diff --git a/BUILD.gn b/BUILD.gn index 6eefc1b..549429e 100644 --- a/BUILD.gn +++ b/BUILD.gn
@@ -101,7 +101,6 @@ "//chrome", "//chrome/installer/zucchini:zucchini", "//chrome/installer/zucchini:zucchini_unittests", - "//chrome/profiling:unit_tests", "//chrome/test:browser_tests", "//chrome/test:interactive_ui_tests", "//chrome/test:sync_integration_tests", @@ -714,6 +713,10 @@ deps += [ "//tools/perf/contrib/vr_benchmarks:vr_perf_tests" ] } } + + if (is_fuchsia) { + deps += [ "//headless" ] + } } # TODO(GYP_GONE): This target exists for compatibility with GYP, specifically
diff --git a/DEPS b/DEPS index dbf21c3..aaa4d1f 100644 --- a/DEPS +++ b/DEPS
@@ -40,11 +40,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': '32fa5104148722dbd6aac1ce8d38dcf47737f669', + 'skia_revision': '228f761111ea4c914dc11fc5523bdabc5eca7ffc', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': 'f1317ecc526a2026e55c9bd6c532c3046defdeaa', + 'v8_revision': 'e67e792e74a4e1c115c1e22d6e7b0b58ba41f6c8', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling swarming_client # and whatever else without interference from each other. @@ -52,7 +52,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. - 'angle_revision': '553590a57921fd83abb814fee943c0ccc9bf45a2', + 'angle_revision': '9b11ea4f2df63784bb34ccef2456d58939a0efb9', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling build tools # and whatever else without interference from each other. @@ -64,7 +64,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. - 'pdfium_revision': 'd27998f6526272a5b8732106aa9b75f724434aca', + 'pdfium_revision': 'aeac95192c106b41c058c8372aa2ec8d0092f60b', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling openmax_dl # and whatever else without interference from each other. @@ -96,7 +96,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': '0eeb5baed7a4417ac083221805842019185ccec0', + 'catapult_revision': '122dd5e91bf64888049459ce73a8fd34c084cfe0', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -362,7 +362,7 @@ Var('chromium_git') + '/external/github.com/swisspol/GCDWebServer.git' + '@' + '43555c66627f6ed44817855a0f6d465f559d30e0', 'src/ios/third_party/material_components_ios/src': - Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + 'c2a357fb67321e9660190c55b49836c51fe04821', + Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + 'a0466df249c593ba65007440d7a84e4665ac2631', 'src/ios/third_party/material_font_disk_loader_ios/src': Var('chromium_git') + '/external/github.com/material-foundation/material-font-disk-loader-ios.git' + '@' + '8e30188777b016182658fbaa0a4a020a48183224',
diff --git a/WATCHLISTS b/WATCHLISTS index 5ee2978..e9fb9ff 100644 --- a/WATCHLISTS +++ b/WATCHLISTS
@@ -772,6 +772,9 @@ 'courgette': { 'filepath': 'courgette/', }, + 'cq': { + 'filepath': 'infra/config/cq.cfg', + }, 'cr_elements': { 'filepath': 'ui/webui/resources/cr_element', }, @@ -920,9 +923,6 @@ 'gn': { 'filepath': 'tools/gn', }, - 'goma': { - 'filepath': 'infra/config/cq.cfg', - }, 'gpu': { 'filepath': 'gpu/', }, @@ -1913,7 +1913,8 @@ 'rouslan+bubble@chromium.org'], 'cache_storage': ['jkarlin+watch@chromium.org', 'nhiroki@chromium.org'], - 'cast': ['avayvod+watch@chromium.org', + 'cast': ['amp+watch@chromium.org', + 'avayvod+watch@chromium.org', 'imcheng+watch@chromium.org', 'isheriff+watch@chromium.org', 'jasonroberts+watch@google.com', @@ -1922,7 +1923,8 @@ 'cast_certificate': ['dougsteed+watch@chromium.org', 'mfoltz+watch@chromium.org', 'ryanchung+watch@chromium.org'], - 'cast_channel': ['mfoltz+watch@chromium.org', + 'cast_channel': ['amp+watch@chromium.org', + 'mfoltz+watch@chromium.org', 'ryanchung+watch@chromium.org'], 'cc': ['cc-bugs@chromium.org'], 'certificate_transparency': ['certificate-transparency-chrome@googlegroups.com', @@ -1985,6 +1987,11 @@ 'twellington+watch@chromium.org'], 'courgette': ['huangs+watch@chromium.org', 'wfh+watch@chromium.org'], + 'cq': ['cq-config-changes@chromium.org', + 'shinyak+cc@chromium.org', + 'tikuta+cc@chromium.org', + 'ukai+cc@chromium.org', + 'yyanagisawa+cc@chromium.org'], 'cr_elements': ['michaelpg+watch-elements@chromium.org', 'stevenjb+watch-md-settings@chromium.org'], 'custom_tabs': ['lizeb+watch-custom-tabs@chromium.org'], @@ -1999,7 +2006,8 @@ 'timvolodine@chromium.org'], 'devtools': ['devtools-reviews@chromium.org', 'pfeldman@chromium.org'], - 'dial': ['mfoltz+watch@chromium.org', + 'dial': ['amp+watch@chromium.org', + 'mfoltz+watch@chromium.org', 'zhaobin+watch@chromium.org'], 'disk_cache': ['gavinp+disk@chromium.org'], 'download': ['dtrainor+watch@chromium.org'], @@ -2037,10 +2045,6 @@ 'gn': ['agrieve+watch@chromium.org', 'dpranke@chromium.org', 'tfarina@chromium.org'], - 'goma': ['shinyak+cc@chromium.com', - 'tikuta+cc@chromium.com', - 'ukai+cc@chromium.com', - 'yyanagisawa+cc@chromium.com'], 'gpu': ['piman+watch@chromium.org'], 'history_ui': ['pam+watch@chromium.org'], 'hotword': ['rlp+watch@chromium.org'], @@ -2104,12 +2108,14 @@ 'media_mojo': ['alokp+watch@chromium.org'], 'media_recorder': ['emircan+watch+mediarecorder@chromium.org', 'mcasas+mediarecorder@chromium.org'], - 'media_remoting': ['apacible+watch@chromium.org', + 'media_remoting': ['amp+watch@chromium.org', + 'apacible+watch@chromium.org', 'erickung+watch@chromium.org', 'mfoltz+watch@chromium.org', 'miu+watch@chromium.org', 'xjz+watch@chromium.org'], - 'media_router': ['imcheng+watch@chromium.org', + 'media_router': ['amp+watch@chromium.org', + 'imcheng+watch@chromium.org', 'mfoltz+watch@chromium.org'], 'memory_coordinator': ['chrome-grc-reviews+memory@chromium.org'], 'message_loop': ['sadrul@chromium.org'], @@ -2196,7 +2202,8 @@ 'prerender': ['cbentzel+watch@chromium.org', 'gavinp+prer@chromium.org', 'tburkard+watch@chromium.org'], - 'presentation': ['mfoltz+watch@chromium.org'], + 'presentation': ['amp+watch@chromium.org', + 'mfoltz+watch@chromium.org'], 'push_messaging': ['johnme+watch@chromium.org', 'peter@chromium.org'], 'reading_list': ['stkhapugin@chromium.org'], @@ -2243,7 +2250,8 @@ 'nhiroki@chromium.org', 'tzik@chromium.org'], 'tab_alert_indicators': ['miu+watch@chromium.org'], - 'tab_capture': ['miu+watch@chromium.org', + 'tab_capture': ['amp+watch@chromium.org', + 'miu+watch@chromium.org', 'xjz+watch@chromium.org'], 'tab_contents': ['ajwong+watch@chromium.org', 'avi@chromium.org',
diff --git a/android_webview/browser/aw_browser_main_parts.cc b/android_webview/browser/aw_browser_main_parts.cc index 7f05440..6418442 100644 --- a/android_webview/browser/aw_browser_main_parts.cc +++ b/android_webview/browser/aw_browser_main_parts.cc
@@ -149,7 +149,7 @@ } if (base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kEnableWebViewFinch)) { + switches::kEnableWebViewVariations)) { AwMetricsServiceClient::GetOrCreateGUID(); }
diff --git a/android_webview/browser/aw_contents_statics.cc b/android_webview/browser/aw_contents_statics.cc index 43b71bd..be551515 100644 --- a/android_webview/browser/aw_contents_statics.cc +++ b/android_webview/browser/aw_contents_statics.cc
@@ -13,6 +13,7 @@ #include "base/android/jni_string.h" #include "base/android/scoped_java_ref.h" #include "base/callback.h" +#include "components/security_interstitials/core/urls.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/storage_partition.h" #include "content/public/common/url_constants.h" @@ -52,6 +53,15 @@ } // namespace // static +ScopedJavaLocalRef<jstring> GetSafeBrowsingPrivacyPolicyUrl( + JNIEnv* env, + const JavaParamRef<jclass>&) { + // TODO(ntfschr): append the locale to this URL + return base::android::ConvertUTF8ToJavaString( + env, security_interstitials::kSafeBrowsingPrivacyPolicyUrl); +} + +// static void ClearClientCertPreferences(JNIEnv* env, const JavaParamRef<jclass>&, const JavaParamRef<jobject>& callback) {
diff --git a/android_webview/browser/aw_metrics_service_client.cc b/android_webview/browser/aw_metrics_service_client.cc index b8b55aa..1a7e8e7 100644 --- a/android_webview/browser/aw_metrics_service_client.cc +++ b/android_webview/browser/aw_metrics_service_client.cc
@@ -125,10 +125,10 @@ request_context_ = request_context; channel_ = GetChannelFromPackageName(); - // If Finch is enabled for WebView the GUID will already have been read at - // startup + // If variations are enabled for WebView the GUID will already have been read + // at startup if (base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kEnableWebViewFinch)) { + switches::kEnableWebViewVariations)) { InitializeWithGUID(); } else { content::BrowserThread::PostTaskAndReply( @@ -141,7 +141,8 @@ void AwMetricsServiceClient::InitializeWithGUID() { // The guid must have already been initialized at this point, either - // synchronously or asynchronously depending on the kEnableWebViewFinch flag + // synchronously or asynchronously depending on the kEnableWebViewVariations + // flag DCHECK_EQ(g_client_id_guid.Get().length(), GUID_SIZE); pref_service_->SetString(metrics::prefs::kMetricsClientID, g_client_id_guid.Get());
diff --git a/android_webview/common/aw_switches.cc b/android_webview/common/aw_switches.cc index 555513c9f..a8d9e825 100644 --- a/android_webview/common/aw_switches.cc +++ b/android_webview/common/aw_switches.cc
@@ -6,7 +6,7 @@ namespace switches { -const char kEnableWebViewFinch[] = "enable-webview-finch"; +const char kEnableWebViewVariations[] = "enable-webview-variations"; const char kSyncOnDrawHardware[] = "sync-on-draw-hardware"; const char kWebViewSandboxedRenderer[] = "webview-sandboxed-renderer";
diff --git a/android_webview/common/aw_switches.h b/android_webview/common/aw_switches.h index c41a274..341712b 100644 --- a/android_webview/common/aw_switches.h +++ b/android_webview/common/aw_switches.h
@@ -7,7 +7,7 @@ namespace switches { -extern const char kEnableWebViewFinch[]; +extern const char kEnableWebViewVariations[]; extern const char kSyncOnDrawHardware[]; extern const char kWebViewSandboxedRenderer[]; extern const char kWebViewEnableSafeBrowsingSupport[];
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java index 6a5c5cc..c7eb4e9 100644 --- a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java +++ b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java
@@ -583,6 +583,16 @@ AwContentsStatics.setSafeBrowsingWhitelist(urls, callback); } + /** + * Returns a URL pointing to the privacy policy for Safe Browsing reporting. + * + * @return the url pointing to a privacy policy document which can be displayed + * to users. + */ + // TODO(ntfschr): add @Override once next android SDK rolls + public Uri getSafeBrowsingPrivacyPolicyUrl() { + return AwContentsStatics.getSafeBrowsingPrivacyPolicyUrl(); + } }; } }
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContentsStatics.java b/android_webview/java/src/org/chromium/android_webview/AwContentsStatics.java index e4e2605..f03750db 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwContentsStatics.java +++ b/android_webview/java/src/org/chromium/android_webview/AwContentsStatics.java
@@ -6,6 +6,7 @@ import android.annotation.TargetApi; import android.content.Context; +import android.net.Uri; import android.webkit.ValueCallback; import org.chromium.base.ThreadUtils; @@ -154,6 +155,10 @@ } } + public static Uri getSafeBrowsingPrivacyPolicyUrl() { + return Uri.parse(nativeGetSafeBrowsingPrivacyPolicyUrl()); + } + public static void setCheckClearTextPermitted(boolean permitted) { nativeSetCheckClearTextPermitted(permitted); } @@ -176,6 +181,7 @@ //-------------------------------------------------------------------------------------------- // Native methods //-------------------------------------------------------------------------------------------- + private static native String nativeGetSafeBrowsingPrivacyPolicyUrl(); private static native void nativeClearClientCertPreferences(Runnable callback); private static native String nativeGetUnreachableWebDataUrl(); private static native String nativeGetProductVersion();
diff --git a/android_webview/javatests/AndroidManifest.xml b/android_webview/javatests/AndroidManifest.xml index ed0ae66f..07a3566 100644 --- a/android_webview/javatests/AndroidManifest.xml +++ b/android_webview/javatests/AndroidManifest.xml
@@ -8,6 +8,10 @@ <instrumentation android:name="org.chromium.android_webview.test.AwInstrumentationTestRunner" android:targetPackage="org.chromium.android_webview.shell" android:label="Tests for org.chromium.android_webview"/> + <instrumentation android:name="org.chromium.base.test.BaseChromiumAndroidJUnitRunner" + android:targetPackage="org.chromium.android_webview.shell" + chromium-junit4="true" + android:label="Tests for org.chromium.android_webview"/> <uses-permission android:name="android.permission.RUN_INSTRUMENTATION" /> <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> <uses-permission android:name="android.permission.READ_LOGS"/>
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AcceptLanguageTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AcceptLanguageTest.java index fdbc2148..187b398 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AcceptLanguageTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AcceptLanguageTest.java
@@ -85,9 +85,9 @@ getJavaScriptResultBodyTextContent(mAwContents, mContentsClient)); assertEquals(LocaleUtils.getDefaultLocaleString(), acceptLanguages[0]); - String[] acceptLanguagesJs = getAcceptLanguages( - JSUtils.executeJavaScriptAndWaitForResult( - this, mAwContents, mContentsClient.getOnEvaluateJavaScriptResultHelper(), + String[] acceptLanguagesJs = + getAcceptLanguages(JSUtils.executeJavaScriptAndWaitForResult(getInstrumentation(), + mAwContents, mContentsClient.getOnEvaluateJavaScriptResultHelper(), "navigator.languages.join(',')")); assertEquals(acceptLanguagesJs.length, acceptLanguages.length); for (int i = 0; i < acceptLanguagesJs.length; ++i) { @@ -128,9 +128,10 @@ assertEquals( LocaleUtils.getDefaultLocaleListString(), TextUtils.join(",", acceptLanguages)); - String[] acceptLanguagesJs = getAcceptLanguages(JSUtils.executeJavaScriptAndWaitForResult( - this, mAwContents, mContentsClient.getOnEvaluateJavaScriptResultHelper(), - "navigator.languages.join(',')")); + String[] acceptLanguagesJs = + getAcceptLanguages(JSUtils.executeJavaScriptAndWaitForResult(getInstrumentation(), + mAwContents, mContentsClient.getOnEvaluateJavaScriptResultHelper(), + "navigator.languages.join(',')")); assertEquals(acceptLanguagesJs.length, acceptLanguages.length); for (int i = 0; i < acceptLanguagesJs.length; ++i) { assertEquals(acceptLanguagesJs[i], acceptLanguages[i]);
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AndroidScrollIntegrationTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AndroidScrollIntegrationTest.java index 4ff65e9..84f74a24 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AndroidScrollIntegrationTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AndroidScrollIntegrationTest.java
@@ -126,7 +126,7 @@ } @Override - protected TestDependencyFactory createTestDependencyFactory() { + public TestDependencyFactory createTestDependencyFactory() { return new TestDependencyFactory() { @Override public AwScrollOffsetManager createScrollOffsetManager(
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AndroidViewIntegrationTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AndroidViewIntegrationTest.java index ad613bf..16b780d 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AndroidViewIntegrationTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AndroidViewIntegrationTest.java
@@ -70,7 +70,7 @@ } @Override - protected TestDependencyFactory createTestDependencyFactory() { + public TestDependencyFactory createTestDependencyFactory() { return new TestDependencyFactory() { @Override public AwLayoutSizer createLayoutSizer() {
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwActivityTestRule.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwActivityTestRule.java new file mode 100644 index 0000000..d3bd9a5 --- /dev/null +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwActivityTestRule.java
@@ -0,0 +1,412 @@ +// 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. + +package org.chromium.android_webview.test; + +import static org.chromium.base.test.util.ScalableTimeout.scaleTimeout; + +import android.app.Instrumentation; +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.rule.ActivityTestRule; + +import org.junit.runner.Description; +import org.junit.runners.model.Statement; + +import org.chromium.android_webview.AwBrowserContext; +import org.chromium.android_webview.AwContents; +import org.chromium.android_webview.AwContentsClient; +import org.chromium.android_webview.AwSettings; +import org.chromium.android_webview.test.AwTestBase.PopupInfo; +import org.chromium.android_webview.test.AwTestBase.TestDependencyFactory; +import org.chromium.android_webview.test.AwTestCommon.AwTestCommonCallback; +import org.chromium.base.test.util.CallbackHelper; +import org.chromium.base.test.util.InMemorySharedPreferences; +import org.chromium.net.test.util.TestWebServer; + +import java.lang.annotation.Annotation; +import java.util.Map; +import java.util.concurrent.Callable; + +/** Custom ActivityTestRunner for WebView instrumentation tests */ +public class AwActivityTestRule + extends ActivityTestRule<AwTestRunnerActivity> implements AwTestCommonCallback { + public static final long WAIT_TIMEOUT_MS = scaleTimeout(15000); + + public static final int CHECK_INTERVAL = 100; + + private Description mCurrentTestDescription; + + private final AwTestCommon mTestCommon; + + public AwActivityTestRule() { + super(AwTestRunnerActivity.class); + mTestCommon = new AwTestCommon(this); + } + + @Override + public Statement apply(final Statement base, Description description) { + mCurrentTestDescription = description; + return super.apply(new Statement() { + @Override + public void evaluate() throws Throwable { + setUp(); + base.evaluate(); + } + }, description); + } + + public void setUp() throws Exception { + mTestCommon.setUp(); + } + + @Override + public AwBrowserContext createAwBrowserContextOnUiThread( + InMemorySharedPreferences prefs, Context appContext) { + return new AwBrowserContext(prefs, appContext); + } + + @Override + public TestDependencyFactory createTestDependencyFactory() { + return new TestDependencyFactory(); + } + + /** + * Override this to return false if the test doesn't want to create an + * AwBrowserContext automatically. + */ + @Override + public boolean needsAwBrowserContextCreated() { + return true; + } + + /** + * Override this to return false if the test doesn't want the browser + * startup sequence to be run automatically. + * + * @return Whether the instrumentation test requires the browser process to + * already be started. + */ + @Override + public boolean needsBrowserProcessStarted() { + return true; + } + + public void createAwBrowserContext() { + mTestCommon.createAwBrowserContext(); + } + + public void startBrowserProcess() throws Exception { + mTestCommon.startBrowserProcess(); + } + + /** + * Runs a {@link Callable} on the main thread, blocking until it is + * complete, and returns the result. Calls + * {@link Instrumentation#waitForIdleSync()} first to help avoid certain + * race conditions. + * + * @param <R> Type of result to return + */ + public <R> R runTestOnUiThreadAndGetResult(Callable<R> callable) throws Exception { + return mTestCommon.runTestOnUiThreadAndGetResult(callable); + } + + public void enableJavaScriptOnUiThread(final AwContents awContents) { + mTestCommon.enableJavaScriptOnUiThread(awContents); + } + + public void setNetworkAvailableOnUiThread( + final AwContents awContents, final boolean networkUp) { + mTestCommon.setNetworkAvailableOnUiThread(awContents, networkUp); + } + + /** + * Loads url on the UI thread and blocks until onPageFinished is called. + */ + public void loadUrlSync(final AwContents awContents, CallbackHelper onPageFinishedHelper, + final String url) throws Exception { + mTestCommon.loadUrlSync(awContents, onPageFinishedHelper, url); + } + + public void loadUrlSync(final AwContents awContents, CallbackHelper onPageFinishedHelper, + final String url, final Map<String, String> extraHeaders) throws Exception { + mTestCommon.loadUrlSync(awContents, onPageFinishedHelper, url, extraHeaders); + } + + public void loadUrlSyncAndExpectError(final AwContents awContents, + CallbackHelper onPageFinishedHelper, CallbackHelper onReceivedErrorHelper, + final String url) throws Exception { + mTestCommon.loadUrlSyncAndExpectError( + awContents, onPageFinishedHelper, onReceivedErrorHelper, url); + } + + /** + * Loads url on the UI thread but does not block. + */ + public void loadUrlAsync(final AwContents awContents, final String url) throws Exception { + mTestCommon.loadUrlAsync(awContents, url); + } + + public void loadUrlAsync( + final AwContents awContents, final String url, final Map<String, String> extraHeaders) { + mTestCommon.loadUrlAsync(awContents, url, extraHeaders); + } + + /** + * Posts url on the UI thread and blocks until onPageFinished is called. + */ + public void postUrlSync(final AwContents awContents, CallbackHelper onPageFinishedHelper, + final String url, byte[] postData) throws Exception { + mTestCommon.postUrlSync(awContents, onPageFinishedHelper, url, postData); + } + + /** + * Loads url on the UI thread but does not block. + */ + public void postUrlAsync(final AwContents awContents, final String url, byte[] postData) + throws Exception { + mTestCommon.postUrlAsync(awContents, url, postData); + } + + /** + * Loads data on the UI thread and blocks until onPageFinished is called. + */ + public void loadDataSync(final AwContents awContents, CallbackHelper onPageFinishedHelper, + final String data, final String mimeType, final boolean isBase64Encoded) + throws Exception { + mTestCommon.loadDataSync(awContents, onPageFinishedHelper, data, mimeType, isBase64Encoded); + } + + public void loadDataSyncWithCharset(final AwContents awContents, + CallbackHelper onPageFinishedHelper, final String data, final String mimeType, + final boolean isBase64Encoded, final String charset) throws Exception { + mTestCommon.loadDataSyncWithCharset( + awContents, onPageFinishedHelper, data, mimeType, isBase64Encoded, charset); + } + + /** + * Loads data on the UI thread but does not block. + */ + public void loadDataAsync(final AwContents awContents, final String data, final String mimeType, + final boolean isBase64Encoded) throws Exception { + mTestCommon.loadDataAsync(awContents, data, mimeType, isBase64Encoded); + } + + public void loadDataWithBaseUrlSync(final AwContents awContents, + CallbackHelper onPageFinishedHelper, final String data, final String mimeType, + final boolean isBase64Encoded, final String baseUrl, final String historyUrl) + throws Throwable { + mTestCommon.loadDataWithBaseUrlSync(awContents, onPageFinishedHelper, data, mimeType, + isBase64Encoded, baseUrl, historyUrl); + } + + public void loadDataWithBaseUrlAsync(final AwContents awContents, final String data, + final String mimeType, final boolean isBase64Encoded, final String baseUrl, + final String historyUrl) throws Throwable { + mTestCommon.loadDataWithBaseUrlAsync( + awContents, data, mimeType, isBase64Encoded, baseUrl, historyUrl); + } + + /** + * Reloads the current page synchronously. + */ + public void reloadSync(final AwContents awContents, CallbackHelper onPageFinishedHelper) + throws Exception { + mTestCommon.reloadSync(awContents, onPageFinishedHelper); + } + + /** + * Stops loading on the UI thread. + */ + public void stopLoading(final AwContents awContents) { + mTestCommon.stopLoading(awContents); + } + + public void waitForVisualStateCallback(final AwContents awContents) throws Exception { + mTestCommon.waitForVisualStateCallback(awContents); + } + + public void insertVisualStateCallbackOnUIThread(final AwContents awContents, + final long requestId, final AwContents.VisualStateCallback callback) { + mTestCommon.insertVisualStateCallbackOnUIThread(awContents, requestId, callback); + } + + // Waits for the pixel at the center of AwContents to color up into expectedColor. + // Note that this is a stricter condition that waiting for a visual state callback, + // as visual state callback only indicates that *something* has appeared in WebView. + public void waitForPixelColorAtCenterOfView(final AwContents awContents, + final AwTestContainerView testContainerView, final int expectedColor) throws Exception { + mTestCommon.waitForPixelColorAtCenterOfView(awContents, testContainerView, expectedColor); + } + + public AwTestContainerView createAwTestContainerView(final AwContentsClient awContentsClient) { + return mTestCommon.createAwTestContainerView(awContentsClient); + } + + public AwTestContainerView createAwTestContainerView(final AwContentsClient awContentsClient, + boolean supportsLegacyQuirks, final TestDependencyFactory testDependencyFactory) { + return mTestCommon.createAwTestContainerView( + awContentsClient, supportsLegacyQuirks, testDependencyFactory); + } + + public AwBrowserContext getAwBrowserContext() { + return mTestCommon.getAwBrowserContext(); + } + + public AwTestContainerView createDetachedAwTestContainerView( + final AwContentsClient awContentsClient) { + return mTestCommon.createDetachedAwTestContainerView(awContentsClient); + } + + public AwTestContainerView createDetachedAwTestContainerView( + final AwContentsClient awContentsClient, boolean supportsLegacyQuirks, + TestDependencyFactory testDependencyFactory) { + return mTestCommon.createDetachedAwTestContainerView( + awContentsClient, supportsLegacyQuirks, testDependencyFactory); + } + + protected boolean isHardwareAcceleratedTest() { + return mTestCommon.isHardwareAcceleratedTest(); + } + + public AwTestContainerView createAwTestContainerViewOnMainSync(final AwContentsClient client) + throws Exception { + return mTestCommon.createAwTestContainerViewOnMainSync(client); + } + + public AwTestContainerView createAwTestContainerViewOnMainSync( + final AwContentsClient client, final boolean supportsLegacyQuirks) { + return mTestCommon.createAwTestContainerViewOnMainSync(client, supportsLegacyQuirks); + } + + public AwTestContainerView createAwTestContainerViewOnMainSync(final AwContentsClient client, + final boolean supportsLegacyQuirks, final TestDependencyFactory testDependencyFactory) { + return mTestCommon.createAwTestContainerViewOnMainSync( + client, supportsLegacyQuirks, testDependencyFactory); + } + + public void destroyAwContentsOnMainSync(final AwContents awContents) { + mTestCommon.destroyAwContentsOnMainSync(awContents); + } + + public String getTitleOnUiThread(final AwContents awContents) throws Exception { + return mTestCommon.getTitleOnUiThread(awContents); + } + + public AwSettings getAwSettingsOnUiThread(final AwContents awContents) throws Exception { + return mTestCommon.getAwSettingsOnUiThread(awContents); + } + + /** + * Verify double quotes in both sides of the raw string. Strip the double quotes and + * returns rest of the string. + */ + protected String maybeStripDoubleQuotes(String raw) { + return mTestCommon.maybeStripDoubleQuotes(raw); + } + + /** + * Executes the given snippet of JavaScript code within the given ContentView. Returns the + * result of its execution in JSON format. + */ + public String executeJavaScriptAndWaitForResult(final AwContents awContents, + TestAwContentsClient viewClient, final String code) throws Exception { + return mTestCommon.executeJavaScriptAndWaitForResult(awContents, viewClient, code); + } + + /** + * Executes JavaScript code within the given ContentView to get the text content in + * document body. Returns the result string without double quotes. + */ + public String getJavaScriptResultBodyTextContent( + final AwContents awContents, final TestAwContentsClient viewClient) throws Exception { + return mTestCommon.getJavaScriptResultBodyTextContent(awContents, viewClient); + } + + /** + * Wrapper around CriteriaHelper.pollInstrumentationThread. This uses AwTestBase-specifc + * timeouts and treats timeouts and exceptions as test failures automatically. + */ + public static void pollInstrumentationThread(final Callable<Boolean> callable) + throws Exception { + AwTestCommon.pollInstrumentationThread(callable); + } + + /** + * Wrapper around {@link AwTestBase#poll()} but runs the callable on the UI thread. + */ + public void pollUiThread(final Callable<Boolean> callable) throws Exception { + mTestCommon.pollUiThread(callable); + } + + /** + * Clears the resource cache. Note that the cache is per-application, so this will clear the + * cache for all WebViews used. + */ + public void clearCacheOnUiThread(final AwContents awContents, final boolean includeDiskFiles) + throws Exception { + mTestCommon.clearCacheOnUiThread(awContents, includeDiskFiles); + } + + /** + * Returns pure page scale. + */ + public float getScaleOnUiThread(final AwContents awContents) throws Exception { + return mTestCommon.getScaleOnUiThread(awContents); + } + + /** + * Returns page scale multiplied by the screen density. + */ + public float getPixelScaleOnUiThread(final AwContents awContents) throws Exception { + return mTestCommon.getPixelScaleOnUiThread(awContents); + } + + /** + * Returns whether a user can zoom the page in. + */ + public boolean canZoomInOnUiThread(final AwContents awContents) throws Exception { + return mTestCommon.canZoomInOnUiThread(awContents); + } + + /** + * Returns whether a user can zoom the page out. + */ + public boolean canZoomOutOnUiThread(final AwContents awContents) throws Exception { + return mTestCommon.canZoomOutOnUiThread(awContents); + } + + public void killRenderProcessOnUiThreadAsync(final AwContents awContents) throws Exception { + mTestCommon.killRenderProcessOnUiThreadAsync(awContents); + } + + /** + * Loads the main html then triggers the popup window. + */ + public void triggerPopup(final AwContents parentAwContents, + TestAwContentsClient parentAwContentsClient, TestWebServer testWebServer, + String mainHtml, String popupHtml, String popupPath, String triggerScript) + throws Exception { + mTestCommon.triggerPopup(parentAwContents, parentAwContentsClient, testWebServer, mainHtml, + popupHtml, popupPath, triggerScript); + } + + /** + * Supplies the popup window with AwContents then waits for the popup window to finish loading. + */ + public PopupInfo connectPendingPopup(final AwContents parentAwContents) throws Exception { + return mTestCommon.connectPendingPopup(parentAwContents); + } + + @Override + public boolean testMethodHasAnnotation(Class<? extends Annotation> clazz) { + return mCurrentTestDescription.getAnnotation(clazz) != null ? true : false; + } + + @Override + public Instrumentation getInstrumentation() { + return InstrumentationRegistry.getInstrumentation(); + } +}
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldInterceptRequestTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldInterceptRequestTest.java index 5e3004e..f56533f1 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldInterceptRequestTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldInterceptRequestTest.java
@@ -214,7 +214,7 @@ mShouldInterceptRequestHelper.getRequestsForUrl(pageWithFormUrl).method); callCount = mShouldInterceptRequestHelper.getCallCount(); - JSUtils.clickOnLinkUsingJs(this, mAwContents, + JSUtils.clickOnLinkUsingJs(getInstrumentation(), mAwContents, mContentsClient.getOnEvaluateJavaScriptResultHelper(), "link"); mShouldInterceptRequestHelper.waitForCallback(callCount); assertEquals("POST",
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldOverrideUrlLoadingTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldOverrideUrlLoadingTest.java index c02be0dc..28090bd1 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldOverrideUrlLoadingTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldOverrideUrlLoadingTest.java
@@ -78,7 +78,7 @@ private void clickOnLinkUsingJs() throws Throwable { enableJavaScriptOnUiThread(mAwContents); - JSUtils.clickOnLinkUsingJs(this, mAwContents, + JSUtils.clickOnLinkUsingJs(getInstrumentation(), mAwContents, mContentsClient.getOnEvaluateJavaScriptResultHelper(), "link"); } @@ -926,8 +926,9 @@ loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), urlWithLink); // Executing JS code that tries to navigate somewhere should not create an intent. - assertEquals("\"" + testUrl + "\"", JSUtils.executeJavaScriptAndWaitForResult( - this, mAwContents, new OnEvaluateJavaScriptResultHelper(), + assertEquals("\"" + testUrl + "\"", + JSUtils.executeJavaScriptAndWaitForResult(getInstrumentation(), mAwContents, + new OnEvaluateJavaScriptResultHelper(), "document.location.href='" + testUrl + "'")); assertNull(getActivity().getLastSentIntent());
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsGarbageCollectionTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsGarbageCollectionTest.java index cb5c93d..e0c4d29 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsGarbageCollectionTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsGarbageCollectionTest.java
@@ -42,7 +42,7 @@ } @Override - protected TestDependencyFactory createTestDependencyFactory() { + public TestDependencyFactory createTestDependencyFactory() { if (mOverridenFactory == null) { return new TestDependencyFactory(); } else {
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsTest.java index ce37246..a787e7c 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsTest.java
@@ -4,6 +4,8 @@ package org.chromium.android_webview.test; +import static org.chromium.android_webview.test.AwTestCommon.WAIT_TIMEOUT_MS; + import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; @@ -11,14 +13,19 @@ import android.os.Handler; import android.os.Looper; import android.os.Message; +import android.support.test.InstrumentationRegistry; import android.support.test.filters.LargeTest; import android.support.test.filters.SmallTest; -import android.test.UiThreadTest; import android.util.Pair; import android.view.KeyEvent; import android.view.View; import android.webkit.JavascriptInterface; +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + import org.chromium.android_webview.AwContents; import org.chromium.android_webview.AwSettings; import org.chromium.android_webview.AwSwitches; @@ -52,117 +59,141 @@ /** * AwContents tests. */ -public class AwContentsTest extends AwTestBase { +@RunWith(AwJUnit4ClassRunner.class) +public class AwContentsTest { + @Rule + public AwActivityTestRule mActivityTestRule = new AwActivityTestRule(); private TestAwContentsClient mContentsClient = new TestAwContentsClient(); + @Test @SmallTest @Feature({"AndroidWebView"}) - @UiThreadTest public void testCreateDestroy() throws Throwable { // NOTE this test runs on UI thread, so we cannot call any async methods. - createAwTestContainerView(mContentsClient).getAwContents().destroy(); + mActivityTestRule.runOnUiThread(new Runnable() { + @Override + public void run() { + mActivityTestRule.createAwTestContainerView(mContentsClient) + .getAwContents() + .destroy(); + } + }); } + @Test @SmallTest @Feature({"AndroidWebView"}) public void testCreateLoadPageDestroy() throws Throwable { AwTestContainerView awTestContainerView = - createAwTestContainerViewOnMainSync(mContentsClient); - loadDataSync(awTestContainerView.getAwContents(), mContentsClient.getOnPageFinishedHelper(), - CommonResources.ABOUT_HTML, "text/html", false); + mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient); + mActivityTestRule.loadDataSync(awTestContainerView.getAwContents(), + mContentsClient.getOnPageFinishedHelper(), CommonResources.ABOUT_HTML, "text/html", + false); - destroyAwContentsOnMainSync(awTestContainerView.getAwContents()); + mActivityTestRule.destroyAwContentsOnMainSync(awTestContainerView.getAwContents()); // It should be safe to call destroy multiple times. - destroyAwContentsOnMainSync(awTestContainerView.getAwContents()); + mActivityTestRule.destroyAwContentsOnMainSync(awTestContainerView.getAwContents()); } + @Test @LargeTest @Feature({"AndroidWebView"}) public void testCreateLoadDestroyManyTimes() throws Throwable { for (int i = 0; i < 10; ++i) { - AwTestContainerView testView = createAwTestContainerViewOnMainSync(mContentsClient); + AwTestContainerView testView = + mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient); AwContents awContents = testView.getAwContents(); - loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(), + mActivityTestRule.loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(), ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL); - destroyAwContentsOnMainSync(awContents); + mActivityTestRule.destroyAwContentsOnMainSync(awContents); } } + @Test @LargeTest @Feature({"AndroidWebView"}) public void testCreateLoadDestroyManyAtOnce() throws Throwable { AwTestContainerView views[] = new AwTestContainerView[10]; for (int i = 0; i < views.length; ++i) { - views[i] = createAwTestContainerViewOnMainSync(mContentsClient); - loadUrlSync(views[i].getAwContents(), mContentsClient.getOnPageFinishedHelper(), + views[i] = mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient); + mActivityTestRule.loadUrlSync(views[i].getAwContents(), + mContentsClient.getOnPageFinishedHelper(), ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL); } for (int i = 0; i < views.length; ++i) { - destroyAwContentsOnMainSync(views[i].getAwContents()); + mActivityTestRule.destroyAwContentsOnMainSync(views[i].getAwContents()); views[i] = null; } } + @Test @SmallTest @Feature({"AndroidWebView"}) - @UiThreadTest public void testWebViewApisFailGracefullyAfterDestruction() throws Throwable { - AwContents awContents = - createAwTestContainerView(mContentsClient).getAwContents(); - awContents.destroy(); + mActivityTestRule.runOnUiThread(new Runnable() { + @Override + public void run() { + AwContents awContents = mActivityTestRule.createAwTestContainerView(mContentsClient) + .getAwContents(); + awContents.destroy(); - // The documentation for WebView#destroy() reads "This method should be called - // after this WebView has been removed from the view system. No other methods - // may be called on this WebView after destroy". - // However, some apps do not respect that restriction so we need to ensure that - // we fail gracefully and do not crash when APIs are invoked after destruction. - // Due to the large number of APIs we only test a representative selection here. - awContents.clearHistory(); - awContents.loadUrl("http://www.google.com"); - awContents.findAllAsync("search"); - assertNull(awContents.getUrl()); - assertFalse(awContents.canGoBack()); - awContents.disableJavascriptInterfacesInspection(); - awContents.invokeZoomPicker(); - awContents.onResume(); - awContents.stopLoading(); - awContents.onWindowVisibilityChanged(View.VISIBLE); - awContents.requestFocus(); - awContents.isMultiTouchZoomSupported(); - awContents.setOverScrollMode(View.OVER_SCROLL_NEVER); - awContents.pauseTimers(); - awContents.onContainerViewScrollChanged(200, 200, 100, 100); - awContents.computeScroll(); - awContents.onMeasure(100, 100); - awContents.onDraw(new Canvas()); - awContents.getMostRecentProgress(); - assertEquals(0, awContents.computeHorizontalScrollOffset()); - assertEquals(0, awContents.getContentWidthCss()); - awContents.onKeyUp(KeyEvent.KEYCODE_BACK, - new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MENU)); + // The documentation for WebView#destroy() reads "This method should be called + // after this WebView has been removed from the view system. No other methods + // may be called on this WebView after destroy". + // However, some apps do not respect that restriction so we need to ensure that + // we fail gracefully and do not crash when APIs are invoked after destruction. + // Due to the large number of APIs we only test a representative selection here. + awContents.clearHistory(); + awContents.loadUrl("http://www.google.com"); + awContents.findAllAsync("search"); + Assert.assertNull(awContents.getUrl()); + Assert.assertFalse(awContents.canGoBack()); + awContents.disableJavascriptInterfacesInspection(); + awContents.invokeZoomPicker(); + awContents.onResume(); + awContents.stopLoading(); + awContents.onWindowVisibilityChanged(View.VISIBLE); + awContents.requestFocus(); + awContents.isMultiTouchZoomSupported(); + awContents.setOverScrollMode(View.OVER_SCROLL_NEVER); + awContents.pauseTimers(); + awContents.onContainerViewScrollChanged(200, 200, 100, 100); + awContents.computeScroll(); + awContents.onMeasure(100, 100); + awContents.onDraw(new Canvas()); + awContents.getMostRecentProgress(); + Assert.assertEquals(0, awContents.computeHorizontalScrollOffset()); + Assert.assertEquals(0, awContents.getContentWidthCss()); + awContents.onKeyUp(KeyEvent.KEYCODE_BACK, + new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MENU)); + } + }); } + @Test @SmallTest @Feature({"AndroidWebView"}) public void testUseAwSettingsAfterDestroy() throws Throwable { AwTestContainerView awTestContainerView = - createAwTestContainerViewOnMainSync(mContentsClient); - AwSettings awSettings = getAwSettingsOnUiThread(awTestContainerView.getAwContents()); - loadDataSync(awTestContainerView.getAwContents(), mContentsClient.getOnPageFinishedHelper(), - CommonResources.ABOUT_HTML, "text/html", false); - destroyAwContentsOnMainSync(awTestContainerView.getAwContents()); + mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient); + AwSettings awSettings = + mActivityTestRule.getAwSettingsOnUiThread(awTestContainerView.getAwContents()); + mActivityTestRule.loadDataSync(awTestContainerView.getAwContents(), + mContentsClient.getOnPageFinishedHelper(), CommonResources.ABOUT_HTML, "text/html", + false); + mActivityTestRule.destroyAwContentsOnMainSync(awTestContainerView.getAwContents()); // AwSettings should still be usable even after native side is destroyed. String newFontFamily = "serif"; awSettings.setStandardFontFamily(newFontFamily); - assertEquals(newFontFamily, awSettings.getStandardFontFamily()); + Assert.assertEquals(newFontFamily, awSettings.getStandardFontFamily()); boolean newBlockNetworkLoads = !awSettings.getBlockNetworkLoads(); awSettings.setBlockNetworkLoads(newBlockNetworkLoads); - assertEquals(newBlockNetworkLoads, awSettings.getBlockNetworkLoads()); + Assert.assertEquals(newBlockNetworkLoads, awSettings.getBlockNetworkLoads()); } private int callDocumentHasImagesSync(final AwContents awContents) @@ -178,21 +209,23 @@ s.release(); } }); - runTestOnUiThread(new Runnable() { + InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() { @Override public void run() { awContents.documentHasImages(msg); } }); - assertTrue(s.tryAcquire(WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS)); + Assert.assertTrue(s.tryAcquire(AwActivityTestRule.WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS)); int result = val.get(); return result; } + @Test @SmallTest @Feature({"AndroidWebView"}) public void testDocumentHasImages() throws Throwable { - AwTestContainerView testView = createAwTestContainerViewOnMainSync(mContentsClient); + AwTestContainerView testView = + mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient); AwContents awContents = testView.getAwContents(); final CallbackHelper loadHelper = mContentsClient.getOnPageFinishedHelper(); @@ -202,21 +235,22 @@ final String imageDoc = "<head/><body><img/><img/></body>"; // Make sure a document that does not have images returns 0 - loadDataSync(awContents, loadHelper, emptyDoc, mime, false); + mActivityTestRule.loadDataSync(awContents, loadHelper, emptyDoc, mime, false); int result = callDocumentHasImagesSync(awContents); - assertEquals(0, result); + Assert.assertEquals(0, result); // Make sure a document that does have images returns 1 - loadDataSync(awContents, loadHelper, imageDoc, mime, false); + mActivityTestRule.loadDataSync(awContents, loadHelper, imageDoc, mime, false); result = callDocumentHasImagesSync(awContents); - assertEquals(1, result); + Assert.assertEquals(1, result); } + @Test @SmallTest @Feature({"AndroidWebView"}) public void testClearCacheMemoryAndDisk() throws Throwable { final AwTestContainerView testContainer = - createAwTestContainerViewOnMainSync(mContentsClient); + mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient); final AwContents awContents = testContainer.getAwContents(); TestWebServer webServer = TestWebServer.start(); @@ -230,46 +264,44 @@ pagePath, "<html><body>foo</body></html>", headers); // First load to populate cache. - clearCacheOnUiThread(awContents, true); - loadUrlSync(awContents, - mContentsClient.getOnPageFinishedHelper(), - pageUrl); - assertEquals(1, webServer.getRequestCount(pagePath)); + mActivityTestRule.clearCacheOnUiThread(awContents, true); + mActivityTestRule.loadUrlSync( + awContents, mContentsClient.getOnPageFinishedHelper(), pageUrl); + Assert.assertEquals(1, webServer.getRequestCount(pagePath)); // Load about:blank so next load is not treated as reload by webkit and force // revalidate with the server. - loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(), + mActivityTestRule.loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(), ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL); // No clearCache call, so should be loaded from cache. - loadUrlSync(awContents, - mContentsClient.getOnPageFinishedHelper(), - pageUrl); - assertEquals(1, webServer.getRequestCount(pagePath)); + mActivityTestRule.loadUrlSync( + awContents, mContentsClient.getOnPageFinishedHelper(), pageUrl); + Assert.assertEquals(1, webServer.getRequestCount(pagePath)); // Same as above. - loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(), + mActivityTestRule.loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(), ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL); // Clear cache, so should hit server again. - clearCacheOnUiThread(awContents, true); - loadUrlSync(awContents, - mContentsClient.getOnPageFinishedHelper(), - pageUrl); - assertEquals(2, webServer.getRequestCount(pagePath)); + mActivityTestRule.clearCacheOnUiThread(awContents, true); + mActivityTestRule.loadUrlSync( + awContents, mContentsClient.getOnPageFinishedHelper(), pageUrl); + Assert.assertEquals(2, webServer.getRequestCount(pagePath)); } finally { webServer.shutdown(); } } + @Test @SmallTest @Feature({"AndroidWebView"}) public void testClearCacheInQuickSuccession() throws Throwable { final AwTestContainerView testContainer = - createAwTestContainerViewOnMainSync(new TestAwContentsClient()); + mActivityTestRule.createAwTestContainerViewOnMainSync(new TestAwContentsClient()); final AwContents awContents = testContainer.getAwContents(); - runTestOnUiThread(new Runnable() { + InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() { @Override public void run() { for (int i = 0; i < 10; ++i) { @@ -279,11 +311,13 @@ }); } + @Test @SmallTest @Feature({"AndroidWebView"}) public void testGetFavicon() throws Throwable { AwContents.setShouldDownloadFavicons(); - final AwTestContainerView testView = createAwTestContainerViewOnMainSync(mContentsClient); + final AwTestContainerView testView = + mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient); final AwContents awContents = testView.getAwContents(); TestWebServer webServer = TestWebServer.start(); @@ -298,10 +332,11 @@ // the page load completes which makes it slightly hard to test. final Bitmap defaultFavicon = awContents.getFavicon(); - getAwSettingsOnUiThread(awContents).setImagesEnabled(true); - loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(), pageUrl); + mActivityTestRule.getAwSettingsOnUiThread(awContents).setImagesEnabled(true); + mActivityTestRule.loadUrlSync( + awContents, mContentsClient.getOnPageFinishedHelper(), pageUrl); - pollUiThread(new Callable<Boolean>() { + mActivityTestRule.pollUiThread(new Callable<Boolean>() { @Override public Boolean call() { return awContents.getFavicon() != null @@ -312,19 +347,21 @@ final Object originalFaviconSource = (new URL(faviconUrl)).getContent(); final Bitmap originalFavicon = BitmapFactory.decodeStream((InputStream) originalFaviconSource); - assertNotNull(originalFavicon); + Assert.assertNotNull(originalFavicon); - assertTrue(awContents.getFavicon().sameAs(originalFavicon)); + Assert.assertTrue(awContents.getFavicon().sameAs(originalFavicon)); } finally { webServer.shutdown(); } } + @Test @Feature({"AndroidWebView", "Downloads"}) @SmallTest public void testDownload() throws Throwable { - AwTestContainerView testView = createAwTestContainerViewOnMainSync(mContentsClient); + AwTestContainerView testView = + mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient); AwContents awContents = testView.getAwContents(); final String data = "download data"; @@ -343,42 +380,47 @@ final OnDownloadStartHelper downloadStartHelper = mContentsClient.getOnDownloadStartHelper(); final int callCount = downloadStartHelper.getCallCount(); - loadUrlAsync(awContents, pageUrl); + mActivityTestRule.loadUrlAsync(awContents, pageUrl); downloadStartHelper.waitForCallback(callCount); - assertEquals(pageUrl, downloadStartHelper.getUrl()); - assertEquals(contentDisposition, downloadStartHelper.getContentDisposition()); - assertEquals(mimeType, downloadStartHelper.getMimeType()); - assertEquals(data.length(), downloadStartHelper.getContentLength()); + Assert.assertEquals(pageUrl, downloadStartHelper.getUrl()); + Assert.assertEquals(contentDisposition, downloadStartHelper.getContentDisposition()); + Assert.assertEquals(mimeType, downloadStartHelper.getMimeType()); + Assert.assertEquals(data.length(), downloadStartHelper.getContentLength()); } finally { webServer.shutdown(); } } + @Test @Feature({"AndroidWebView", "setNetworkAvailable"}) @SmallTest public void testSetNetworkAvailable() throws Throwable { - AwTestContainerView testView = createAwTestContainerViewOnMainSync(mContentsClient); + AwTestContainerView testView = + mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient); AwContents awContents = testView.getAwContents(); String script = "navigator.onLine"; - enableJavaScriptOnUiThread(awContents); - loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(), + mActivityTestRule.enableJavaScriptOnUiThread(awContents); + mActivityTestRule.loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(), ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL); // Default to "online". - assertEquals("true", executeJavaScriptAndWaitForResult(awContents, mContentsClient, - script)); + Assert.assertEquals("true", + mActivityTestRule.executeJavaScriptAndWaitForResult( + awContents, mContentsClient, script)); // Forcing "offline". - setNetworkAvailableOnUiThread(awContents, false); - assertEquals("false", executeJavaScriptAndWaitForResult(awContents, mContentsClient, - script)); + mActivityTestRule.setNetworkAvailableOnUiThread(awContents, false); + Assert.assertEquals("false", + mActivityTestRule.executeJavaScriptAndWaitForResult( + awContents, mContentsClient, script)); // Forcing "online". - setNetworkAvailableOnUiThread(awContents, true); - assertEquals("true", executeJavaScriptAndWaitForResult(awContents, mContentsClient, - script)); + mActivityTestRule.setNetworkAvailableOnUiThread(awContents, true); + Assert.assertEquals("true", + mActivityTestRule.executeJavaScriptAndWaitForResult( + awContents, mContentsClient, script)); } @@ -394,13 +436,15 @@ } } + @Test @Feature({"AndroidWebView", "Android-JavaBridge"}) @SmallTest public void testJavaBridge() throws Throwable { - final AwTestContainerView testView = createAwTestContainerViewOnMainSync(mContentsClient); + final AwTestContainerView testView = + mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient); final CallbackHelper callback = new CallbackHelper(); - runTestOnUiThread(new Runnable() { + InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() { @Override public void run() { AwContents awContents = testView.getAwContents(); @@ -413,56 +457,64 @@ callback.waitForCallback(0, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS); } + @Test @Feature({"AndroidWebView"}) @SmallTest public void testEscapingOfErrorPage() throws Throwable { - AwTestContainerView testView = createAwTestContainerViewOnMainSync(mContentsClient); + AwTestContainerView testView = + mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient); AwContents awContents = testView.getAwContents(); String script = "window.failed == true"; - enableJavaScriptOnUiThread(awContents); + mActivityTestRule.enableJavaScriptOnUiThread(awContents); CallbackHelper onPageFinishedHelper = mContentsClient.getOnPageFinishedHelper(); int currentCallCount = onPageFinishedHelper.getCallCount(); - loadUrlAsync(awContents, + mActivityTestRule.loadUrlAsync(awContents, "file:///file-that-does-not-exist#<script>window.failed = true;</script>"); - onPageFinishedHelper.waitForCallback(currentCallCount, 1, WAIT_TIMEOUT_MS, - TimeUnit.MILLISECONDS); + onPageFinishedHelper.waitForCallback( + currentCallCount, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS); - assertEquals("false", executeJavaScriptAndWaitForResult(awContents, mContentsClient, - script)); + Assert.assertEquals("false", + mActivityTestRule.executeJavaScriptAndWaitForResult( + awContents, mContentsClient, script)); } + @Test @SuppressFBWarnings("DLS_DEAD_LOCAL_STORE") @Feature({"AndroidWebView"}) @SmallTest public void testCanInjectHeaders() throws Throwable { final AwTestContainerView testContainer = - createAwTestContainerViewOnMainSync(mContentsClient); + mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient); final AwContents awContents = testContainer.getAwContents(); - enableJavaScriptOnUiThread(awContents); + mActivityTestRule.enableJavaScriptOnUiThread(awContents); - EmbeddedTestServer testServer = - EmbeddedTestServer.createAndStartServer(getInstrumentation().getContext()); + EmbeddedTestServer testServer = EmbeddedTestServer.createAndStartServer( + InstrumentationRegistry.getInstrumentation().getContext()); try { String url = testServer.getURL("/echoheader?X-foo"); final Map<String, String> extraHeaders = new HashMap<String, String>(); extraHeaders.put("X-foo", "bar"); - loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(), url, extraHeaders); + mActivityTestRule.loadUrlSync( + awContents, mContentsClient.getOnPageFinishedHelper(), url, extraHeaders); - String xfoo = getJavaScriptResultBodyTextContent(awContents, mContentsClient); - assertEquals("bar", xfoo); + String xfoo = mActivityTestRule.getJavaScriptResultBodyTextContent( + awContents, mContentsClient); + Assert.assertEquals("bar", xfoo); url = testServer.getURL("/echoheader?Referer"); extraHeaders.clear(); extraHeaders.put("Referer", "http://www.example.com/"); - loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(), url, extraHeaders); + mActivityTestRule.loadUrlSync( + awContents, mContentsClient.getOnPageFinishedHelper(), url, extraHeaders); - String referer = getJavaScriptResultBodyTextContent(awContents, mContentsClient); - assertEquals("http://www.example.com/", referer); + String referer = mActivityTestRule.getJavaScriptResultBodyTextContent( + awContents, mContentsClient); + Assert.assertEquals("http://www.example.com/", referer); } finally { testServer.stopAndDestroyServer(); } @@ -471,17 +523,19 @@ // This is a meta test that we don't accidentally turn off hardware // acceleration in instrumentation tests without notice. Do not add the // @DisableHardwareAccelerationForTest annotation for this test. + @Test @Feature({"AndroidWebView"}) @SmallTest public void testHardwareModeWorks() throws Throwable { AwTestContainerView testContainer = - createAwTestContainerViewOnMainSync(mContentsClient); - assertTrue(testContainer.isHardwareAccelerated()); - assertTrue(testContainer.isBackedByHardwareView()); + mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient); + Assert.assertTrue(testContainer.isHardwareAccelerated()); + Assert.assertTrue(testContainer.isBackedByHardwareView()); } // TODO(hush): more ssl tests. And put the ssl tests into a separate test // class. + @Test @Feature({"AndroidWebView"}) @SmallTest // If the user allows the ssl error, the same ssl error will not trigger @@ -489,7 +543,7 @@ // error will still trigger the onReceivedSslError callback. public void testSslPreferences() throws Throwable { final AwTestContainerView testContainer = - createAwTestContainerViewOnMainSync(mContentsClient); + mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient); final AwContents awContents = testContainer.getAwContents(); TestWebServer webServer = TestWebServer.startSsl(); final String pagePath = "/hello.html"; @@ -499,54 +553,62 @@ mContentsClient.getOnReceivedSslErrorHelper(); int onSslErrorCallCount = onReceivedSslErrorHelper.getCallCount(); - loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(), pageUrl); + mActivityTestRule.loadUrlSync( + awContents, mContentsClient.getOnPageFinishedHelper(), pageUrl); - assertEquals(onSslErrorCallCount + 1, onReceivedSslErrorHelper.getCallCount()); - assertEquals(1, webServer.getRequestCount(pagePath)); + Assert.assertEquals(onSslErrorCallCount + 1, onReceivedSslErrorHelper.getCallCount()); + Assert.assertEquals(1, webServer.getRequestCount(pagePath)); // Now load the page again. This time, we expect no ssl error, because // user's decision should be remembered. onSslErrorCallCount = onReceivedSslErrorHelper.getCallCount(); - loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(), pageUrl); - assertEquals(onSslErrorCallCount, onReceivedSslErrorHelper.getCallCount()); + mActivityTestRule.loadUrlSync( + awContents, mContentsClient.getOnPageFinishedHelper(), pageUrl); + Assert.assertEquals(onSslErrorCallCount, onReceivedSslErrorHelper.getCallCount()); // Now clear the ssl preferences then load the same url again. Expect to see // onReceivedSslError getting called again. awContents.clearSslPreferences(); onSslErrorCallCount = onReceivedSslErrorHelper.getCallCount(); - loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(), pageUrl); - assertEquals(onSslErrorCallCount + 1, onReceivedSslErrorHelper.getCallCount()); + mActivityTestRule.loadUrlSync( + awContents, mContentsClient.getOnPageFinishedHelper(), pageUrl); + Assert.assertEquals(onSslErrorCallCount + 1, onReceivedSslErrorHelper.getCallCount()); // Now clear the stored decisions and tell the client to deny ssl errors. awContents.clearSslPreferences(); mContentsClient.setAllowSslError(false); onSslErrorCallCount = onReceivedSslErrorHelper.getCallCount(); - loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(), pageUrl); - assertEquals(onSslErrorCallCount + 1, onReceivedSslErrorHelper.getCallCount()); + mActivityTestRule.loadUrlSync( + awContents, mContentsClient.getOnPageFinishedHelper(), pageUrl); + Assert.assertEquals(onSslErrorCallCount + 1, onReceivedSslErrorHelper.getCallCount()); // Now load the same page again. This time, we still expect onReceivedSslError, // because we only remember user's decision if it is "allow". onSslErrorCallCount = onReceivedSslErrorHelper.getCallCount(); - loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(), pageUrl); - assertEquals(onSslErrorCallCount + 1, onReceivedSslErrorHelper.getCallCount()); + mActivityTestRule.loadUrlSync( + awContents, mContentsClient.getOnPageFinishedHelper(), pageUrl); + Assert.assertEquals(onSslErrorCallCount + 1, onReceivedSslErrorHelper.getCallCount()); } /** * Verifies that Web Notifications and the Push API are not exposed in WebView. */ + @Test @Feature({"AndroidWebView"}) @SmallTest public void testPushAndNotificationsDisabled() throws Throwable { - AwTestContainerView testView = createAwTestContainerViewOnMainSync(mContentsClient); + AwTestContainerView testView = + mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient); AwContents awContents = testView.getAwContents(); String script = "window.Notification || window.PushManager"; - enableJavaScriptOnUiThread(awContents); - loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(), + mActivityTestRule.enableJavaScriptOnUiThread(awContents); + mActivityTestRule.loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(), ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL); - assertEquals("null", executeJavaScriptAndWaitForResult(awContents, mContentsClient, - script)); + Assert.assertEquals("null", + mActivityTestRule.executeJavaScriptAndWaitForResult( + awContents, mContentsClient, script)); } private static class MockBindingManager implements BindingManager { @@ -573,8 +635,8 @@ } catch (InterruptedException e) { } } - assertTrue(mForegroundState.size() != 0); - assertEquals(inForeground, mForegroundState.get(0).booleanValue()); + Assert.assertTrue(mForegroundState.size() != 0); + Assert.assertEquals(inForeground, mForegroundState.get(0)); mForegroundState.remove(0); return; } @@ -612,6 +674,7 @@ /** * Verifies that a child process is actually gets created with WEBVIEW_SANDBOXED_RENDERER flag. */ + @Test @Feature({"AndroidWebView"}) @SmallTest @CommandLineFlags.Add(AwSwitches.WEBVIEW_SANDBOXED_RENDERER) @@ -619,21 +682,24 @@ public void testSandboxedRendererWorks() throws Throwable { MockBindingManager bindingManager = new MockBindingManager(); ChildProcessLauncherHelper.setBindingManagerForTesting(bindingManager); - assertFalse(bindingManager.isChildProcessCreated()); + Assert.assertFalse(bindingManager.isChildProcessCreated()); - AwTestContainerView testView = createAwTestContainerViewOnMainSync(mContentsClient); + AwTestContainerView testView = + mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient); AwContents awContents = testView.getAwContents(); final String pageTitle = "I am sandboxed"; - loadDataSync(awContents, mContentsClient.getOnPageFinishedHelper(), + mActivityTestRule.loadDataSync(awContents, mContentsClient.getOnPageFinishedHelper(), "<html><head><title>" + pageTitle + "</title></head></html>", "text/html", false); - assertEquals(pageTitle, getTitleOnUiThread(awContents)); + Assert.assertEquals(pageTitle, mActivityTestRule.getTitleOnUiThread(awContents)); - assertTrue(bindingManager.isChildProcessCreated()); + Assert.assertTrue(bindingManager.isChildProcessCreated()); // Test end-to-end interaction with the renderer. - AwSettings awSettings = getAwSettingsOnUiThread(awContents); + AwSettings awSettings = mActivityTestRule.getAwSettingsOnUiThread(awContents); awSettings.setJavaScriptEnabled(true); - assertEquals("42", JSUtils.executeJavaScriptAndWaitForResult(this, awContents, + Assert.assertEquals("42", + JSUtils.executeJavaScriptAndWaitForResult( + InstrumentationRegistry.getInstrumentation(), awContents, mContentsClient.getOnEvaluateJavaScriptResultHelper(), "21 + 21")); } @@ -641,6 +707,7 @@ * By default the renderer should be considererd to be in the * foreground. */ + @Test @Feature({"AndroidWebView"}) @SmallTest @CommandLineFlags.Add(AwSwitches.WEBVIEW_SANDBOXED_RENDERER) @@ -648,14 +715,15 @@ public void testRendererPriorityStartsHigh() throws Throwable { MockBindingManager bindingManager = new MockBindingManager(); ChildProcessLauncherHelper.setBindingManagerForTesting(bindingManager); - assertFalse(bindingManager.isChildProcessCreated()); + Assert.assertFalse(bindingManager.isChildProcessCreated()); - AwTestContainerView testView = createAwTestContainerViewOnMainSync(mContentsClient); + AwTestContainerView testView = + mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient); AwContents awContents = testView.getAwContents(); - loadDataSync(awContents, mContentsClient.getOnPageFinishedHelper(), "<html></html>", - "text/html", false); + mActivityTestRule.loadDataSync(awContents, mContentsClient.getOnPageFinishedHelper(), + "<html></html>", "text/html", false); - assertTrue(bindingManager.isChildProcessCreated()); + Assert.assertTrue(bindingManager.isChildProcessCreated()); bindingManager.assertSetInForegroundCall(true); } @@ -663,6 +731,7 @@ * If we specify that the priority is WAIVED, then the renderer * should not be in the foreground. */ + @Test @Feature({"AndroidWebView"}) @SmallTest @CommandLineFlags.Add(AwSwitches.WEBVIEW_SANDBOXED_RENDERER) @@ -670,21 +739,22 @@ public void testRendererPriorityLow() throws Throwable { MockBindingManager bindingManager = new MockBindingManager(); ChildProcessLauncherHelper.setBindingManagerForTesting(bindingManager); - assertFalse(bindingManager.isChildProcessCreated()); + Assert.assertFalse(bindingManager.isChildProcessCreated()); - final AwTestContainerView testView = createAwTestContainerViewOnMainSync(mContentsClient); + final AwTestContainerView testView = + mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient); final AwContents awContents = testView.getAwContents(); - runTestOnUiThread(new Runnable() { + InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() { @Override public void run() { awContents.setRendererPriorityPolicy(RendererPriority.WAIVED, false); } }); - loadDataSync(awContents, mContentsClient.getOnPageFinishedHelper(), "<html></html>", - "text/html", false); + mActivityTestRule.loadDataSync(awContents, mContentsClient.getOnPageFinishedHelper(), + "<html></html>", "text/html", false); - assertTrue(awContents.isPageVisible()); - assertTrue(bindingManager.isChildProcessCreated()); + Assert.assertTrue(awContents.isPageVisible()); + Assert.assertTrue(bindingManager.isChildProcessCreated()); bindingManager.assertSetInForegroundCall(false); } @@ -693,6 +763,7 @@ * background, then pausing the view should send the renderer to * the background. */ + @Test @Feature({"AndroidWebView"}) @SmallTest @CommandLineFlags.Add(AwSwitches.WEBVIEW_SANDBOXED_RENDERER) @@ -700,23 +771,24 @@ public void testRendererPriorityManaged() throws Throwable { MockBindingManager bindingManager = new MockBindingManager(); ChildProcessLauncherHelper.setBindingManagerForTesting(bindingManager); - assertFalse(bindingManager.isChildProcessCreated()); + Assert.assertFalse(bindingManager.isChildProcessCreated()); - final AwTestContainerView testView = createAwTestContainerViewOnMainSync(mContentsClient); + final AwTestContainerView testView = + mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient); final AwContents awContents = testView.getAwContents(); - runTestOnUiThread(new Runnable() { + InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() { @Override public void run() { awContents.setRendererPriorityPolicy(RendererPriority.HIGH, true); } }); - loadDataSync(awContents, mContentsClient.getOnPageFinishedHelper(), "<html></html>", - "text/html", false); + mActivityTestRule.loadDataSync(awContents, mContentsClient.getOnPageFinishedHelper(), + "<html></html>", "text/html", false); - assertTrue(awContents.isPageVisible()); - assertTrue(bindingManager.isChildProcessCreated()); + Assert.assertTrue(awContents.isPageVisible()); + Assert.assertTrue(bindingManager.isChildProcessCreated()); bindingManager.assertSetInForegroundCall(true); - runTestOnUiThread(new Runnable() { + InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() { @Override public void run() { awContents.onPause(); @@ -725,30 +797,39 @@ bindingManager.assertSetInForegroundCall(false); } + @Test @Feature({"AndroidWebView"}) @SmallTest - @UiThreadTest @CommandLineFlags.Add(AwSwitches.WEBVIEW_SANDBOXED_RENDERER) @SkipCommandLineParameterization public void testPauseDestroyResume() throws Throwable { - AwContents awContents; - awContents = createAwTestContainerView(mContentsClient).getAwContents(); - awContents.pauseTimers(); - awContents.pauseTimers(); - awContents.destroy(); - awContents = createAwTestContainerView(mContentsClient).getAwContents(); - awContents.resumeTimers(); + mActivityTestRule.runOnUiThread(new Runnable() { + @Override + public void run() { + AwContents awContents; + awContents = mActivityTestRule.createAwTestContainerView(mContentsClient) + .getAwContents(); + awContents.pauseTimers(); + awContents.pauseTimers(); + awContents.destroy(); + awContents = mActivityTestRule.createAwTestContainerView(mContentsClient) + .getAwContents(); + awContents.resumeTimers(); + } + }); } /** Regression test for https://crbug.com/732976. Load a data URL, then immediately * after that load a javascript URL. The data URL navigation shouldn't be blocked. */ + @Test @LargeTest @Feature({"AndroidWebView"}) public void testJavaScriptUrlAfterLoadData() throws Throwable { - AwTestContainerView testView = createAwTestContainerViewOnMainSync(mContentsClient); + AwTestContainerView testView = + mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient); final AwContents awContents = testView.getAwContents(); - getInstrumentation().runOnMainSync(new Runnable() { + mActivityTestRule.runOnUiThread(new Runnable() { @Override public void run() { // Run javascript navigation immediately, without waiting for the completion of data @@ -760,10 +841,10 @@ mContentsClient.getOnPageFinishedHelper().waitForCallback( 0, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS); - assertEquals("data:text/html,<html>test</html>", awContents.getLastCommittedUrl()); + Assert.assertEquals("data:text/html,<html>test</html>", awContents.getLastCommittedUrl()); TestAwContentsClient.AddMessageToConsoleHelper consoleHelper = mContentsClient.getAddMessageToConsoleHelper(); - assertEquals(0, consoleHelper.getMessages().size()); + Assert.assertEquals(0, consoleHelper.getMessages().size()); } }
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwSecondBrowserProcessTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwSecondBrowserProcessTest.java index 328b864..a864b82c 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwSecondBrowserProcessTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwSecondBrowserProcessTest.java
@@ -31,7 +31,7 @@ private int mSecondBrowserServicePid; @Override - protected boolean needsBrowserProcessStarted() { + public boolean needsBrowserProcessStarted() { return false; }
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java index eb19757..fd5db6f5e 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java
@@ -2930,7 +2930,7 @@ } @Override - protected TestDependencyFactory createTestDependencyFactory() { + public TestDependencyFactory createTestDependencyFactory() { if (mOverridenFactory == null) { return new TestDependencyFactory(); } else { @@ -2960,12 +2960,12 @@ final AwTestContainerView mContainerView = createAwTestContainerViewOnMainSync(client); final AwContents awContents = mContainerView.getAwContents(); enableJavaScriptOnUiThread(awContents); - JSUtils.executeJavaScriptAndWaitForResult(this, awContents, + JSUtils.executeJavaScriptAndWaitForResult(getInstrumentation(), awContents, client.getOnEvaluateJavaScriptResultHelper(), "window.emptyDocumentPersistenceTest = true;"); loadUrlSync(awContents, client.getOnPageFinishedHelper(), ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL); - String result = JSUtils.executeJavaScriptAndWaitForResult(this, awContents, + String result = JSUtils.executeJavaScriptAndWaitForResult(getInstrumentation(), awContents, client.getOnEvaluateJavaScriptResultHelper(), "window.emptyDocumentPersistenceTest ? 'set' : 'not set';"); assertEquals(allow ? "\"set\"" : "\"not set\"", result); @@ -3038,12 +3038,12 @@ awContents, client.getOnPageFinishedHelper(), testPageHtml, "text/html", false); // Focus on an empty DIV. - JSUtils.executeJavaScriptAndWaitForResult(this, awContents, + JSUtils.executeJavaScriptAndWaitForResult(getInstrumentation(), awContents, client.getOnEvaluateJavaScriptResultHelper(), "window.a.focus();"); assertEquals(1, getSelectionChangeCountForSelectionUpdateTest(awContents, client)); // Create and delete a zero-width space. See crbug.com/698752 for details. - JSUtils.executeJavaScriptAndWaitForResult(this, awContents, + JSUtils.executeJavaScriptAndWaitForResult(getInstrumentation(), awContents, client.getOnEvaluateJavaScriptResultHelper(), "(function() {" + "var sel = window.getSelection();" @@ -3075,16 +3075,16 @@ String expectedTitle = Integer.toString(mTitleIdx); // Since selectionchange event is posted on a message loop, we run another message loop // before we get the result. On Chromium both run on the same message loop. - JSUtils.executeJavaScriptAndWaitForResult(this, awContents, + JSUtils.executeJavaScriptAndWaitForResult(getInstrumentation(), awContents, client.getOnEvaluateJavaScriptResultHelper(), "setTimeout(function() { document.title = '" + expectedTitle + "'; });"); pollTitleAs(expectedTitle, awContents); - String result = JSUtils.executeJavaScriptAndWaitForResult( - this, awContents, client.getOnEvaluateJavaScriptResultHelper(), "window.cnt"); + String result = JSUtils.executeJavaScriptAndWaitForResult(getInstrumentation(), awContents, + client.getOnEvaluateJavaScriptResultHelper(), "window.cnt"); // Clean up - JSUtils.executeJavaScriptAndWaitForResult( - this, awContents, client.getOnEvaluateJavaScriptResultHelper(), "window.cnt = 0;"); + JSUtils.executeJavaScriptAndWaitForResult(getInstrumentation(), awContents, + client.getOnEvaluateJavaScriptResultHelper(), "window.cnt = 0;"); return Integer.parseInt(result); }
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwStrictModeTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwStrictModeTest.java index 898d9eb..80f6261 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwStrictModeTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwStrictModeTest.java
@@ -33,13 +33,13 @@ } @Override - protected boolean needsAwBrowserContextCreated() { + public boolean needsAwBrowserContextCreated() { return false; } @Override - protected boolean needsBrowserProcessStarted() { + public boolean needsBrowserProcessStarted() { // Don't start the browser process in AwTestBase - we want to start it ourselves with // strictmode policies turned on. return false;
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwTestBase.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwTestBase.java index f67a272..c39c643 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwTestBase.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwTestBase.java
@@ -9,12 +9,9 @@ import android.app.Instrumentation; import android.content.Context; import android.os.Build; -import android.util.AndroidRuntimeException; -import android.util.Log; import android.view.ViewGroup; import org.chromium.android_webview.AwBrowserContext; -import org.chromium.android_webview.AwBrowserProcess; import org.chromium.android_webview.AwContents; import org.chromium.android_webview.AwContents.DependencyFactory; import org.chromium.android_webview.AwContents.InternalAccessDelegate; @@ -22,18 +19,13 @@ import org.chromium.android_webview.AwContentsClient; import org.chromium.android_webview.AwSettings; import org.chromium.android_webview.AwSwitches; -import org.chromium.android_webview.test.util.GraphicsTestUtils; -import org.chromium.android_webview.test.util.JSUtils; -import org.chromium.base.ThreadUtils; +import org.chromium.android_webview.test.AwTestCommon.AwTestCommonCallback; +import org.chromium.base.Log; import org.chromium.base.test.BaseActivityInstrumentationTestCase; import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.InMemorySharedPreferences; import org.chromium.base.test.util.MinAndroidSdkLevel; import org.chromium.base.test.util.parameter.CommandLineParameter; -import org.chromium.content.browser.test.util.Criteria; -import org.chromium.content.browser.test.util.CriteriaHelper; -import org.chromium.content.browser.test.util.TestCallbackHelperContainer.OnPageFinishedHelper; -import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.net.test.util.TestWebServer; import java.lang.annotation.Annotation; @@ -41,94 +33,102 @@ import java.lang.reflect.Method; import java.util.Map; import java.util.concurrent.Callable; -import java.util.concurrent.FutureTask; -import java.util.concurrent.TimeUnit; -import java.util.regex.Matcher; -import java.util.regex.Pattern; /** - * A base class for android_webview tests. WebView only runs on KitKat and later, - * so make sure no one attempts to run the tests on earlier OS releases. - * - * By default, all tests run both in single-process mode, and with sandboxed renderer. - * If a test doesn't yet work with sandboxed renderer, an entire class, or an individual test - * method can be marked for single-process testing only by adding the following annotation: - * - * @SkipCommandLineParameterization + * A base class for android_webview tests. WebView only runs on KitKat and + * later, so make sure no one attempts to run the tests on earlier OS releases. + * By default, all tests run both in single-process mode, and with sandboxed + * renderer. If a test doesn't yet work with sandboxed renderer, an entire + * class, or an individual test method can be marked for single-process testing + * only by adding @SkipCommandLineParameterization to the test */ @MinAndroidSdkLevel(Build.VERSION_CODES.KITKAT) @CommandLineParameter({"", AwSwitches.WEBVIEW_SANDBOXED_RENDERER}) -public class AwTestBase extends BaseActivityInstrumentationTestCase<AwTestRunnerActivity> { - public static final long WAIT_TIMEOUT_MS = scaleTimeout(15000); - public static final int CHECK_INTERVAL = 100; +public class AwTestBase extends BaseActivityInstrumentationTestCase<AwTestRunnerActivity> + implements AwTestCommonCallback { private static final String TAG = "AwTestBase"; - private static final Pattern MAYBE_QUOTED_STRING = Pattern.compile("^(\"?)(.*)\\1$"); - // The browser context needs to be a process-wide singleton. - private AwBrowserContext mBrowserContext; + public static final long WAIT_TIMEOUT_MS = scaleTimeout(15000); + + public static final int CHECK_INTERVAL = 100; + + private final AwTestCommon mTestCommon; public AwTestBase() { super(AwTestRunnerActivity.class); + mTestCommon = new AwTestCommon(this); } @Override protected void setUp() throws Exception { - if (needsAwBrowserContextCreated()) { - createAwBrowserContext(); - } - - super.setUp(); - if (needsBrowserProcessStarted()) { - startBrowserProcess(); - } + mTestCommon.setUp(); } - protected void createAwBrowserContext() { - if (mBrowserContext != null) { - throw new AndroidRuntimeException("There should only be one browser context."); - } - getActivity(); // The Activity must be launched in order to load native code - final InMemorySharedPreferences prefs = new InMemorySharedPreferences(); - final Context appContext = getInstrumentation().getTargetContext().getApplicationContext(); - getInstrumentation().runOnMainSync(new Runnable() { - @Override - public void run() { - mBrowserContext = createAwBrowserContextOnUiThread(prefs, appContext); - } - }); - } - - protected AwBrowserContext createAwBrowserContextOnUiThread( + @Override + public AwBrowserContext createAwBrowserContextOnUiThread( InMemorySharedPreferences prefs, Context appContext) { return new AwBrowserContext(prefs, appContext); } + @Override + public TestDependencyFactory createTestDependencyFactory() { + return new TestDependencyFactory(); + } + + /** + * Override this to return false if the test doesn't want to create an + * AwBrowserContext automatically. + */ + @Override + public boolean needsAwBrowserContextCreated() { + return true; + } + + /** + * Override this to return false if the test doesn't want the browser + * startup sequence to be run automatically. + * + * @return Whether the instrumentation test requires the browser process to + * already be started. + */ + @Override + public boolean needsBrowserProcessStarted() { + return true; + } + + /** + * Checks the current test has |clazz| annotation. Note this swallows + * NoSuchMethodException and returns false in that case. + */ + @Override + public boolean testMethodHasAnnotation(Class<? extends Annotation> clazz) { + String testName = getName(); + Method method = null; + try { + method = getClass().getMethod(testName); + } catch (NoSuchMethodException e) { + Log.w(TAG, "Test method name not found.", e); + return false; + } + + // Cast to AnnotatedElement to work around a compilation failure. + // Method.isAnnotationPresent() was removed in Java 8 (which is used by + // the Android N SDK), + // so compilation with Java 7 fails. See crbug.com/608792. + return ((AnnotatedElement) method).isAnnotationPresent(clazz); + } + + @Override + public void runOnUiThread(Runnable runnable) { + getInstrumentation().runOnMainSync(runnable); + } + + protected void createAwBrowserContext() { + mTestCommon.createAwBrowserContext(); + } + protected void startBrowserProcess() throws Exception { - // The Activity must be launched in order for proper webview statics to be setup. - getActivity(); - getInstrumentation().runOnMainSync(new Runnable() { - @Override - public void run() { - AwBrowserProcess.start(); - } - }); - } - - /** - * Override this to return false if the test doesn't want to create an AwBrowserContext - * automatically. - */ - protected boolean needsAwBrowserContextCreated() { - return true; - } - - /** - * Override this to return false if the test doesn't want the browser startup sequence to - * be run automatically. - * @return Whether the instrumentation test requires the browser process to already be started. - */ - protected boolean needsBrowserProcessStarted() { - return true; + mTestCommon.startBrowserProcess(); } /** @@ -141,28 +141,16 @@ */ public <R> R runTestOnUiThreadAndGetResult(Callable<R> callable) throws Exception { - FutureTask<R> task = new FutureTask<R>(callable); - getInstrumentation().runOnMainSync(task); - return task.get(); + return mTestCommon.runTestOnUiThreadAndGetResult(callable); } public void enableJavaScriptOnUiThread(final AwContents awContents) { - getInstrumentation().runOnMainSync(new Runnable() { - @Override - public void run() { - awContents.getSettings().setJavaScriptEnabled(true); - } - }); + mTestCommon.enableJavaScriptOnUiThread(awContents); } public void setNetworkAvailableOnUiThread(final AwContents awContents, final boolean networkUp) { - getInstrumentation().runOnMainSync(new Runnable() { - @Override - public void run() { - awContents.setNetworkAvailable(networkUp); - } - }); + mTestCommon.setNetworkAvailableOnUiThread(awContents, networkUp); } /** @@ -171,30 +159,22 @@ public void loadUrlSync(final AwContents awContents, CallbackHelper onPageFinishedHelper, final String url) throws Exception { - loadUrlSync(awContents, onPageFinishedHelper, url, null); + mTestCommon.loadUrlSync(awContents, onPageFinishedHelper, url); } public void loadUrlSync(final AwContents awContents, CallbackHelper onPageFinishedHelper, final String url, final Map<String, String> extraHeaders) throws Exception { - int currentCallCount = onPageFinishedHelper.getCallCount(); - loadUrlAsync(awContents, url, extraHeaders); - onPageFinishedHelper.waitForCallback(currentCallCount, 1, WAIT_TIMEOUT_MS, - TimeUnit.MILLISECONDS); + mTestCommon.loadUrlSync(awContents, onPageFinishedHelper, url, extraHeaders); } public void loadUrlSyncAndExpectError(final AwContents awContents, CallbackHelper onPageFinishedHelper, CallbackHelper onReceivedErrorHelper, final String url) throws Exception { - int onErrorCallCount = onReceivedErrorHelper.getCallCount(); - int onFinishedCallCount = onPageFinishedHelper.getCallCount(); - loadUrlAsync(awContents, url); - onReceivedErrorHelper.waitForCallback(onErrorCallCount, 1, WAIT_TIMEOUT_MS, - TimeUnit.MILLISECONDS); - onPageFinishedHelper.waitForCallback(onFinishedCallCount, 1, WAIT_TIMEOUT_MS, - TimeUnit.MILLISECONDS); + mTestCommon.loadUrlSyncAndExpectError( + awContents, onPageFinishedHelper, onReceivedErrorHelper, url); } /** @@ -202,18 +182,13 @@ */ public void loadUrlAsync(final AwContents awContents, final String url) throws Exception { - loadUrlAsync(awContents, url, null); + mTestCommon.loadUrlAsync(awContents, url); } public void loadUrlAsync(final AwContents awContents, final String url, final Map<String, String> extraHeaders) { - getInstrumentation().runOnMainSync(new Runnable() { - @Override - public void run() { - awContents.loadUrl(url, extraHeaders); - } - }); + mTestCommon.loadUrlAsync(awContents, url, extraHeaders); } /** @@ -222,10 +197,7 @@ public void postUrlSync(final AwContents awContents, CallbackHelper onPageFinishedHelper, final String url, byte[] postData) throws Exception { - int currentCallCount = onPageFinishedHelper.getCallCount(); - postUrlAsync(awContents, url, postData); - onPageFinishedHelper.waitForCallback(currentCallCount, 1, WAIT_TIMEOUT_MS, - TimeUnit.MILLISECONDS); + mTestCommon.postUrlSync(awContents, onPageFinishedHelper, url, postData); } /** @@ -233,17 +205,7 @@ */ public void postUrlAsync(final AwContents awContents, final String url, byte[] postData) throws Exception { - class PostUrl implements Runnable { - byte[] mPostData; - public PostUrl(byte[] postData) { - mPostData = postData; - } - @Override - public void run() { - awContents.postUrl(url, mPostData); - } - } - getInstrumentation().runOnMainSync(new PostUrl(postData)); + mTestCommon.postUrlAsync(awContents, url, postData); } /** @@ -253,10 +215,7 @@ CallbackHelper onPageFinishedHelper, final String data, final String mimeType, final boolean isBase64Encoded) throws Exception { - int currentCallCount = onPageFinishedHelper.getCallCount(); - loadDataAsync(awContents, data, mimeType, isBase64Encoded); - onPageFinishedHelper.waitForCallback(currentCallCount, 1, WAIT_TIMEOUT_MS, - TimeUnit.MILLISECONDS); + mTestCommon.loadDataSync(awContents, onPageFinishedHelper, data, mimeType, isBase64Encoded); } public void loadDataSyncWithCharset(final AwContents awContents, @@ -264,16 +223,8 @@ final String data, final String mimeType, final boolean isBase64Encoded, final String charset) throws Exception { - int currentCallCount = onPageFinishedHelper.getCallCount(); - getInstrumentation().runOnMainSync(new Runnable() { - @Override - public void run() { - awContents.loadUrl(LoadUrlParams.createLoadDataParams( - data, mimeType, isBase64Encoded, charset)); - } - }); - onPageFinishedHelper.waitForCallback(currentCallCount, 1, WAIT_TIMEOUT_MS, - TimeUnit.MILLISECONDS); + mTestCommon.loadDataSyncWithCharset( + awContents, onPageFinishedHelper, data, mimeType, isBase64Encoded, charset); } /** @@ -282,34 +233,22 @@ public void loadDataAsync(final AwContents awContents, final String data, final String mimeType, final boolean isBase64Encoded) throws Exception { - getInstrumentation().runOnMainSync(new Runnable() { - @Override - public void run() { - awContents.loadData(data, mimeType, isBase64Encoded ? "base64" : null); - } - }); + mTestCommon.loadDataAsync(awContents, data, mimeType, isBase64Encoded); } public void loadDataWithBaseUrlSync(final AwContents awContents, CallbackHelper onPageFinishedHelper, final String data, final String mimeType, final boolean isBase64Encoded, final String baseUrl, final String historyUrl) throws Throwable { - int currentCallCount = onPageFinishedHelper.getCallCount(); - loadDataWithBaseUrlAsync(awContents, data, mimeType, isBase64Encoded, baseUrl, historyUrl); - onPageFinishedHelper.waitForCallback(currentCallCount, 1, WAIT_TIMEOUT_MS, - TimeUnit.MILLISECONDS); + mTestCommon.loadDataWithBaseUrlSync(awContents, onPageFinishedHelper, data, mimeType, + isBase64Encoded, baseUrl, historyUrl); } public void loadDataWithBaseUrlAsync(final AwContents awContents, final String data, final String mimeType, final boolean isBase64Encoded, final String baseUrl, final String historyUrl) throws Throwable { - runTestOnUiThread(new Runnable() { - @Override - public void run() { - awContents.loadDataWithBaseURL( - baseUrl, data, mimeType, isBase64Encoded ? "base64" : null, historyUrl); - } - }); + mTestCommon.loadDataWithBaseUrlAsync( + awContents, data, mimeType, isBase64Encoded, baseUrl, historyUrl); } /** @@ -317,104 +256,211 @@ */ public void reloadSync(final AwContents awContents, CallbackHelper onPageFinishedHelper) throws Exception { - int currentCallCount = onPageFinishedHelper.getCallCount(); - getInstrumentation().runOnMainSync(new Runnable() { - @Override - public void run() { - awContents.getNavigationController().reload(true); - } - }); - onPageFinishedHelper.waitForCallback(currentCallCount, 1, WAIT_TIMEOUT_MS, - TimeUnit.MILLISECONDS); + mTestCommon.reloadSync(awContents, onPageFinishedHelper); } /** * Stops loading on the UI thread. */ public void stopLoading(final AwContents awContents) { - getInstrumentation().runOnMainSync(new Runnable() { - @Override - public void run() { - awContents.stopLoading(); - } - }); + mTestCommon.stopLoading(awContents); } public void waitForVisualStateCallback(final AwContents awContents) throws Exception { - final CallbackHelper ch = new CallbackHelper(); - final int chCount = ch.getCallCount(); - getInstrumentation().runOnMainSync(new Runnable() { - @Override - public void run() { - final long requestId = 666; - awContents.insertVisualStateCallback(requestId, - new AwContents.VisualStateCallback() { - @Override - public void onComplete(long id) { - assertEquals(requestId, id); - ch.notifyCalled(); - } - }); - } - }); - ch.waitForCallback(chCount); + mTestCommon.waitForVisualStateCallback(awContents); } public void insertVisualStateCallbackOnUIThread(final AwContents awContents, final long requestId, final AwContents.VisualStateCallback callback) { - getInstrumentation().runOnMainSync(new Runnable() { - @Override - public void run() { - awContents.insertVisualStateCallback(requestId, callback); - } - }); + mTestCommon.insertVisualStateCallbackOnUIThread(awContents, requestId, callback); } - // Waits for the pixel at the center of AwContents to color up into expectedColor. - // Note that this is a stricter condition that waiting for a visual state callback, - // as visual state callback only indicates that *something* has appeared in WebView. + // Waits for the pixel at the center of AwContents to color up into + // expectedColor. + // Note that this is a stricter condition that waiting for a visual state + // callback, + // as visual state callback only indicates that *something* has appeared in + // WebView. public void waitForPixelColorAtCenterOfView(final AwContents awContents, final AwTestContainerView testContainerView, final int expectedColor) throws Exception { - pollUiThread(new Callable<Boolean>() { - @Override - public Boolean call() throws Exception { - return GraphicsTestUtils.getPixelColorAtCenterOfView(awContents, testContainerView) - == expectedColor; - } - }); + mTestCommon.waitForPixelColorAtCenterOfView(awContents, testContainerView, expectedColor); + } + + public AwTestContainerView createAwTestContainerView( + final AwContentsClient awContentsClient) { + return mTestCommon.createAwTestContainerView(awContentsClient); + } + + public AwTestContainerView createAwTestContainerView(final AwContentsClient awContentsClient, + boolean supportsLegacyQuirks, final TestDependencyFactory testDependencyFactory) { + return mTestCommon.createAwTestContainerView( + awContentsClient, supportsLegacyQuirks, testDependencyFactory); + } + + public AwBrowserContext getAwBrowserContext() { + return mTestCommon.getAwBrowserContext(); + } + + public AwTestContainerView createDetachedAwTestContainerView( + final AwContentsClient awContentsClient) { + return mTestCommon.createDetachedAwTestContainerView(awContentsClient); + } + + public AwTestContainerView createDetachedAwTestContainerView( + final AwContentsClient awContentsClient, boolean supportsLegacyQuirks, + TestDependencyFactory testDependencyFactory) { + return mTestCommon.createDetachedAwTestContainerView( + awContentsClient, supportsLegacyQuirks, testDependencyFactory); + } + + protected boolean isHardwareAcceleratedTest() { + return mTestCommon.isHardwareAcceleratedTest(); + } + + public AwTestContainerView createAwTestContainerViewOnMainSync( + final AwContentsClient client) throws Exception { + return mTestCommon.createAwTestContainerViewOnMainSync(client); + } + + public AwTestContainerView createAwTestContainerViewOnMainSync( + final AwContentsClient client, final boolean supportsLegacyQuirks) { + return mTestCommon.createAwTestContainerViewOnMainSync(client, supportsLegacyQuirks); + } + + public AwTestContainerView createAwTestContainerViewOnMainSync(final AwContentsClient client, + final boolean supportsLegacyQuirks, final TestDependencyFactory testDependencyFactory) { + return mTestCommon.createAwTestContainerViewOnMainSync( + client, supportsLegacyQuirks, testDependencyFactory); + } + + public void destroyAwContentsOnMainSync(final AwContents awContents) { + mTestCommon.destroyAwContentsOnMainSync(awContents); + } + + public String getTitleOnUiThread(final AwContents awContents) throws Exception { + return mTestCommon.getTitleOnUiThread(awContents); + } + + public AwSettings getAwSettingsOnUiThread( + final AwContents awContents) throws Exception { + return mTestCommon.getAwSettingsOnUiThread(awContents); } /** - * Checks the current test has |clazz| annotation. Note this swallows NoSuchMethodException - * and returns false in that case. + * Verify double quotes in both sides of the raw string. Strip the double + * quotes and returns rest of the string. */ - private boolean testMethodHasAnnotation(Class<? extends Annotation> clazz) { - String testName = getName(); - Method method = null; - try { - method = getClass().getMethod(testName); - } catch (NoSuchMethodException e) { - Log.w(TAG, "Test method name not found.", e); - return false; - } - - // Cast to AnnotatedElement to work around a compilation failure. - // Method.isAnnotationPresent() was removed in Java 8 (which is used by the Android N SDK), - // so compilation with Java 7 fails. See crbug.com/608792. - return ((AnnotatedElement) method).isAnnotationPresent(clazz); + protected String maybeStripDoubleQuotes(String raw) { + return mTestCommon.maybeStripDoubleQuotes(raw); } /** - * Factory class used in creation of test AwContents instances. - * - * Test cases can provide subclass instances to the createAwTest* methods in order to create an - * AwContents instance with injected test dependencies. + * Executes the given snippet of JavaScript code within the given + * ContentView. Returns the result of its execution in JSON format. + */ + public String executeJavaScriptAndWaitForResult(final AwContents awContents, + TestAwContentsClient viewClient, final String code) throws Exception { + return mTestCommon.executeJavaScriptAndWaitForResult(awContents, viewClient, code); + } + + /** + * Executes JavaScript code within the given ContentView to get the text content in + * document body. Returns the result string without double quotes. + */ + protected String getJavaScriptResultBodyTextContent( + final AwContents awContents, final TestAwContentsClient viewClient) throws Exception { + return mTestCommon.getJavaScriptResultBodyTextContent(awContents, viewClient); + } + + /** + * Wrapper around CriteriaHelper.pollInstrumentationThread. This uses AwTestBase-specifc + * timeouts and treats timeouts and exceptions as test failures automatically. + */ + public static void pollInstrumentationThread(final Callable<Boolean> callable) + throws Exception { + AwTestCommon.pollInstrumentationThread(callable); + } + + /** + * Wrapper around {@link AwTestBase#poll()} but runs the callable on the UI + * thread. + */ + public void pollUiThread(final Callable<Boolean> callable) throws Exception { + mTestCommon.pollUiThread(callable); + } + + /** + * Clears the resource cache. Note that the cache is per-application, so + * this will clear the cache for all WebViews used. + */ + public void clearCacheOnUiThread( + final AwContents awContents, + final boolean includeDiskFiles) throws Exception { + mTestCommon.clearCacheOnUiThread(awContents, includeDiskFiles); + } + + /** + * Returns pure page scale. + */ + public float getScaleOnUiThread(final AwContents awContents) throws Exception { + return mTestCommon.getScaleOnUiThread(awContents); + } + + /** + * Returns page scale multiplied by the screen density. + */ + public float getPixelScaleOnUiThread(final AwContents awContents) throws Exception { + return mTestCommon.getPixelScaleOnUiThread(awContents); + } + + /** + * Returns whether a user can zoom the page in. + */ + public boolean canZoomInOnUiThread(final AwContents awContents) throws Exception { + return mTestCommon.canZoomInOnUiThread(awContents); + } + + /** + * Returns whether a user can zoom the page out. + */ + public boolean canZoomOutOnUiThread(final AwContents awContents) throws Exception { + return mTestCommon.canZoomOutOnUiThread(awContents); + } + + public void killRenderProcessOnUiThreadAsync(final AwContents awContents) throws Exception { + mTestCommon.killRenderProcessOnUiThreadAsync(awContents); + } + + /** + * Loads the main html then triggers the popup window. + */ + public void triggerPopup(final AwContents parentAwContents, + TestAwContentsClient parentAwContentsClient, TestWebServer testWebServer, + String mainHtml, String popupHtml, String popupPath, String triggerScript) + throws Exception { + mTestCommon.triggerPopup(parentAwContents, parentAwContentsClient, testWebServer, mainHtml, + popupHtml, popupPath, triggerScript); + } + + /** + * Supplies the popup window with AwContents then waits for the popup window + * to finish loading. + */ + public PopupInfo connectPendingPopup(final AwContents parentAwContents) throws Exception { + return mTestCommon.connectPendingPopup(parentAwContents); + } + + /** + * Factory class used in creation of test AwContents instances. Test cases + * can provide subclass instances to the createAwTest* methods in order to + * create an AwContents instance with injected test dependencies. */ public static class TestDependencyFactory extends AwContents.DependencyFactory { - public AwTestContainerView createAwTestContainerView(AwTestRunnerActivity activity, - boolean allowHardwareAcceleration) { + public AwTestContainerView createAwTestContainerView( + AwTestRunnerActivity activity, boolean allowHardwareAcceleration) { return new AwTestContainerView(activity, allowHardwareAcceleration); } + public AwSettings createAwSettings(Context context, boolean supportsLegacyQuirks) { return new AwSettings(context, false /* isAccessFromFileURLsGrantedByDefault */, supportsLegacyQuirks, false /* allowEmptyDocumentPersistence */, @@ -432,279 +478,6 @@ } } - protected TestDependencyFactory createTestDependencyFactory() { - return new TestDependencyFactory(); - } - - public AwTestContainerView createAwTestContainerView( - final AwContentsClient awContentsClient) { - return createAwTestContainerView(awContentsClient, false, null); - } - - public AwTestContainerView createAwTestContainerView(final AwContentsClient awContentsClient, - boolean supportsLegacyQuirks, final TestDependencyFactory testDependencyFactory) { - AwTestContainerView testContainerView = createDetachedAwTestContainerView( - awContentsClient, supportsLegacyQuirks, testDependencyFactory); - getActivity().addView(testContainerView); - testContainerView.requestFocus(); - return testContainerView; - } - - public AwBrowserContext getAwBrowserContext() { - return mBrowserContext; - } - - public AwTestContainerView createDetachedAwTestContainerView( - final AwContentsClient awContentsClient) { - return createDetachedAwTestContainerView(awContentsClient, false, null); - } - - public AwTestContainerView createDetachedAwTestContainerView( - final AwContentsClient awContentsClient, boolean supportsLegacyQuirks, - TestDependencyFactory testDependencyFactory) { - if (testDependencyFactory == null) { - testDependencyFactory = createTestDependencyFactory(); - } - boolean allowHardwareAcceleration = isHardwareAcceleratedTest(); - final AwTestContainerView testContainerView = - testDependencyFactory.createAwTestContainerView( - getActivity(), allowHardwareAcceleration); - - AwSettings awSettings = - testDependencyFactory.createAwSettings(getActivity(), supportsLegacyQuirks); - AwContents awContents = testDependencyFactory.createAwContents(mBrowserContext, - testContainerView, testContainerView.getContext(), - testContainerView.getInternalAccessDelegate(), - testContainerView.getNativeDrawGLFunctorFactory(), awContentsClient, awSettings, - testDependencyFactory); - testContainerView.initialize(awContents); - return testContainerView; - } - - protected boolean isHardwareAcceleratedTest() { - return !testMethodHasAnnotation(DisableHardwareAccelerationForTest.class); - } - - public AwTestContainerView createAwTestContainerViewOnMainSync( - final AwContentsClient client) throws Exception { - return createAwTestContainerViewOnMainSync(client, false, null); - } - - public AwTestContainerView createAwTestContainerViewOnMainSync( - final AwContentsClient client, final boolean supportsLegacyQuirks) { - return createAwTestContainerViewOnMainSync(client, supportsLegacyQuirks, null); - } - - public AwTestContainerView createAwTestContainerViewOnMainSync(final AwContentsClient client, - final boolean supportsLegacyQuirks, final TestDependencyFactory testDependencyFactory) { - return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<AwTestContainerView>() { - @Override - public AwTestContainerView call() { - return createAwTestContainerView( - client, supportsLegacyQuirks, testDependencyFactory); - } - }); - } - - public void destroyAwContentsOnMainSync(final AwContents awContents) { - if (awContents == null) return; - getInstrumentation().runOnMainSync(new Runnable() { - @Override - public void run() { - awContents.destroy(); - } - }); - } - - public String getTitleOnUiThread(final AwContents awContents) throws Exception { - return runTestOnUiThreadAndGetResult(new Callable<String>() { - @Override - public String call() throws Exception { - return awContents.getTitle(); - } - }); - } - - public AwSettings getAwSettingsOnUiThread( - final AwContents awContents) throws Exception { - return runTestOnUiThreadAndGetResult(new Callable<AwSettings>() { - @Override - public AwSettings call() throws Exception { - return awContents.getSettings(); - } - }); - } - - /** - * Verify double quotes in both sides of the raw string. Strip the double quotes and - * returns rest of the string. - */ - protected String maybeStripDoubleQuotes(String raw) { - assertNotNull(raw); - Matcher m = MAYBE_QUOTED_STRING.matcher(raw); - assertTrue(m.matches()); - return m.group(2); - } - - /** - * Executes the given snippet of JavaScript code within the given ContentView. Returns the - * result of its execution in JSON format. - */ - public String executeJavaScriptAndWaitForResult(final AwContents awContents, - TestAwContentsClient viewClient, final String code) throws Exception { - return JSUtils.executeJavaScriptAndWaitForResult(this, awContents, - viewClient.getOnEvaluateJavaScriptResultHelper(), - code); - } - - /** - * Executes JavaScript code within the given ContentView to get the text content in - * document body. Returns the result string without double quotes. - */ - protected String getJavaScriptResultBodyTextContent( - final AwContents awContents, final TestAwContentsClient viewClient) throws Exception { - String raw = executeJavaScriptAndWaitForResult( - awContents, viewClient, "document.body.textContent"); - return maybeStripDoubleQuotes(raw); - } - - /** - * Wrapper around CriteriaHelper.pollInstrumentationThread. This uses AwTestBase-specifc - * timeouts and treats timeouts and exceptions as test failures automatically. - */ - public static void pollInstrumentationThread(final Callable<Boolean> callable) - throws Exception { - CriteriaHelper.pollInstrumentationThread(new Criteria() { - @Override - public boolean isSatisfied() { - try { - return callable.call(); - } catch (Throwable e) { - Log.e(TAG, "Exception while polling.", e); - return false; - } - } - }, WAIT_TIMEOUT_MS, CHECK_INTERVAL); - } - - /** - * Wrapper around {@link AwTestBase#poll()} but runs the callable on the UI thread. - */ - public void pollUiThread(final Callable<Boolean> callable) throws Exception { - pollInstrumentationThread(new Callable<Boolean>() { - @Override - public Boolean call() throws Exception { - return runTestOnUiThreadAndGetResult(callable); - } - }); - } - - /** - * Clears the resource cache. Note that the cache is per-application, so this will clear the - * cache for all WebViews used. - */ - public void clearCacheOnUiThread( - final AwContents awContents, - final boolean includeDiskFiles) throws Exception { - getInstrumentation().runOnMainSync(new Runnable() { - @Override - public void run() { - awContents.clearCache(includeDiskFiles); - } - }); - } - - /** - * Returns pure page scale. - */ - public float getScaleOnUiThread(final AwContents awContents) throws Exception { - return runTestOnUiThreadAndGetResult(new Callable<Float>() { - @Override - public Float call() throws Exception { - return awContents.getPageScaleFactor(); - } - }); - } - - /** - * Returns page scale multiplied by the screen density. - */ - public float getPixelScaleOnUiThread(final AwContents awContents) throws Exception { - return runTestOnUiThreadAndGetResult(new Callable<Float>() { - @Override - public Float call() throws Exception { - return awContents.getScale(); - } - }); - } - - /** - * Returns whether a user can zoom the page in. - */ - public boolean canZoomInOnUiThread(final AwContents awContents) throws Exception { - return runTestOnUiThreadAndGetResult(new Callable<Boolean>() { - @Override - public Boolean call() throws Exception { - return awContents.canZoomIn(); - } - }); - } - - /** - * Returns whether a user can zoom the page out. - */ - public boolean canZoomOutOnUiThread(final AwContents awContents) throws Exception { - return runTestOnUiThreadAndGetResult(new Callable<Boolean>() { - @Override - public Boolean call() throws Exception { - return awContents.canZoomOut(); - } - }); - } - - public void killRenderProcessOnUiThreadAsync(final AwContents awContents) throws Exception { - getInstrumentation().runOnMainSync(new Runnable() { - @Override - public void run() { - awContents.killRenderProcess(); - } - }); - } - - /** - * Loads the main html then triggers the popup window. - */ - public void triggerPopup(final AwContents parentAwContents, - TestAwContentsClient parentAwContentsClient, TestWebServer testWebServer, - String mainHtml, String popupHtml, String popupPath, String triggerScript) - throws Exception { - enableJavaScriptOnUiThread(parentAwContents); - getInstrumentation().runOnMainSync(new Runnable() { - @Override - public void run() { - parentAwContents.getSettings().setSupportMultipleWindows(true); - parentAwContents.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); - } - }); - - final String parentUrl = testWebServer.setResponse("/popupParent.html", mainHtml, null); - if (popupHtml != null) { - testWebServer.setResponse(popupPath, popupHtml, null); - } else { - testWebServer.setResponseWithNoContentStatus(popupPath); - } - - parentAwContentsClient.getOnCreateWindowHelper().setReturnValue(true); - loadUrlSync(parentAwContents, parentAwContentsClient.getOnPageFinishedHelper(), parentUrl); - - TestAwContentsClient.OnCreateWindowHelper onCreateWindowHelper = - parentAwContentsClient.getOnCreateWindowHelper(); - int currentCallCount = onCreateWindowHelper.getCallCount(); - parentAwContents.evaluateJavaScriptForTests(triggerScript, null); - onCreateWindowHelper.waitForCallback( - currentCallCount, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS); - } - /** * POD object for holding references to helper objects of a popup window. */ @@ -712,6 +485,7 @@ public final TestAwContentsClient popupContentsClient; public final AwTestContainerView popupContainerView; public final AwContents popupContents; + public PopupInfo(TestAwContentsClient popupContentsClient, AwTestContainerView popupContainerView, AwContents popupContents) { this.popupContentsClient = popupContentsClient; @@ -719,37 +493,4 @@ this.popupContents = popupContents; } } - - /** - * Supplies the popup window with AwContents then waits for the popup window to finish loading. - */ - public PopupInfo connectPendingPopup(final AwContents parentAwContents) throws Exception { - TestAwContentsClient popupContentsClient; - AwTestContainerView popupContainerView; - final AwContents popupContents; - popupContentsClient = new TestAwContentsClient(); - popupContainerView = createAwTestContainerViewOnMainSync(popupContentsClient); - popupContents = popupContainerView.getAwContents(); - enableJavaScriptOnUiThread(popupContents); - - getInstrumentation().runOnMainSync(new Runnable() { - @Override - public void run() { - parentAwContents.supplyContentsForPopup(popupContents); - } - }); - - OnPageFinishedHelper onPageFinishedHelper = popupContentsClient.getOnPageFinishedHelper(); - int finishCallCount = onPageFinishedHelper.getCallCount(); - TestAwContentsClient.OnReceivedTitleHelper onReceivedTitleHelper = - popupContentsClient.getOnReceivedTitleHelper(); - int titleCallCount = onReceivedTitleHelper.getCallCount(); - - onPageFinishedHelper.waitForCallback(finishCallCount, 1, WAIT_TIMEOUT_MS, - TimeUnit.MILLISECONDS); - onReceivedTitleHelper.waitForCallback(titleCallCount, 1, WAIT_TIMEOUT_MS, - TimeUnit.MILLISECONDS); - - return new PopupInfo(popupContentsClient, popupContainerView, popupContents); - } }
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwTestCommon.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwTestCommon.java new file mode 100644 index 0000000..5ea6498 --- /dev/null +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwTestCommon.java
@@ -0,0 +1,570 @@ +// 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. + +package org.chromium.android_webview.test; + +import static org.chromium.base.test.util.ScalableTimeout.scaleTimeout; + +import android.app.Instrumentation; +import android.content.Context; +import android.util.AndroidRuntimeException; + +import org.junit.Assert; + +import org.chromium.android_webview.AwBrowserContext; +import org.chromium.android_webview.AwBrowserProcess; +import org.chromium.android_webview.AwContents; +import org.chromium.android_webview.AwContentsClient; +import org.chromium.android_webview.AwSettings; +import org.chromium.android_webview.test.AwTestBase.PopupInfo; +import org.chromium.android_webview.test.AwTestBase.TestDependencyFactory; +import org.chromium.android_webview.test.util.GraphicsTestUtils; +import org.chromium.android_webview.test.util.JSUtils; +import org.chromium.base.Log; +import org.chromium.base.ThreadUtils; +import org.chromium.base.test.util.CallbackHelper; +import org.chromium.base.test.util.InMemorySharedPreferences; +import org.chromium.content.browser.test.util.Criteria; +import org.chromium.content.browser.test.util.CriteriaHelper; +import org.chromium.content.browser.test.util.TestCallbackHelperContainer.OnPageFinishedHelper; +import org.chromium.content_public.browser.LoadUrlParams; +import org.chromium.net.test.util.TestWebServer; + +import java.lang.annotation.Annotation; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.FutureTask; +import java.util.concurrent.TimeUnit; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +// TODO(yolandyan): move this class to its test rule once JUnit4 migration is over +final class AwTestCommon { + static final long WAIT_TIMEOUT_MS = scaleTimeout(15000); + + static final int CHECK_INTERVAL = 100; + + private static final String TAG = "AwTestCommon"; + + private static final Pattern MAYBE_QUOTED_STRING = Pattern.compile("^(\"?)(.*)\\1$"); + + // The browser context needs to be a process-wide singleton. + private AwBrowserContext mBrowserContext; + + private final AwTestCommonCallback mCallback; + + AwTestCommon(AwTestCommonCallback callback) { + mCallback = callback; + } + + void setUp() throws Exception { + if (mCallback.needsAwBrowserContextCreated()) { + createAwBrowserContext(); + } + if (mCallback.needsBrowserProcessStarted()) { + startBrowserProcess(); + } + } + + void createAwBrowserContext() { + if (mBrowserContext != null) { + throw new AndroidRuntimeException("There should only be one browser context."); + } + mCallback.getActivity(); // The Activity must be launched in order to load native code + final InMemorySharedPreferences prefs = new InMemorySharedPreferences(); + final Context appContext = + mCallback.getInstrumentation().getTargetContext().getApplicationContext(); + mCallback.getInstrumentation().runOnMainSync(new Runnable() { + @Override + public void run() { + mBrowserContext = + mCallback.createAwBrowserContextOnUiThread(prefs, appContext); + } + }); + } + + void startBrowserProcess() throws Exception { + // The Activity must be launched in order for proper webview statics to be setup. + mCallback.getActivity(); + mCallback.getInstrumentation().runOnMainSync(new Runnable() { + @Override + public void run() { + AwBrowserProcess.start(); + } + }); + } + + <R> R runTestOnUiThreadAndGetResult(Callable<R> callable) throws Exception { + FutureTask<R> task = new FutureTask<R>(callable); + mCallback.getInstrumentation().runOnMainSync(task); + return task.get(); + } + + void enableJavaScriptOnUiThread(final AwContents awContents) { + mCallback.getInstrumentation().runOnMainSync(new Runnable() { + @Override + public void run() { + awContents.getSettings().setJavaScriptEnabled(true); + } + }); + } + + void setNetworkAvailableOnUiThread(final AwContents awContents, final boolean networkUp) { + mCallback.getInstrumentation().runOnMainSync(new Runnable() { + @Override + public void run() { + awContents.setNetworkAvailable(networkUp); + } + }); + } + + void loadUrlSync(final AwContents awContents, CallbackHelper onPageFinishedHelper, + final String url) throws Exception { + loadUrlSync(awContents, onPageFinishedHelper, url, null); + } + + void loadUrlSync(final AwContents awContents, CallbackHelper onPageFinishedHelper, + final String url, final Map<String, String> extraHeaders) throws Exception { + int currentCallCount = onPageFinishedHelper.getCallCount(); + loadUrlAsync(awContents, url, extraHeaders); + onPageFinishedHelper.waitForCallback( + currentCallCount, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS); + } + + void loadUrlSyncAndExpectError(final AwContents awContents, CallbackHelper onPageFinishedHelper, + CallbackHelper onReceivedErrorHelper, final String url) throws Exception { + int onErrorCallCount = onReceivedErrorHelper.getCallCount(); + int onFinishedCallCount = onPageFinishedHelper.getCallCount(); + loadUrlAsync(awContents, url); + onReceivedErrorHelper.waitForCallback( + onErrorCallCount, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS); + onPageFinishedHelper.waitForCallback( + onFinishedCallCount, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS); + } + + void loadUrlAsync(final AwContents awContents, final String url) throws Exception { + loadUrlAsync(awContents, url, null); + } + + void loadUrlAsync( + final AwContents awContents, final String url, final Map<String, String> extraHeaders) { + mCallback.getInstrumentation().runOnMainSync(new Runnable() { + @Override + public void run() { + awContents.loadUrl(url, extraHeaders); + } + }); + } + + void postUrlSync(final AwContents awContents, CallbackHelper onPageFinishedHelper, + final String url, byte[] postData) throws Exception { + int currentCallCount = onPageFinishedHelper.getCallCount(); + postUrlAsync(awContents, url, postData); + onPageFinishedHelper.waitForCallback( + currentCallCount, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS); + } + + void postUrlAsync(final AwContents awContents, final String url, byte[] postData) + throws Exception { + class PostUrl implements Runnable { + byte[] mPostData; + public PostUrl(byte[] postData) { + mPostData = postData; + } + @Override + public void run() { + awContents.postUrl(url, mPostData); + } + } + mCallback.getInstrumentation().runOnMainSync(new PostUrl(postData)); + } + + void loadDataSync(final AwContents awContents, CallbackHelper onPageFinishedHelper, + final String data, final String mimeType, final boolean isBase64Encoded) + throws Exception { + int currentCallCount = onPageFinishedHelper.getCallCount(); + loadDataAsync(awContents, data, mimeType, isBase64Encoded); + onPageFinishedHelper.waitForCallback( + currentCallCount, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS); + } + + void loadDataSyncWithCharset(final AwContents awContents, CallbackHelper onPageFinishedHelper, + final String data, final String mimeType, final boolean isBase64Encoded, + final String charset) throws Exception { + int currentCallCount = onPageFinishedHelper.getCallCount(); + mCallback.getInstrumentation().runOnMainSync(new Runnable() { + @Override + public void run() { + awContents.loadUrl(LoadUrlParams.createLoadDataParams( + data, mimeType, isBase64Encoded, charset)); + } + }); + onPageFinishedHelper.waitForCallback( + currentCallCount, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS); + } + + void loadDataAsync(final AwContents awContents, final String data, final String mimeType, + final boolean isBase64Encoded) throws Exception { + mCallback.getInstrumentation().runOnMainSync(new Runnable() { + @Override + public void run() { + awContents.loadData(data, mimeType, isBase64Encoded ? "base64" : null); + } + }); + } + + void loadDataWithBaseUrlSync(final AwContents awContents, CallbackHelper onPageFinishedHelper, + final String data, final String mimeType, final boolean isBase64Encoded, + final String baseUrl, final String historyUrl) throws Throwable { + int currentCallCount = onPageFinishedHelper.getCallCount(); + loadDataWithBaseUrlAsync(awContents, data, mimeType, isBase64Encoded, baseUrl, historyUrl); + onPageFinishedHelper.waitForCallback( + currentCallCount, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS); + } + + void loadDataWithBaseUrlAsync(final AwContents awContents, final String data, + final String mimeType, final boolean isBase64Encoded, final String baseUrl, + final String historyUrl) throws Throwable { + mCallback.runOnUiThread(new Runnable() { + @Override + public void run() { + awContents.loadDataWithBaseURL( + baseUrl, data, mimeType, isBase64Encoded ? "base64" : null, historyUrl); + } + }); + } + + void reloadSync(final AwContents awContents, CallbackHelper onPageFinishedHelper) + throws Exception { + int currentCallCount = onPageFinishedHelper.getCallCount(); + mCallback.getInstrumentation().runOnMainSync(new Runnable() { + @Override + public void run() { + awContents.getNavigationController().reload(true); + } + }); + onPageFinishedHelper.waitForCallback( + currentCallCount, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS); + } + + void stopLoading(final AwContents awContents) { + mCallback.getInstrumentation().runOnMainSync(new Runnable() { + @Override + public void run() { + awContents.stopLoading(); + } + }); + } + + void waitForVisualStateCallback(final AwContents awContents) throws Exception { + final CallbackHelper ch = new CallbackHelper(); + final int chCount = ch.getCallCount(); + mCallback.getInstrumentation().runOnMainSync(new Runnable() { + @Override + public void run() { + final long requestId = 666; + awContents.insertVisualStateCallback( + requestId, new AwContents.VisualStateCallback() { + @Override + public void onComplete(long id) { + Assert.assertEquals(requestId, id); + ch.notifyCalled(); + } + }); + } + }); + ch.waitForCallback(chCount); + } + + void insertVisualStateCallbackOnUIThread(final AwContents awContents, final long requestId, + final AwContents.VisualStateCallback callback) { + mCallback.getInstrumentation().runOnMainSync(new Runnable() { + @Override + public void run() { + awContents.insertVisualStateCallback(requestId, callback); + } + }); + } + + void waitForPixelColorAtCenterOfView(final AwContents awContents, + final AwTestContainerView testContainerView, final int expectedColor) throws Exception { + pollUiThread(new Callable<Boolean>() { + @Override + public Boolean call() throws Exception { + return GraphicsTestUtils.getPixelColorAtCenterOfView(awContents, testContainerView) + == expectedColor; + } + }); + } + + AwTestContainerView createAwTestContainerView(final AwContentsClient awContentsClient) { + return createAwTestContainerView(awContentsClient, false, null); + } + + AwTestContainerView createAwTestContainerView(final AwContentsClient awContentsClient, + boolean supportsLegacyQuirks, final TestDependencyFactory testDependencyFactory) { + AwTestContainerView testContainerView = createDetachedAwTestContainerView( + awContentsClient, supportsLegacyQuirks, testDependencyFactory); + mCallback.getActivity().addView(testContainerView); + testContainerView.requestFocus(); + return testContainerView; + } + + AwBrowserContext getAwBrowserContext() { + return mBrowserContext; + } + + AwTestContainerView createDetachedAwTestContainerView(final AwContentsClient awContentsClient) { + return createDetachedAwTestContainerView(awContentsClient, false, null); + } + + AwTestContainerView createDetachedAwTestContainerView(final AwContentsClient awContentsClient, + boolean supportsLegacyQuirks, TestDependencyFactory testDependencyFactory) { + if (testDependencyFactory == null) { + testDependencyFactory = mCallback.createTestDependencyFactory(); + } + boolean allowHardwareAcceleration = isHardwareAcceleratedTest(); + final AwTestContainerView testContainerView = + testDependencyFactory.createAwTestContainerView( + mCallback.getActivity(), allowHardwareAcceleration); + + AwSettings awSettings = testDependencyFactory.createAwSettings( + mCallback.getActivity(), supportsLegacyQuirks); + AwContents awContents = testDependencyFactory.createAwContents(mBrowserContext, + testContainerView, testContainerView.getContext(), + testContainerView.getInternalAccessDelegate(), + testContainerView.getNativeDrawGLFunctorFactory(), awContentsClient, awSettings, + testDependencyFactory); + testContainerView.initialize(awContents); + return testContainerView; + } + + boolean isHardwareAcceleratedTest() { + return !mCallback.testMethodHasAnnotation(DisableHardwareAccelerationForTest.class); + } + + AwTestContainerView createAwTestContainerViewOnMainSync(final AwContentsClient client) + throws Exception { + return createAwTestContainerViewOnMainSync(client, false, null); + } + + AwTestContainerView createAwTestContainerViewOnMainSync( + final AwContentsClient client, final boolean supportsLegacyQuirks) { + return createAwTestContainerViewOnMainSync(client, supportsLegacyQuirks, null); + } + + AwTestContainerView createAwTestContainerViewOnMainSync(final AwContentsClient client, + final boolean supportsLegacyQuirks, final TestDependencyFactory testDependencyFactory) { + return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<AwTestContainerView>() { + @Override + public AwTestContainerView call() { + return createAwTestContainerView( + client, supportsLegacyQuirks, testDependencyFactory); + } + }); + } + + void destroyAwContentsOnMainSync(final AwContents awContents) { + if (awContents == null) return; + mCallback.getInstrumentation().runOnMainSync(new Runnable() { + @Override + public void run() { + awContents.destroy(); + } + }); + } + + String getTitleOnUiThread(final AwContents awContents) throws Exception { + return runTestOnUiThreadAndGetResult(new Callable<String>() { + @Override + public String call() throws Exception { + return awContents.getTitle(); + } + }); + } + + AwSettings getAwSettingsOnUiThread(final AwContents awContents) throws Exception { + return runTestOnUiThreadAndGetResult(new Callable<AwSettings>() { + @Override + public AwSettings call() throws Exception { + return awContents.getSettings(); + } + }); + } + + String maybeStripDoubleQuotes(String raw) { + Assert.assertNotNull(raw); + Matcher m = MAYBE_QUOTED_STRING.matcher(raw); + Assert.assertTrue(m.matches()); + return m.group(2); + } + + String executeJavaScriptAndWaitForResult(final AwContents awContents, + TestAwContentsClient viewClient, final String code) throws Exception { + return JSUtils.executeJavaScriptAndWaitForResult(mCallback.getInstrumentation(), awContents, + viewClient.getOnEvaluateJavaScriptResultHelper(), code); + } + + /** + * Executes JavaScript code within the given ContentView to get the text content in + * document body. Returns the result string without double quotes. + */ + String getJavaScriptResultBodyTextContent( + final AwContents awContents, final TestAwContentsClient viewClient) throws Exception { + String raw = executeJavaScriptAndWaitForResult( + awContents, viewClient, "document.body.textContent"); + return maybeStripDoubleQuotes(raw); + } + + static void pollInstrumentationThread(final Callable<Boolean> callable) throws Exception { + CriteriaHelper.pollInstrumentationThread(new Criteria() { + @Override + public boolean isSatisfied() { + try { + return callable.call(); + } catch (Throwable e) { + Log.e(TAG, "Exception while polling.", e); + return false; + } + } + }, WAIT_TIMEOUT_MS, CHECK_INTERVAL); + } + + void pollUiThread(final Callable<Boolean> callable) throws Exception { + pollInstrumentationThread(new Callable<Boolean>() { + @Override + public Boolean call() throws Exception { + return runTestOnUiThreadAndGetResult(callable); + } + }); + } + + void clearCacheOnUiThread(final AwContents awContents, final boolean includeDiskFiles) + throws Exception { + mCallback.getInstrumentation().runOnMainSync(new Runnable() { + @Override + public void run() { + awContents.clearCache(includeDiskFiles); + } + }); + } + + float getScaleOnUiThread(final AwContents awContents) throws Exception { + return runTestOnUiThreadAndGetResult(new Callable<Float>() { + @Override + public Float call() throws Exception { + return awContents.getPageScaleFactor(); + } + }); + } + + float getPixelScaleOnUiThread(final AwContents awContents) throws Exception { + return runTestOnUiThreadAndGetResult(new Callable<Float>() { + @Override + public Float call() throws Exception { + return awContents.getScale(); + } + }); + } + + boolean canZoomInOnUiThread(final AwContents awContents) throws Exception { + return runTestOnUiThreadAndGetResult(new Callable<Boolean>() { + @Override + public Boolean call() throws Exception { + return awContents.canZoomIn(); + } + }); + } + + boolean canZoomOutOnUiThread(final AwContents awContents) throws Exception { + return runTestOnUiThreadAndGetResult(new Callable<Boolean>() { + @Override + public Boolean call() throws Exception { + return awContents.canZoomOut(); + } + }); + } + + void killRenderProcessOnUiThreadAsync(final AwContents awContents) throws Exception { + mCallback.getInstrumentation().runOnMainSync(new Runnable() { + @Override + public void run() { + awContents.killRenderProcess(); + } + }); + } + + void triggerPopup(final AwContents parentAwContents, + TestAwContentsClient parentAwContentsClient, TestWebServer testWebServer, + String mainHtml, String popupHtml, String popupPath, String triggerScript) + throws Exception { + enableJavaScriptOnUiThread(parentAwContents); + mCallback.getInstrumentation().runOnMainSync(new Runnable() { + @Override + public void run() { + parentAwContents.getSettings().setSupportMultipleWindows(true); + parentAwContents.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); + } + }); + + final String parentUrl = testWebServer.setResponse("/popupParent.html", mainHtml, null); + if (popupHtml != null) { + testWebServer.setResponse(popupPath, popupHtml, null); + } else { + testWebServer.setResponseWithNoContentStatus(popupPath); + } + + parentAwContentsClient.getOnCreateWindowHelper().setReturnValue(true); + loadUrlSync(parentAwContents, parentAwContentsClient.getOnPageFinishedHelper(), parentUrl); + + TestAwContentsClient.OnCreateWindowHelper onCreateWindowHelper = + parentAwContentsClient.getOnCreateWindowHelper(); + int currentCallCount = onCreateWindowHelper.getCallCount(); + parentAwContents.evaluateJavaScriptForTests(triggerScript, null); + onCreateWindowHelper.waitForCallback( + currentCallCount, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS); + } + + PopupInfo connectPendingPopup(final AwContents parentAwContents) throws Exception { + TestAwContentsClient popupContentsClient; + AwTestContainerView popupContainerView; + final AwContents popupContents; + popupContentsClient = new TestAwContentsClient(); + popupContainerView = createAwTestContainerViewOnMainSync(popupContentsClient); + popupContents = popupContainerView.getAwContents(); + enableJavaScriptOnUiThread(popupContents); + + mCallback.getInstrumentation().runOnMainSync(new Runnable() { + @Override + public void run() { + parentAwContents.supplyContentsForPopup(popupContents); + } + }); + + OnPageFinishedHelper onPageFinishedHelper = popupContentsClient.getOnPageFinishedHelper(); + int finishCallCount = onPageFinishedHelper.getCallCount(); + TestAwContentsClient.OnReceivedTitleHelper onReceivedTitleHelper = + popupContentsClient.getOnReceivedTitleHelper(); + int titleCallCount = onReceivedTitleHelper.getCallCount(); + + onPageFinishedHelper.waitForCallback( + finishCallCount, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS); + onReceivedTitleHelper.waitForCallback( + titleCallCount, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS); + + return new PopupInfo(popupContentsClient, popupContainerView, popupContents); + } + + interface AwTestCommonCallback { + Instrumentation getInstrumentation(); + AwTestRunnerActivity getActivity(); + void runOnUiThread(Runnable runnable) throws Throwable; + boolean testMethodHasAnnotation(Class<? extends Annotation> clazz); + AwBrowserContext createAwBrowserContextOnUiThread( + InMemorySharedPreferences prefs, Context appContext); + TestDependencyFactory createTestDependencyFactory(); + boolean needsAwBrowserContextCreated(); + boolean needsBrowserProcessStarted(); + } +}
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java index 8e39f2e63..1aa25a7 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java
@@ -264,7 +264,7 @@ int onPageFinishedCallCount = onPageFinishedHelper.getCallCount(); int onPageStartedCallCount = onPageStartedHelper.getCallCount(); - JSUtils.clickOnLinkUsingJs(this, mAwContents, + JSUtils.clickOnLinkUsingJs(getInstrumentation(), mAwContents, mContentsClient.getOnEvaluateJavaScriptResultHelper(), "link"); onPageFinishedHelper.waitForCallback(onPageFinishedCallCount);
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerStartupTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerStartupTest.java index d49a3de4..777ff9c 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerStartupTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerStartupTest.java
@@ -43,12 +43,12 @@ } @Override - protected boolean needsAwBrowserContextCreated() { + public boolean needsAwBrowserContextCreated() { return false; } @Override - protected boolean needsBrowserProcessStarted() { + public boolean needsBrowserProcessStarted() { return false; }
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerTest.java index f094c9a..d9405ab5 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerTest.java
@@ -114,13 +114,12 @@ private void setCookieWithJavaScript(final String name, final String value) throws Throwable { - JSUtils.executeJavaScriptAndWaitForResult( - this, mAwContents, + JSUtils.executeJavaScriptAndWaitForResult(getInstrumentation(), mAwContents, mContentsClient.getOnEvaluateJavaScriptResultHelper(), "var expirationDate = new Date();" - + "expirationDate.setDate(expirationDate.getDate() + 5);" - + "document.cookie='" + name + "=" + value - + "; expires=' + expirationDate.toUTCString();"); + + "expirationDate.setDate(expirationDate.getDate() + 5);" + + "document.cookie='" + name + "=" + value + + "; expires=' + expirationDate.toUTCString();"); } @MediumTest @@ -366,15 +365,14 @@ @MediumTest @Feature({"AndroidWebView", "Privacy"}) public void testThirdPartyCookie() throws Throwable { - // In theory we need two servers to test this, one server ('the first party') which returns - // a response with a link to a second server ('the third party') at different origin. This - // second server attempts to set a cookie which should fail if AcceptThirdPartyCookie() is - // false. - // Strictly according to the letter of RFC6454 it should be possible to set this situation - // up with two TestServers on different ports (these count as having different origins) but - // Chrome is not strict about this and does not check the port. Instead we cheat making some - // of the urls come from localhost and some from 127.0.0.1 which count (both in theory and - // pratice) as having different origins. + // In theory we need two servers to test this, one server ('the first + // party') which returns a response with a link to a second server ('the third party') at + // different origin. This second server attempts to set a cookie which should fail if + // AcceptThirdPartyCookie() is false. Strictly according to the letter of RFC6454 it should + // be possible to set this situation up with two TestServers on different ports (these count + // as having different origins) but Chrome is not strict about this and does not check the + // port. Instead we cheat making some of the urls come from localhost and some from + // 127.0.0.1 which count (both in theory and pratice) as having different origins. TestWebServer webServer = TestWebServer.start(); try { // Turn global allow on.
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/GeolocationTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/GeolocationTest.java index c636700..494855b 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/GeolocationTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/GeolocationTest.java
@@ -102,7 +102,7 @@ } @Override - protected TestDependencyFactory createTestDependencyFactory() { + public TestDependencyFactory createTestDependencyFactory() { return mOverridenFactory == null ? new TestDependencyFactory() : mOverridenFactory; }
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/HttpCacheTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/HttpCacheTest.java index d08ee36..2c42c0a 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/HttpCacheTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/HttpCacheTest.java
@@ -18,7 +18,7 @@ public class HttpCacheTest extends AwTestBase { @Override - protected boolean needsBrowserProcessStarted() { + public boolean needsBrowserProcessStarted() { return false; }
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/LoadUrlTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/LoadUrlTest.java index 5ac1e250..675ff54 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/LoadUrlTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/LoadUrlTest.java
@@ -288,8 +288,8 @@ validateHeadersValue(awContents, contentsClient, extraHeaders, true); int currentCallCount = contentsClient.getOnPageFinishedHelper().getCallCount(); - JSUtils.clickOnLinkUsingJs( - this, awContents, contentsClient.getOnEvaluateJavaScriptResultHelper(), "click"); + JSUtils.clickOnLinkUsingJs(getInstrumentation(), awContents, + contentsClient.getOnEvaluateJavaScriptResultHelper(), "click"); contentsClient.getOnPageFinishedHelper().waitForCallback( currentCallCount, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS); // No extra headers for the page navigated via clicking.
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 220cfad..e459e3a 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
@@ -310,7 +310,7 @@ * sites are malicious */ @Override - protected AwBrowserContext createAwBrowserContextOnUiThread( + public AwBrowserContext createAwBrowserContextOnUiThread( InMemorySharedPreferences prefs, Context appContext) { return new MockAwBrowserContext(prefs, appContext); } @@ -984,4 +984,15 @@ // trace unless on the instrumentation thread. assertTrue("Callback should run on UI Thread", mOnUiThread); } + + @SmallTest + @Feature({"AndroidWebView"}) + public void testGetSafeBrowsingPrivacyPolicyUrl() throws Throwable { + final Uri privacyPolicyUrl = Uri.parse("https://www.google.com/chrome/browser/privacy/") + .buildUpon() + .fragment("safe-browsing-policies") + .build(); + assertEquals(privacyPolicyUrl, AwContentsStatics.getSafeBrowsingPrivacyPolicyUrl()); + assertNotNull(AwContentsStatics.getSafeBrowsingPrivacyPolicyUrl()); + } }
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/util/JSUtils.java b/android_webview/javatests/src/org/chromium/android_webview/test/util/JSUtils.java index 306be04..4f35e75 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/util/JSUtils.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/util/JSUtils.java
@@ -4,12 +4,12 @@ package org.chromium.android_webview.test.util; -import android.test.InstrumentationTestCase; - -import junit.framework.Assert; - import static org.chromium.base.test.util.ScalableTimeout.scaleTimeout; +import android.app.Instrumentation; + +import org.junit.Assert; + import org.chromium.android_webview.AwContents; import org.chromium.content.browser.test.util.Criteria; import org.chromium.content.browser.test.util.CriteriaHelper; @@ -22,18 +22,16 @@ private static final long WAIT_TIMEOUT_MS = scaleTimeout(2000); private static final int CHECK_INTERVAL = 100; - public static void clickOnLinkUsingJs( - final InstrumentationTestCase testCase, + public static void clickOnLinkUsingJs(final Instrumentation instrumentation, final AwContents awContents, final OnEvaluateJavaScriptResultHelper onEvaluateJavaScriptResultHelper, final String linkId) throws Exception { - CriteriaHelper.pollInstrumentationThread(new Criteria() { @Override public boolean isSatisfied() { try { - String linkIsNotNull = executeJavaScriptAndWaitForResult(testCase, awContents, - onEvaluateJavaScriptResultHelper, + String linkIsNotNull = executeJavaScriptAndWaitForResult(instrumentation, + awContents, onEvaluateJavaScriptResultHelper, "document.getElementById('" + linkId + "') != null"); return linkIsNotNull.equals("true"); } catch (Throwable t) { @@ -44,7 +42,7 @@ } }, WAIT_TIMEOUT_MS, CHECK_INTERVAL); - testCase.getInstrumentation().runOnMainSync(new Runnable() { + instrumentation.runOnMainSync(new Runnable() { @Override public void run() { awContents.getWebContents().evaluateJavaScriptForTests( @@ -56,12 +54,11 @@ }); } - public static String executeJavaScriptAndWaitForResult( - InstrumentationTestCase testCase, + public static String executeJavaScriptAndWaitForResult(Instrumentation instrumentation, final AwContents awContents, final OnEvaluateJavaScriptResultHelper onEvaluateJavaScriptResultHelper, final String code) throws Exception { - testCase.getInstrumentation().runOnMainSync(new Runnable() { + instrumentation.runOnMainSync(new Runnable() { @Override public void run() { onEvaluateJavaScriptResultHelper.evaluateJavaScriptForTests(
diff --git a/android_webview/test/BUILD.gn b/android_webview/test/BUILD.gn index c3ebb792..8c3b2e3e 100644 --- a/android_webview/test/BUILD.gn +++ b/android_webview/test/BUILD.gn
@@ -26,6 +26,8 @@ "//base:base_java_test_support", "//components/policy/android:policy_java_test_support", "//content/public/android:content_java", + "//third_party/android_support_test_runner:runner_java", + "//third_party/junit", "//ui/android:ui_java", ] @@ -40,6 +42,7 @@ "shell/src/org/chromium/android_webview/test/AwInstrumentationTestRunner.java", "shell/src/org/chromium/android_webview/test/AwTestContainerView.java", "shell/src/org/chromium/android_webview/test/AwTestRunnerActivity.java", + "shell/src/org/chromium/android_webview/test/AwJUnit4ClassRunner.java", "shell/src/org/chromium/android_webview/test/NullContentsClient.java", "shell/src/org/chromium/android_webview/test/SecondBrowserProcess.java", "shell/src/org/chromium/android_webview/test/TestContentProvider.java", @@ -126,7 +129,9 @@ "//device/geolocation:geolocation_java_test_support", "//net/android:net_java", "//net/android:net_java_test_support", + "//third_party/android_support_test_runner:rules_java", "//third_party/android_support_test_runner:runner_java", + "//third_party/junit", "//ui/android:ui_java", ] java_files = [ @@ -166,7 +171,9 @@ "../javatests/src/org/chromium/android_webview/test/AwServiceWorkerClientTest.java", "../javatests/src/org/chromium/android_webview/test/AwSettingsTest.java", "../javatests/src/org/chromium/android_webview/test/AwStrictModeTest.java", + "../javatests/src/org/chromium/android_webview/test/AwTestCommon.java", "../javatests/src/org/chromium/android_webview/test/AwTestBase.java", + "../javatests/src/org/chromium/android_webview/test/AwActivityTestRule.java", "../javatests/src/org/chromium/android_webview/test/AwWebContentsObserverTest.java", "../javatests/src/org/chromium/android_webview/test/AwVariationsSeedFetchServiceTest.java", "../javatests/src/org/chromium/android_webview/test/AwZoomTest.java",
diff --git a/android_webview/test/shell/src/org/chromium/android_webview/test/AwJUnit4ClassRunner.java b/android_webview/test/shell/src/org/chromium/android_webview/test/AwJUnit4ClassRunner.java new file mode 100644 index 0000000..4bedc5d --- /dev/null +++ b/android_webview/test/shell/src/org/chromium/android_webview/test/AwJUnit4ClassRunner.java
@@ -0,0 +1,97 @@ +// 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. + +package org.chromium.android_webview.test; + +import android.support.test.InstrumentationRegistry; + +import org.junit.runner.notification.RunNotifier; +import org.junit.runners.model.FrameworkMethod; +import org.junit.runners.model.InitializationError; + +import org.chromium.android_webview.AwSwitches; +import org.chromium.base.CollectionUtil; +import org.chromium.base.CommandLine; +import org.chromium.base.test.BaseJUnit4ClassRunner; +import org.chromium.base.test.BaseTestResult.PreTestHook; +import org.chromium.base.test.util.CommandLineFlags; +import org.chromium.base.test.util.parameter.SkipCommandLineParameterization; +import org.chromium.policy.test.annotations.Policies; + +import java.util.ArrayList; +import java.util.List; + +/** + * A custom runner for //chrome JUnit4 tests. + */ +public final class AwJUnit4ClassRunner extends BaseJUnit4ClassRunner { + /** + * Create an AwJUnit4ClassRunner to run {@code klass} and initialize values + * + * @param klass Test class to run + * @throws InitializationError if the test class is malformed + */ + public AwJUnit4ClassRunner(Class<?> klass) throws InitializationError { + super(klass, null, defaultPreTestHooks()); + } + + private static List<PreTestHook> defaultPreTestHooks() { + return CollectionUtil.newArrayList(Policies.getRegistrationHook()); + } + + @Override + protected List<FrameworkMethod> getChildren() { + List<FrameworkMethod> result = new ArrayList<>(); + for (FrameworkMethod method : computeTestMethods()) { + if (method.getAnnotation(SkipCommandLineParameterization.class) == null) { + result.add(new WebViewMultiProcessFrameworkMethod(method)); + } + result.add(method); + } + return result; + } + + @Override + protected void runChild(FrameworkMethod method, RunNotifier notifier) { + CommandLineFlags.setUp(InstrumentationRegistry.getTargetContext(), method.getMethod()); + if (method instanceof WebViewMultiProcessFrameworkMethod) { + CommandLine.getInstance().appendSwitch(AwSwitches.WEBVIEW_SANDBOXED_RENDERER); + } + super.runChild(method, notifier); + } + + /** + * Custom FrameworkMethod class indicate this test method will run in multiprocess mode. + * + * The clas also add "__multiprocess_mode" postfix to the test name. + */ + private static class WebViewMultiProcessFrameworkMethod extends FrameworkMethod { + public WebViewMultiProcessFrameworkMethod(FrameworkMethod method) { + super(method.getMethod()); + } + + @Override + public String getName() { + return super.getName() + "__multiprocess_mode"; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof WebViewMultiProcessFrameworkMethod) { + WebViewMultiProcessFrameworkMethod method = + (WebViewMultiProcessFrameworkMethod) obj; + return super.equals(obj) && method.getName().equals(getName()); + } + return false; + } + + @Override + public int hashCode() { + int result = 17; + result = 31 * result + super.hashCode(); + result = 31 * result + getName().hashCode(); + return result; + } + } +}
diff --git a/ash/app_list/app_list_presenter_delegate_unittest.cc b/ash/app_list/app_list_presenter_delegate_unittest.cc index 71eb479..d0bb6514 100644 --- a/ash/app_list/app_list_presenter_delegate_unittest.cc +++ b/ash/app_list/app_list_presenter_delegate_unittest.cc
@@ -525,14 +525,17 @@ TapAndClickOutsideClosesPeekingAppList) { const bool test_mouse_event = TestMouseEventParam(); app_list_presenter_impl()->Show(GetPrimaryDisplayId()); - EXPECT_EQ(app_list_presenter_impl()->GetView()->app_list_state(), - app_list::AppListView::PEEKING); + EXPECT_EQ(app_list::AppListView::PEEKING, + app_list_presenter_impl()->GetView()->app_list_state()); ui::test::EventGenerator& generator = GetEventGenerator(); // Tapping outside the bounds closes the app list. - gfx::Point tap_point = - app_list_presenter_impl()->GetView()->bounds().origin(); - tap_point.Offset(0, -10); + const gfx::Rect peeking_bounds = + app_list_presenter_impl()->GetView()->GetBoundsInScreen(); + gfx::Point tap_point = peeking_bounds.origin(); + tap_point.Offset(10, -10); + ASSERT_FALSE(peeking_bounds.Contains(tap_point)); + if (test_mouse_event) { generator.MoveMouseTo(tap_point); generator.ClickLeftButton();
diff --git a/ash/fast_ink/fast_ink_view.cc b/ash/fast_ink/fast_ink_view.cc index 8f1a1c9..c732dcbf5 100644 --- a/ash/fast_ink/fast_ink_view.cc +++ b/ash/fast_ink/fast_ink_view.cc
@@ -128,19 +128,19 @@ void FastInkView::ReclaimResources( const std::vector<viz::ReturnedResource>& resources) { - DCHECK_EQ(resources.size(), 1u); + for (auto& entry : resources) { + auto it = resources_.find(entry.id); + DCHECK(it != resources_.end()); + std::unique_ptr<FastInkResource> resource = std::move(it->second); + resources_.erase(it); - auto it = resources_.find(resources.front().id); - DCHECK(it != resources_.end()); - std::unique_ptr<FastInkResource> resource = std::move(it->second); - resources_.erase(it); + gpu::gles2::GLES2Interface* gles2 = resource->context_provider->ContextGL(); + if (entry.sync_token.HasData()) + gles2->WaitSyncTokenCHROMIUM(entry.sync_token.GetConstData()); - gpu::gles2::GLES2Interface* gles2 = resource->context_provider->ContextGL(); - if (resources.front().sync_token.HasData()) - gles2->WaitSyncTokenCHROMIUM(resources.front().sync_token.GetConstData()); - - if (!resources.front().lost) - returned_resources_.push_back(std::move(resource)); + if (!entry.lost) + returned_resources_.push_back(std::move(resource)); + } } void FastInkView::UpdateDamageRect(const gfx::Rect& rect) {
diff --git a/ash/login/ui/login_auth_user_view.cc b/ash/login/ui/login_auth_user_view.cc index df467f5..77aa6d3 100644 --- a/ash/login/ui/login_auth_user_view.cc +++ b/ash/login/ui/login_auth_user_view.cc
@@ -140,7 +140,7 @@ void LoginAuthUserView::OnAuthSubmit(bool is_pin, const base::string16& password) { Shell::Get()->lock_screen_controller()->AuthenticateUser( - current_user_, UTF16ToUTF8(password), is_pin, + current_user_, base::UTF16ToUTF8(password), is_pin, base::BindOnce([](OnAuthCallback on_auth, bool auth_success) { on_auth.Run(auth_success); }, on_auth_));
diff --git a/ash/public/cpp/BUILD.gn b/ash/public/cpp/BUILD.gn index ff8fe16..b3d5baa 100644 --- a/ash/public/cpp/BUILD.gn +++ b/ash/public/cpp/BUILD.gn
@@ -41,6 +41,7 @@ "shelf_types.h", "shell_window_ids.cc", "shell_window_ids.h", + "voice_interaction_state.h", "window_pin_type.cc", "window_pin_type.h", "window_properties.cc",
diff --git a/ash/public/cpp/shell_window_ids.h b/ash/public/cpp/shell_window_ids.h index 3d6d8d6..68e9ec8c 100644 --- a/ash/public/cpp/shell_window_ids.h +++ b/ash/public/cpp/shell_window_ids.h
@@ -111,18 +111,20 @@ // region selector for partial screenshots. kShellWindowId_OverlayContainer, - // ID of the window created by PhantomWindowController or - // DragWindowController. - kShellWindowId_PhantomWindow, - // The container for mouse cursor. kShellWindowId_MouseCursorContainer, // The topmost container, used for power off animation. kShellWindowId_PowerButtonAnimationContainer, - kShellWindowId_Min = kShellWindowId_ScreenRotationContainer, - kShellWindowId_Max = kShellWindowId_PowerButtonAnimationContainer, + kShellWindowId_MinContainer = kShellWindowId_ScreenRotationContainer, + kShellWindowId_MaxContainer = kShellWindowId_PowerButtonAnimationContainer, +}; + +// Special shell windows that are not containers. +enum NonContainerWindowId { + // The window created by PhantomWindowController or DragWindowController. + kShellWindowId_PhantomWindow = kShellWindowId_MaxContainer + 1 }; // A list of all the above valid container IDs. Add any new ID to this list. @@ -152,7 +154,6 @@ kShellWindowId_DragImageAndTooltipContainer, kShellWindowId_SettingBubbleContainer, kShellWindowId_OverlayContainer, - kShellWindowId_PhantomWindow, kShellWindowId_MouseCursorContainer, kShellWindowId_PowerButtonAnimationContainer, };
diff --git a/ash/public/cpp/voice_interaction_state.h b/ash/public/cpp/voice_interaction_state.h new file mode 100644 index 0000000..fd9d049 --- /dev/null +++ b/ash/public/cpp/voice_interaction_state.h
@@ -0,0 +1,21 @@ +// 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 ASH_PUBLIC_CPP_VOICE_INTERACTION_STATE_H_ +#define ASH_PUBLIC_CPP_VOICE_INTERACTION_STATE_H_ + +namespace ash { + +enum class VoiceInteractionState { + // Voice interaction service is not ready yet, request sent will be waiting. + NOT_READY = 0, + // Voice interaction session is stopped. + STOPPED, + // Voice interaction session is currently running. + RUNNING +}; + +} // namespace ash + +#endif // ASH_PUBLIC_CPP_VOICE_INTERACTION_STATE_H_
diff --git a/ash/resources/vector_icons/BUILD.gn b/ash/resources/vector_icons/BUILD.gn index 569640d..70a3281 100644 --- a/ash/resources/vector_icons/BUILD.gn +++ b/ash/resources/vector_icons/BUILD.gn
@@ -100,8 +100,6 @@ "shelf_overflow.icon", "shelf_overview.1x.icon", "shelf_overview.icon", - "shelf_voice_interaction.1x.icon", - "shelf_voice_interaction.icon", "system_menu_accessibility.1x.icon", "system_menu_accessibility.icon", "system_menu_accessibility_auto_click.1x.icon",
diff --git a/ash/resources/vector_icons/shelf_voice_interaction.1x.icon b/ash/resources/vector_icons/shelf_voice_interaction.1x.icon deleted file mode 100644 index 57ed627..0000000 --- a/ash/resources/vector_icons/shelf_voice_interaction.1x.icon +++ /dev/null
@@ -1,38 +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. - -CANVAS_DIMENSIONS, 24, -PATH_COLOR_ARGB, 0xFF, 0x34, 0xA8, 0x53, -MOVE_TO, 22.36f, 8.64f, -CUBIC_TO, 23.27f, 8.64f, 24, 7.9f, 24, 7, -CUBIC_TO, 24, 6.1f, 23.27f, 5.36f, 22.36f, 5.36f, -CUBIC_TO, 21.46f, 5.36f, 20.73f, 6.1f, 20.73f, 7, -CUBIC_TO, 20.73f, 7.9f, 21.46f, 8.64f, 22.36f, 8.64f, -LINE_TO, 22.36f, 8.64f, -CLOSE, -NEW_PATH, -PATH_COLOR_ARGB, 0xFF, 0xEB, 0x43, 0x35, -MOVE_TO, 17.45f, 14.09f, -CUBIC_TO, 19.26f, 14.09f, 20.73f, 12.63f, 20.73f, 10.82f, -CUBIC_TO, 20.73f, 9.01f, 19.26f, 7.55f, 17.45f, 7.55f, -CUBIC_TO, 15.65f, 7.55f, 14.18f, 9.01f, 14.18f, 10.82f, -CUBIC_TO, 14.18f, 12.63f, 15.65f, 14.09f, 17.45f, 14.09f, -CLOSE, -NEW_PATH, -PATH_COLOR_ARGB, 0xFF, 0xFB, 0xBC, 0x05, -MOVE_TO, 17.45f, 22.82f, -CUBIC_TO, 19.56f, 22.82f, 21.27f, 21.11f, 21.27f, 19, -CUBIC_TO, 21.27f, 16.89f, 19.56f, 15.18f, 17.45f, 15.18f, -CUBIC_TO, 15.35f, 15.18f, 13.64f, 16.89f, 13.64f, 19, -CUBIC_TO, 13.64f, 21.11f, 15.35f, 22.82f, 17.45f, 22.82f, -CLOSE, -NEW_PATH, -PATH_COLOR_ARGB, 0xFF, 0x42, 0x85, 0xF4, -MOVE_TO, 6.55f, 14.09f, -CUBIC_TO, 10.16f, 14.09f, 13.09f, 11.16f, 13.09f, 7.55f, -CUBIC_TO, 13.09f, 3.93f, 10.16f, 1, 6.55f, 1, -CUBIC_TO, 2.93f, 1, 0, 3.93f, 0, 7.55f, -CUBIC_TO, 0, 11.16f, 2.93f, 14.09f, 6.55f, 14.09f, -CLOSE, -END
diff --git a/ash/resources/vector_icons/shelf_voice_interaction.icon b/ash/resources/vector_icons/shelf_voice_interaction.icon deleted file mode 100644 index 188c78d..0000000 --- a/ash/resources/vector_icons/shelf_voice_interaction.icon +++ /dev/null
@@ -1,38 +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. - -CANVAS_DIMENSIONS, 48, -PATH_COLOR_ARGB, 0xFF, 0x34, 0xA8, 0x53, -MOVE_TO, 44.73f, 17.27f, -CUBIC_TO, 46.53f, 17.27f, 48, 15.81f, 48, 14, -CUBIC_TO, 48, 12.19f, 46.53f, 10.73f, 44.73f, 10.73f, -CUBIC_TO, 42.92f, 10.73f, 41.45f, 12.19f, 41.45f, 14, -CUBIC_TO, 41.45f, 15.81f, 42.92f, 17.27f, 44.73f, 17.27f, -LINE_TO, 44.73f, 17.27f, -CLOSE, -NEW_PATH, -PATH_COLOR_ARGB, 0xFF, 0xEB, 0x43, 0x35, -MOVE_TO, 34.91f, 28.18f, -CUBIC_TO, 38.52f, 28.18f, 41.45f, 25.25f, 41.45f, 21.64f, -CUBIC_TO, 41.45f, 18.02f, 38.52f, 15.09f, 34.91f, 15.09f, -CUBIC_TO, 31.29f, 15.09f, 28.36f, 18.02f, 28.36f, 21.64f, -CUBIC_TO, 28.36f, 25.25f, 31.29f, 28.18f, 34.91f, 28.18f, -CLOSE, -NEW_PATH, -PATH_COLOR_ARGB, 0xFF, 0xFB, 0xBC, 0x05, -MOVE_TO, 34.91f, 45.64f, -CUBIC_TO, 39.13f, 45.64f, 42.55f, 42.22f, 42.55f, 38, -CUBIC_TO, 42.55f, 33.78f, 39.13f, 30.36f, 34.91f, 30.36f, -CUBIC_TO, 30.69f, 30.36f, 27.27f, 33.78f, 27.27f, 38, -CUBIC_TO, 27.27f, 42.22f, 30.69f, 45.64f, 34.91f, 45.64f, -CLOSE, -NEW_PATH, -PATH_COLOR_ARGB, 0xFF, 0x42, 0x85, 0xF4, -MOVE_TO, 13.09f, 28.18f, -CUBIC_TO, 20.32f, 28.18f, 26.18f, 22.32f, 26.18f, 15.09f, -CUBIC_TO, 26.18f, 7.86f, 20.32f, 2, 13.09f, 2, -CUBIC_TO, 5.86f, 2, 0, 7.86f, 0, 15.09f, -CUBIC_TO, 0, 22.32f, 5.86f, 28.18f, 13.09f, 28.18f, -CLOSE, -END
diff --git a/ash/shelf/app_list_button.cc b/ash/shelf/app_list_button.cc index a782a63..57cfa11 100644 --- a/ash/shelf/app_list_button.cc +++ b/ash/shelf/app_list_button.cc
@@ -381,7 +381,8 @@ if (chromeos::switches::IsVoiceInteractionEnabled()) // active: 100% alpha, inactive: 54% alpha - fg_flags.setAlpha(voice_interaction_running_ + fg_flags.setAlpha(voice_interaction_state_ == + ash::VoiceInteractionState::RUNNING ? kVoiceInteractionRunningAlpha : kVoiceInteractionNotRunningAlpha); @@ -459,19 +460,34 @@ OnAppListDismissed(); } -void AppListButton::OnVoiceInteractionStatusChanged(bool running) { - voice_interaction_running_ = running; +void AppListButton::OnVoiceInteractionStatusChanged( + ash::VoiceInteractionState state) { + voice_interaction_state_ = state; SchedulePaint(); - // Voice interaction window shows up, we start hiding the animation if it is - // running. - if (running && voice_interaction_overlay_->IsBursting()) { - voice_interaction_animation_hide_delay_timer_->Start( - FROM_HERE, - base::TimeDelta::FromMilliseconds( - kVoiceInteractionAnimationHideDelayMs), - base::Bind(&VoiceInteractionOverlay::HideAnimation, - base::Unretained(voice_interaction_overlay_))); + switch (state) { + case ash::VoiceInteractionState::STOPPED: + break; + case ash::VoiceInteractionState::NOT_READY: + // If we are showing the bursting or waiting animation, no need to do + // anything. Otherwise show the waiting animation now. + if (!voice_interaction_overlay_->IsBursting() && + !voice_interaction_overlay_->IsWaiting()) { + voice_interaction_overlay_->WaitingAnimation(); + } + break; + case ash::VoiceInteractionState::RUNNING: + // we start hiding the animation if it is running. + if (voice_interaction_overlay_->IsBursting() || + voice_interaction_overlay_->IsWaiting()) { + voice_interaction_animation_hide_delay_timer_->Start( + FROM_HERE, + base::TimeDelta::FromMilliseconds( + kVoiceInteractionAnimationHideDelayMs), + base::Bind(&VoiceInteractionOverlay::HideAnimation, + base::Unretained(voice_interaction_overlay_))); + } + break; } } @@ -479,9 +495,10 @@ // We only show the voice interaction icon and related animation when the // shelf is at the bottom position and voice interaction is not running. ShelfAlignment alignment = shelf_->alignment(); - bool show_icon = (alignment == SHELF_ALIGNMENT_BOTTOM || - alignment == SHELF_ALIGNMENT_BOTTOM_LOCKED) && - !voice_interaction_running_; + bool show_icon = + (alignment == SHELF_ALIGNMENT_BOTTOM || + alignment == SHELF_ALIGNMENT_BOTTOM_LOCKED) && + (voice_interaction_state_ == ash::VoiceInteractionState::STOPPED); voice_interaction_overlay_->StartAnimation(show_icon); }
diff --git a/ash/shelf/app_list_button.h b/ash/shelf/app_list_button.h index 2bf9232..a12d66bf 100644 --- a/ash/shelf/app_list_button.h +++ b/ash/shelf/app_list_button.h
@@ -8,6 +8,7 @@ #include <memory> #include "ash/ash_export.h" +#include "ash/public/cpp/voice_interaction_state.h" #include "ash/shell_observer.h" #include "base/macros.h" #include "third_party/skia/include/core/SkColor.h" @@ -69,7 +70,8 @@ // ShellObserver: void OnAppListVisibilityChanged(bool shown, aura::Window* root_window) override; - void OnVoiceInteractionStatusChanged(bool running) override; + void OnVoiceInteractionStatusChanged( + ash::VoiceInteractionState state) override; void StartVoiceInteractionAnimation(); @@ -98,7 +100,8 @@ std::unique_ptr<base::OneShotTimer> voice_interaction_animation_hide_delay_timer_; - bool voice_interaction_running_ = false; + ash::VoiceInteractionState voice_interaction_state_ = + ash::VoiceInteractionState::STOPPED; // Flag that gets set each time we receive a mouse or gesture event. It is // then used to render the ink drop in the right location.
diff --git a/ash/shelf/voice_interaction_overlay.cc b/ash/shelf/voice_interaction_overlay.cc index 97b934a..2495e28 100644 --- a/ash/shelf/voice_interaction_overlay.cc +++ b/ash/shelf/voice_interaction_overlay.cc
@@ -288,6 +288,22 @@ gfx::Tween::LINEAR_OUT_SLOW_IN, animation_observer); } + void SetToLarge(const gfx::PointF& new_center) { + PaintedShapeTransforms transforms; + SetPaintedLayersVisible(true); + // Hide the foreground layers and only show the background layers. + for (int i = 0; i < PAINTED_SHAPE_COUNT; ++i) + painted_layers_[i]->SetVisible(false); + // Hide the shadow layer + shadow_layer_->SetVisible(false); + + center_point_ = new_center; + // Set the painted layers to the large rectangle size + CalculateRectTransforms(large_size_, kBackgroundCornerRadiusDip, + &transforms); + SetTransforms(transforms); + } + void ResetShape() { // This reverts to the original small round shape. shadow_layer_->SetVisible(true); @@ -581,9 +597,6 @@ icon_layer_(base::MakeUnique<VoiceInteractionIcon>()), background_layer_(base::MakeUnique<VoiceInteractionIconBackground>()), host_view_(host_view), - is_bursting_(false), - show_icon_(false), - should_hide_animation_(false), circle_layer_delegate_(kRippleColor, kRippleCircleInitRadiusDip) { SetPaintToLayer(ui::LAYER_NOT_DRAWN); layer()->set_name("VoiceInteractionOverlay:ROOT_LAYER"); @@ -605,7 +618,7 @@ VoiceInteractionOverlay::~VoiceInteractionOverlay() {} void VoiceInteractionOverlay::StartAnimation(bool show_icon) { - is_bursting_ = false; + animation_state_ = AnimationState::STARTING; show_icon_ = show_icon; SetVisible(true); @@ -715,8 +728,7 @@ } void VoiceInteractionOverlay::BurstAnimation() { - is_bursting_ = true; - should_hide_animation_ = false; + animation_state_ = AnimationState::BURSTING; gfx::Point center = host_view_->GetAppListButtonCenterPoint(); gfx::Transform transform; @@ -766,10 +778,6 @@ } // Setup background animation. - ui::CallbackLayerAnimationObserver* observer = - new ui::CallbackLayerAnimationObserver( - base::Bind(&VoiceInteractionOverlay::AnimationEndedCallback, - base::Unretained(this))); // Transform to new shape. // We want to animate from the background's current position into a larger // size. The animation moves the background's center point while morphing from @@ -785,12 +793,70 @@ gfx::PointF( kBackgroundLargeWidthDip / 2 + kBackgroundPaddingDip - x_offset, -kBackgroundLargeHeightDip / 2 - kBackgroundPaddingDip - y_offset), - observer); - observer->SetActive(); + nullptr); +} + +void VoiceInteractionOverlay::WaitingAnimation() { + // If we are already playing burst animation, it will end up at waiting state + // anyway. No need to do anything. + if (IsBursting()) + return; + + animation_state_ = AnimationState::WAITING; + + gfx::Point center = host_view_->GetAppListButtonCenterPoint(); + gfx::Transform transform; + + ripple_layer_->SetOpacity(0); + icon_layer_->SetOpacity(0); + background_layer_->SetOpacity(0); + SetVisible(true); + + // Setup icon layer. + { + transform.Translate(kBackgroundLargeWidthDip / 2 + kBackgroundPaddingDip - + kIconEndSizeDip / 2, + -kBackgroundLargeHeightDip / 2 - kBackgroundPaddingDip - + kIconEndSizeDip / 2); + SkMScalar scale_factor = kIconEndSizeDip / kIconInitSizeDip; + transform.Scale(scale_factor, scale_factor); + icon_layer_->SetTransform(transform); + + ui::ScopedLayerAnimationSettings settings(icon_layer_->GetAnimator()); + settings.SetTransitionDuration( + base::TimeDelta::FromMilliseconds(kBackgroundMorphDurationMs)); + settings.SetPreemptionStrategy( + ui::LayerAnimator::PreemptionStrategy::ENQUEUE_NEW_ANIMATION); + settings.SetTweenType(gfx::Tween::LINEAR_OUT_SLOW_IN); + + icon_layer_->SetOpacity(1); + icon_layer_->StartAnimation(); + } + + // Setup background layer. + { + float x_offset = center.x() - kBackgroundSizeDip / 2; + float y_offset = center.y() - kBackgroundSizeDip / 2; + + transform.MakeIdentity(); + background_layer_->SetTransform(transform); + background_layer_->SetToLarge(gfx::PointF( + kBackgroundLargeWidthDip / 2 + kBackgroundPaddingDip - x_offset, + -kBackgroundLargeHeightDip / 2 - kBackgroundPaddingDip - y_offset)); + + ui::ScopedLayerAnimationSettings settings(background_layer_->GetAnimator()); + settings.SetTransitionDuration( + base::TimeDelta::FromMilliseconds(kBackgroundMorphDurationMs)); + settings.SetPreemptionStrategy( + ui::LayerAnimator::PreemptionStrategy::ENQUEUE_NEW_ANIMATION); + settings.SetTweenType(gfx::Tween::LINEAR_OUT_SLOW_IN); + + background_layer_->SetOpacity(1); + } } void VoiceInteractionOverlay::EndAnimation() { - if (is_bursting_) { + if (IsBursting()) { // Too late, user action already fired, we have to finish what's started. return; } @@ -868,14 +934,7 @@ } void VoiceInteractionOverlay::HideAnimation() { - is_bursting_ = false; - - if (background_layer_->GetAnimator()->is_animating()) { - // Wait for current animation to finish - should_hide_animation_ = true; - return; - } - should_hide_animation_ = false; + animation_state_ = AnimationState::HIDDEN; // Setup ripple animations. { @@ -915,12 +974,4 @@ } } -bool VoiceInteractionOverlay::AnimationEndedCallback( - const ui::CallbackLayerAnimationObserver& observer) { - if (should_hide_animation_) - HideAnimation(); - - return true; -} - } // namespace ash
diff --git a/ash/shelf/voice_interaction_overlay.h b/ash/shelf/voice_interaction_overlay.h index f126751c..4f89c08 100644 --- a/ash/shelf/voice_interaction_overlay.h +++ b/ash/shelf/voice_interaction_overlay.h
@@ -13,10 +13,6 @@ #include "ui/views/animation/ink_drop_painted_layer_delegates.h" #include "ui/views/view.h" -namespace ui { -class CallbackLayerAnimationObserver; -} // namespace ui - namespace ash { class AppListButton; @@ -31,12 +27,25 @@ void StartAnimation(bool show_icon); void EndAnimation(); void BurstAnimation(); + void WaitingAnimation(); void HideAnimation(); - bool IsBursting() const { return is_bursting_; } + bool IsBursting() const { + return AnimationState::BURSTING == animation_state_; + } + bool IsWaiting() const { return AnimationState::WAITING == animation_state_; } private: - bool AnimationEndedCallback( - const ui::CallbackLayerAnimationObserver& observer); + enum class AnimationState { + // Indicates no animation is playing. + HIDDEN = 0, + // Indicates currently playing the starting animation. + STARTING, + // Indiates the current animation is in the bursting phase, which means no + // turning back. + BURSTING, + // Indicates currently playing the waiting animation. + WAITING + }; std::unique_ptr<ui::Layer> ripple_layer_; std::unique_ptr<VoiceInteractionIcon> icon_layer_; @@ -44,16 +53,10 @@ AppListButton* host_view_; - // Indiates the current animation is in the bursting phase, which means no - // turning back. - bool is_bursting_; + AnimationState animation_state_ = AnimationState::HIDDEN; // Whether showing the icon animation or not. - bool show_icon_; - - // Whether we should hide the burst animation when the animation ends. This is - // used to synchronize the animation and the underlying window's appearance. - bool should_hide_animation_; + bool show_icon_ = false; views::CircleLayerDelegate circle_layer_delegate_;
diff --git a/ash/shell.cc b/ash/shell.cc index b656fd50..b2f7edf4 100644 --- a/ash/shell.cc +++ b/ash/shell.cc
@@ -617,9 +617,9 @@ observer.OnAppListVisibilityChanged(visible, root_window); } -void Shell::NotifyVoiceInteractionStatusChanged(bool running) { +void Shell::NotifyVoiceInteractionStatusChanged(VoiceInteractionState state) { for (auto& observer : shell_observers_) - observer.OnVoiceInteractionStatusChanged(running); + observer.OnVoiceInteractionStatusChanged(state); } ////////////////////////////////////////////////////////////////////////////////
diff --git a/ash/shell.h b/ash/shell.h index 1a34aebd..5518b0361 100644 --- a/ash/shell.h +++ b/ash/shell.h
@@ -173,6 +173,7 @@ enum class Config; enum class LoginStatus; +enum class VoiceInteractionState; // Shell is a singleton object that presents the Shell API and implements the // RootWindow's delegate interface. @@ -617,7 +618,7 @@ void NotifyAppListVisibilityChanged(bool visible, aura::Window* root_window); - void NotifyVoiceInteractionStatusChanged(bool running); + void NotifyVoiceInteractionStatusChanged(VoiceInteractionState state); private: FRIEND_TEST_ALL_PREFIXES(ExtendedDesktopTest, TestCursor);
diff --git a/ash/shell_observer.h b/ash/shell_observer.h index fbf20b4..5e4f2561 100644 --- a/ash/shell_observer.h +++ b/ash/shell_observer.h
@@ -16,6 +16,8 @@ namespace ash { +enum class VoiceInteractionState; + class ASH_EXPORT ShellObserver { public: // Called when the AppList is shown or dismissed. @@ -68,8 +70,8 @@ // Called when a new KeyboardController is created. virtual void OnKeyboardControllerCreated() {} - // Called when voice interaction session starts / finishes. - virtual void OnVoiceInteractionStatusChanged(bool running) {} + // Called when voice interaction session state changes. + virtual void OnVoiceInteractionStatusChanged(VoiceInteractionState state) {} // Called at the end of Shell::Init. virtual void OnShellInitialized() {}
diff --git a/ash/shell_unittest.cc b/ash/shell_unittest.cc index 21b6f487..367974a 100644 --- a/ash/shell_unittest.cc +++ b/ash/shell_unittest.cc
@@ -100,6 +100,10 @@ kShellWindowId_ImeWindowParentContainer)); EXPECT_TRUE( Shell::GetContainer(root_window, kShellWindowId_MouseCursorContainer)); + + // Phantom window is not a container. + EXPECT_EQ(0u, container_ids.count(kShellWindowId_PhantomWindow)); + EXPECT_FALSE(Shell::GetContainer(root_window, kShellWindowId_PhantomWindow)); } class ModalWindow : public views::WidgetDelegateView {
diff --git a/ash/system/supervised/tray_supervised_user_unittest.cc b/ash/system/supervised/tray_supervised_user_unittest.cc index d1ce6dc..cad315a 100644 --- a/ash/system/supervised/tray_supervised_user_unittest.cc +++ b/ash/system/supervised/tray_supervised_user_unittest.cc
@@ -20,6 +20,7 @@ #include "ui/message_center/notification_types.h" #include "ui/views/view.h" +using base::UTF16ToUTF8; using message_center::NotificationList; namespace ash {
diff --git a/ash/wallpaper/wallpaper_controller.cc b/ash/wallpaper/wallpaper_controller.cc index 39c54bc..4aa97499 100644 --- a/ash/wallpaper/wallpaper_controller.cc +++ b/ash/wallpaper/wallpaper_controller.cc
@@ -9,6 +9,7 @@ #include "ash/ash_switches.h" #include "ash/display/window_tree_host_manager.h" +#include "ash/login/ui/login_constants.h" #include "ash/public/cpp/ash_pref_names.h" #include "ash/public/cpp/config.h" #include "ash/public/cpp/shell_window_ids.h" @@ -425,6 +426,9 @@ return; } + if (Shell::Get()->session_controller()->IsUserSessionBlocked()) + component->SetWallpaperBlur(login_constants::kBlurSigma); + RootWindowController* controller = RootWindowController::ForWindow(root_window); controller->SetAnimatingWallpaperWidgetController(
diff --git a/ash/wallpaper/wallpaper_view.cc b/ash/wallpaper/wallpaper_view.cc index ec74bc7..bb7f32c 100644 --- a/ash/wallpaper/wallpaper_view.cc +++ b/ash/wallpaper/wallpaper_view.cc
@@ -263,8 +263,6 @@ aura::Window* container = root_window->GetChildById(container_id); wallpaper_widget->SetBounds(container->bounds()); - if (Shell::Get()->session_controller()->IsUserSessionBlocked()) - wallpaper_widget->GetLayer()->SetLayerBlur(login_constants::kBlurSigma); return wallpaper_widget; }
diff --git a/ash/wallpaper/wallpaper_widget_controller.cc b/ash/wallpaper/wallpaper_widget_controller.cc index ecedde7..db2883c 100644 --- a/ash/wallpaper/wallpaper_widget_controller.cc +++ b/ash/wallpaper/wallpaper_widget_controller.cc
@@ -70,6 +70,8 @@ WallpaperWidgetController::~WallpaperWidgetController() { if (widget_) { + if (widget_->GetLayer()->layer_blur() > 0.0f) + widget_parent_->layer()->SetCacheRenderSurface(false); views::Widget* widget = widget_; RemoveObservers(); widget->CloseNow(); @@ -88,11 +90,15 @@ bool WallpaperWidgetController::Reparent(aura::Window* root_window, int container) { if (widget_) { + // Ensures the cache render surface of the old parent is unset. + widget_parent_->layer()->SetCacheRenderSurface(false); widget_parent_->RemoveObserver(this); aura::Window* window = widget_->GetNativeWindow(); root_window->GetChildById(container)->AddChild(window); widget_parent_ = widget_->GetNativeWindow()->parent(); widget_parent_->AddObserver(this); + if (widget_->GetLayer()->layer_blur() > 0.0f) + widget_parent_->layer()->SetCacheRenderSurface(true); return true; } // Nothing to reparent. @@ -128,6 +134,12 @@ } } +void WallpaperWidgetController::SetWallpaperBlur(float blur_sigma) { + widget_->GetLayer()->SetLayerBlur(blur_sigma); + // Force the use of cache render surface to make blur more efficient. + widget_parent_->layer()->SetCacheRenderSurface(blur_sigma > 0.0f); +} + AnimatingWallpaperWidgetController::AnimatingWallpaperWidgetController( WallpaperWidgetController* controller) : controller_(controller) {}
diff --git a/ash/wallpaper/wallpaper_widget_controller.h b/ash/wallpaper/wallpaper_widget_controller.h index 1c379ee9..99363043b 100644 --- a/ash/wallpaper/wallpaper_widget_controller.h +++ b/ash/wallpaper/wallpaper_widget_controller.h
@@ -42,6 +42,9 @@ // necessary this as |layer_| doesn't have access to the root window). void StartAnimating(RootWindowController* root_window_controller); + // Blur pixels of the wallpaper layer by 3 * the given amount. + void SetWallpaperBlur(float blur_sigma); + views::Widget* widget() { return widget_; } private:
diff --git a/ash/wm/wm_snap_to_pixel_layout_manager.cc b/ash/wm/wm_snap_to_pixel_layout_manager.cc index a28d268..a1968ee 100644 --- a/ash/wm/wm_snap_to_pixel_layout_manager.cc +++ b/ash/wm/wm_snap_to_pixel_layout_manager.cc
@@ -19,8 +19,8 @@ // static void WmSnapToPixelLayoutManager::InstallOnContainers(aura::Window* window) { for (aura::Window* child : window->children()) { - if (child->id() < kShellWindowId_Min || - child->id() > kShellWindowId_Max) // not a container + if (child->id() < kShellWindowId_MinContainer || + child->id() > kShellWindowId_MaxContainer) // not a container continue; if (child->GetProperty(kSnapChildrenToPixelBoundary)) { if (!child->layout_manager())
diff --git a/base/BUILD.gn b/base/BUILD.gn index ca2e3b5..29b25e24 100644 --- a/base/BUILD.gn +++ b/base/BUILD.gn
@@ -2449,6 +2449,7 @@ "memory/ref_counted_unittest.nc", "memory/weak_ptr_unittest.nc", "metrics/histogram_unittest.nc", + "strings/string16_unittest.nc", "task_scheduler/task_traits_unittest.nc", ]
diff --git a/base/android/java/src/org/chromium/base/ContentUriUtils.java b/base/android/java/src/org/chromium/base/ContentUriUtils.java index a239fd4..ba92a56c 100644 --- a/base/android/java/src/org/chromium/base/ContentUriUtils.java +++ b/base/android/java/src/org/chromium/base/ContentUriUtils.java
@@ -176,10 +176,7 @@ public static String getDisplayName(Uri uri, Context context, String columnField) { if (uri == null) return ""; ContentResolver contentResolver = context.getContentResolver(); - Cursor cursor = null; - try { - cursor = contentResolver.query(uri, null, null, null, null); - + try (Cursor cursor = contentResolver.query(uri, null, null, null, null)) { if (cursor != null && cursor.getCount() >= 1) { cursor.moveToFirst(); int displayNameIndex = cursor.getColumnIndex(columnField); @@ -207,8 +204,6 @@ // Some android models don't handle the provider call correctly. // see crbug.com/345393 return ""; - } finally { - StreamUtil.closeQuietly(cursor); } return ""; } @@ -226,10 +221,7 @@ return false; } ContentResolver contentResolver = ContextUtils.getApplicationContext().getContentResolver(); - Cursor cursor = null; - try { - cursor = contentResolver.query(uri, null, null, null, null); - + try (Cursor cursor = contentResolver.query(uri, null, null, null, null)) { if (cursor != null && cursor.getCount() >= 1) { cursor.moveToFirst(); return hasVirtualFlag(cursor); @@ -238,8 +230,6 @@ // Some android models don't handle the provider call correctly. // see crbug.com/345393 return false; - } finally { - StreamUtil.closeQuietly(cursor); } return false; }
diff --git a/base/android/java/src/org/chromium/base/SecureRandomInitializer.java b/base/android/java/src/org/chromium/base/SecureRandomInitializer.java index 294b1e6..bfd7b49 100644 --- a/base/android/java/src/org/chromium/base/SecureRandomInitializer.java +++ b/base/android/java/src/org/chromium/base/SecureRandomInitializer.java
@@ -24,16 +24,12 @@ * Safely initializes the random number generator, by seeding it with data from /dev/urandom. */ public static void initialize(SecureRandom generator) throws IOException { - FileInputStream fis = null; - try { + try (FileInputStream fis = new FileInputStream("/dev/urandom")) { byte[] seedBytes = new byte[NUM_RANDOM_BYTES]; - fis = new FileInputStream("/dev/urandom"); if (fis.read(seedBytes) != seedBytes.length) { throw new IOException("Failed to get enough random data."); } generator.setSeed(seedBytes); - } finally { - StreamUtil.closeQuietly(fis); } } }
diff --git a/base/message_loop/message_loop_io_posix_unittest.cc b/base/message_loop/message_loop_io_posix_unittest.cc index 75d25ad..4a6d103 100644 --- a/base/message_loop/message_loop_io_posix_unittest.cc +++ b/base/message_loop/message_loop_io_posix_unittest.cc
@@ -36,26 +36,10 @@ int err = pipe(pipefds); ASSERT_EQ(0, err); read_fd_ = ScopedFD(pipefds[0]); - ASSERT_TRUE(SetNonBlocking(read_fd_.get())); write_fd_ = ScopedFD(pipefds[1]); } void TriggerReadEvent() { - // First empty the pipe buffer. - while (true) { - char c; - int result = HANDLE_EINTR(read(read_fd_.get(), &c, 1)); - if (result == -1) { - if (errno != EWOULDBLOCK) { - PLOG(ERROR) << "read"; - FAIL(); - } - break; - } - - EXPECT_GT(result, 0); - }; - // Write from the other end of the pipe to trigger the event. char c = '\0'; EXPECT_EQ(1, HANDLE_EINTR(write(write_fd_.get(), &c, 1))); @@ -87,20 +71,49 @@ std::unique_ptr<MessageLoopForIO::FileDescriptorWatcher> watcher_to_delete_; }; -// Watcher that calls specified closures when read/write events occur. +// Watcher that calls specified closures when read/write events occur. Verifies +// that each non-null closure passed to this class is called once and only once. +// Also resets the read event by reading from the FD. class CallClosureHandler : public MessageLoopForIO::Watcher { public: CallClosureHandler(OnceClosure read_closure, OnceClosure write_closure) : read_closure_(std::move(read_closure)), write_closure_(std::move(write_closure)) {} - ~CallClosureHandler() override {} + ~CallClosureHandler() override { + EXPECT_TRUE(read_closure_.is_null()); + EXPECT_TRUE(write_closure_.is_null()); + } - // base:MessagePumpFuchsia::Watcher interface + void SetReadClosure(OnceClosure read_closure) { + EXPECT_TRUE(read_closure_.is_null()); + read_closure_ = std::move(read_closure); + } + + void SetWriteClosure(OnceClosure write_closure) { + EXPECT_TRUE(write_closure_.is_null()); + write_closure_ = std::move(write_closure); + } + + // base:MessagePumpFuchsia::Watcher interface. void OnFileCanReadWithoutBlocking(int fd) override { + // Empty the pipe buffer to reset the event. Otherwise libevent + // implementation of MessageLoop may call the event handler again even if + // |read_closure_| below quits the RunLoop. + char c; + int result = HANDLE_EINTR(read(fd, &c, 1)); + if (result == -1) { + PLOG(ERROR) << "read"; + FAIL(); + } + EXPECT_EQ(result, 1); + + ASSERT_FALSE(read_closure_.is_null()); std::move(read_closure_).Run(); } + void OnFileCanWriteWithoutBlocking(int fd) override { + ASSERT_FALSE(write_closure_.is_null()); std::move(write_closure_).Run(); } @@ -238,6 +251,92 @@ RunLoop().RunUntilIdle(); } +// Verify that non-persistent watcher is called only once. +TEST_F(MessageLoopForIoPosixTest, NonPersistentWatcher) { + MessageLoopForIO message_loop; + MessageLoopForIO::FileDescriptorWatcher watcher(FROM_HERE); + + RunLoop run_loop; + CallClosureHandler handler(run_loop.QuitClosure(), OnceClosure()); + + // Create a non-persistent watcher. + ASSERT_TRUE(MessageLoopForIO::current()->WatchFileDescriptor( + read_fd_.get(), /* persistent= */ false, MessageLoopForIO::WATCH_READ, + &watcher, &handler)); + + TriggerReadEvent(); + run_loop.Run(); + + // Trigger the event again. handler should not be called again. + TriggerReadEvent(); + RunLoop().RunUntilIdle(); +} + +// Verify that persistent watcher is called every time the event is triggered. +TEST_F(MessageLoopForIoPosixTest, PersistentWatcher) { + MessageLoopForIO message_loop; + MessageLoopForIO::FileDescriptorWatcher watcher(FROM_HERE); + + RunLoop run_loop1; + CallClosureHandler handler(run_loop1.QuitClosure(), OnceClosure()); + + // Create persistent watcher. + ASSERT_TRUE(MessageLoopForIO::current()->WatchFileDescriptor( + read_fd_.get(), /* persistent= */ true, MessageLoopForIO::WATCH_READ, + &watcher, &handler)); + + TriggerReadEvent(); + run_loop1.Run(); + + RunLoop run_loop2; + handler.SetReadClosure(run_loop2.QuitClosure()); + + // Trigger the event again. handler should be called now, which will quit + // run_loop2. + TriggerReadEvent(); + run_loop2.Run(); +} + +void StopWatchingAndWatchAgain( + MessageLoopForIO::FileDescriptorWatcher* controller, + int fd, + MessageLoopForIO::Watcher* new_handler, + RunLoop* run_loop) { + controller->StopWatchingFileDescriptor(); + + ASSERT_TRUE(MessageLoopForIO::current()->WatchFileDescriptor( + fd, /* persistent= */ true, MessageLoopForIO::WATCH_READ, controller, + new_handler)); + + run_loop->Quit(); +} + +// Verify that a watcher can be stopped and reused from an event handler. +TEST_F(MessageLoopForIoPosixTest, StopAndRestartFromHandler) { + MessageLoopForIO message_loop; + MessageLoopForIO::FileDescriptorWatcher watcher(FROM_HERE); + + RunLoop run_loop1; + RunLoop run_loop2; + CallClosureHandler handler2(run_loop2.QuitClosure(), OnceClosure()); + CallClosureHandler handler1(BindOnce(&StopWatchingAndWatchAgain, &watcher, + read_fd_.get(), &handler2, &run_loop1), + OnceClosure()); + + // Create persistent watcher. + ASSERT_TRUE(MessageLoopForIO::current()->WatchFileDescriptor( + read_fd_.get(), /* persistent= */ true, MessageLoopForIO::WATCH_READ, + &watcher, &handler1)); + + TriggerReadEvent(); + run_loop1.Run(); + + // Trigger the event again. handler2 should be called now, which will quit + // run_loop2 + TriggerReadEvent(); + run_loop2.Run(); +} + } // namespace #endif // !defined(OS_NACL)
diff --git a/base/message_loop/message_pump_fuchsia.cc b/base/message_loop/message_pump_fuchsia.cc index ab1fab1..4199ffc 100644 --- a/base/message_loop/message_pump_fuchsia.cc +++ b/base/message_loop/message_pump_fuchsia.cc
@@ -18,16 +18,19 @@ MessagePumpFuchsia::MxHandleWatchController::~MxHandleWatchController() { if (!StopWatchingMxHandle()) NOTREACHED(); - if (was_destroyed_) { - DCHECK(!*was_destroyed_); - *was_destroyed_ = true; - } } bool MessagePumpFuchsia::MxHandleWatchController::StopWatchingMxHandle() { - // Clear |persistent_| flag, so that if we are stopped mid-callback, we - // won't re-instate the wait operation. - persistent_ = false; + if (was_stopped_) { + DCHECK(!*was_stopped_); + *was_stopped_ = true; + + // |was_stopped_| points at a value stored on the stack, which will go out + // of scope. MessagePumpFuchsia::Run() will reset it only if the value is + // false. So we need to reset this pointer here as well, to make sure it's + // not used again. + was_stopped_ = nullptr; + } // If the pump is gone, or we haven't begun waiting, then there is nothing // to cancel. @@ -50,17 +53,17 @@ uint32_t events; __mxio_wait_end(io_, signals, &events); - // Each |watcher_| callback we invoke may delete |this| from under us. The - // pump has set |was_destroyed_| to point to a safe location on the calling - // stack, so we can use that to detect deletion mid-callback avoid doing - // further work that would touch |this|. - bool* was_destroyed = was_destroyed_; + // Each |watcher_| callback we invoke may stop or delete |this|. The pump has + // set |was_stopped_| to point to a safe location on the calling stack, so we + // can use that to detect being stopped mid-callback and avoid doing further + // work that would touch |this|. + bool* was_stopped = was_stopped_; if (events & MXIO_EVT_WRITABLE) watcher_->OnFileCanWriteWithoutBlocking(fd_); - if (!*was_destroyed && (events & MXIO_EVT_READABLE)) + if (!*was_stopped && (events & MXIO_EVT_READABLE)) watcher_->OnFileCanReadWithoutBlocking(fd_); - // Don't add additional work here without checking |*was_destroyed_| again. + // Don't add additional work here without checking |*was_stopped_| again. } MessagePumpFuchsia::FdWatchController::FdWatchController( @@ -247,18 +250,18 @@ mx_signals_t signals = controller->WaitEnd(packet.signal.observed); - // In the case of a persistent Watch, the Watch may be deleted by the - // caller within the callback, in which case |controller| is no longer - // valid, and we mustn't continue the watch. We check for this with a bool - // on the stack, which the Watch receives a pointer to, to set it so we - // can detect destruction. - bool controller_was_destroyed = false; - controller->was_destroyed_ = &controller_was_destroyed; + // In the case of a persistent Watch, the Watch may be stopped and + // potentially deleted by the caller within the callback, in which case + // |controller| should not be accessed again, and we mustn't continue the + // watch. We check for this with a bool on the stack, which the Watch + // receives a pointer to. + bool controller_was_stopped = false; + controller->was_stopped_ = &controller_was_stopped; controller->watcher_->OnMxHandleSignalled(controller->handle_, signals); - if (!controller_was_destroyed) { - controller->was_destroyed_ = nullptr; + if (!controller_was_stopped) { + controller->was_stopped_ = nullptr; if (controller->persistent_) controller->WaitBegin(); }
diff --git a/base/message_loop/message_pump_fuchsia.h b/base/message_loop/message_pump_fuchsia.h index 1aad9f79..41b4904 100644 --- a/base/message_loop/message_pump_fuchsia.h +++ b/base/message_loop/message_pump_fuchsia.h
@@ -58,10 +58,10 @@ // This bool is used by the pump when invoking the MxHandleWatcher callback, // and by the FdHandleWatchController when invoking read & write callbacks, // to cope with the possibility of the caller deleting the *Watcher within - // the callback. The pump sets |was_destroyed_| to a location on the stack, + // the callback. The pump sets |was_stopped_| to a location on the stack, // and the Watcher writes to it, if set, when deleted, allowing the pump // to check the value on the stack to short-cut any post-callback work. - bool* was_destroyed_ = nullptr; + bool* was_stopped_ = nullptr; protected: friend class MessagePumpFuchsia;
diff --git a/base/message_loop/message_pump_perftest.cc b/base/message_loop/message_pump_perftest.cc index f5bd0dd..55b06e4c 100644 --- a/base/message_loop/message_pump_perftest.cc +++ b/base/message_loop/message_pump_perftest.cc
@@ -285,6 +285,7 @@ (now - start).InMicroseconds() / static_cast<double>(num_posted), "us/task", true); + queue->WillDestroyCurrentMessageLoop(); } };
diff --git a/base/metrics/histogram.cc b/base/metrics/histogram.cc index 7c2a6c2..7cdddcd 100644 --- a/base/metrics/histogram.cc +++ b/base/metrics/histogram.cc
@@ -48,9 +48,6 @@ constexpr uintptr_t kDummyValue = 0xDEADBEEF; #endif -// TODO(asvitkine): Remove this after crbug/736675. -char g_last_logged_histogram_name[256] = {0}; - bool ReadHistogramArguments(PickleIterator* iter, std::string* histogram_name, int* flags, @@ -478,9 +475,6 @@ DCHECK_EQ(0, ranges(0)); DCHECK_EQ(kSampleType_MAX, ranges(bucket_count())); - strlcpy(g_last_logged_histogram_name, histogram_name().c_str(), - sizeof(g_last_logged_histogram_name)); - if (value > kSampleType_MAX - 1) value = kSampleType_MAX - 1; if (value < 0) @@ -584,9 +578,9 @@ return is_valid; // Abort if a problem is found (except "flags", which could legally be zero). - const std::string debug_string = base::StringPrintf( - "%s/%" PRIu32 "/%d/%s", histogram_name().c_str(), bad_fields, - corrupted_count, g_last_logged_histogram_name); + const std::string debug_string = + base::StringPrintf("%s/%" PRIu32 "/%d", histogram_name().c_str(), + bad_fields, corrupted_count); #if !defined(OS_NACL) // Temporary for https://crbug.com/736675. base::debug::ScopedCrashKey crash_key("bad_histogram", debug_string);
diff --git a/base/process/memory_fuchsia.cc b/base/process/memory_fuchsia.cc index 7ddaeb5..6f559a43 100644 --- a/base/process/memory_fuchsia.cc +++ b/base/process/memory_fuchsia.cc
@@ -8,6 +8,10 @@ namespace base { +void EnableTerminationOnOutOfMemory() { + // Nothing to be done here. +} + void EnableTerminationOnHeapCorruption() { // Nothing to be done here. }
diff --git a/base/strings/string16.cc b/base/strings/string16.cc index cea1932..d85859a 100644 --- a/base/strings/string16.cc +++ b/base/strings/string16.cc
@@ -67,6 +67,8 @@ return s_orig; } +namespace string16_internals { + std::ostream& operator<<(std::ostream& out, const string16& str) { return out << UTF16ToUTF8(str); } @@ -75,8 +77,11 @@ *out << str; } +} // namespace string16_internals + } // namespace base -template class std::basic_string<base::char16, base::string16_char_traits>; +template class std:: + basic_string<base::char16, base::string16_internals::string16_char_traits>; #endif // WCHAR_T_IS_UTF32
diff --git a/base/strings/string16.h b/base/strings/string16.h index 30f4e3ee..a86baa2 100644 --- a/base/strings/string16.h +++ b/base/strings/string16.h
@@ -42,7 +42,6 @@ typedef wchar_t char16; typedef std::wstring string16; -typedef std::char_traits<wchar_t> string16_char_traits; } // namespace base @@ -64,6 +63,11 @@ BASE_EXPORT char16* c16memcpy(char16* s1, const char16* s2, size_t n); BASE_EXPORT char16* c16memset(char16* s, char16 c, size_t n); +// This namespace contains the implementation of base::string16 along with +// things that need to be found via argument-dependent lookup from a +// base::string16. +namespace string16_internals { + struct string16_char_traits { typedef char16 char_type; typedef int int_type; @@ -134,7 +138,13 @@ } }; -typedef std::basic_string<char16, base::string16_char_traits> string16; +} // namespace string16_internals + +typedef std::basic_string<char16, + base::string16_internals::string16_char_traits> + string16; + +namespace string16_internals { BASE_EXPORT extern std::ostream& operator<<(std::ostream& out, const string16& str); @@ -142,6 +152,8 @@ // This is required by googletest to print a readable output on test failures. BASE_EXPORT extern void PrintTo(const string16& str, std::ostream* out); +} // namespace string16_internals + } // namespace base // The string class will be explicitly instantiated only once, in string16.cc. @@ -183,8 +195,9 @@ // // TODO(mark): File this bug with Apple and update this note with a bug number. -extern template -class BASE_EXPORT std::basic_string<base::char16, base::string16_char_traits>; +extern template class BASE_EXPORT + std::basic_string<base::char16, + base::string16_internals::string16_char_traits>; // Specialize std::hash for base::string16. Although the style guide forbids // this in general, it is necessary for consistency with WCHAR_T_IS_UTF16
diff --git a/base/strings/string16_unittest.nc b/base/strings/string16_unittest.nc new file mode 100644 index 0000000..5186a45 --- /dev/null +++ b/base/strings/string16_unittest.nc
@@ -0,0 +1,25 @@ +// 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. + +// This is a "No Compile Test". +// http://dev.chromium.org/developers/testing/no-compile-tests + +#include "base/strings/string16.h" + +#if defined(NCTEST_NO_KOENIG_LOOKUP_FOR_STRING16) // [r"use of undeclared identifier 'ShouldNotBeFound'"] + +// base::string16 is declared as a typedef. It should not cause other functions +// in base to be found via Argument-dependent lookup. + +namespace base { +void ShouldNotBeFound(const base::string16& arg) {} +} + +// Intentionally not in base:: namespace. +void WontCompile() { + base::string16 s; + ShouldNotBeFound(s); +} + +#endif
diff --git a/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumAndroidJUnitRunner.java b/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumAndroidJUnitRunner.java index 7d7d99c..8a23048 100644 --- a/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumAndroidJUnitRunner.java +++ b/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumAndroidJUnitRunner.java
@@ -9,6 +9,7 @@ import android.app.Instrumentation; import android.content.Context; import android.os.Bundle; +import android.support.test.InstrumentationRegistry; import android.support.test.internal.runner.RunnerArgs; import android.support.test.internal.runner.TestExecutor; import android.support.test.internal.runner.TestRequest; @@ -46,8 +47,6 @@ private static final String TAG = "BaseJUnitRunner"; - private Bundle mArguments; - @Override public Application newApplication(ClassLoader cl, String className, Context context) throws ClassNotFoundException, IllegalAccessException, InstantiationException { @@ -57,12 +56,6 @@ return super.newApplication(cl, className, context); } - @Override - public void onCreate(Bundle arguments) { - super.onCreate(arguments); - mArguments = arguments; - } - /** * Add TestListInstrumentationRunListener when argument ask the runner to list tests info. * @@ -72,10 +65,21 @@ */ @Override public void onStart() { - if (mArguments != null && mArguments.getString(LIST_ALL_TESTS_FLAG) != null) { - Log.w(TAG, "Runner will list out tests info in JSON without running tests"); + Bundle arguments = InstrumentationRegistry.getArguments(); + if (arguments != null && arguments.getString(LIST_ALL_TESTS_FLAG) != null) { + Log.w(TAG, + String.format("Runner will list out tests info in JSON without running tests. " + + "Arguments: %s", + arguments.toString())); listTests(); // Intentionally not calling super.onStart() to avoid additional work. } else { + if (arguments != null && arguments.getString(ARGUMENT_LOG_ONLY) != null) { + Log.e(TAG, + String.format("Runner will log the tests without running tests." + + " If this cause a test run to fail, please report to" + + " crbug.com/754015. Arguments: %s", + arguments.toString())); + } super.onStart(); } } @@ -86,12 +90,12 @@ try { TestExecutor.Builder executorBuilder = new TestExecutor.Builder(this); executorBuilder.addRunListener(listener); - Bundle junit3Arguments = new Bundle(mArguments); + Bundle junit3Arguments = new Bundle(InstrumentationRegistry.getArguments()); junit3Arguments.putString(ARGUMENT_NOT_ANNOTATION, "org.junit.runner.RunWith"); TestRequest listJUnit3TestRequest = createListTestRequest(junit3Arguments); results = executorBuilder.build().execute(listJUnit3TestRequest); - Bundle junit4Arguments = new Bundle(mArguments); + Bundle junit4Arguments = new Bundle(InstrumentationRegistry.getArguments()); junit4Arguments.putString(ARGUMENT_ANNOTATION, "org.junit.runner.RunWith"); // Do not use Log runner from android test support. @@ -103,7 +107,8 @@ TestRequest listJUnit4TestRequest = createListTestRequest(junit4Arguments); results.putAll(executorBuilder.build().execute(listJUnit4TestRequest)); - listener.saveTestsToJson(mArguments.getString(LIST_ALL_TESTS_FLAG)); + listener.saveTestsToJson( + InstrumentationRegistry.getArguments().getString(LIST_ALL_TESTS_FLAG)); } catch (IOException | RuntimeException e) { String msg = "Fatal exception when running tests"; Log.e(TAG, msg, e);
diff --git a/base/test/launcher/test_launcher.cc b/base/test/launcher/test_launcher.cc index 0223991..a610b22 100644 --- a/base/test/launcher/test_launcher.cc +++ b/base/test/launcher/test_launcher.cc
@@ -62,6 +62,12 @@ #include "base/win/windows_version.h" #endif +#if defined(OS_FUCHSIA) +// TODO(scottmg): For temporary code in OnOutputTimeout(). +#include <magenta/syscalls.h> +#include <magenta/syscalls/object.h> +#endif + namespace base { // See https://groups.google.com/a/chromium.org/d/msg/chromium-dev/nkdTP7sstSc/uT3FaE_sgkAJ . @@ -1169,6 +1175,26 @@ #else fprintf(stdout, "\t%s\n", pair.second.GetCommandLineString().c_str()); #endif + +#if defined(OS_FUCHSIA) + // TODO(scottmg): Temporary code to try to identify why child processes + // appear to not be terminated after a timeout correctly. + // https://crbug.com/750370 and https://crbug.com/738275. + + mx_info_process_t proc_info = {}; + mx_status_t status = + mx_object_get_info(pair.first, MX_INFO_PROCESS, &proc_info, + sizeof(proc_info), nullptr, nullptr); + if (status != MX_OK) { + fprintf(stdout, "mx_object_get_info failed for '%s', status=%d\n", + pair.second.GetCommandLineString().c_str(), status); + } else { + fprintf(stdout, " return_code=%d\n", proc_info.return_code); + fprintf(stdout, " started=%d\n", proc_info.started); + fprintf(stdout, " exited=%d\n", proc_info.exited); + fprintf(stdout, " debugger_attached=%d\n", proc_info.debugger_attached); + } +#endif // OS_FUCHSIA } fflush(stdout);
diff --git a/base/threading/platform_thread.h b/base/threading/platform_thread.h index ad1b7d4..0fb7073 100644 --- a/base/threading/platform_thread.h +++ b/base/threading/platform_thread.h
@@ -20,6 +20,8 @@ #include <windows.h> #elif defined(OS_MACOSX) #include <mach/mach_types.h> +#elif defined(OS_FUCHSIA) +#include <magenta/types.h> #elif defined(OS_POSIX) #include <pthread.h> #include <unistd.h> @@ -32,6 +34,8 @@ typedef DWORD PlatformThreadId; #elif defined(OS_MACOSX) typedef mach_port_t PlatformThreadId; +#elif defined(OS_FUCHSIA) +typedef mx_handle_t PlatformThreadId; #elif defined(OS_POSIX) typedef pid_t PlatformThreadId; #endif
diff --git a/base/threading/platform_thread_fuchsia.cc b/base/threading/platform_thread_fuchsia.cc index 6a9ed18..aea9551 100644 --- a/base/threading/platform_thread_fuchsia.cc +++ b/base/threading/platform_thread_fuchsia.cc
@@ -52,7 +52,8 @@ void PlatformThread::SetName(const std::string& name) { // TODO(fuchsia): There's no system-level API to communicate a thread name // (for the debugger, etc.), so for now only set to our internal mechanisms. - ThreadIdNameManager::GetInstance()->SetName(pthread_self(), name); + ThreadIdNameManager::GetInstance()->SetName(PlatformThread::CurrentId(), + name); tracked_objects::ThreadData::InitializeThreadContext(name); }
diff --git a/base/threading/platform_thread_posix.cc b/base/threading/platform_thread_posix.cc index e049a54..d1e6e675 100644 --- a/base/threading/platform_thread_posix.cc +++ b/base/threading/platform_thread_posix.cc
@@ -28,6 +28,10 @@ #include <sys/syscall.h> #endif +#if defined(OS_FUCHSIA) +#include <magenta/process.h> +#endif + namespace base { void InitThreading(); @@ -137,7 +141,9 @@ return syscall(__NR_gettid); #elif defined(OS_ANDROID) return gettid(); -#elif defined(OS_SOLARIS) || defined(OS_QNX) || defined(OS_FUCHSIA) +#elif defined(OS_FUCHSIA) + return mx_thread_self(); +#elif defined(OS_SOLARIS) || defined(OS_QNX) return pthread_self(); #elif defined(OS_NACL) && defined(__GLIBC__) return pthread_self();
diff --git a/base/trace_event/memory_dump_scheduler_unittest.cc b/base/trace_event/memory_dump_scheduler_unittest.cc index 676be989..18c9a34 100644 --- a/base/trace_event/memory_dump_scheduler_unittest.cc +++ b/base/trace_event/memory_dump_scheduler_unittest.cc
@@ -42,8 +42,8 @@ protected: MemoryDumpScheduler scheduler_; WaitableEvent evt_; - Thread bg_thread_; CallbackWrapper on_tick_; + Thread bg_thread_; }; TEST_F(MemoryDumpSchedulerTest, SingleTrigger) {
diff --git a/build/android/BUILD.gn b/build/android/BUILD.gn index f00a35c..80c21c1 100644 --- a/build/android/BUILD.gn +++ b/build/android/BUILD.gn
@@ -11,6 +11,13 @@ "buildhooks/java/org/chromium/build/BuildHooks.java", "buildhooks/java/org/chromium/build/Callback.java", ] + + # Make all targets pull in the try-with-resources support files. + # If an apk ends up not using any such statements, ProGuard will remove + # them. + deps = [ + "//third_party/bazel/desugar:desugar_runtime_java", + ] no_build_hooks = true supports_android = true }
diff --git a/build/android/apk_operations.py b/build/android/apk_operations.py index 2f695f4..d38ffb5d 100644 --- a/build/android/apk_operations.py +++ b/build/android/apk_operations.py
@@ -40,9 +40,14 @@ devices_obj.pMap(uninstall) -def _LaunchUrl(devices_obj, input_args, device_args_file, url, apk_package): +def _LaunchUrl(devices_obj, input_args, device_args_file, url, apk): if input_args and device_args_file is None: - raise Exception("This apk does not support any flags.") + raise Exception('This apk does not support any flags.') + if url: + view_activity = apk.GetViewActivityName() + if not view_activity: + raise Exception('APK does not support launching with URLs.') + def launch(device): # The flags are first updated with input args. changer = flag_changer.FlagChanger(device, device_args_file) @@ -53,12 +58,13 @@ # Then launch the apk. if url is None: # Simulate app icon click if no url is present. - cmd = ['monkey', '-p', apk_package, '-c', + cmd = ['monkey', '-p', apk.GetPackageName(), '-c', 'android.intent.category.LAUNCHER', '1'] device.RunShellCommand(cmd, check_return=True) else: - launch_intent = intent.Intent( - action='android.intent.action.VIEW', package=apk_package, data=url) + launch_intent = intent.Intent(action='android.intent.action.VIEW', + activity=view_activity, data=url, + package=apk.GetPackageName()) device.StartActivity(launch_intent) devices_obj.pMap(launch) @@ -287,11 +293,13 @@ _UninstallApk(install_dict, devices_obj, apk_package) elif command == 'launch': _LaunchUrl(devices_obj, args.args, command_line_flags_file, - args.url, apk_package) + args.url, apk) elif command == 'run': + logging.warning('Installing...') _InstallApk(apk, install_dict, devices_obj) + logging.warning('Sending launch intent...') _LaunchUrl(devices_obj, args.args, command_line_flags_file, - args.url, apk_package) + args.url, apk) elif command == 'stop': devices_obj.ForceStop(apk_package) elif command == 'clear-data': @@ -318,6 +326,7 @@ if args.verbose_count > 0: flags.append('--verbose') logging.warning('Running: %s', ' '.join(pipes.quote(f) for f in flags)) + logging.warning('All subsequent output is from adb_gdb script.') os.execv(gdb_script_path, flags) elif command == 'logcat': adb_path = adb_wrapper.AdbWrapper.GetAdbPath()
diff --git a/build/android/gradle/generate_gradle.py b/build/android/gradle/generate_gradle.py index 30818293..a5e29ee 100755 --- a/build/android/gradle/generate_gradle.py +++ b/build/android/gradle/generate_gradle.py
@@ -57,6 +57,12 @@ '//content/shell/android:content_shell_apk', ] +_EXCLUDED_PREBUILT_JARS = [ + # Android Studio already provides Desugar runtime. + # Including it would cause linking error because of a duplicate class. + 'lib.java/third_party/bazel/desugar/Desugar-runtime.jar' +] + def _TemplatePath(name): return os.path.join(_FILE_DIR, '{}.jinja'.format(name)) @@ -223,7 +229,8 @@ return [p for p in self.JavaFiles() if not p.startswith('..')] def PrebuiltJars(self): - return self.Gradle().get('dependent_prebuilt_jars', []) + all_jars = self.Gradle().get('dependent_prebuilt_jars', []) + return [i for i in all_jars if i not in _EXCLUDED_PREBUILT_JARS] def AllEntries(self): """Returns a list of all entries that the current entry depends on.
diff --git a/build/android/gyp/create_test_runner_script.py b/build/android/gyp/create_test_runner_script.py index f6a2c3d..a67da882 100755 --- a/build/android/gyp/create_test_runner_script.py +++ b/build/android/gyp/create_test_runner_script.py
@@ -70,14 +70,14 @@ group.add_argument('--additional-apk-incremental', action='append', dest='additional_apks_incremental', default=[]) group.add_argument('--apk-under-test') - group.add_argument('--apk-under-test-incremental-install-script') + group.add_argument('--apk-under-test-incremental-install-json') group.add_argument('--executable-dist-dir') group.add_argument('--isolate-file-path') group.add_argument('--output-directory') group.add_argument('--runtime-deps-path') group.add_argument('--test-apk') group.add_argument('--test-jar') - group.add_argument('--test-apk-incremental-install-script') + group.add_argument('--test-apk-incremental-install-json') group.add_argument('--coverage-dir') group.add_argument('--android-manifest-path') group.add_argument('--resource-zips') @@ -112,11 +112,11 @@ if args.apk_under_test: test_runner_path_args.append( ('--apk-under-test', RelativizePathToScript(args.apk_under_test))) - if args.apk_under_test_incremental_install_script: + if args.apk_under_test_incremental_install_json: test_runner_path_args.append( - ('--apk-under-test-incremental-install-script', + ('--apk-under-test-incremental-install-json', RelativizePathToScript( - args.apk_under_test_incremental_install_script))) + args.apk_under_test_incremental_install_json))) if args.executable_dist_dir: test_runner_path_args.append( ('--executable-dist-dir', @@ -136,10 +136,10 @@ if args.test_jar: test_runner_path_args.append( ('--test-jar', RelativizePathToScript(args.test_jar))) - if args.test_apk_incremental_install_script: + if args.test_apk_incremental_install_json: test_runner_path_args.append( - ('--test-apk-incremental-install-script', - RelativizePathToScript(args.test_apk_incremental_install_script))) + ('--test-apk-incremental-install-json', + RelativizePathToScript(args.test_apk_incremental_install_json))) if args.coverage_dir: test_runner_path_args.append( ('--coverage-dir', RelativizePathToScript(args.coverage_dir)))
diff --git a/build/android/gyp/desugar.py b/build/android/gyp/desugar.py index 6455279..bf51b007 100755 --- a/build/android/gyp/desugar.py +++ b/build/android/gyp/desugar.py
@@ -6,9 +6,7 @@ import argparse import os -import shutil import sys -import tempfile from util import build_utils @@ -30,10 +28,9 @@ bootclasspath_entry, '--output', output_jar, - # Disable try-with-resources due to proguard duplicate zip entry error - # TODO(zpeng): Enable try-with-resources with - # desugar_try_with_resources_omit_runtime_classes - '--desugar_try_with_resources_if_needed=false', + # Don't include try-with-resources files in every .jar. Instead, they + # are included via //third_party/bazel/desugar:desugar_runtime_java. + '--desugar_try_with_resources_omit_runtime_classes', ] for path in classpath: cmd += ['--classpath_entry', path]
diff --git a/build/android/gyp/javac.py b/build/android/gyp/javac.py index adeed36..3ca6bd5 100755 --- a/build/android/gyp/javac.py +++ b/build/android/gyp/javac.py
@@ -371,8 +371,11 @@ if options.java_version == '1.8' and options.bootclasspath: # Android's boot jar doesn't contain all java 8 classes. # See: https://github.com/evant/gradle-retrolambda/issues/23. - javac_path = os.path.realpath(distutils.spawn.find_executable('javac')) - jdk_dir = os.path.dirname(os.path.dirname(javac_path)) + # Get the path of the jdk folder by searching for the 'jar' executable. We + # cannot search for the 'javac' executable because goma provides a custom + # version of 'javac'. + jar_path = os.path.realpath(distutils.spawn.find_executable('jar')) + jdk_dir = os.path.dirname(os.path.dirname(jar_path)) rt_jar = os.path.join(jdk_dir, 'jre', 'lib', 'rt.jar') options.bootclasspath.append(rt_jar)
diff --git a/build/android/lint/suppressions.xml b/build/android/lint/suppressions.xml index 7ad4dde..faf554e 100644 --- a/build/android/lint/suppressions.xml +++ b/build/android/lint/suppressions.xml
@@ -143,6 +143,7 @@ <ignore regexp="chrome/android/webapk/shell_apk/res"/> <ignore regexp="chromecast/internal"/> <ignore regexp="tools/android/push_apps_to_background/res"/> + <ignore regexp="ui/android/java/res"/> </issue> <issue id="ImpliedQuantity" severity="Error"> <ignore regexp="chrome/android/chrome_strings_grd"/> @@ -193,6 +194,8 @@ <issue id="NewApi" severity="ignore"/> <issue id="NewApi"> <ignore regexp="Attribute `paddingStart` referenced here can result in a crash on some specific devices older than API 17"/> + <!-- We support try-with-resources via desugar. --> + <ignore regexp="Try-with-resources requires API level 19"/> <ignore regexp="chrome/android/java/res/values-v17/styles.xml"/> <ignore regexp="chromecast/internal"/> <ignore regexp="com/android/tv"/> @@ -312,19 +315,16 @@ <ignore regexp="chrome/android/java/res/layout/signin_promo_view.xml"/> <ignore regexp="R.dimen.signin_promo_account_image_size"/> <ignore regexp="R.dimen.signin_promo_cold_state_image_size"/> + <!-- Used by Android's policies system, pulled from app directly --> + <ignore regexp="restriction_values.xml"/> <!-- TODO(wnwen): Clean up the suppressions below this comment --> <ignore regexp="android_ui_strings.xml"/> <ignore regexp="android_webview/java/res/drawable-hdpi/ic_play_circle_outline_black_48dp.png"/> <ignore regexp="android_webview/test/shell/res/raw/resource_file.html"/> <ignore regexp="android_webview/test/shell/res/raw/resource_icon.png"/> <ignore regexp="android_webview/tools/automated_ui_tests/java/res/"/> - <ignore regexp="chrome/android/java/res/drawable-hdpi/*"/> - <ignore regexp="chrome/android/java/res/drawable-nodpi/missing.png"/> - <ignore regexp="chrome/android/java/res/values-v17/styles.xml"/> <ignore regexp="chromecast/browser/android/apk/res/values/strings.xml"/> <ignore regexp="chromecast/internal"/> - <ignore regexp="clank"/> - <ignore regexp="content/shell/android/java/res/mipmap-hdpi/app_icon.png"/> <ignore regexp="android_webview/locale_paks.resources.zip/*"/> <ignore regexp="android_webview/strings_grd.resources.zip/values/android_webview_strings.xml"/> <ignore regexp="components/strings/components_strings_grd.resources.zip/values.*/components_strings.xml"/> @@ -336,87 +336,6 @@ <ignore regexp="remoting/android/java/res/drawable-hdpi/ic_zoom_out.png"/> <ignore regexp="remoting/android/java/res/layout/navigation_list_item.xml"/> <ignore regexp="remoting/android/java/res/values-v17/styles.xml"/> - <!-- Used by Android's policies system --> - <ignore regexp="restriction_values.xml"/> - <ignore regexp="ui/android/java/res/drawable-hdpi/verify_checkmark.png"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="ui/android/java/res/values/dimens.xml"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="components/autofill/android/java/res/values/dimens.xml"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="components/autofill/android/java/res/drawable/autofill_chip_inset.xml"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="components/autofill/android/java/res/layout/autofill_keyboard_accessory_icon.xml"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="components/autofill/android/java/res/layout/autofill_keyboard_accessory_item.xml"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="content/public/android/java/res/raw/empty.wav"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="content/public/android/java/res/drawable-hdpi/ic_menu_share_holo_light.png"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="content/public/android/java/res/drawable-hdpi/ic_search.png"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="content/public/android/java/res/menu/select_action_menu.xml"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="remoting/android/java/res/menu/chromoting_actionbar.xml"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="remoting/android/java/res/menu/desktop_actionbar.xml"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="remoting/android/java/res/menu/host_context_menu.xml"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="remoting/android/java/res/drawable-hdpi/*"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="content/public/android/java/res/values-v17/styles.xml"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="content/public/android/content_strings_grd.resources.zip/values/android_content_strings.xml"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="components/web_contents_delegate_android/android/java/res/drawable-hdpi/bubble.9.png"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="components/web_contents_delegate_android/android/java/res/drawable-hdpi/bubble_arrow_up.png"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="components/web_contents_delegate_android/android/java/res/drawable-hdpi/ic_warning.png"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="components/web_contents_delegate_android/android/java/res/layout/validation_message_bubble.xml"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="content/shell/android/java/res/drawable/ic_refresh.png"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="content/shell/android/java/res/drawable/progress.xml"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="content/shell/android/java/res/layout/shell_view.xml"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="content/shell/android/java/res/values/strings.xml"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="android_webview/test/shell/res/values/config.xml"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="android_webview/test/shell/res/layout/testshell_activity.xml"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="chrome/android/java/res/anim/accelerate_quart.xml"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="chrome/android/java/res/layout/accessibility_tab_switcher.xml"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="chrome/android/java/res/drawable/accessibility_tab_switcher_divider.xml"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="chrome/android/java/res/layout/accessibility_tab_switcher_list_item.xml"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="chrome/android/java/res/layout/account_chooser_dialog_item.xml"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="chrome/android/java/res/layout/account_chooser_dialog_title.xml"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="chrome/android/java/res/drawable-hdpi/account_management_no_picture.png"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="chrome/android/java/res/xml/account_management_preferences.xml"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="chrome/android/java/res/anim/activity_close_exit.xml"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="chrome/android/java/res/anim/activity_open_enter.xml"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="chrome/android/chrome_strings_grd.resources.zip/values/android_chrome_strings.xml"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="content/shell/android/shell_apk/res/layout/content_shell_activity.xml"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="content/shell/android/linker_test_apk/res/layout/test_activity.xml"/> - <!-- TODO(crbug.com/635567): Fix this properly. --> - <ignore regexp="content/shell/android/shell_apk/res/values/strings.xml"/> </issue> <issue id="UseCompoundDrawables"> <!-- Upscaling 24dp to 48dp doesn't work as expected with a TextView compound drawable. -->
diff --git a/build/android/pylib/local/device/local_device_instrumentation_test_run.py b/build/android/pylib/local/device/local_device_instrumentation_test_run.py index 51611f2..9b8ef58 100644 --- a/build/android/pylib/local/device/local_device_instrumentation_test_run.py +++ b/build/android/pylib/local/device/local_device_instrumentation_test_run.py
@@ -597,7 +597,12 @@ extras['package'] = '.'.join(test_package.split('.')[:2]) extras[_EXTRA_TEST_LIST] = dev_test_list_json.name target = '%s/%s' % (test_package, junit4_runner_class) - dev.StartInstrumentation(target, extras=extras) + test_list_run_output = dev.StartInstrumentation( + target, extras=extras) + if any(test_list_run_output): + logging.error('Unexpected output while listing tests:') + for line in test_list_run_output: + logging.error(' %s', line) with tempfile_ext.NamedTemporaryDirectory() as host_dir: host_file = os.path.join(host_dir, 'list_tests.json') dev.PullFile(dev_test_list_json.name, host_file)
diff --git a/build/android/pylib/utils/instrumentation_tracing.py b/build/android/pylib/utils/instrumentation_tracing.py index fe23894..7e00c58 100644 --- a/build/android/pylib/utils/instrumentation_tracing.py +++ b/build/android/pylib/utils/instrumentation_tracing.py
@@ -4,7 +4,15 @@ """Functions to instrument all Python function calls. -Generates a JSON file readable by Chrome's about:tracing.""" +This generates a JSON file readable by Chrome's about:tracing. To use it, +either call start_instrumenting and stop_instrumenting at the appropriate times, +or use the Instrument context manager. + +A function is only traced if it is from a Python module that matches at least +one regular expression object in to_include, and does not match any in +to_exclude. In between the start and stop events, every function call of a +function from such a module will be added to the trace. +""" import contextlib import functools
diff --git a/build/android/test_runner.pydeps b/build/android/test_runner.pydeps index 1d03946..573577e 100644 --- a/build/android/test_runner.pydeps +++ b/build/android/test_runner.pydeps
@@ -71,6 +71,7 @@ ../../third_party/catapult/devil/devil/utils/host_utils.py ../../third_party/catapult/devil/devil/utils/lazy/__init__.py ../../third_party/catapult/devil/devil/utils/lazy/weak_constant.py +../../third_party/catapult/devil/devil/utils/logging_common.py ../../third_party/catapult/devil/devil/utils/lsusb.py ../../third_party/catapult/devil/devil/utils/parallelizer.py ../../third_party/catapult/devil/devil/utils/reraiser_thread.py
diff --git a/build/config/android/config.gni b/build/config/android/config.gni index 1ff5744..8135f242 100644 --- a/build/config/android/config.gni +++ b/build/config/android/config.gni
@@ -80,7 +80,7 @@ } webview_public_framework_jar = - "//third_party/android_platform/webview/frameworks_7.1.1_r28.jar" + "//third_party/android_system_sdk/android_system.jar" if (!defined(webview_framework_jar)) { webview_framework_jar = webview_public_framework_jar }
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni index a5fb140..8202c1d 100644 --- a/build/config/android/rules.gni +++ b/build/config/android/rules.gni
@@ -2926,7 +2926,6 @@ # any apk that depends on this library. # ignore_aidl: Whether to ignore .aidl files found with the .aar. # ignore_assets: Whether to ignore assets found in the .aar. - # ignore_manifest: Whether to ignore merging of AndroidManifest.xml. # ignore_native_libraries: Whether to ignore .so files found in the .aar. # create_srcjar: If false, does not create an R.java file. # TODO(jbudorick@): remove this arguments after crbug.com/522043 is fixed. @@ -2941,8 +2940,6 @@ _unpack_target_name = "${target_name}__unpack_aar" _ignore_aidl = defined(invoker.ignore_aidl) && invoker.ignore_aidl _ignore_assets = defined(invoker.ignore_assets) && invoker.ignore_assets - _ignore_manifest = - defined(invoker.ignore_manifest) && invoker.ignore_manifest _ignore_native_libraries = defined(invoker.ignore_native_libraries) && invoker.ignore_native_libraries @@ -2968,11 +2965,6 @@ assert(_ignore_native_libraries || !_scanned_files.has_native_libraries, "android_aar_prebuilt() with .so files is not supported." + " Use ignore_native_libraries = true to silence this error.") - assert(_ignore_manifest || _scanned_files.is_manifest_empty, - "android_aar_prebuilt() manifest merging not yet supported and" + - " non-trivial AndroidManifest.xml detected." + - " Implement or use ignore_manifest = true." + - " http://crbug.com/643967") assert(_scanned_files.has_classes_jar || _scanned_files.subjars == []) action(_unpack_target_name) { @@ -3015,7 +3007,8 @@ } # Create the android_resources target for resources. - if (_scanned_files.resources != [] || _scanned_files.has_r_text_file) { + if (_scanned_files.resources != [] || _scanned_files.has_r_text_file || + !_scanned_files.is_manifest_empty) { _res_target_name = "${target_name}__res" android_resources(_res_target_name) { forward_variables_from(invoker,
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn index 971edb0d..e2f4211 100644 --- a/build/config/compiler/BUILD.gn +++ b/build/config/compiler/BUILD.gn
@@ -1204,12 +1204,10 @@ # TODO(thakis ): https://crbug.com/683349 "-Wno-user-defined-warnings", - ] - if (llvm_force_head_revision) { # TODO(thakis): https://crbug.com/753973 - cflags += [ "-Wno-enum-compare-switch" ] - } + "-Wno-enum-compare-switch", + ] } else if (use_xcode_clang && xcode_version_int >= 830) { # This is necessary to allow a progressive transition from using xcode 8.0 # to 8.3 or more recent. Remove when all bots are migrated to 8.3.
diff --git a/build/config/sanitizers/BUILD.gn b/build/config/sanitizers/BUILD.gn index 541952e4..65966cf1 100644 --- a/build/config/sanitizers/BUILD.gn +++ b/build/config/sanitizers/BUILD.gn
@@ -200,7 +200,7 @@ ldflags += [ "-fsanitize=vptr" ] } - if (use_sanitizer_coverage && current_toolchain != "//build/toolchain/mac:clang_x64") { + if (use_sanitizer_coverage) { ldflags += [ "-fsanitize-coverage=$sanitizer_coverage_flags" ] } @@ -380,7 +380,7 @@ config("coverage_flags") { cflags = [] - if (use_sanitizer_coverage && current_toolchain != "//build/toolchain/mac:clang_x64") { + if (use_sanitizer_coverage) { cflags += [ "-fsanitize-coverage=$sanitizer_coverage_flags", "-mllvm",
diff --git a/build/config/sanitizers/sanitizers.gni b/build/config/sanitizers/sanitizers.gni index fb2a83c..3b2ed9b 100644 --- a/build/config/sanitizers/sanitizers.gni +++ b/build/config/sanitizers/sanitizers.gni
@@ -206,3 +206,11 @@ # printed. assert(!use_cfi_recover || use_cfi_diag, "Only use CFI recovery together with diagnostics.") + +# TODO(crbug.com/753445): the use_sanitizer_coverage arg is currently +# not supported by the Chromium mac_clang_x64 toolchain. +assert( + !(use_sanitizer_coverage && is_mac), + "crbug.com/753445: use_sanitizer_coverage=true is not supported by the " + + "Chromium mac_clang_x64 toolchain. Please set the argument value to " + + "false.")
diff --git a/build/mac_toolchain.py b/build/mac_toolchain.py index 3852dba..50f2ef6f 100755 --- a/build/mac_toolchain.py +++ b/build/mac_toolchain.py
@@ -13,6 +13,7 @@ user interaction. """ +from distutils.version import LooseVersion import os import platform import plistlib @@ -132,10 +133,11 @@ os.unlink(name) -def AcceptLicense(target_os): - """Use xcodebuild to accept new toolchain license if necessary. Don't accept - the license if a newer license has already been accepted. This only works if - xcodebuild and xcode-select are passwordless in sudoers.""" +def FinalizeUnpack(target_os): + """Use xcodebuild to accept new toolchain license and run first launch + installers if necessary. Don't accept the license if a newer license has + already been accepted. This only works if xcodebuild and xcode-select are + passwordless in sudoers.""" # Check old license try: @@ -164,6 +166,11 @@ pass print "Accepting license." + target_version_plist_path = \ + os.path.join(TOOLCHAIN_BUILD_DIR % target_os, + *['Contents','version.plist']) + target_version_plist = LoadPlist(target_version_plist_path) + short_version_string = target_version_plist['CFBundleShortVersionString'] old_path = subprocess.Popen(['/usr/bin/xcode-select', '-p'], stdout=subprocess.PIPE).communicate()[0].strip() try: @@ -171,6 +178,11 @@ TOOLCHAIN_BUILD_DIR % target_os, 'Contents/Developer') subprocess.check_call(['sudo', '/usr/bin/xcode-select', '-s', build_dir]) subprocess.check_call(['sudo', '/usr/bin/xcodebuild', '-license', 'accept']) + + if target_os == 'ios' and \ + LooseVersion(short_version_string) >= LooseVersion("9.0"): + print "Installing packages." + subprocess.check_call(['sudo', '/usr/bin/xcodebuild', '-runFirstLaunch']) finally: subprocess.check_call(['sudo', '/usr/bin/xcode-select', '-s', old_path]) @@ -216,7 +228,7 @@ if ReadStampFile(target_os) == toolchain_version: print 'Toolchain (%s) is already up to date.' % toolchain_version - AcceptLicense(target_os) + FinalizeUnpack(target_os) return 0 if not CanAccessToolchainBucket(): @@ -234,7 +246,7 @@ toolchain_file = toolchain_filename % toolchain_version toolchain_full_url = TOOLCHAIN_URL + toolchain_file DownloadAndUnpack(toolchain_full_url, TOOLCHAIN_BUILD_DIR % target_os) - AcceptLicense(target_os) + FinalizeUnpack(target_os) print 'Toolchain %s unpacked.' % toolchain_version WriteStampFile(target_os, toolchain_version)
diff --git a/build/sanitizers/tsan_suppressions.cc b/build/sanitizers/tsan_suppressions.cc index cbeeee4..182b8c21 100644 --- a/build/sanitizers/tsan_suppressions.cc +++ b/build/sanitizers/tsan_suppressions.cc
@@ -265,10 +265,6 @@ // "race:third_party/harfbuzz-ng/src/*\n" - // TODO(asvitkine): Remove these after crbug/736675. - "race:base::Histogram::AddCount\n" - "race:AddCount\n" - // End of suppressions. ; // Please keep this semicolon.
diff --git a/build/secondary/third_party/android_tools/BUILD.gn b/build/secondary/third_party/android_tools/BUILD.gn index 17b27f3..fe5ee4c4 100644 --- a/build/secondary/third_party/android_tools/BUILD.gn +++ b/build/secondary/third_party/android_tools/BUILD.gn
@@ -56,7 +56,6 @@ ] _lib_name = "design" aar_path = "$lib_path/$_lib_name/$lib_version/$_lib_name-$lib_version.aar" - ignore_manifest = true } android_aar_prebuilt("android_support_transition_java") { @@ -65,7 +64,6 @@ ] _lib_name = "transition" aar_path = "$lib_path/$_lib_name/$lib_version/$_lib_name-$lib_version.aar" - ignore_manifest = true } android_aar_prebuilt("android_support_multidex_java") { @@ -91,32 +89,27 @@ _lib_name = "support-compat" aar_path = "$lib_path/$_lib_name/$lib_version/$_lib_name-$lib_version.aar" ignore_aidl = true # We don't appear to need these currently. - ignore_manifest = true } android_aar_prebuilt("android_support_core_ui_java") { _lib_name = "support-core-ui" aar_path = "$lib_path/$_lib_name/$lib_version/$_lib_name-$lib_version.aar" - ignore_manifest = true } android_aar_prebuilt("android_support_core_utils_java") { _lib_name = "support-core-utils" aar_path = "$lib_path/$_lib_name/$lib_version/$_lib_name-$lib_version.aar" - ignore_manifest = true } android_aar_prebuilt("android_support_fragment_java") { _lib_name = "support-fragment" aar_path = "$lib_path/$_lib_name/$lib_version/$_lib_name-$lib_version.aar" - ignore_manifest = true } android_aar_prebuilt("android_support_media_compat_java") { _lib_name = "support-media-compat" aar_path = "$lib_path/$_lib_name/$lib_version/$_lib_name-$lib_version.aar" ignore_aidl = true # We don't appear to need these currently. - ignore_manifest = true } android_aar_prebuilt("android_support_v13_java") { @@ -126,19 +119,16 @@ ] _lib_name = "support-v13" aar_path = "$lib_path/$_lib_name/$lib_version/$_lib_name-$lib_version.aar" - ignore_manifest = true } android_aar_prebuilt("android_support_vector_drawable_java") { _lib_name = "support-vector-drawable" aar_path = "$lib_path/$_lib_name/$lib_version/$_lib_name-$lib_version.aar" - ignore_manifest = true } android_aar_prebuilt("android_support_v7_appcompat_java_internal") { _lib_name = "appcompat-v7" aar_path = "$lib_path/$_lib_name/$lib_version/$_lib_name-$lib_version.aar" - ignore_manifest = true } java_group("android_support_v7_appcompat_java") { @@ -155,7 +145,6 @@ ] _lib_name = "gridlayout-v7" aar_path = "$lib_path/$_lib_name/$lib_version/$_lib_name-$lib_version.aar" - ignore_manifest = true } android_aar_prebuilt("android_support_v7_mediarouter_java") { @@ -164,7 +153,6 @@ ] _lib_name = "mediarouter-v7" aar_path = "$lib_path/$_lib_name/$lib_version/$_lib_name-$lib_version.aar" - ignore_manifest = true } android_aar_prebuilt("android_support_v7_recyclerview_java") { @@ -173,7 +161,6 @@ ] _lib_name = "recyclerview-v7" aar_path = "$lib_path/$_lib_name/$lib_version/$_lib_name-$lib_version.aar" - ignore_manifest = true } android_aar_prebuilt("android_support_v7_preference_java") { @@ -182,7 +169,6 @@ ] _lib_name = "preference-v7" aar_path = "$lib_path/$_lib_name/$lib_version/$_lib_name-$lib_version.aar" - ignore_manifest = true } android_aar_prebuilt("android_support_v14_preference_java") { @@ -191,7 +177,6 @@ ] _lib_name = "preference-v14" aar_path = "$lib_path/$_lib_name/$lib_version/$_lib_name-$lib_version.aar" - ignore_manifest = true } android_aar_prebuilt("android_support_v17_leanback_java") { @@ -201,7 +186,6 @@ ] _lib_name = "leanback-v17" aar_path = "$lib_path/$_lib_name/$lib_version/$_lib_name-$lib_version.aar" - ignore_manifest = true } android_aar_prebuilt("android_support_v17_preference_java") { @@ -255,7 +239,6 @@ _lib_name = "play-services-basement" aar_path = "$gms_path/$_lib_name/$gms_version/$_lib_name-$gms_version.aar" input_jars_paths = [ "$android_sdk/optional/org.apache.http.legacy.jar" ] - ignore_manifest = true } android_aar_prebuilt("google_play_services_tasks_java") { @@ -264,7 +247,6 @@ ] _lib_name = "play-services-tasks" aar_path = "$gms_path/$_lib_name/$gms_version/$_lib_name-$gms_version.aar" - ignore_manifest = true } android_aar_prebuilt("google_play_services_base_java") { @@ -274,7 +256,6 @@ ] _lib_name = "play-services-base" aar_path = "$gms_path/$_lib_name/$gms_version/$_lib_name-$gms_version.aar" - ignore_manifest = true } android_aar_prebuilt("google_play_services_auth_base_java") { @@ -284,7 +265,6 @@ ] _lib_name = "play-services-auth-base" aar_path = "$gms_path/$_lib_name/$gms_version/$_lib_name-$gms_version.aar" - ignore_manifest = true } android_aar_prebuilt("google_play_services_auth_java") { @@ -295,7 +275,6 @@ ] _lib_name = "play-services-auth" aar_path = "$gms_path/$_lib_name/$gms_version/$_lib_name-$gms_version.aar" - ignore_manifest = true } android_aar_prebuilt("google_play_services_cast_java") { @@ -306,7 +285,6 @@ ] _lib_name = "play-services-cast" aar_path = "$gms_path/$_lib_name/$gms_version/$_lib_name-$gms_version.aar" - ignore_manifest = true } android_aar_prebuilt("google_play_services_iid_java") { @@ -316,7 +294,6 @@ ] _lib_name = "play-services-iid" aar_path = "$gms_path/$_lib_name/$gms_version/$_lib_name-$gms_version.aar" - ignore_manifest = true } android_aar_prebuilt("google_play_services_gcm_java") { @@ -327,7 +304,6 @@ ] _lib_name = "play-services-gcm" aar_path = "$gms_path/$_lib_name/$gms_version/$_lib_name-$gms_version.aar" - ignore_manifest = true } android_aar_prebuilt("google_play_services_location_java") { @@ -337,7 +313,6 @@ ] _lib_name = "play-services-location" aar_path = "$gms_path/$_lib_name/$gms_version/$_lib_name-$gms_version.aar" - ignore_manifest = true } android_aar_prebuilt("google_play_services_nearby_java") { @@ -347,7 +322,6 @@ ] _lib_name = "play-services-nearby" aar_path = "$gms_path/$_lib_name/$gms_version/$_lib_name-$gms_version.aar" - ignore_manifest = true } android_aar_prebuilt("google_play_services_vision_java") { @@ -357,7 +331,6 @@ ] _lib_name = "play-services-vision" aar_path = "$gms_path/$_lib_name/$gms_version/$_lib_name-$gms_version.aar" - ignore_manifest = true } # TODO(paulmiller): Replace this with a proper target after rolling to a GMS
diff --git a/build/toolchain/mac/BUILD.gn b/build/toolchain/mac/BUILD.gn index 5310a61..85aa44f7 100644 --- a/build/toolchain/mac/BUILD.gn +++ b/build/toolchain/mac/BUILD.gn
@@ -460,6 +460,10 @@ toolchain_args = { current_cpu = "x64" current_os = "mac" + + # TODO(crbug.com/753445): the use_sanitizer_coverage arg is currently + # not supported by the Chromium mac_clang_x64 toolchain. + use_sanitizer_coverage = false } }
diff --git a/build/vs_toolchain.py b/build/vs_toolchain.py index 6555127..88dda3b 100755 --- a/build/vs_toolchain.py +++ b/build/vs_toolchain.py
@@ -328,13 +328,18 @@ if not win_sdk_dir: return - debug_files = ['dbghelp.dll', 'dbgcore.dll'] - for debug_file in debug_files: + # List of debug files that should be copied, the first element of the tuple is + # the name of the file and the second indicates if it's optional. + debug_files = [('dbghelp.dll', False), ('dbgcore.dll', True)] + for debug_file, is_optional in debug_files: full_path = os.path.join(win_sdk_dir, 'Debuggers', target_cpu, debug_file) if not os.path.exists(full_path): - raise Exception('%s not found in "%s"\r\nYou must install the ' - '"Debugging Tools for Windows" feature from the Windows ' - '10 SDK.' % (debug_file, full_path)) + if is_optional: + continue + else: + raise Exception('%s not found in "%s"\r\nYou must install the ' + '"Debugging Tools for Windows" feature from the Windows' + ' 10 SDK.' % (debug_file, full_path)) target_path = os.path.join(target_dir, debug_file) _CopyRuntimeImpl(target_path, full_path)
diff --git a/cc/base/synced_property.h b/cc/base/synced_property.h index f0ff329..6b8b91eb 100644 --- a/cc/base/synced_property.h +++ b/cc/base/synced_property.h
@@ -62,31 +62,39 @@ } // Push the latest value from the main thread onto pending tree-associated - // state. Returns true if this had any effect. - bool PushFromMainThread(typename T::ValueType main_thread_value) { - bool changed = pending_base_.get() != main_thread_value; - + // state. Returns true if pushing the value results in different values + // between the main layer tree and the pending tree. + bool PushMainToPending(typename T::ValueType main_thread_value) { reflected_delta_in_pending_tree_ = reflected_delta_in_main_tree_; reflected_delta_in_main_tree_ = T::Identity(); pending_base_ = T(main_thread_value); - return changed; + return Current(false) != main_thread_value; } // Push the value associated with the pending tree to be the active base - // value. As part of this, subtract the delta reflected in the pending tree + // value. As part of this, subtract the delta reflected in the pending tree // from the active tree delta (which will make the delta zero at steady state, // or make it contain only the difference since the last send). + // Returns true if pushing the update results in: + // 1) Different values on the pending tree and the active tree. + // 2) An update to the current value on the active tree. + // The reason for considering the second case only when pushing to the active + // tree, as opposed to when pushing to the pending tree, is that only the + // active tree computes state using this value which is not computed on the + // pending tree and not pushed during activation (aka scrollbar geometries). bool PushPendingToActive() { - bool changed = active_base_.get() != pending_base_.get() || - active_delta_.get() != PendingDelta().get(); + typename T::ValueType pending_value_before_push = Current(false); + typename T::ValueType active_value_before_push = Current(true); active_base_ = pending_base_; active_delta_ = PendingDelta(); reflected_delta_in_pending_tree_ = T::Identity(); clobber_active_value_ = false; - return changed; + typename T::ValueType current_active_value = Current(true); + return pending_value_before_push != current_active_value || + active_value_before_push != current_active_value; } // This simulates the consequences of the sent value getting committed and
diff --git a/cc/ipc/BUILD.gn b/cc/ipc/BUILD.gn index 1f42567..4dfd33aa 100644 --- a/cc/ipc/BUILD.gn +++ b/cc/ipc/BUILD.gn
@@ -48,7 +48,6 @@ "local_surface_id.mojom", "quads.mojom", "selection.mojom", - "shared_bitmap_allocation_notifier.mojom", "shared_quad_state.mojom", "surface_id.mojom", "texture_mailbox.mojom",
diff --git a/cc/paint/paint_op_reader.cc b/cc/paint/paint_op_reader.cc index 0ebedc1..cd1e43e 100644 --- a/cc/paint/paint_op_reader.cc +++ b/cc/paint/paint_op_reader.cc
@@ -248,7 +248,11 @@ } ref.positions_.resize(positions_size); ReadData(positions_size * sizeof(SkScalar), ref.positions_.data()); + // We don't write the cached shader, so don't attempt to read it either. + + if (!(*shader)->IsValid()) + valid_ = false; } bool PaintOpReader::AlignMemory(size_t alignment) {
diff --git a/cc/paint/paint_shader.cc b/cc/paint/paint_shader.cc index c5138268..7d5d710 100644 --- a/cc/paint/paint_shader.cc +++ b/cc/paint/paint_shader.cc
@@ -245,4 +245,28 @@ return GetSkShader()->isOpaque(); } +bool PaintShader::IsValid() const { + // If we managed to create a shader already, then we should be valid. + if (cached_shader_) + return true; + + switch (shader_type_) { + case Type::kColor: + return true; + case Type::kLinearGradient: + case Type::kRadialGradient: + case Type::kTwoPointConicalGradient: + case Type::kSweepGradient: + return colors_.size() >= 2 && + (positions_.empty() || positions_.size() == colors_.size()); + case Type::kImage: + return !!image_; + case Type::kPaintRecord: + return !!record_; + case Type::kShaderCount: + return false; + } + return false; +} + } // namespace cc
diff --git a/cc/paint/paint_shader.h b/cc/paint/paint_shader.h index 65ab74d..8a133709 100644 --- a/cc/paint/paint_shader.h +++ b/cc/paint/paint_shader.h
@@ -116,6 +116,12 @@ bool IsOpaque() const; + // Returns true if the shader looks like it is valid (ie the members required + // for this shader type all look reasonable. Returns false otherwise. Note + // that this is a best effort function since truly validating whether the + // shader is correct is hard. + bool IsValid() const; + private: friend class PaintFlags; friend class PaintOpReader;
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc index 10b3be3..f34b3a4 100644 --- a/cc/trees/layer_tree_host.cc +++ b/cc/trees/layer_tree_host.cc
@@ -1256,7 +1256,7 @@ tree_impl->set_top_controls_height(top_controls_height_); tree_impl->set_bottom_controls_height(bottom_controls_height_); tree_impl->PushBrowserControlsFromMainThread(top_controls_shown_ratio_); - tree_impl->elastic_overscroll()->PushFromMainThread(elastic_overscroll_); + tree_impl->elastic_overscroll()->PushMainToPending(elastic_overscroll_); if (tree_impl->IsActiveTree()) tree_impl->elastic_overscroll()->PushPendingToActive();
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc index 77e3137..eddb892b 100644 --- a/cc/trees/layer_tree_host_impl_unittest.cc +++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -4979,7 +4979,7 @@ DrawFrame(); host_impl_->active_tree()->SetCurrentBrowserControlsShownRatio(0.f); - host_impl_->active_tree()->top_controls_shown_ratio()->PushFromMainThread( + host_impl_->active_tree()->top_controls_shown_ratio()->PushMainToPending( 30.f / top_controls_height_); host_impl_->active_tree()->top_controls_shown_ratio()->PushPendingToActive(); EXPECT_FLOAT_EQ(30.f, @@ -5013,7 +5013,7 @@ layer_size_, layer_size_, layer_size_); DrawFrame(); - host_impl_->active_tree()->top_controls_shown_ratio()->PushFromMainThread( + host_impl_->active_tree()->top_controls_shown_ratio()->PushMainToPending( 20.f / top_controls_height_); host_impl_->active_tree()->top_controls_shown_ratio()->PushPendingToActive(); host_impl_->active_tree()->SetCurrentBrowserControlsShownRatio( @@ -5066,8 +5066,7 @@ host_impl_->sync_tree()->PushBrowserControlsFromMainThread(1.f); host_impl_->sync_tree()->set_browser_controls_shrink_blink_size(true); - host_impl_->active_tree()->top_controls_shown_ratio()->PushFromMainThread( - 1.f); + host_impl_->active_tree()->top_controls_shown_ratio()->PushMainToPending(1.f); host_impl_->active_tree()->top_controls_shown_ratio()->PushPendingToActive(); host_impl_->active_tree()->SetCurrentBrowserControlsShownRatio(0.f); @@ -5432,7 +5431,7 @@ host_impl_->active_tree() ->top_controls_shown_ratio() ->PullDeltaForMainThread(); - host_impl_->active_tree()->top_controls_shown_ratio()->PushFromMainThread( + host_impl_->active_tree()->top_controls_shown_ratio()->PushMainToPending( delta); } @@ -12392,7 +12391,7 @@ // When building property trees from impl side, the builder uses the scroll // offset of layer_impl to initialize the scroll offset in scroll tree: - // scroll_tree.synced_scroll_offset.PushFromMainThread( + // scroll_tree.synced_scroll_offset.PushMainToPending( // layer->CurrentScrollOffset()). // However, layer_impl does not store scroll_offset, so it is using scroll // tree's scroll offset to initialize itself. Usually this approach works
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc index ad5557d..2bc0189 100644 --- a/cc/trees/layer_tree_impl.cc +++ b/cc/trees/layer_tree_impl.cc
@@ -755,26 +755,14 @@ if (page_scale_factor) { DCHECK(!IsActiveTree() || !layer_tree_host_impl_->pending_tree()); - changed_page_scale |= page_scale_factor_->Delta() != 1.f; - // TODO(enne): Once CDP goes away, ignore this call below. The only time - // the property trees will differ is if there's been a page scale on the - // compositor thread after the begin frame, which is the delta check above. changed_page_scale |= - page_scale_factor_->PushFromMainThread(*page_scale_factor); + page_scale_factor_->PushMainToPending(*page_scale_factor); } if (IsActiveTree()) { - // TODO(enne): Pushing from pending to active should never require - // DidUpdatePageScale. The values should already be set by the fully - // computed property trees being synced from one tree to another. Remove - // this once CDP goes away. changed_page_scale |= page_scale_factor_->PushPendingToActive(); } - // TODO(pdr): Simplify the logic here and the equivalent logic in - // ScrollTree::PushScrollUpdatesFromMainThread where two types of changes - // are detected: whether the current value changed, and whether the pushes - // have any effect. if (changed_page_scale) DidUpdatePageScale(); @@ -840,7 +828,7 @@ if (top_controls_shown_ratio) { DCHECK(!IsActiveTree() || !layer_tree_host_impl_->pending_tree()); - top_controls_shown_ratio_->PushFromMainThread(*top_controls_shown_ratio); + top_controls_shown_ratio_->PushMainToPending(*top_controls_shown_ratio); } if (IsActiveTree()) { bool changed_active = top_controls_shown_ratio_->PushPendingToActive();
diff --git a/cc/trees/property_tree.cc b/cc/trees/property_tree.cc index 88492b90..e3096fb7 100644 --- a/cc/trees/property_tree.cc +++ b/cc/trees/property_tree.cc
@@ -1413,21 +1413,22 @@ SyncedScrollOffset* synced_scroll_offset = GetOrCreateSyncedScrollOffset(id); - bool changed = synced_scroll_offset->PushFromMainThread(map_entry.second); + // If the value on the main thread differs from the value on the pending + // tree after state sync, we need to update the scroll state on the newly + // committed PropertyTrees. + bool needs_scroll_update = + synced_scroll_offset->PushMainToPending(map_entry.second); // If we are committing directly to the active tree, push pending to active - // here. + // here. If the value differs between the pending and active trees, we need + // to update the scroll state on the newly activated PropertyTrees. + // In the case of pushing to the active tree, even if the pending and active + // tree state match but the value on the active tree changed, we need to + // update the scrollbar geometries. if (property_trees()->is_active) - changed |= synced_scroll_offset->PushPendingToActive(); + needs_scroll_update |= synced_scroll_offset->PushPendingToActive(); - // If the pushed main thread scroll offset differs from the current scroll - // offset (accounting for delta), ensure DidUpdateScrollOffset is called to - // update the TransformNode's scroll offset. We also need to ensure - // scrollbar geometries are updated if the underlying scroll offset changes. - // TODO(pdr): This is confusing because we need to account for multiple - // cases where the value is dirty. - if (changed || map_entry.second != synced_scroll_offset->Current( - property_trees()->is_active)) + if (needs_scroll_update) sync_tree->DidUpdateScrollOffset(id); } } @@ -1457,17 +1458,17 @@ map_entry.second->AbortCommit(); } -bool ScrollTree::SetBaseScrollOffset(ElementId id, +void ScrollTree::SetBaseScrollOffset(ElementId id, const gfx::ScrollOffset& scroll_offset) { if (property_trees()->is_main_thread) { scroll_offset_map_[id] = scroll_offset; - return true; + return; } // Scroll offset updates on the impl thread should only be for layers which // were created on the main thread. But this method is called when we build // PropertyTrees on the impl thread from LayerTreeImpl. - return GetOrCreateSyncedScrollOffset(id)->PushFromMainThread(scroll_offset); + GetOrCreateSyncedScrollOffset(id)->PushMainToPending(scroll_offset); } bool ScrollTree::SetScrollOffset(ElementId id, @@ -1491,7 +1492,7 @@ const gfx::ScrollOffset& offset) { DCHECK(!property_trees()->is_main_thread); SyncedScrollOffset* synced_scroll_offset = GetOrCreateSyncedScrollOffset(id); - bool changed = synced_scroll_offset->PushFromMainThread(offset); + bool changed = synced_scroll_offset->PushMainToPending(offset); if (property_trees()->is_active) changed |= synced_scroll_offset->PushPendingToActive(); return changed;
diff --git a/cc/trees/property_tree.h b/cc/trees/property_tree.h index 60f88e4..22ac11c4 100644 --- a/cc/trees/property_tree.h +++ b/cc/trees/property_tree.h
@@ -429,7 +429,7 @@ void PushScrollUpdatesFromPendingTree(PropertyTrees* pending_property_trees, LayerTreeImpl* active_tree); - bool SetBaseScrollOffset(ElementId id, + void SetBaseScrollOffset(ElementId id, const gfx::ScrollOffset& scroll_offset); bool SetScrollOffset(ElementId id, const gfx::ScrollOffset& scroll_offset); void SetScrollOffsetClobberActiveValue(ElementId id) {
diff --git a/cc/trees/tree_synchronizer_unittest.cc b/cc/trees/tree_synchronizer_unittest.cc index daf58880..6753d9e 100644 --- a/cc/trees/tree_synchronizer_unittest.cc +++ b/cc/trees/tree_synchronizer_unittest.cc
@@ -572,7 +572,7 @@ // the pending base and active base must be the same at this stage. scoped_refptr<SyncedScrollOffset> scroll_layer_offset = new SyncedScrollOffset; - scroll_layer_offset->PushFromMainThread(scroll_layer->scroll_offset()); + scroll_layer_offset->PushMainToPending(scroll_layer->scroll_offset()); scroll_layer_offset->PushPendingToActive(); EXPECT_TRUE(AreScrollOffsetsEqual( scroll_layer_offset.get(), @@ -582,7 +582,7 @@ scoped_refptr<SyncedScrollOffset> transient_scroll_layer_offset = new SyncedScrollOffset; - transient_scroll_layer_offset->PushFromMainThread( + transient_scroll_layer_offset->PushMainToPending( transient_scroll_layer->scroll_offset()); transient_scroll_layer_offset->PushPendingToActive(); EXPECT_TRUE( @@ -628,7 +628,7 @@ scroll_layer_offset->SetCurrent(gfx::ScrollOffset(20, 30)); scroll_layer_offset->PullDeltaForMainThread(); scroll_layer_offset->SetCurrent(gfx::ScrollOffset(40, 50)); - scroll_layer_offset->PushFromMainThread(gfx::ScrollOffset(100, 100)); + scroll_layer_offset->PushMainToPending(gfx::ScrollOffset(100, 100)); scroll_layer_offset->PushPendingToActive(); EXPECT_TRUE(AreScrollOffsetsEqual( scroll_layer_offset.get(),
diff --git a/chrome/VERSION b/chrome/VERSION index d326ec9..def4114 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=62 MINOR=0 -BUILD=3183 +BUILD=3186 PATCH=0
diff --git a/chrome/android/java/res/drawable-hdpi/account_management_no_picture.png b/chrome/android/java/res/drawable-hdpi/account_management_no_picture.png deleted file mode 100644 index 78a7013..0000000 --- a/chrome/android/java/res/drawable-hdpi/account_management_no_picture.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-hdpi/fre_placeholder.png b/chrome/android/java/res/drawable-hdpi/fre_placeholder.png deleted file mode 100644 index adee808..0000000 --- a/chrome/android/java/res/drawable-hdpi/fre_placeholder.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-hdpi/ic_folder_white_24dp.png b/chrome/android/java/res/drawable-hdpi/ic_folder_white_24dp.png deleted file mode 100644 index 941893d..0000000 --- a/chrome/android/java/res/drawable-hdpi/ic_folder_white_24dp.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-hdpi/ic_lock.png b/chrome/android/java/res/drawable-hdpi/ic_lock.png deleted file mode 100644 index dbae4756..0000000 --- a/chrome/android/java/res/drawable-hdpi/ic_lock.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-hdpi/signin_promo_illustration.png b/chrome/android/java/res/drawable-hdpi/signin_promo_illustration.png deleted file mode 100644 index 7881de4..0000000 --- a/chrome/android/java/res/drawable-hdpi/signin_promo_illustration.png +++ /dev/null Binary files differ
diff --git a/ui/android/java/res/drawable-hdpi/verify_checkmark.png b/chrome/android/java/res/drawable-hdpi/verify_checkmark.png similarity index 100% rename from ui/android/java/res/drawable-hdpi/verify_checkmark.png rename to chrome/android/java/res/drawable-hdpi/verify_checkmark.png Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/account_management_no_picture.png b/chrome/android/java/res/drawable-mdpi/account_management_no_picture.png deleted file mode 100644 index 317ac26..0000000 --- a/chrome/android/java/res/drawable-mdpi/account_management_no_picture.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/fre_placeholder.png b/chrome/android/java/res/drawable-mdpi/fre_placeholder.png deleted file mode 100644 index 9b09d87..0000000 --- a/chrome/android/java/res/drawable-mdpi/fre_placeholder.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/ic_folder_white_24dp.png b/chrome/android/java/res/drawable-mdpi/ic_folder_white_24dp.png deleted file mode 100644 index 44fa61ea..0000000 --- a/chrome/android/java/res/drawable-mdpi/ic_folder_white_24dp.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/ic_lock.png b/chrome/android/java/res/drawable-mdpi/ic_lock.png deleted file mode 100644 index 362e74e..0000000 --- a/chrome/android/java/res/drawable-mdpi/ic_lock.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/signin_promo_illustration.png b/chrome/android/java/res/drawable-mdpi/signin_promo_illustration.png deleted file mode 100644 index 5a480c0..0000000 --- a/chrome/android/java/res/drawable-mdpi/signin_promo_illustration.png +++ /dev/null Binary files differ
diff --git a/ui/android/java/res/drawable-mdpi/verify_checkmark.png b/chrome/android/java/res/drawable-mdpi/verify_checkmark.png similarity index 100% rename from ui/android/java/res/drawable-mdpi/verify_checkmark.png rename to chrome/android/java/res/drawable-mdpi/verify_checkmark.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/account_management_no_picture.png b/chrome/android/java/res/drawable-xhdpi/account_management_no_picture.png deleted file mode 100644 index 958eb300..0000000 --- a/chrome/android/java/res/drawable-xhdpi/account_management_no_picture.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/fre_placeholder.png b/chrome/android/java/res/drawable-xhdpi/fre_placeholder.png deleted file mode 100644 index 24a53e19..0000000 --- a/chrome/android/java/res/drawable-xhdpi/fre_placeholder.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/ic_folder_white_24dp.png b/chrome/android/java/res/drawable-xhdpi/ic_folder_white_24dp.png deleted file mode 100644 index 058314d9..0000000 --- a/chrome/android/java/res/drawable-xhdpi/ic_folder_white_24dp.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/ic_lock.png b/chrome/android/java/res/drawable-xhdpi/ic_lock.png deleted file mode 100644 index 39af9c78..0000000 --- a/chrome/android/java/res/drawable-xhdpi/ic_lock.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/signin_promo_illustration.png b/chrome/android/java/res/drawable-xhdpi/signin_promo_illustration.png deleted file mode 100644 index e97d0cc..0000000 --- a/chrome/android/java/res/drawable-xhdpi/signin_promo_illustration.png +++ /dev/null Binary files differ
diff --git a/ui/android/java/res/drawable-xhdpi/verify_checkmark.png b/chrome/android/java/res/drawable-xhdpi/verify_checkmark.png similarity index 100% rename from ui/android/java/res/drawable-xhdpi/verify_checkmark.png rename to chrome/android/java/res/drawable-xhdpi/verify_checkmark.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/account_management_no_picture.png b/chrome/android/java/res/drawable-xxhdpi/account_management_no_picture.png deleted file mode 100644 index b3c7a32..0000000 --- a/chrome/android/java/res/drawable-xxhdpi/account_management_no_picture.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/fre_placeholder.png b/chrome/android/java/res/drawable-xxhdpi/fre_placeholder.png deleted file mode 100644 index 6467308..0000000 --- a/chrome/android/java/res/drawable-xxhdpi/fre_placeholder.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/ic_folder_white_24dp.png b/chrome/android/java/res/drawable-xxhdpi/ic_folder_white_24dp.png deleted file mode 100644 index c0824e2..0000000 --- a/chrome/android/java/res/drawable-xxhdpi/ic_folder_white_24dp.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/ic_lock.png b/chrome/android/java/res/drawable-xxhdpi/ic_lock.png deleted file mode 100644 index 512c912..0000000 --- a/chrome/android/java/res/drawable-xxhdpi/ic_lock.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/signin_promo_illustration.png b/chrome/android/java/res/drawable-xxhdpi/signin_promo_illustration.png deleted file mode 100644 index 07527d8..0000000 --- a/chrome/android/java/res/drawable-xxhdpi/signin_promo_illustration.png +++ /dev/null Binary files differ
diff --git a/ui/android/java/res/drawable-xxhdpi/verify_checkmark.png b/chrome/android/java/res/drawable-xxhdpi/verify_checkmark.png similarity index 100% rename from ui/android/java/res/drawable-xxhdpi/verify_checkmark.png rename to chrome/android/java/res/drawable-xxhdpi/verify_checkmark.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xxxhdpi/account_management_no_picture.png b/chrome/android/java/res/drawable-xxxhdpi/account_management_no_picture.png deleted file mode 100644 index a5ac5be0..0000000 --- a/chrome/android/java/res/drawable-xxxhdpi/account_management_no_picture.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-xxxhdpi/ic_folder_white_24dp.png b/chrome/android/java/res/drawable-xxxhdpi/ic_folder_white_24dp.png deleted file mode 100644 index cd28801e..0000000 --- a/chrome/android/java/res/drawable-xxxhdpi/ic_folder_white_24dp.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-xxxhdpi/ic_lock.png b/chrome/android/java/res/drawable-xxxhdpi/ic_lock.png deleted file mode 100644 index 88c4828..0000000 --- a/chrome/android/java/res/drawable-xxxhdpi/ic_lock.png +++ /dev/null Binary files differ
diff --git a/ui/android/java/res/drawable-xxxhdpi/verify_checkmark.png b/chrome/android/java/res/drawable-xxxhdpi/verify_checkmark.png similarity index 100% rename from ui/android/java/res/drawable-xxxhdpi/verify_checkmark.png rename to chrome/android/java/res/drawable-xxxhdpi/verify_checkmark.png Binary files differ
diff --git a/chrome/android/java/res/drawable/checkmark_blue.xml b/chrome/android/java/res/drawable/checkmark_blue.xml index 2f74dcf..fc7cebc 100644 --- a/chrome/android/java/res/drawable/checkmark_blue.xml +++ b/chrome/android/java/res/drawable/checkmark_blue.xml
@@ -9,7 +9,7 @@ <path android:fillColor="@color/black_alpha_20" - android:pathData="M13,13m-10,0a10,10 0,1 1,20 0a10,10 0,1 1,-20 0"/> + android:pathData="M12,14m-10,0a10,10 0,1 1,20 0a10,10 0,1 1,-20 0"/> <path android:fillColor="@android:color/white" android:pathData="M4 6H20v12H4z" />
diff --git a/chrome/android/java/res/layout/main.xml b/chrome/android/java/res/layout/main.xml index 95f0598e..7100531 100644 --- a/chrome/android/java/res/layout/main.xml +++ b/chrome/android/java/res/layout/main.xml
@@ -9,7 +9,7 @@ android:layout_height="match_parent" android:orientation="vertical"> - <android.support.design.widget.CoordinatorLayout + <org.chromium.chrome.browser.coordinator.CoordinatorLayoutForPointer android:id="@+id/coordinator" android:layout_width="match_parent" android:layout_height="0dp" @@ -23,7 +23,8 @@ <FrameLayout android:id="@+id/overview_list_layout_holder" android:layout_width="match_parent" - android:layout_height="match_parent" /> + android:layout_height="match_parent" + android:visibility="gone" /> <org.chromium.chrome.browser.snackbar.BottomContainer android:id="@+id/bottom_container" @@ -92,7 +93,7 @@ <FrameLayout android:id="@+id/bottom_sheet_snackbar_container" android:layout_width="match_parent" - android:layout_height="match_parent" + android:layout_height="wrap_content" android:layout_gravity="start|bottom" android:layout_marginTop="@dimen/bottom_nav_height_inverse" /> @@ -102,8 +103,7 @@ android:layout="@layout/empty_background_view_tablet" android:layout_width="match_parent" android:layout_height="match_parent" /> - - </android.support.design.widget.CoordinatorLayout> + </org.chromium.chrome.browser.coordinator.CoordinatorLayoutForPointer> </LinearLayout>
diff --git a/chrome/android/java/res/layout/photo_picker_toolbar.xml b/chrome/android/java/res/layout/photo_picker_toolbar.xml index 9211226..e51ee2cb0 100644 --- a/chrome/android/java/res/layout/photo_picker_toolbar.xml +++ b/chrome/android/java/res/layout/photo_picker_toolbar.xml
@@ -21,7 +21,8 @@ android:enabled="false" android:text="@string/done" android:textColor="@color/blue_when_enabled" - android:textSize="16sp" - app:textAllCaps="true" /> + android:textSize="14sp" + app:textAllCaps="true" + style="@style/RobotoMediumStyle" /> </org.chromium.chrome.browser.photo_picker.PhotoPickerToolbar>
diff --git a/chrome/android/java/res/values-v17/styles.xml b/chrome/android/java/res/values-v17/styles.xml index fae6f063..eddb59b 100644 --- a/chrome/android/java/res/values-v17/styles.xml +++ b/chrome/android/java/res/values-v17/styles.xml
@@ -435,12 +435,6 @@ </style> <!-- Bookmarks --> - <style name="BookmarkTitleBarButton"> - <item name="android:layout_width">wrap_content</item> - <item name="android:layout_height">wrap_content</item> - <item name="android:background">@null</item> - <item name="android:padding">15dp</item> - </style> <style name="BookmarkMenuStyle" parent="Widget.AppCompat.ListPopupWindow"> <item name="android:popupBackground">@drawable/menu_bg</item> </style> @@ -571,14 +565,6 @@ <item name="android:paddingEnd">16dp</item> <item name="android:background">?attr/listChoiceBackgroundIndicator</item> </style> - <style name="NumberRollTextViewStyle"> - <item name="android:layout_width">wrap_content</item> - <item name="android:layout_height">wrap_content</item> - <item name="android:layout_gravity">center_vertical</item> - <item name="android:singleLine">true</item> - <item name="android:textColor">@android:color/white</item> - <item name="android:textSize">20sp</item> - </style> <style name="BottomSheetContentTitle" parent="TextAppearance.Widget.AppCompat.Toolbar.Title"> <item name="android:textSize">20sp</item> </style> @@ -742,10 +728,4 @@ <item name="android:windowEnterAnimation">@anim/design_bottom_sheet_slide_in</item> <item name="android:windowExitAnimation">@null</item> </style> - - <!-- VR animations --> - <style name="VrEntryAnimation"> - <item name="android:windowEnterAnimation">@anim/stay_hidden</item> - <item name="android:windowExitAnimation">@null</item> - </style> </resources>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenu.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenu.java index faba0f76..a31031c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenu.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenu.java
@@ -33,7 +33,6 @@ import android.widget.ImageButton; import android.widget.ListView; import android.widget.PopupWindow; -import android.widget.PopupWindow.OnDismissListener; import org.chromium.base.AnimationFrameTimeHistogram; import org.chromium.base.ApiCompatibilityUtils; @@ -177,18 +176,15 @@ boolean anchorAtBottom = isAnchorAtBottom(anchorView, visibleDisplayFrame); int footerHeight = 0; - mPopup.setOnDismissListener(new OnDismissListener() { - @Override - public void onDismiss() { - if (anchorView instanceof ImageButton) { - ((ImageButton) anchorView).setSelected(false); - } - - if (mMenuItemEnterAnimator != null) mMenuItemEnterAnimator.cancel(); - - mHandler.appMenuDismissed(); - mHandler.onMenuVisibilityChanged(false); + mPopup.setOnDismissListener(() -> { + if (anchorView instanceof ImageButton) { + ((ImageButton) anchorView).setSelected(false); } + + if (mMenuItemEnterAnimator != null) mMenuItemEnterAnimator.cancel(); + + mHandler.appMenuDismissed(); + mHandler.onMenuVisibilityChanged(false); }); // Some OEMs don't actually let us change the background... but they still return the
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java index b3e00aed..7d26ac85 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java
@@ -15,7 +15,6 @@ import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; -import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; @@ -258,12 +257,7 @@ holder.title.setText(titleItem.getTitle()); holder.title.setEnabled(titleItem.isEnabled()); holder.title.setFocusable(titleItem.isEnabled()); - holder.title.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - mAppMenu.onItemClick(titleItem); - } - }); + holder.title.setOnClickListener(v -> mAppMenu.onItemClick(titleItem)); if (subItem.isCheckable()) { // Display a checkbox for the MenuItem. @@ -330,19 +324,9 @@ button.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_AUTO); } - button.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - mAppMenu.onItemClick(item); - } - }); + button.setOnClickListener(v -> mAppMenu.onItemClick(item)); - button.setOnLongClickListener(new View.OnLongClickListener() { - @Override - public boolean onLongClick(View v) { - return mAppMenu.onItemLongClick(item, v); - } - }); + button.setOnLongClickListener(v -> mAppMenu.onItemLongClick(item, v)); highlightItemIfNecessary(button, true, item.getItemId()); @@ -366,12 +350,7 @@ // This will ensure that the item is not highlighted when selected. convertView.setEnabled(isEnabled); - convertView.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - mAppMenu.onItemClick(item); - } - }); + convertView.setOnClickListener(v -> mAppMenu.onItemClick(item)); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuDragHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuDragHelper.java index 1f87c978..9fdbad7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuDragHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuDragHelper.java
@@ -68,24 +68,21 @@ // If user is dragging and the popup ListView is too big to display at once, // mDragScrolling animator scrolls mPopup.getListView() automatically depending on // the user's touch position. - mDragScrolling.setTimeListener(new TimeAnimator.TimeListener() { - @Override - public void onTimeUpdate(TimeAnimator animation, long totalTime, long deltaTime) { - if (mAppMenu.getListView() == null) return; + mDragScrolling.setTimeListener((animation, totalTime, deltaTime) -> { + if (mAppMenu.getListView() == null) return; - // We keep both mDragScrollOffset and mDragScrollOffsetRounded because - // the actual scrolling is by the rounded value but at the same time we also - // want to keep the precise scroll value in float. - mDragScrollOffset += (deltaTime * 0.001f) * mDragScrollingVelocity; - int diff = Math.round(mDragScrollOffset - mDragScrollOffsetRounded); - mDragScrollOffsetRounded += diff; - mAppMenu.getListView().smoothScrollBy(diff, 0); + // We keep both mDragScrollOffset and mDragScrollOffsetRounded because + // the actual scrolling is by the rounded value but at the same time we also + // want to keep the precise scroll value in float. + mDragScrollOffset += (deltaTime * 0.001f) * mDragScrollingVelocity; + int diff = Math.round(mDragScrollOffset - mDragScrollOffsetRounded); + mDragScrollOffsetRounded += diff; + mAppMenu.getListView().smoothScrollBy(diff, 0); - // Force touch move event to highlight items correctly for the scrolled position. - if (!Float.isNaN(mLastTouchX) && !Float.isNaN(mLastTouchY)) { - menuItemAction(Math.round(mLastTouchX), Math.round(mLastTouchY), - ITEM_ACTION_HIGHLIGHT); - } + // Force touch move event to highlight items correctly for the scrolled position. + if (!Float.isNaN(mLastTouchX) && !Float.isNaN(mLastTouchY)) { + menuItemAction(Math.round(mLastTouchX), Math.round(mLastTouchY), + ITEM_ACTION_HIGHLIGHT); } });
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillPopupBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillPopupBridge.java index 60ea19a2..92fe2be 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillPopupBridge.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillPopupBridge.java
@@ -43,12 +43,7 @@ mContext = null; // Clean up the native counterpart. This is posted to allow the native counterpart // to fully finish the construction of this glue object before we attempt to delete it. - new Handler().post(new Runnable() { - @Override - public void run() { - dismissed(); - } - }); + new Handler().post(() -> dismissed()); } else { mAutofillPopup = new AutofillPopup(activity, anchorView, this); mContext = activity;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/CardUnmaskBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/CardUnmaskBridge.java index 73d1e979..774eca29 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/CardUnmaskBridge.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/CardUnmaskBridge.java
@@ -32,12 +32,7 @@ mCardUnmaskPrompt = null; // Clean up the native counterpart. This is posted to allow the native counterpart // to fully finish the construction of this glue object before we attempt to delete it. - new Handler().post(new Runnable() { - @Override - public void run() { - dismissed(); - } - }); + new Handler().post(() -> dismissed()); } else { mCardUnmaskPrompt = new CardUnmaskPrompt(activity, this, title, instructions, confirmButtonLabel, ResourceId.mapToDrawableId(iconId),
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/CardUnmaskPrompt.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/CardUnmaskPrompt.java index 0212c7d..c712cfbd 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/CardUnmaskPrompt.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/CardUnmaskPrompt.java
@@ -21,11 +21,9 @@ import android.text.Editable; import android.text.InputFilter; import android.text.TextWatcher; -import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; -import android.view.View.OnFocusChangeListener; import android.view.ViewGroup; import android.view.accessibility.AccessibilityEvent; import android.view.inputmethod.EditorInfo; @@ -213,39 +211,27 @@ new InputFilter[] {new InputFilter.LengthFilter(mDelegate.getExpectedCvcLength())}); // Hitting the "submit" button on the software keyboard should submit the form if valid. - mCardUnmaskInput.setOnEditorActionListener(new TextView.OnEditorActionListener() { - @Override - public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { - if (actionId == EditorInfo.IME_ACTION_DONE) { - Button positiveButton = mDialog.getButton(AlertDialog.BUTTON_POSITIVE); - if (positiveButton.isEnabled()) positiveButton.performClick(); - return true; - } - return false; + mCardUnmaskInput.setOnEditorActionListener((v14, actionId, event) -> { + if (actionId == EditorInfo.IME_ACTION_DONE) { + Button positiveButton = mDialog.getButton(AlertDialog.BUTTON_POSITIVE); + if (positiveButton.isEnabled()) positiveButton.performClick(); + return true; } + return false; }); // Create the listeners to be notified when the user focuses out the input fields. - mCardUnmaskInput.setOnFocusChangeListener(new OnFocusChangeListener() { - @Override - public void onFocusChange(View v, boolean hasFocus) { - mDidFocusOnCvc = true; - validate(); - } + mCardUnmaskInput.setOnFocusChangeListener((v13, hasFocus) -> { + mDidFocusOnCvc = true; + validate(); }); - mMonthInput.setOnFocusChangeListener(new OnFocusChangeListener() { - @Override - public void onFocusChange(View v, boolean hasFocus) { - mDidFocusOnMonth = true; - validate(); - } + mMonthInput.setOnFocusChangeListener((v12, hasFocus) -> { + mDidFocusOnMonth = true; + validate(); }); - mYearInput.setOnFocusChangeListener(new OnFocusChangeListener() { - @Override - public void onFocusChange(View v, boolean hasFocus) { - mDidFocusOnYear = true; - validate(); - } + mYearInput.setOnFocusChangeListener((v1, hasFocus) -> { + mDidFocusOnYear = true; + validate(); }); // Load the error messages to show to the user. @@ -288,23 +274,14 @@ // the dialog. Button verifyButton = mDialog.getButton(AlertDialog.BUTTON_POSITIVE); verifyButton.setEnabled(false); - verifyButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - mDelegate.onUserInput(mCardUnmaskInput.getText().toString(), + verifyButton.setOnClickListener( + view -> mDelegate.onUserInput(mCardUnmaskInput.getText().toString(), mMonthInput.getText().toString(), Integer.toString(getFourDigitYear()), - mStoreLocallyCheckbox != null && mStoreLocallyCheckbox.isChecked()); - } - }); + mStoreLocallyCheckbox != null && mStoreLocallyCheckbox.isChecked())); mCardUnmaskInput.addTextChangedListener(this); - mCardUnmaskInput.post(new Runnable() { - @Override - public void run() { - setInitialFocus(); - } - }); + mCardUnmaskInput.post(() -> setInitialFocus()); } public void update(String title, String instructions, boolean shouldRequestExpirationDate) { @@ -345,12 +322,7 @@ setNoRetryError(errorMessage); } } else { - Runnable dismissRunnable = new Runnable() { - @Override - public void run() { - dismiss(); - } - }; + Runnable dismissRunnable = () -> dismiss(); if (mSuccessMessageDurationMilliseconds > 0) { mVerificationProgressBar.setVisibility(View.GONE); mDialog.findViewById(R.id.verification_success).setVisibility(View.VISIBLE); @@ -453,17 +425,9 @@ mStoreLocallyTooltipPopup.setOutsideTouchable(true); mStoreLocallyTooltipPopup.setBackgroundDrawable(ApiCompatibilityUtils.getDrawable( resources, R.drawable.store_locally_tooltip_background)); - mStoreLocallyTooltipPopup.setOnDismissListener(new PopupWindow.OnDismissListener() { - @Override - public void onDismiss() { - Handler h = new Handler(); - h.postDelayed(new Runnable() { - @Override - public void run() { - mStoreLocallyTooltipPopup = null; - } - }, 200); - } + mStoreLocallyTooltipPopup.setOnDismissListener(() -> { + Handler h = new Handler(); + h.postDelayed(() -> mStoreLocallyTooltipPopup = null, 200); }); mStoreLocallyTooltipPopup.showAsDropDown(mStoreLocallyCheckbox, ViewCompat.getPaddingStart(mStoreLocallyCheckbox), 0);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/PasswordGenerationPopupBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/PasswordGenerationPopupBridge.java index 2c3654cd2..85b976c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/PasswordGenerationPopupBridge.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/PasswordGenerationPopupBridge.java
@@ -54,12 +54,7 @@ mPopup = null; // Prevent destroying the native counterpart when it's about to derefence its own // members in UpdateBoundsAndRedrawPopup(). - new Handler().post(new Runnable() { - @Override - public void run() { - onDismiss(); - } - }); + new Handler().post(() -> onDismiss()); } else { mPopup = new DropdownPopupWindow(mContext, anchorView); mPopup.setOnItemClickListener(this);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java index 822280d82..6ade3dce 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java
@@ -10,6 +10,7 @@ import android.graphics.Paint; import android.graphics.Rect; import android.graphics.RectF; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.support.v4.view.ViewCompat; @@ -20,6 +21,7 @@ import android.util.Pair; import android.view.DragEvent; import android.view.MotionEvent; +import android.view.PointerIcon; import android.view.View; import android.view.ViewGroup; import android.view.accessibility.AccessibilityEvent; @@ -181,6 +183,14 @@ internalInit(); } + @Override + public PointerIcon onResolvePointerIcon(MotionEvent event, int pointerIndex) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) return null; + View activeView = getActiveView(); + if (activeView == null || !ViewCompat.isAttachedToWindow(activeView)) return null; + return activeView.onResolvePointerIcon(event, pointerIndex); + } + /** * Creates a {@link CompositorView}. * @param c The Context to create this {@link CompositorView} in.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/coordinator/CoordinatorLayoutForPointer.java b/chrome/android/java/src/org/chromium/chrome/browser/coordinator/CoordinatorLayoutForPointer.java new file mode 100644 index 0000000..14b0de4 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/coordinator/CoordinatorLayoutForPointer.java
@@ -0,0 +1,45 @@ +// 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. + +package org.chromium.chrome.browser.coordinator; + +import android.content.Context; +import android.os.Build; +import android.support.design.widget.CoordinatorLayout; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.PointerIcon; +import android.view.View; + +/** + * This class overrides {@link onResolvePointerIcon} method to correctly determine the pointer icon + * from a mouse motion event. This is needed because the default android impl does not consider + * view visibility. + */ +public class CoordinatorLayoutForPointer extends CoordinatorLayout { + public CoordinatorLayoutForPointer(Context context, AttributeSet attrs) { + super(context, attrs); + } + + private boolean isWithinBoundOfView(int x, int y, View view) { + return ((x >= view.getLeft() && x <= view.getRight()) + && (y >= view.getTop() && y <= view.getBottom())); + } + + @Override + public PointerIcon onResolvePointerIcon(MotionEvent event, int pointerIndex) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) return null; + + final int x = (int) event.getX(pointerIndex); + final int y = (int) event.getY(pointerIndex); + final int childrenCount = getChildCount(); + for (int i = childrenCount - 1; i >= 0; --i) { + if (getChildAt(i).getVisibility() != VISIBLE) continue; + if (isWithinBoundOfView(x, y, getChildAt(i))) { + return getChildAt(i).onResolvePointerIcon(event, pointerIndex); + } + } + return super.onResolvePointerIcon(event, pointerIndex); + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/favicon/FaviconHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/favicon/FaviconHelper.java index 28057dacb..af42bead 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/favicon/FaviconHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/favicon/FaviconHelper.java
@@ -35,7 +35,7 @@ public interface FaviconImageCallback { /** * This method will be called when the result favicon is ready. - * @param image Favicon image. + * @param image Favicon image. * @param iconUrl Favicon image's icon url. */ @CalledByNative("FaviconImageCallback") @@ -48,8 +48,8 @@ public interface IconAvailabilityCallback { /** * This method will be called when the availability of the icon has been checked. - * @param newlyAvailable true if the icon was downloaded and is now available, - * false if the favicon was already there or the download failed. + * @param newlyAvailable true if the icon was downloaded and is now available, false if the + * favicon was already there or the download failed. */ @CalledByNative("IconAvailabilityCallback") public void onIconAvailabilityChecked(boolean newlyAvailable); @@ -74,13 +74,12 @@ /** * Get Favicon bitmap for the requested arguments. Retrieves favicons only for pages the user * has visited on the current device. - * @param profile Profile used for the FaviconService construction. - * @param pageUrl The target Page URL to get the favicon. - * @param desiredSizeInPixel The size of the favicon in pixel we want to get. - * @param faviconImageCallback A method to be called back when the result is available. - * Note that this callback is not called if this method returns - * false. - * @return True if GetLocalFaviconImageForURL is successfully called. + * @param profile Profile used for the FaviconService construction. + * @param pageUrl The target Page URL to get the favicon. + * @param desiredSizeInPixel The size of the favicon in pixel we want to get. + * @param faviconImageCallback A method to be called back when the result is available. Note + * that this callback is not called if this method returns false. + * @return True if GetLocalFaviconImageForURL is successfully called. */ public boolean getLocalFaviconImageForURL( Profile profile, String pageUrl, int desiredSizeInPixel, @@ -95,32 +94,41 @@ * Get 16x16 Favicon bitmap for the requested arguments. Only retrives favicons in synced * session storage. (e.g. favicons synced from other devices). * TODO(apiccion): provide a way to obtain higher resolution favicons. - * @param profile Profile used for the FaviconService construction. - * @param pageUrl The target Page URL to get the favicon. - * - * @return 16x16 favicon Bitmap corresponding to the pageUrl. + * @param profile Profile used for the FaviconService construction. + * @param pageUrl The target Page URL to get the favicon. + * @return 16x16 favicon Bitmap corresponding to the pageUrl. */ public Bitmap getSyncedFaviconImageForURL(Profile profile, String pageUrl) { assert mNativeFaviconHelper != 0; return nativeGetSyncedFaviconImageForURL(mNativeFaviconHelper, profile, pageUrl); } + // TODO(jkrcal): Remove these two methods when FaviconHelper is not used any more by + // org.chromium.chrome.browser.suggestions.ImageFetcher. https://crbug.com/751628 /** * Tries to make sure that the specified icon is available in the cache of the provided profile. - * @param profile Profile used for the FaviconService construction. - * @param webContents The object used to download the icon. - * @param pageUrl The target Page URL to get the favicon for. - * @param iconUrl The URL of the icon to retrieve. - * @param isLargeIcon Specifies whether the type is TOUCH_ICON (true) or FAVICON (false). - * @param isTemporary Specifies whether the icon at iconUrl is temporary and should be updated - * as soon as the page at pageUrl is revisited. - * @param callback Called when completed (download not needed, finished or failed). + * The icon will we cached as an on-demand favicon. + * @param profile Profile used for the FaviconService construction. + * @param webContents The object used to download the icon. + * @param pageUrl The target Page URL to get the favicon for. + * @param iconUrl The URL of the icon to retrieve. + * @param isLargeIcon Specifies whether the type is TOUCH_ICON (true) or FAVICON (false). + * @param callback Called when completed (download not needed, finished or failed). */ public void ensureIconIsAvailable(Profile profile, WebContents webContents, String pageUrl, - String iconUrl, boolean isLargeIcon, boolean isTemporary, - IconAvailabilityCallback callback) { + String iconUrl, boolean isLargeIcon, IconAvailabilityCallback callback) { nativeEnsureIconIsAvailable(mNativeFaviconHelper, profile, webContents, pageUrl, iconUrl, - isLargeIcon, isTemporary, callback); + isLargeIcon, callback); + } + + /** + * Mark that the specified on-demand favicon was requested now. This postpones the automatic + * eviction of the favicon from the database. + * @param profile Profile used for the FaviconService construction. + * @param iconUrl The URL of the icon to touch. + */ + public void touchOnDemandFavicon(Profile profile, String iconUrl) { + nativeTouchOnDemandFavicon(mNativeFaviconHelper, profile, iconUrl); } private static native long nativeInit(); @@ -132,5 +140,7 @@ Profile profile, String pageUrl); private static native void nativeEnsureIconIsAvailable(long nativeFaviconHelper, Profile profile, WebContents webContents, String pageUrl, String iconUrl, - boolean isLargeIcon, boolean isTemporary, IconAvailabilityCallback callback); + boolean isLargeIcon, IconAvailabilityCallback callback); + private static native void nativeTouchOnDemandFavicon( + long nativeFaviconHelper, Profile profile, String iconUrl); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java index 261ef68..128c5df 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
@@ -28,6 +28,7 @@ import android.os.SystemClock; import android.provider.Settings; import android.speech.RecognizerIntent; +import android.support.annotation.DrawableRes; import android.support.annotation.IntDef; import android.text.InputType; import android.text.TextUtils; @@ -164,6 +165,7 @@ private NavigationButtonType mNavigationButtonType; // The type of the security icon currently active. + @DrawableRes private int mSecurityIconResource; private final OmniboxResultsAdapter mSuggestionListAdapter; @@ -1306,6 +1308,7 @@ * @param isOfflinePage Whether the page for which the icon is shown is an offline page. * @return The resource ID of the icon that should be displayed, 0 if no icon should show. */ + @DrawableRes public static int getSecurityIconResource( int securityLevel, boolean isSmallDevice, boolean isOfflinePage) { if (isOfflinePage) { @@ -1370,6 +1373,7 @@ @Override public void updateSecurityIcon(int securityLevel) { boolean isSmallDevice = !DeviceFormFactor.isTablet(); + @DrawableRes int id = getSecurityIconResource( securityLevel, isSmallDevice, mToolbarDataProvider.isOfflinePage()); if (id == 0) { @@ -1422,6 +1426,15 @@ } /** + * @return The ID of the drawable currently shown in the security icon. + */ + @VisibleForTesting + @DrawableRes + int getSecurityIconResourceId() { + return mSecurityIconResource; + } + + /** * Sets the type of the current navigation type and updates the UI to match it. * @param buttonType The type of navigation button to be shown. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/AddressEditor.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/AddressEditor.java index cec5022..57dc10e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/AddressEditor.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/AddressEditor.java
@@ -189,28 +189,22 @@ // If the user clicks [Cancel], send |toEdit| address back to the caller, which was the // original state (could be null, a complete address, a partial address). - mEditor.setCancelCallback(new Runnable() { - @Override - public void run() { - // This makes sure that onSubKeysReceived returns early if it's - // ever called when Cancel has already occurred. - mAdminAreasLoaded = true; - PersonalDataManager.getInstance().cancelPendingGetSubKeys(); - callback.onResult(toEdit); - } + mEditor.setCancelCallback(() -> { + // This makes sure that onSubKeysReceived returns early if it's + // ever called when Cancel has already occurred. + mAdminAreasLoaded = true; + PersonalDataManager.getInstance().cancelPendingGetSubKeys(); + callback.onResult(toEdit); }); // If the user clicks [Done], save changes on disk, mark the address "complete," and send it // back to the caller. - mEditor.setDoneCallback(new Runnable() { - @Override - public void run() { - mAdminAreasLoaded = true; - PersonalDataManager.getInstance().cancelPendingGetSubKeys(); - commitChanges(mProfile); - address.completeAddress(mProfile); - callback.onResult(address); - } + mEditor.setDoneCallback(() -> { + mAdminAreasLoaded = true; + PersonalDataManager.getInstance().cancelPendingGetSubKeys(); + commitChanges(mProfile); + address.completeAddress(mProfile); + callback.onResult(address); }); loadAdminAreasForCountry(mProfile.getCountryCode());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/AndroidPaymentApp.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/AndroidPaymentApp.java index 6f8bfbe3..0777a1a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/AndroidPaymentApp.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/AndroidPaymentApp.java
@@ -7,8 +7,6 @@ import android.app.Activity; import android.content.ComponentName; import android.content.Context; -import android.content.DialogInterface; -import android.content.DialogInterface.OnCancelListener; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.content.ServiceConnection; @@ -183,11 +181,8 @@ return; } - mHandler.postDelayed(new Runnable() { - @Override - public void run() { - if (!mIsReadyToPayQueried) respondToGetInstrumentsQuery(null); - } + mHandler.postDelayed(() -> { + if (!mIsReadyToPayQueried) respondToGetInstrumentsQuery(null); }, SERVICE_CONNECTION_TIMEOUT_MS); } @@ -198,19 +193,16 @@ } if (mInstrumentsCallback == null) return; - mHandler.post(new Runnable() { - @Override - public void run() { - ThreadUtils.assertOnUiThread(); - if (mInstrumentsCallback == null) return; - List<PaymentInstrument> instruments = null; - if (instrument != null) { - instruments = new ArrayList<>(); - instruments.add(instrument); - } - mInstrumentsCallback.onInstrumentsReady(AndroidPaymentApp.this, instruments); - mInstrumentsCallback = null; + mHandler.post(() -> { + ThreadUtils.assertOnUiThread(); + if (mInstrumentsCallback == null) return; + List<PaymentInstrument> instruments = null; + if (instrument != null) { + instruments = new ArrayList<>(); + instruments.add(instrument); } + mInstrumentsCallback.onInstrumentsReady(AndroidPaymentApp.this, instruments); + mInstrumentsCallback = null; }); } @@ -235,12 +227,7 @@ respondToGetInstrumentsQuery(null); return; } - mHandler.postDelayed(new Runnable() { - @Override - public void run() { - respondToGetInstrumentsQuery(null); - } - }, READY_TO_PAY_TIMEOUT_MS); + mHandler.postDelayed(() -> respondToGetInstrumentsQuery(null), READY_TO_PAY_TIMEOUT_MS); } @Override @@ -298,27 +285,13 @@ .setTitle(R.string.external_app_leave_incognito_warning_title) .setMessage(R.string.external_payment_app_leave_incognito_warning) .setPositiveButton(R.string.ok, - new OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - launchPaymentApp(id, merchantName, schemelessOrigin, - schemelessIframeOrigin, certificateChain, methodDataMap, - total, displayItems, modifiers); - } - }) + (OnClickListener) (dialog, which) -> launchPaymentApp(id, merchantName, + schemelessOrigin, + schemelessIframeOrigin, certificateChain, methodDataMap, + total, displayItems, modifiers)) .setNegativeButton(R.string.cancel, - new OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - notifyErrorInvokingPaymentApp(); - } - }) - .setOnCancelListener(new OnCancelListener() { - @Override - public void onCancel(DialogInterface dialog) { - notifyErrorInvokingPaymentApp(); - } - }) + (OnClickListener) (dialog, which) -> notifyErrorInvokingPaymentApp()) + .setOnCancelListener(dialog -> notifyErrorInvokingPaymentApp()) .show(); } @@ -443,12 +416,7 @@ } private void notifyErrorInvokingPaymentApp() { - mHandler.post(new Runnable() { - @Override - public void run() { - mInstrumentDetailsCallback.onInstrumentDetailsError(); - } - }); + mHandler.post(() -> mInstrumentDetailsCallback.onInstrumentDetailsError()); } private static String serializeDetails(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/AutofillPaymentApp.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/AutofillPaymentApp.java index 0c1514a..a3c6dce3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/AutofillPaymentApp.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/AutofillPaymentApp.java
@@ -96,12 +96,7 @@ } } - new Handler().post(new Runnable() { - @Override - public void run() { - callback.onInstrumentsReady(AutofillPaymentApp.this, instruments); - } - }); + new Handler().post(() -> callback.onInstrumentsReady(AutofillPaymentApp.this, instruments)); } /** @return A set of card networks (e.g., "visa", "amex") accepted by "basic-card" method. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/CardEditor.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/CardEditor.java index c48b16b1..91c3f30 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/CardEditor.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/CardEditor.java
@@ -33,7 +33,6 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; -import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.HashSet; @@ -202,17 +201,14 @@ } // Sort profiles for billing address according to completeness. - Collections.sort(mProfilesForBillingAddress, new Comparator<AutofillProfile>() { - @Override - public int compare(AutofillProfile a, AutofillProfile b) { - boolean isAComplete = AutofillAddress.checkAddressCompletionStatus( - a, AutofillAddress.NORMAL_COMPLETENESS_CHECK) - == AutofillAddress.COMPLETE; - boolean isBComplete = AutofillAddress.checkAddressCompletionStatus( - b, AutofillAddress.NORMAL_COMPLETENESS_CHECK) - == AutofillAddress.COMPLETE; - return ApiCompatibilityUtils.compareBoolean(isBComplete, isAComplete); - } + Collections.sort(mProfilesForBillingAddress, (a, b) -> { + boolean isAComplete = AutofillAddress.checkAddressCompletionStatus( + a, AutofillAddress.NORMAL_COMPLETENESS_CHECK) + == AutofillAddress.COMPLETE; + boolean isBComplete = AutofillAddress.checkAddressCompletionStatus( + b, AutofillAddress.NORMAL_COMPLETENESS_CHECK) + == AutofillAddress.COMPLETE; + return ApiCompatibilityUtils.compareBoolean(isBComplete, isAComplete); }); mCardIssuerNetworks = new HashMap<>(); @@ -254,16 +250,13 @@ } }; - mCardIconGenerator = new EditorValueIconGenerator() { - @Override - public int getIconResourceId(@Nullable CharSequence value) { - if (value == null) return 0; - CardIssuerNetwork cardTypeInfo = mCardIssuerNetworks.get( - PersonalDataManager.getInstance().getBasicCardIssuerNetwork( - value.toString(), false)); - if (cardTypeInfo == null) return 0; - return cardTypeInfo.icon; - } + mCardIconGenerator = value -> { + if (value == null) return 0; + CardIssuerNetwork cardTypeInfo = mCardIssuerNetworks.get( + PersonalDataManager.getInstance().getBasicCardIssuerNetwork( + value.toString(), false)); + if (cardTypeInfo == null) return 0; + return cardTypeInfo.icon; }; mCalendar = new AsyncTask<Void, Void, Calendar>() { @@ -378,12 +371,7 @@ try { calendar = mCalendar.get(); } catch (InterruptedException | ExecutionException e) { - mHandler.post(new Runnable() { - @Override - public void run() { - callback.onResult(null); - } - }); + mHandler.post(() -> callback.onResult(null)); return; } assert calendar != null; @@ -406,33 +394,25 @@ // If the user clicks [Cancel], send |toEdit| card back to the caller (will return original // state, which could be null, a full card, or a partial card). - editor.setCancelCallback(new Runnable() { - @Override - public void run() { - callback.onResult(toEdit); - } - }); + editor.setCancelCallback(() -> callback.onResult(toEdit)); // If the user clicks [Done], save changes on disk, mark the card "complete," and send it // back to the caller. - editor.setDoneCallback(new Runnable() { - @Override - public void run() { - commitChanges(card, isNewCard); + editor.setDoneCallback(() -> { + commitChanges(card, isNewCard); - String methodName = card.getBasicCardIssuerNetwork(); - if (mAcceptedBasicCardIssuerNetworks.contains(methodName)) { - methodName = AutofillPaymentApp.BASIC_CARD_METHOD_NAME; - } - assert methodName != null; - - AutofillProfile billingAddress = - findTargetProfile(mProfilesForBillingAddress, card.getBillingAddressId()); - assert billingAddress != null; - - instrument.completeInstrument(card, methodName, billingAddress); - callback.onResult(instrument); + String methodName = card.getBasicCardIssuerNetwork(); + if (mAcceptedBasicCardIssuerNetworks.contains(methodName)) { + methodName = AutofillPaymentApp.BASIC_CARD_METHOD_NAME; } + assert methodName != null; + + AutofillProfile billingAddress = + findTargetProfile(mProfilesForBillingAddress, card.getBillingAddressId()); + assert billingAddress != null; + + instrument.completeInstrument(card, methodName, billingAddress); + callback.onResult(instrument); }); mEditorDialog.show(editor); @@ -502,13 +482,10 @@ null /* value */); if (mCanScan) { mNumberField.addActionIcon(R.drawable.ic_photo_camera, - R.string.autofill_scan_credit_card, new Runnable() { - @Override - public void run() { - if (mIsScanning) return; - mIsScanning = true; - mCardScanner.scan(); - } + R.string.autofill_scan_credit_card, (Runnable) () -> { + if (mIsScanning) return; + mIsScanning = true; + mCardScanner.scan(); }); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ContactEditor.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ContactEditor.java index 0ec3a51..8e98658 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ContactEditor.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ContactEditor.java
@@ -188,41 +188,33 @@ // If the user clicks [Cancel], send |toEdit| contact back to the caller, which was the // original state (could be null, a complete contact, a partial contact). - editor.setCancelCallback(new Runnable() { - @Override - public void run() { - callback.onResult(toEdit); + editor.setCancelCallback(() -> callback.onResult(toEdit)); + + editor.setDoneCallback(() -> { + String name = null; + String phone = null; + String email = null; + AutofillProfile profile = contact.getProfile(); + + if (nameField != null) { + name = nameField.getValue().toString(); + profile.setFullName(name); } - }); - editor.setDoneCallback(new Runnable() { - @Override - public void run() { - String name = null; - String phone = null; - String email = null; - AutofillProfile profile = contact.getProfile(); - - if (nameField != null) { - name = nameField.getValue().toString(); - profile.setFullName(name); - } - - if (phoneField != null) { - phone = phoneField.getValue().toString(); - profile.setPhoneNumber(phone); - } - - if (emailField != null) { - email = emailField.getValue().toString(); - profile.setEmailAddress(email); - } - - profile.setGUID(PersonalDataManager.getInstance().setProfileToLocal(profile)); - profile.setIsLocal(true); - contact.completeContact(profile.getGUID(), name, phone, email); - callback.onResult(contact); + if (phoneField != null) { + phone = phoneField.getValue().toString(); + profile.setPhoneNumber(phone); } + + if (emailField != null) { + email = emailField.getValue().toString(); + profile.setEmailAddress(email); + } + + profile.setGUID(PersonalDataManager.getInstance().setProfileToLocal(profile)); + profile.setIsLocal(true); + contact.completeContact(profile.getGUID(), name, phone, email); + callback.onResult(contact); }); mEditorDialog.show(editor);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/JourneyLogger.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/JourneyLogger.java index 249b9378..39f47c15 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/JourneyLogger.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/JourneyLogger.java
@@ -115,6 +115,20 @@ mJourneyLoggerAndroid, requestShipping, requestEmail, requestPhone, requestName); } + /* + * Records what types of payment methods were requested by the merchant in the Payment Request. + * + * @param requestedBasicCard Whether the merchant requested basic-card. + * @param requestedMethodGoogle Whether the merchant requested a Google payment method. + * @param requestedMethodOther Whether the merchant requested a non basic-card, non-Google + * payment method. + */ + public void setRequestedPaymentMethodTypes(boolean requestedBasicCard, + boolean requestedMethodGoogle, boolean requestedMethodOther) { + nativeSetRequestedPaymentMethodTypes(mJourneyLoggerAndroid, requestedBasicCard, + requestedMethodGoogle, requestedMethodOther); + } + /** * Records the payment method that was selected by the user. * @@ -189,7 +203,10 @@ private native void nativeSetRequestedInformation(long nativeJourneyLoggerAndroid, boolean requestShipping, boolean requestEmail, boolean requestPhone, boolean requestName); + private native void nativeSetRequestedPaymentMethodTypes(long nativeJourneyLoggerAndroid, + boolean requestedBasicCard, boolean requestedMethodGoogle, + boolean requestedMethodOther); private native void nativeSetCompleted(long nativeJourneyLoggerAndroid); private native void nativeSetAborted(long nativeJourneyLoggerAndroid, int reason); private native void nativeSetNotShown(long nativeJourneyLoggerAndroid, int reason); -} \ No newline at end of file +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java index c42f510..e218b43 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
@@ -7,7 +7,6 @@ import android.app.Activity; import android.content.Context; import android.content.Intent; -import android.graphics.Bitmap; import android.os.Handler; import android.support.v4.util.ArrayMap; import android.text.TextUtils; @@ -30,7 +29,8 @@ import org.chromium.chrome.browser.payments.ui.LineItem; import org.chromium.chrome.browser.payments.ui.PaymentInformation; import org.chromium.chrome.browser.payments.ui.PaymentOption; -import org.chromium.chrome.browser.payments.ui.PaymentRequestSection.OptionSection.FocusChangedObserver; +import org.chromium.chrome.browser.payments.ui.PaymentRequestSection.OptionSection + .FocusChangedObserver; import org.chromium.chrome.browser.payments.ui.PaymentRequestUI; import org.chromium.chrome.browser.payments.ui.SectionInformation; import org.chromium.chrome.browser.payments.ui.ShoppingCart; @@ -190,12 +190,7 @@ private static final String ANDROID_PAY_METHOD_NAME = "https://android.com/pay"; private static final String PAY_WITH_GOOGLE_METHOD_NAME = "https://google.com/pay"; private static final Comparator<Completable> COMPLETENESS_COMPARATOR = - new Comparator<Completable>() { - @Override - public int compare(Completable a, Completable b) { - return (b.isComplete() ? 1 : 0) - (a.isComplete() ? 1 : 0); - } - }; + (a, b) -> (b.isComplete() ? 1 : 0) - (a.isComplete() ? 1 : 0); /** * Sorts the payment instruments by several rules: @@ -207,34 +202,31 @@ * instruments. */ private static final Comparator<PaymentInstrument> PAYMENT_INSTRUMENT_COMPARATOR = - new Comparator<PaymentInstrument>() { - @Override - public int compare(PaymentInstrument a, PaymentInstrument b) { - // Payment apps (not autofill) first. - int autofill = - (a.isAutofillInstrument() ? 1 : 0) - (b.isAutofillInstrument() ? 1 : 0); - if (autofill != 0) return autofill; + (a, b) -> { + // Payment apps (not autofill) first. + int autofill = + (a.isAutofillInstrument() ? 1 : 0) - (b.isAutofillInstrument() ? 1 : 0); + if (autofill != 0) return autofill; - // Complete cards before cards with missing information. - int completeness = (b.isComplete() ? 1 : 0) - (a.isComplete() ? 1 : 0); - if (completeness != 0) return completeness; + // Complete cards before cards with missing information. + int completeness = (b.isComplete() ? 1 : 0) - (a.isComplete() ? 1 : 0); + if (completeness != 0) return completeness; - // Cards with matching type before unknown type cards. - int typeMatch = (b.isExactlyMatchingMerchantRequest() ? 1 : 0) - - (a.isExactlyMatchingMerchantRequest() ? 1 : 0); - if (typeMatch != 0) return typeMatch; + // Cards with matching type before unknown type cards. + int typeMatch = (b.isExactlyMatchingMerchantRequest() ? 1 : 0) + - (a.isExactlyMatchingMerchantRequest() ? 1 : 0); + if (typeMatch != 0) return typeMatch; - // Preselectable instruments before non-preselectable instruments. - // Note that this only affects service worker payment apps' instruments for now - // since autofill payment instruments have already been sorted by preselect - // after sorting by completeness and typeMatch. And the other payment apps' - // instruments can always be preselected. - int canPreselect = (b.canPreselect() ? 1 : 0) - (a.canPreselect() ? 1 : 0); - if (canPreselect != 0) return canPreselect; + // Preselectable instruments before non-preselectable instruments. + // Note that this only affects service worker payment apps' instruments for now + // since autofill payment instruments have already been sorted by preselect + // after sorting by completeness and typeMatch. And the other payment apps' + // instruments can always be preselected. + int canPreselect = (b.canPreselect() ? 1 : 0) - (a.canPreselect() ? 1 : 0); + if (canPreselect != 0) return canPreselect; - // More frequently and recently used instruments first. - return compareInstrumentsByFrecency(b, a); - } + // More frequently and recently used instruments first. + return compareInstrumentsByFrecency(b, a); }; /** Every origin can call canMakePayment() every 30 minutes. */ @@ -497,6 +489,22 @@ PaymentAppFactory.getInstance().create(mWebContents, Collections.unmodifiableSet(mMethodData.keySet()), this /* callback */); + // Log the various types of payment methods that were requested by the merchant. + boolean requestedMethodGoogle = false; + boolean requestedMethodOther = false; + for (String methodName : mMethodData.keySet()) { + if (methodName.equals(ANDROID_PAY_METHOD_NAME) + || methodName.equals(PAY_WITH_GOOGLE_METHOD_NAME)) { + requestedMethodGoogle = true; + } else if (methodName.startsWith(UrlConstants.HTTPS_URL_PREFIX)) { + // Any method that starts with https and is not Android pay or Google pay is in the + // "other" category. + requestedMethodOther = true; + } + } + mJourneyLogger.setRequestedPaymentMethodTypes(mMerchantSupportsAutofillPaymentInstruments, + requestedMethodGoogle, requestedMethodOther); + // If there is a single payment method and the merchant has not requested any other // information, we can safely go directly to the payment app instead of showing // Payment Request UI. @@ -544,13 +552,10 @@ faviconHelper.getLocalFaviconImageForURL(Profile.getLastUsedProfile(), mWebContents.getLastCommittedUrl(), activity.getResources().getDimensionPixelSize(R.dimen.payments_favicon_size), - new FaviconHelper.FaviconImageCallback() { - @Override - public void onFaviconAvailable(Bitmap bitmap, String iconUrl) { - if (mClient != null && bitmap == null) mClient.warnNoFavicon(); - if (mUI != null && bitmap != null) mUI.setTitleBitmap(bitmap); - faviconHelper.destroy(); - } + (bitmap, iconUrl) -> { + if (mClient != null && bitmap == null) mClient.warnNoFavicon(); + if (mUI != null && bitmap != null) mUI.setTitleBitmap(bitmap); + faviconHelper.destroy(); }); // Add the callback to change the label of shipping addresses depending on the focus. @@ -1054,11 +1059,8 @@ if (mPaymentMethodsSection == null) return; - mHandler.post(new Runnable() { - @Override - public void run() { - if (mUI != null) providePaymentInformation(); - } + mHandler.post(() -> { + if (mUI != null) providePaymentInformation(); }); } @@ -1077,30 +1079,22 @@ @Override public void getShoppingCart(final Callback<ShoppingCart> callback) { - mHandler.post(new Runnable() { - @Override - public void run() { - callback.onResult(mUiShoppingCart); - } - }); + mHandler.post(() -> callback.onResult(mUiShoppingCart)); } @Override public void getSectionInformation(@PaymentRequestUI.DataType final int optionType, final Callback<SectionInformation> callback) { - mHandler.post(new Runnable() { - @Override - public void run() { - if (optionType == PaymentRequestUI.TYPE_SHIPPING_ADDRESSES) { - callback.onResult(mShippingAddressesSection); - } else if (optionType == PaymentRequestUI.TYPE_SHIPPING_OPTIONS) { - callback.onResult(mUiShippingOptions); - } else if (optionType == PaymentRequestUI.TYPE_CONTACT_DETAILS) { - callback.onResult(mContactSection); - } else if (optionType == PaymentRequestUI.TYPE_PAYMENT_METHODS) { - assert mPaymentMethodsSection != null; - callback.onResult(mPaymentMethodsSection); - } + mHandler.post(() -> { + if (optionType == PaymentRequestUI.TYPE_SHIPPING_ADDRESSES) { + callback.onResult(mShippingAddressesSection); + } else if (optionType == PaymentRequestUI.TYPE_SHIPPING_OPTIONS) { + callback.onResult(mUiShippingOptions); + } else if (optionType == PaymentRequestUI.TYPE_CONTACT_DETAILS) { + callback.onResult(mContactSection); + } else if (optionType == PaymentRequestUI.TYPE_PAYMENT_METHODS) { + assert mPaymentMethodsSection != null; + callback.onResult(mPaymentMethodsSection); } }); } @@ -1462,12 +1456,8 @@ // period expires. query = new CanMakePaymentQuery(Collections.unmodifiableMap(mMethodData)); sCanMakePaymentQueries.put(canMakePaymentId, query); - mHandler.postDelayed(new Runnable() { - @Override - public void run() { - sCanMakePaymentQueries.remove(canMakePaymentId); - } - }, CAN_MAKE_PAYMENT_QUERY_PERIOD_MS); + mHandler.postDelayed(() -> sCanMakePaymentQueries.remove(canMakePaymentId), + CAN_MAKE_PAYMENT_QUERY_PERIOD_MS); } else if (shouldEnforceCanMakePaymentQueryQuota() && !query.matchesPaymentMethods(Collections.unmodifiableMap(mMethodData))) { // If there has been a canMakePayment() query in the last 30 minutes, but the previous @@ -1810,12 +1800,9 @@ */ private void closeUI(boolean immediateClose) { if (mUI != null) { - mUI.close(immediateClose, new Runnable() { - @Override - public void run() { - if (mClient != null) mClient.onComplete(); - closeClient(); - } + mUI.close(immediateClose, () -> { + if (mClient != null) mClient.onComplete(); + closeClient(); }); mUI = null; mIsCurrentPaymentRequestShowing = false;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ServiceWorkerPaymentApp.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ServiceWorkerPaymentApp.java index 8dac78e..2d36d86 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ServiceWorkerPaymentApp.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ServiceWorkerPaymentApp.java
@@ -78,13 +78,10 @@ public void getInstruments(Map<String, PaymentMethodData> unusedMethodDataMap, String unusedOrigin, String unusedIFrameOrigin, byte[][] unusedCertificateChain, final InstrumentsCallback callback) { - new Handler().post(new Runnable() { - @Override - public void run() { - List<PaymentInstrument> instruments = new ArrayList(); - instruments.add(ServiceWorkerPaymentApp.this); - callback.onInstrumentsReady(ServiceWorkerPaymentApp.this, instruments); - } + new Handler().post(() -> { + List<PaymentInstrument> instruments = new ArrayList(); + instruments.add(ServiceWorkerPaymentApp.this); + callback.onInstrumentsReady(ServiceWorkerPaymentApp.this, instruments); }); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/NotificationsPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/NotificationsPreferences.java index 2a792d5..b50945d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/NotificationsPreferences.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/NotificationsPreferences.java
@@ -76,6 +76,9 @@ mSuggestionsPref.setChecked( suggestionsEnabled && SnippetsBridge.areContentSuggestionsNotificationsEnabled()); mSuggestionsPref.setEnabled(suggestionsEnabled); + mSuggestionsPref.setSummary(suggestionsEnabled + ? R.string.notifications_content_suggestions_summary + : R.string.notifications_content_suggestions_summary_disabled); mFromWebsitesPref.setSummary(ContentSettingsResources.getCategorySummary( ContentSettingsType.CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/ImageFetcher.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/ImageFetcher.java index d6925e71..d407dabf 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/ImageFetcher.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/ImageFetcher.java
@@ -129,8 +129,9 @@ } if (!suggestion.isArticle() || !SnippetsConfig.isFaviconsFromNewServerEnabled()) { - // The old code path. Remove when the experiment is successful. - // Currently, we have to use this for non-articles, due to privacy. + // The old code path. Currently, we have to use this for non-articles, due to privacy. + // TODO(jkrcal): Remove this path when we completely switch to the new code on Stable. + // https://crbug.com/751628 fetchFaviconFromLocalCache(pageUrl, true, faviconFetchStartTimeMs, faviconSizePx, suggestion, faviconCallback); } else { @@ -194,6 +195,10 @@ fallbackToService ? FaviconFetchResult.SUCCESS_CACHED : FaviconFetchResult.SUCCESS_FETCHED, SystemClock.elapsedRealtime() - faviconFetchStartTimeMs); + + // Update the time when the icon was last requested therefore postponing + // the automatic eviction of the favicon from the favicon database. + getFaviconHelper().touchOnDemandFavicon(mProfile, iconUrl); } else if (fallbackToService) { if (!fetchFaviconFromService(suggestion, snippetUri, faviconFetchStartTimeMs, faviconSizePx, faviconCallback)) { @@ -234,8 +239,7 @@ ensureIconIsAvailable( getSnippetDomain(snippetUri), // Store to the cache for the whole domain. String.format(FAVICON_SERVICE_FORMAT, snippetUri.getHost(), sizePx), - /* useLargeIcon = */ false, /* isTemporary = */ true, - new FaviconHelper.IconAvailabilityCallback() { + /* useLargeIcon = */ false, new FaviconHelper.IconAvailabilityCallback() { @Override public void onIconAvailabilityChecked(boolean newlyAvailable) { if (!newlyAvailable) { @@ -261,11 +265,10 @@ * @param callback The callback to be notified when the favicon has been checked. */ private void ensureIconIsAvailable(String pageUrl, String iconUrl, boolean isLargeIcon, - boolean isTemporary, FaviconHelper.IconAvailabilityCallback callback) { + FaviconHelper.IconAvailabilityCallback callback) { if (mHost.getActiveTab() != null && mHost.getActiveTab().getWebContents() != null) { getFaviconHelper().ensureIconIsAvailable(mProfile, - mHost.getActiveTab().getWebContents(), pageUrl, iconUrl, isLargeIcon, - isTemporary, callback); + mHost.getActiveTab().getWebContents(), pageUrl, iconUrl, isLargeIcon, callback); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcher.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcher.java index 3f77d190..d87061b8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcher.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcher.java
@@ -22,12 +22,6 @@ /** Observes fetching of the Web Manifest. */ public interface Observer { /** - * Called when the initial URL load has completed and the page has no Web Manifest or the - * Web Manifest is not WebAPK compatible. - */ - void onWebManifestForInitialUrlNotWebApkCompatible(); - - /** * Called when the Web Manifest has been successfully fetched (including on the initial URL * load). * @param fetchedInfo The fetched Web Manifest data. @@ -124,15 +118,6 @@ mObserver.onGotManifestData(info, primaryIconUrl, badgeIconUrl); } - /** - * Called when the initial URL load has completed and the page has no Web Manifest or the - * Web Manifest is not WebAPK compatible. - */ - @CalledByNative - private void onWebManifestForInitialUrlNotWebApkCompatible() { - mObserver.onWebManifestForInitialUrlNotWebApkCompatible(); - } - private native long nativeInitialize(String scope, String webManifestUrl); private native void nativeReplaceWebContents( long nativeWebApkUpdateDataFetcher, WebContents webContents);
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 1632c42..51d30178 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
@@ -9,6 +9,7 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.graphics.Bitmap; +import android.os.Handler; import android.text.TextUtils; import org.chromium.base.ActivityState; @@ -25,6 +26,7 @@ import org.chromium.webapk.lib.client.WebApkVersion; import java.util.Map; +import java.util.concurrent.TimeUnit; /** * WebApkUpdateManager manages when to check for updates to the WebAPK's Web Manifest, and sends @@ -33,6 +35,9 @@ public class WebApkUpdateManager implements WebApkUpdateDataFetcher.Observer { private static final String TAG = "WebApkUpdateManager"; + // Maximum wait time for WebAPK update to be scheduled. + private static final long UPDATE_TIMEOUT_MILLISECONDS = TimeUnit.SECONDS.toMillis(30); + /** * Number of times to wait for updating the WebAPK after it is moved to the background prior * to doing the update while the WebAPK is in the foreground. @@ -59,6 +64,9 @@ private WebApkUpdateDataFetcher mFetcher; + /** Runs failure callback if WebAPK update is not scheduled within deadline. */ + private Handler mUpdateFailureHandler; + /** * Contains all the data which is cached for a pending update request once the WebAPK is no * longer running foreground. @@ -97,6 +105,13 @@ mFetcher = buildFetcher(); mFetcher.start(tab, mInfo, this); + mUpdateFailureHandler = new Handler(); + mUpdateFailureHandler.postDelayed(new Runnable() { + @Override + public void run() { + onGotManifestData(null, null, null); + } + }, UPDATE_TIMEOUT_MILLISECONDS); } /** @@ -124,14 +139,12 @@ } @Override - public void onWebManifestForInitialUrlNotWebApkCompatible() { - onGotManifestData(null, null, null); - } - - @Override public void onGotManifestData(WebApkInfo fetchedInfo, String primaryIconUrl, String badgeIconUrl) { mStorage.updateTimeOfLastCheckForUpdatedWebManifest(); + if (mUpdateFailureHandler != null) { + mUpdateFailureHandler.removeCallbacksAndMessages(null); + } boolean gotManifest = (fetchedInfo != null); boolean needsUpgrade = isShellApkVersionOutOfDate(mInfo)
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java index c9f6a4b..92dce66 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java
@@ -156,8 +156,23 @@ public void preInflationStartup() { Intent intent = getIntent(); WebappInfo info = popWebappInfo(WebappInfo.idFromIntent(intent)); + // When WebappActivity is killed by the Android OS, and an entry stays in "Android Recents" + // (The user does not swipe it away), when WebappActivity is relaunched it is relaunched + // with the intent stored in WebappActivity#getIntent() at the time that the WebappActivity + // was killed. WebappActivity may be relaunched from: + + // (A) An intent from WebappLauncherActivity (e.g. as a result of a notification or a deep + // link). Android drops the intent from WebappLauncherActivity in favor of + // WebappActivity#getIntent() at the time that the WebappActivity was killed. + + // (B) The user selecting the WebappActivity in recents. In case (A) we want to use the + // intent sent to WebappLauncherActivity and ignore WebappActivity#getSavedInstanceState(). + // In case (B) we want to restore to saved tab state. if (info == null) { info = createWebappInfo(intent); + } else if (info.shouldForceNavigation()) { + // Don't restore to previous page, navigate using WebappInfo retrieved from cache. + resetSavedInstanceState(); } mWebappInfo = info;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/OverviewListLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/OverviewListLayout.java index 7a9177e..1ea62a1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/OverviewListLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/OverviewListLayout.java
@@ -6,6 +6,7 @@ import android.content.Context; import android.view.LayoutInflater; +import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.ListView; @@ -57,8 +58,10 @@ if (container == null || mTabModelWrapper.getParent() != null) return; - ((ViewGroup) container.findViewById(R.id.overview_list_layout_holder)) - .addView(mTabModelWrapper); + ViewGroup overviewList = + (ViewGroup) container.findViewById(R.id.overview_list_layout_holder); + overviewList.setVisibility(View.VISIBLE); + overviewList.addView(mTabModelWrapper); } @Override @@ -152,7 +155,10 @@ if (mTabModelSelector != null) mTabModelSelector.commitAllTabClosures(); if (mTabModelWrapper != null) { ViewGroup parent = (ViewGroup) mTabModelWrapper.getParent(); - if (parent != null) parent.removeView(mTabModelWrapper); + if (parent != null) { + parent.setVisibility(View.GONE); + parent.removeView(mTabModelWrapper); + } } }
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd index 5c458328..371da18 100644 --- a/chrome/android/java/strings/android_chrome_strings.grd +++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -413,12 +413,6 @@ <message name="IDS_MANAGE_PASSWORDS_TEXT" desc="Text for link to manage passwords on Account Central."> View and manage saved passwords at <ph name="BEGIN_LINK"><link></ph>passwords.google.com<ph name="END_LINK"></link></ph> </message> - <message name="IDS_REDIRECT_TO_PASSWORDS_TEXT" desc="Title of password settings entry in main Chrome preferences for users who will be redirected to passwords.google.com to manage their passwords."> - Saved passwords - </message> - <message name="IDS_REDIRECT_TO_PASSWORDS_LINK" desc="Hostname of the site where users will go if they tap the passwords settings in main Chrome preferences."> - passwords.google.com - </message> <message name="IDS_SAVED_PASSWORDS_NONE_TEXT" desc="Text when there are no saved passwords/exceptions."> Saved passwords will appear here. </message> @@ -434,9 +428,6 @@ <message name="IDS_PASSWORD_ENTRY_EDITOR_PASSWORD" desc='Title preceding password on password entry editor.'> Password </message> - <message name="IDS_PASSWORD_ENTRY_EDITOR_COPY_STORED_SITE" desc='Content description for the button that copies the stored site.'> - Copy site - </message> <message name="IDS_PASSWORD_ENTRY_EDITOR_COPY_STORED_USERNAME" desc='Content description for the button that copies the stored username.'> Copy username </message> @@ -464,17 +455,8 @@ <message name="IDS_PASSWORD_ENTRY_EDITOR_SET_LOCK_SCREEN" desc='Text prompting user to set device lock in order to view/copy passwords'> To view or copy your password here, set screen lock on this device. </message> - <message name="IDS_PASSWORD_ENTRY_EDITOR_NOT_AVAILABLE_ON_PRE_LOLLIPOP" desc='Text that announced user that password viewing is not possible on pre-Lollipop devices'> - Password viewing and copying are not available on your version of Android. - </message> <!-- Lock Screen Fragment --> - <message name="IDS_LOCKSCREEN_VERIFICATION_TITLE" desc='Customized title for lock screen prompting user to unlock their phone to continue with setup.'> - Confirm your screen lock - </message> - <message name="IDS_LOCKSCREEN_VERIFICATION_TEXT" desc='User needs to enter lock pattern to verify that they own this phone.'> - For security reasons, you need to confirm your screen lock in order to access your password. - </message> <message name="IDS_LOCKSCREEN_DESCRIPTION" desc='Text on lockscreen explaining to user that they need to unlock the device to continue setup.'> Unlock to continue setting up your phone </message> @@ -500,6 +482,9 @@ <message name="IDS_NOTIFICATIONS_FROM_WEBSITES_TITLE" desc="Summary for the preference to link to the per-website notification settings."> From websites </message> + <message name="IDS_NOTIFICATIONS_CONTENT_SUGGESTIONS_SUMMARY_DISABLED" desc="Summary for the disabled preference to turn on/off content suggestions notifications when search and site suggestions are disabled."> + Search and site suggestions disabled + </message> <!-- Privacy preferences --> <message name="IDS_PREFS_PRIVACY" desc="Title for the Privacy preferences. [CHAR-LIMIT=32]"> @@ -714,17 +699,6 @@ Automatically send usage statistics and crash reports to Google </message> - <!-- Suggestions preferences --> - <message name="IDS_SUGGESTIONS_FEATURE_SWITCH_TITLE" desc="Title for switch used to toggle the Content Suggestions feature on or off." translateable="false"> - Suggestions - </message> - <message name="IDS_SUGGESTIONS_FEATURE_SWITCH_ON_SUMMARY" desc="Description for the Suggestions switch when the feature is enabled." translateable="false"> - Use Google servers to provide browsing suggestions. - </message> - <message name="IDS_SUGGESTIONS_CAVEATS_DESCRIPTION" desc="Description text for suggestions usage caveats" translateable="false"> - When this feature is turned on, Chrome will use Google servers to provide browsing suggestions, e.g. when you open a new tab. This include popular websites, trending articles as well as personalized suggestions. - </message> - <!-- Accessibility preferences --> <message name="IDS_PREFS_ACCESSIBILITY" desc="Title of Accessibility settings, which allows the user to change webpage font sizes. [CHAR-LIMIT=32]"> Accessibility @@ -2589,9 +2563,6 @@ <message name="IDS_READER_VIEW_TEXT" desc="Message shown on the reader mode button bar, to invite the user to tap to open a reader mode. Reader mode extracts content and removes clutter from a web page and puts the result in a panel making it easier to read."> Make page mobile-friendly </message> - <message name="IDS_READER_MODE_MAXIMIZED_TITLE" desc="Message shown on the reader mode button bar when it is opened to show reader mode. Reader mode extracts content and removes clutter from a web page and puts the result in a panel making it easier to read."> - Mobile-friendly view - </message> <message name="IDS_CONTENT_PROVIDER_SEARCH_DESCRIPTION" desc="Description for Chrome's entry in QSB's list of search suggestion providers [CHAR-LIMIT=32]"> Bookmarks and web history </message> @@ -2951,10 +2922,6 @@ <ph name="ITEM_NAME">%1$s<ex>item_name</ex></ph> (<ph name="ITEM_ID">%2$s<ex>item id</ex></ph>) </message> - <message name="IDS_INSTANT_APPS_OPEN_IN_APP" desc="Button label for the user action that will open an Instant App."> - Open app - </message> - <!-- WebAPK related strings --> <message name="IDS_WEBAPK_RUNNING_IN_CHROME_DISCLOSURE" desc="Message on the notification that indicates a WebApk may use Chrome data."> This app is running in Chrome.
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni index 7150fed..72258f7 100644 --- a/chrome/android/java_sources.gni +++ b/chrome/android/java_sources.gni
@@ -272,6 +272,7 @@ "java/src/org/chromium/chrome/browser/contextualsearch/TapWordLengthSuppression.java", "java/src/org/chromium/chrome/browser/cookies/CanonicalCookie.java", "java/src/org/chromium/chrome/browser/cookies/CookiesFetcher.java", + "java/src/org/chromium/chrome/browser/coordinator/CoordinatorLayoutForPointer.java", "java/src/org/chromium/chrome/browser/crash/ChromeMinidumpUploadJobService.java", "java/src/org/chromium/chrome/browser/crash/ChromeMinidumpUploaderDelegate.java", "java/src/org/chromium/chrome/browser/crash/LogcatExtractionRunnable.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/accessibility/FontSizePrefsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/accessibility/FontSizePrefsTest.java index b4916d58..7cecc91d 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/accessibility/FontSizePrefsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/accessibility/FontSizePrefsTest.java
@@ -22,8 +22,6 @@ import org.chromium.chrome.browser.accessibility.FontSizePrefs.FontSizePrefsObserver; import org.chromium.chrome.browser.test.ChromeBrowserTestRule; -import java.util.concurrent.Callable; - /** * Tests for {@link FontSizePrefs}. */ @@ -175,89 +173,54 @@ } private void assertConsistent() { - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - Assert.assertEquals(getUserFontScaleFactor(), mUserFontScaleFactor, EPSILON); - Assert.assertEquals(getFontScaleFactor(), mFontScaleFactor, EPSILON); - Assert.assertEquals(getForceEnableZoom(), mForceEnableZoom); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + Assert.assertEquals(getUserFontScaleFactor(), mUserFontScaleFactor, EPSILON); + Assert.assertEquals(getFontScaleFactor(), mFontScaleFactor, EPSILON); + Assert.assertEquals(getForceEnableZoom(), mForceEnableZoom); }); } } private FontSizePrefs getFontSizePrefs(final Context context) { - return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<FontSizePrefs>() { - @Override - public FontSizePrefs call() { - return FontSizePrefs.getInstance(context); - } - }); + return ThreadUtils.runOnUiThreadBlockingNoException( + () -> FontSizePrefs.getInstance(context)); } private TestingObserver createAndAddFontSizePrefsObserver() { - return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<TestingObserver>() { - @Override - public TestingObserver call() { - TestingObserver observer = new TestingObserver(); - mFontSizePrefs.addObserver(observer); - return observer; - } + return ThreadUtils.runOnUiThreadBlockingNoException(() -> { + TestingObserver observer = new TestingObserver(); + mFontSizePrefs.addObserver(observer); + return observer; }); } private void setUserFontScaleFactor(final float fontsize) { - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mFontSizePrefs.setUserFontScaleFactor(fontsize); - } - }); + ThreadUtils.runOnUiThreadBlocking(() -> mFontSizePrefs.setUserFontScaleFactor(fontsize)); } private float getUserFontScaleFactor() { - return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<Float>() { - @Override - public Float call() { - return mFontSizePrefs.getUserFontScaleFactor(); - } - }); + return ThreadUtils.runOnUiThreadBlockingNoException( + () -> mFontSizePrefs.getUserFontScaleFactor()); } private float getFontScaleFactor() { - return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<Float>() { - @Override - public Float call() { - return mFontSizePrefs.getFontScaleFactor(); - } - }); + return ThreadUtils.runOnUiThreadBlockingNoException( + () -> mFontSizePrefs.getFontScaleFactor()); } private void setForceEnableZoomFromUser(final boolean enabled) { - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mFontSizePrefs.setForceEnableZoomFromUser(enabled); - } - }); + ThreadUtils.runOnUiThreadBlocking(() -> mFontSizePrefs.setForceEnableZoomFromUser(enabled)); } private boolean getForceEnableZoom() { - return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<Boolean>() { - @Override - public Boolean call() { - return mFontSizePrefs.getForceEnableZoom(); - } - }); + return ThreadUtils.runOnUiThreadBlockingNoException( + () -> mFontSizePrefs.getForceEnableZoom()); } private void setSystemFontScaleForTest(final float systemFontScale) { - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mFontSizePrefs.setSystemFontScaleForTest(systemFontScale); - mFontSizePrefs.onSystemFontScaleChanged(); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + mFontSizePrefs.setSystemFontScaleForTest(systemFontScale); + mFontSizePrefs.onSystemFontScaleChanged(); }); } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/AppMenuTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/AppMenuTest.java index fd791d0..37feb71 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/AppMenuTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/AppMenuTest.java
@@ -35,8 +35,6 @@ import org.chromium.content.browser.test.util.Criteria; import org.chromium.content.browser.test.util.CriteriaHelper; -import java.util.concurrent.Callable; - /** * Tests AppMenu popup */ @@ -81,32 +79,18 @@ InstrumentationRegistry.getInstrumentation().setInTouchMode(false); ChromeActivity.setAppMenuHandlerFactoryForTesting( - new ChromeActivity.AppMenuHandlerFactory() { - @Override - public AppMenuHandler get(Activity activity, AppMenuPropertiesDelegate delegate, - int menuResourceId) { - mAppMenuHandler = - new AppMenuHandlerForTest(activity, delegate, menuResourceId); - return mAppMenuHandler; - } + (activity, delegate, menuResourceId) -> { + mAppMenuHandler = + new AppMenuHandlerForTest(activity, delegate, menuResourceId); + return mAppMenuHandler; }); mActivityTestRule.startMainActivityWithURL(TEST_URL); showAppMenuAndAssertMenuShown(); mAppMenu = mActivityTestRule.getActivity().getAppMenuHandler().getAppMenu(); - ThreadUtils.runOnUiThread(new Runnable() { - @Override - public void run() { - mAppMenu.getListView().setSelection(0); - } - }); - CriteriaHelper.pollInstrumentationThread(Criteria.equals(0, new Callable<Integer>() { - @Override - public Integer call() { - return getCurrentFocusedRow(); - } - })); + ThreadUtils.runOnUiThread(() -> mAppMenu.getListView().setSelection(0)); + CriteriaHelper.pollInstrumentationThread(Criteria.equals(0, () -> getCurrentFocusedRow())); InstrumentationRegistry.getInstrumentation().waitForIdleSync(); } @@ -231,12 +215,7 @@ } private void showAppMenuAndAssertMenuShown() { - ThreadUtils.runOnUiThread(new Runnable() { - @Override - public void run() { - mAppMenuHandler.showAppMenu(null, false); - } - }); + ThreadUtils.runOnUiThread((Runnable) () -> mAppMenuHandler.showAppMenu(null, false)); CriteriaHelper.pollInstrumentationThread(new Criteria("AppMenu did not show") { @Override public boolean isSatisfied() { @@ -264,23 +243,14 @@ pressKey(towardsTop ? KeyEvent.KEYCODE_DPAD_UP : KeyEvent.KEYCODE_DPAD_DOWN); final int expectedPosition = index + increment; CriteriaHelper.pollInstrumentationThread( - Criteria.equals(expectedPosition, new Callable<Integer>() { - @Override - public Integer call() { - return getCurrentFocusedRow(); - } - })); + Criteria.equals(expectedPosition, () -> getCurrentFocusedRow())); } // Try moving past it by one. if (movePast) { pressKey(towardsTop ? KeyEvent.KEYCODE_DPAD_UP : KeyEvent.KEYCODE_DPAD_DOWN); - CriteriaHelper.pollInstrumentationThread(Criteria.equals(end, new Callable<Integer>() { - @Override - public Integer call() { - return getCurrentFocusedRow(); - } - })); + CriteriaHelper.pollInstrumentationThread(Criteria.equals(end, + () -> getCurrentFocusedRow())); } // The menu should stay open. @@ -289,12 +259,9 @@ private void pressKey(final int keycode) { final View view = mAppMenu.getListView(); - ThreadUtils.runOnUiThread(new Runnable() { - @Override - public void run() { - view.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, keycode)); - view.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, keycode)); - } + ThreadUtils.runOnUiThread(() -> { + view.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, keycode)); + view.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, keycode)); }); InstrumentationRegistry.getInstrumentation().waitForIdleSync(); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/ChromeHomeAppMenuTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/ChromeHomeAppMenuTest.java index ae62965..298000e1 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/ChromeHomeAppMenuTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/ChromeHomeAppMenuTest.java
@@ -60,12 +60,9 @@ assertTrue(iconRow.getReloadButtonForTests().isEnabled()); // Navigate backward, open the menu and assert forward button is enabled. - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mAppMenuHandler.hideAppMenu(); - mBottomSheetTestRule.getActivity().getActivityTab().goBack(); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + mAppMenuHandler.hideAppMenu(); + mBottomSheetTestRule.getActivity().getActivityTab().goBack(); }); showAppMenuAndAssertMenuShown(); @@ -76,12 +73,8 @@ @Test @SmallTest public void testTabSwitcherMenu() throws IllegalArgumentException { - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mBottomSheetTestRule.getActivity().getLayoutManager().showOverview(false); - } - }); + ThreadUtils.runOnUiThreadBlocking( + () -> mBottomSheetTestRule.getActivity().getLayoutManager().showOverview(false)); showAppMenuAndAssertMenuShown(); AppMenu appMenu = mAppMenuHandler.getAppMenu(); @@ -90,12 +83,7 @@ } private void showAppMenuAndAssertMenuShown() { - ThreadUtils.runOnUiThread(new Runnable() { - @Override - public void run() { - mAppMenuHandler.showAppMenu(null, false); - } - }); + ThreadUtils.runOnUiThread((Runnable) () -> mAppMenuHandler.showAppMenu(null, false)); CriteriaHelper.pollUiThread(new Criteria("AppMenu did not show") { @Override public boolean isSatisfied() {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/DataSaverAppMenuTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/DataSaverAppMenuTest.java index 69f05afe..5be8175 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/DataSaverAppMenuTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/DataSaverAppMenuTest.java
@@ -62,14 +62,10 @@ @Before public void setUp() throws Exception { ChromeTabbedActivity.setAppMenuHandlerFactoryForTesting( - new ChromeTabbedActivity.AppMenuHandlerFactory() { - @Override - public AppMenuHandler get(Activity activity, AppMenuPropertiesDelegate delegate, - int menuResourceId) { - mAppMenuHandler = - new AppMenuHandlerForTest(activity, delegate, menuResourceId); - return mAppMenuHandler; - } + (activity, delegate, menuResourceId) -> { + mAppMenuHandler = + new AppMenuHandlerForTest(activity, delegate, menuResourceId); + return mAppMenuHandler; }); mActivityTestRule.startMainActivityOnBlankPage(); @@ -83,15 +79,12 @@ @CommandLineFlags.Add("disable-field-trial-config") @Feature({"Browser", "Main"}) public void testMenuDataSaverNoFeature() throws Throwable { - mActivityTestRule.runOnUiThread(new Runnable() { - @Override - public void run() { - ContextUtils.getAppSharedPreferences().edit().clear().apply(); - Assert.assertEquals(0, mAppMenuHandler.getDelegate().getFooterResourceId()); - DataReductionProxySettings.getInstance().setDataReductionProxyEnabled( - mActivityTestRule.getActivity().getApplicationContext(), true); - Assert.assertEquals(0, mAppMenuHandler.getDelegate().getFooterResourceId()); - } + mActivityTestRule.runOnUiThread((Runnable) () -> { + ContextUtils.getAppSharedPreferences().edit().clear().apply(); + Assert.assertEquals(0, mAppMenuHandler.getDelegate().getFooterResourceId()); + DataReductionProxySettings.getInstance().setDataReductionProxyEnabled( + mActivityTestRule.getActivity().getApplicationContext(), true); + Assert.assertEquals(0, mAppMenuHandler.getDelegate().getFooterResourceId()); }); } @@ -104,24 +97,21 @@ "disable-field-trial-config"}) @Feature({"Browser", "Main"}) public void testMenuDataSaver() throws Throwable { - mActivityTestRule.runOnUiThread(new Runnable() { - @Override - public void run() { - ContextUtils.getAppSharedPreferences().edit().clear().apply(); - // Data Saver hasn't been turned on, the footer shouldn't show. - Assert.assertEquals(0, mAppMenuHandler.getDelegate().getFooterResourceId()); + mActivityTestRule.runOnUiThread((Runnable) () -> { + ContextUtils.getAppSharedPreferences().edit().clear().apply(); + // Data Saver hasn't been turned on, the footer shouldn't show. + Assert.assertEquals(0, mAppMenuHandler.getDelegate().getFooterResourceId()); - // Turn Data Saver on, the footer should show. - DataReductionProxySettings.getInstance().setDataReductionProxyEnabled( - mActivityTestRule.getActivity().getApplicationContext(), true); - Assert.assertEquals(R.layout.data_reduction_main_menu_footer, - mAppMenuHandler.getDelegate().getFooterResourceId()); + // Turn Data Saver on, the footer should show. + DataReductionProxySettings.getInstance().setDataReductionProxyEnabled( + mActivityTestRule.getActivity().getApplicationContext(), true); + Assert.assertEquals(R.layout.data_reduction_main_menu_footer, + mAppMenuHandler.getDelegate().getFooterResourceId()); - // Ensure the footer is removed if the proxy is turned off. - DataReductionProxySettings.getInstance().setDataReductionProxyEnabled( - mActivityTestRule.getActivity().getApplicationContext(), false); - Assert.assertEquals(0, mAppMenuHandler.getDelegate().getFooterResourceId()); - } + // Ensure the footer is removed if the proxy is turned off. + DataReductionProxySettings.getInstance().setDataReductionProxyEnabled( + mActivityTestRule.getActivity().getApplicationContext(), false); + Assert.assertEquals(0, mAppMenuHandler.getDelegate().getFooterResourceId()); }); } @@ -138,25 +128,22 @@ "disable-field-trial-config"}) @Feature({"Browser", "Main"}) public void testMenuDataSaverPersistent() throws Throwable { - mActivityTestRule.runOnUiThread(new Runnable() { - @Override - public void run() { - ContextUtils.getAppSharedPreferences().edit().clear().apply(); - // Data Saver hasn't been turned on, the footer shouldn't show. - Assert.assertEquals(0, mAppMenuHandler.getDelegate().getFooterResourceId()); + mActivityTestRule.runOnUiThread((Runnable) () -> { + ContextUtils.getAppSharedPreferences().edit().clear().apply(); + // Data Saver hasn't been turned on, the footer shouldn't show. + Assert.assertEquals(0, mAppMenuHandler.getDelegate().getFooterResourceId()); - // Turn Data Saver on, the footer should show. - DataReductionProxySettings.getInstance().setDataReductionProxyEnabled( - mActivityTestRule.getActivity().getApplicationContext(), true); - Assert.assertEquals(R.layout.data_reduction_main_menu_footer, - mAppMenuHandler.getDelegate().getFooterResourceId()); + // Turn Data Saver on, the footer should show. + DataReductionProxySettings.getInstance().setDataReductionProxyEnabled( + mActivityTestRule.getActivity().getApplicationContext(), true); + Assert.assertEquals(R.layout.data_reduction_main_menu_footer, + mAppMenuHandler.getDelegate().getFooterResourceId()); - // Ensure the footer remains if the proxy is turned off. - DataReductionProxySettings.getInstance().setDataReductionProxyEnabled( - mActivityTestRule.getActivity().getApplicationContext(), false); - Assert.assertEquals(R.layout.data_reduction_main_menu_footer, - mAppMenuHandler.getDelegate().getFooterResourceId()); - } + // Ensure the footer remains if the proxy is turned off. + DataReductionProxySettings.getInstance().setDataReductionProxyEnabled( + mActivityTestRule.getActivity().getApplicationContext(), false); + Assert.assertEquals(R.layout.data_reduction_main_menu_footer, + mAppMenuHandler.getDelegate().getFooterResourceId()); }); } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillKeyboardAccessoryTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillKeyboardAccessoryTest.java index 6895523e..08afdb01 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillKeyboardAccessoryTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillKeyboardAccessoryTest.java
@@ -33,7 +33,6 @@ import org.chromium.content_public.browser.WebContents; import org.chromium.ui.UiUtils; -import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicReference; @@ -91,16 +90,13 @@ + "Doooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooe", "Acme Inc", "1 Main\nApt A", "CA", "San Francisco", "", "94102", "", "US", "(415) 999-0000", "jane@acme.inc", "en")); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mViewCoreRef.set(mActivityTestRule.getActivity().getCurrentContentViewCore()); - mWebContentsRef.set(mViewCoreRef.get().getWebContents()); - mContainerRef.set(mViewCoreRef.get().getContainerView()); - mKeyboardAccessoryRef.set(mActivityTestRule.getActivity() - .getWindowAndroid() - .getKeyboardAccessoryView()); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + mViewCoreRef.set(mActivityTestRule.getActivity().getCurrentContentViewCore()); + mWebContentsRef.set(mViewCoreRef.get().getWebContents()); + mContainerRef.set(mViewCoreRef.get().getContainerView()); + mKeyboardAccessoryRef.set(mActivityTestRule.getActivity() + .getWindowAndroid() + .getKeyboardAccessoryView()); }); DOMUtils.waitForNonZeroNodeBounds(mWebContentsRef.get(), "fn"); } @@ -116,12 +112,8 @@ loadTestPage(false); Assert.assertTrue("Keyboard accessory should be hidden.", ThreadUtils - .runOnUiThreadBlocking(new Callable<Boolean>() { - @Override - public Boolean call() { - return mKeyboardAccessoryRef.get().getVisibility() == View.GONE; - } - }) + .runOnUiThreadBlocking( + () -> mKeyboardAccessoryRef.get().getVisibility() == View.GONE) .booleanValue()); } @@ -144,12 +136,8 @@ }); Assert.assertTrue("Keyboard accessory should be showing.", ThreadUtils - .runOnUiThreadBlocking(new Callable<Boolean>() { - @Override - public Boolean call() { - return mKeyboardAccessoryRef.get().getVisibility() == View.VISIBLE; - } - }) + .runOnUiThreadBlocking( + () -> mKeyboardAccessoryRef.get().getVisibility() == View.VISIBLE) .booleanValue()); } @@ -170,12 +158,8 @@ mActivityTestRule.getActivity(), mContainerRef.get()); } }); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - ((HorizontalScrollView) mKeyboardAccessoryRef.get()).scrollTo(2000, 0); - } - }); + ThreadUtils.runOnUiThreadBlocking( + () -> ((HorizontalScrollView) mKeyboardAccessoryRef.get()).scrollTo(2000, 0)); CriteriaHelper.pollUiThread( new Criteria("First suggestion should be off the screen after manual scroll.") { @Override @@ -223,12 +207,8 @@ mActivityTestRule.getActivity(), mContainerRef.get()); } }); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - ((HorizontalScrollView) mKeyboardAccessoryRef.get()).scrollTo(0, 0); - } - }); + ThreadUtils.runOnUiThreadBlocking( + () -> ((HorizontalScrollView) mKeyboardAccessoryRef.get()).scrollTo(0, 0)); CriteriaHelper.pollUiThread( new Criteria("Last suggestion should be on the screen after manual scroll.") { @Override @@ -278,13 +258,10 @@ mActivityTestRule.getActivity(), mContainerRef.get()); } }); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - View suggestion = getSuggestionAt(0); - if (suggestion != null) { - suggestion.performClick(); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + View suggestion = getSuggestionAt(0); + if (suggestion != null) { + suggestion.performClick(); } }); CriteriaHelper.pollUiThread(new Criteria("Keyboard should be hidden.") { @@ -296,12 +273,8 @@ }); Assert.assertTrue("Keyboard accessory should be hidden.", ThreadUtils - .runOnUiThreadBlocking(new Callable<Boolean>() { - @Override - public Boolean call() { - return mKeyboardAccessoryRef.get().getVisibility() == View.GONE; - } - }) + .runOnUiThreadBlocking( + () -> mKeyboardAccessoryRef.get().getVisibility() == View.GONE) .booleanValue()); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillPopupTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillPopupTest.java index 9c4540d..a41275d 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillPopupTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillPopupTest.java
@@ -37,7 +37,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; @@ -141,12 +140,7 @@ public void setUp() throws Exception { mAutofillLoggedEntries = new ArrayList<AutofillLogger.LogEntry>(); AutofillLogger.setLoggerForTesting( - new AutofillLogger.Logger() { - @Override - public void didFillField(AutofillLogger.LogEntry logEntry) { - mAutofillLoggedEntries.add(logEntry); - } - } + logEntry -> mAutofillLoggedEntries.add(logEntry) ); } @@ -184,12 +178,7 @@ final ChromiumBaseInputConnection inputConnection = viewCore.getImeAdapterForTest().getInputConnectionForTest(); - inputConnection.getHandler().post(new Runnable() { - @Override - public void run() { - inputConnection.setComposingText(inputText, 1); - } - }); + inputConnection.getHandler().post(() -> inputConnection.setComposingText(inputText, 1)); waitForAnchorViewAdd(view); View anchorView = view.findViewById(R.id.dropdown_popup_window); @@ -317,12 +306,7 @@ private void waitForKeyboardShowRequest(final TestInputMethodManagerWrapper immw, final int count) { CriteriaHelper.pollUiThread( - Criteria.equals(count, new Callable<Integer>() { - @Override - public Integer call() { - return immw.getShowSoftInputCounter(); - } - })); + Criteria.equals(count, () -> immw.getShowSoftInputCounter())); } private void waitForAnchorViewAdd(final ViewGroup view) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillPopupWithKeyboardTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillPopupWithKeyboardTest.java index 448aa1cc..32ac0b8 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillPopupWithKeyboardTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillPopupWithKeyboardTest.java
@@ -31,7 +31,6 @@ import org.chromium.ui.R; import org.chromium.ui.UiUtils; -import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicReference; @@ -82,13 +81,10 @@ final AtomicReference<ContentViewCore> viewCoreRef = new AtomicReference<ContentViewCore>(); final AtomicReference<WebContents> webContentsRef = new AtomicReference<WebContents>(); final AtomicReference<ViewGroup> viewRef = new AtomicReference<ViewGroup>(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - viewCoreRef.set(mActivityTestRule.getActivity().getCurrentContentViewCore()); - webContentsRef.set(viewCoreRef.get().getWebContents()); - viewRef.set(viewCoreRef.get().getContainerView()); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + viewCoreRef.set(mActivityTestRule.getActivity().getCurrentContentViewCore()); + webContentsRef.set(viewCoreRef.get().getWebContents()); + viewRef.set(viewCoreRef.get().getContainerView()); }); DOMUtils.waitForNonZeroNodeBounds(webContentsRef.get(), "fn"); @@ -116,12 +112,8 @@ return viewRef.get().findViewById(R.id.dropdown_popup_window) != null; } }); - Object popupObject = ThreadUtils.runOnUiThreadBlocking(new Callable<Object>() { - @Override - public Object call() { - return viewRef.get().findViewById(R.id.dropdown_popup_window).getTag(); - } - }); + Object popupObject = ThreadUtils.runOnUiThreadBlocking( + () -> viewRef.get().findViewById(R.id.dropdown_popup_window).getTag()); Assert.assertTrue(popupObject instanceof AutofillPopup); final AutofillPopup popup = (AutofillPopup) popupObject; CriteriaHelper.pollUiThread(new Criteria("Autofill Popup was never shown.") {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillTest.java index 8a7d9e17..f8a44bce 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillTest.java
@@ -66,19 +66,16 @@ ViewAndroidDelegate.createBasicDelegate( activity.getCurrentContentViewCore().getContainerView()); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - View anchorView = viewDelegate.acquireView(); - viewDelegate.setViewPosition(anchorView, 50f, 500f, 500f, 500f, 1f, 10, 10); + ThreadUtils.runOnUiThreadBlocking(() -> { + View anchorView = viewDelegate.acquireView(); + viewDelegate.setViewPosition(anchorView, 50f, 500f, 500f, 500f, 1f, 10, 10); - mWindowAndroid = new ActivityWindowAndroid(activity); - mAutofillPopup = new AutofillPopup(activity, anchorView, mMockAutofillCallback); - mAutofillPopup.filterAndShow(new AutofillSuggestion[0], false /* isRtl */, - Color.TRANSPARENT /* backgroundColor */, - Color.TRANSPARENT /* dividerColor */, 0 /* dropdownItemHeight */, - 0 /* margin */); - } + mWindowAndroid = new ActivityWindowAndroid(activity); + mAutofillPopup = new AutofillPopup(activity, anchorView, mMockAutofillCallback); + mAutofillPopup.filterAndShow(new AutofillSuggestion[0], false /* isRtl */, + Color.TRANSPARENT /* backgroundColor */, + Color.TRANSPARENT /* dividerColor */, 0 /* dropdownItemHeight */, + 0 /* margin */); }); } @@ -143,15 +140,11 @@ } public void openAutofillPopupAndWaitUntilReady(final AutofillSuggestion[] suggestions) { - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mAutofillPopup.filterAndShow(suggestions, false /* isRtl */, + ThreadUtils.runOnUiThreadBlocking( + () -> mAutofillPopup.filterAndShow(suggestions, false /* isRtl */, Color.TRANSPARENT /* backgroundColor */, Color.TRANSPARENT /* dividerColor */, 0 /* dropdownItemHeight */, - 0 /* margin */); - } - }); + 0 /* margin */)); CriteriaHelper.pollInstrumentationThread(new Criteria() { @Override public boolean isSatisfied() {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillTestHelper.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillTestHelper.java index ef11eb9..ac32f3d 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillTestHelper.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillTestHelper.java
@@ -8,10 +8,8 @@ import org.chromium.base.test.util.CallbackHelper; import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile; import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard; -import org.chromium.chrome.browser.autofill.PersonalDataManager.PersonalDataManagerObserver; import java.util.List; -import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; @@ -28,40 +26,24 @@ } void setRequestTimeoutForTesting() { - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - PersonalDataManager.getInstance().setRequestTimeoutForTesting(0); - } - }); + ThreadUtils.runOnUiThreadBlocking( + () -> PersonalDataManager.getInstance().setRequestTimeoutForTesting(0)); } AutofillProfile getProfile(final String guid) throws ExecutionException { - return ThreadUtils.runOnUiThreadBlocking(new Callable<AutofillProfile>() { - @Override - public AutofillProfile call() { - return PersonalDataManager.getInstance().getProfile(guid); - } - }); + return ThreadUtils.runOnUiThreadBlocking( + () -> PersonalDataManager.getInstance().getProfile(guid)); } List<AutofillProfile> getProfilesToSuggest(final boolean includeNameInLabel) throws ExecutionException { - return ThreadUtils.runOnUiThreadBlocking(new Callable<List<AutofillProfile>>() { - @Override - public List<AutofillProfile> call() { - return PersonalDataManager.getInstance().getProfilesToSuggest(includeNameInLabel); - } - }); + return ThreadUtils.runOnUiThreadBlocking( + () -> PersonalDataManager.getInstance().getProfilesToSuggest(includeNameInLabel)); } List<AutofillProfile> getProfilesForSettings() throws ExecutionException { - return ThreadUtils.runOnUiThreadBlocking(new Callable<List<AutofillProfile>>() { - @Override - public List<AutofillProfile> call() { - return PersonalDataManager.getInstance().getProfilesForSettings(); - } - }); + return ThreadUtils.runOnUiThreadBlocking( + () -> PersonalDataManager.getInstance().getProfilesForSettings()); } int getNumberOfProfilesToSuggest() throws ExecutionException { @@ -75,52 +57,32 @@ public String setProfile(final AutofillProfile profile) throws InterruptedException, ExecutionException, TimeoutException { int callCount = mOnPersonalDataChangedHelper.getCallCount(); - String guid = ThreadUtils.runOnUiThreadBlocking(new Callable<String>() { - @Override - public String call() { - return PersonalDataManager.getInstance().setProfile(profile); - } - }); + String guid = ThreadUtils.runOnUiThreadBlocking( + () -> PersonalDataManager.getInstance().setProfile(profile)); mOnPersonalDataChangedHelper.waitForCallback(callCount); return guid; } public void deleteProfile(final String guid) throws InterruptedException, TimeoutException { int callCount = mOnPersonalDataChangedHelper.getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - PersonalDataManager.getInstance().deleteProfile(guid); - } - }); + ThreadUtils.runOnUiThreadBlocking( + () -> PersonalDataManager.getInstance().deleteProfile(guid)); mOnPersonalDataChangedHelper.waitForCallback(callCount); } public CreditCard getCreditCard(final String guid) throws ExecutionException { - return ThreadUtils.runOnUiThreadBlocking(new Callable<CreditCard>() { - @Override - public CreditCard call() { - return PersonalDataManager.getInstance().getCreditCard(guid); - } - }); + return ThreadUtils.runOnUiThreadBlocking( + () -> PersonalDataManager.getInstance().getCreditCard(guid)); } List<CreditCard> getCreditCardsToSuggest() throws ExecutionException { - return ThreadUtils.runOnUiThreadBlocking(new Callable<List<CreditCard>>() { - @Override - public List<CreditCard> call() { - return PersonalDataManager.getInstance().getCreditCardsToSuggest(); - } - }); + return ThreadUtils.runOnUiThreadBlocking( + () -> PersonalDataManager.getInstance().getCreditCardsToSuggest()); } List<CreditCard> getCreditCardsForSettings() throws ExecutionException { - return ThreadUtils.runOnUiThreadBlocking(new Callable<List<CreditCard>>() { - @Override - public List<CreditCard> call() { - return PersonalDataManager.getInstance().getCreditCardsForSettings(); - } - }); + return ThreadUtils.runOnUiThreadBlocking( + () -> PersonalDataManager.getInstance().getCreditCardsForSettings()); } int getNumberOfCreditCardsToSuggest() throws ExecutionException { @@ -134,12 +96,8 @@ public String setCreditCard(final CreditCard card) throws InterruptedException, ExecutionException, TimeoutException { int callCount = mOnPersonalDataChangedHelper.getCallCount(); - String guid = ThreadUtils.runOnUiThreadBlocking(new Callable<String>() { - @Override - public String call() { - return PersonalDataManager.getInstance().setCreditCard(card); - } - }); + String guid = ThreadUtils.runOnUiThreadBlocking( + () -> PersonalDataManager.getInstance().setCreditCard(card)); mOnPersonalDataChangedHelper.waitForCallback(callCount); return guid; } @@ -147,23 +105,15 @@ public void addServerCreditCard(final CreditCard card) throws InterruptedException, ExecutionException, TimeoutException { int callCount = mOnPersonalDataChangedHelper.getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - PersonalDataManager.getInstance().addServerCreditCardForTest(card); - } - }); + ThreadUtils.runOnUiThreadBlocking( + () -> PersonalDataManager.getInstance().addServerCreditCardForTest(card)); mOnPersonalDataChangedHelper.waitForCallback(callCount); } void deleteCreditCard(final String guid) throws InterruptedException, TimeoutException { int callCount = mOnPersonalDataChangedHelper.getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - PersonalDataManager.getInstance().deleteCreditCard(guid); - } - }); + ThreadUtils.runOnUiThreadBlocking( + () -> PersonalDataManager.getInstance().deleteCreditCard(guid)); mOnPersonalDataChangedHelper.waitForCallback(callCount); } @@ -176,12 +126,8 @@ */ void recordAndLogProfileUse(final String guid) throws InterruptedException, TimeoutException { int callCount = mOnPersonalDataChangedHelper.getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - PersonalDataManager.getInstance().recordAndLogProfileUse(guid); - } - }); + ThreadUtils.runOnUiThreadBlocking( + () -> PersonalDataManager.getInstance().recordAndLogProfileUse(guid)); mOnPersonalDataChangedHelper.waitForCallback(callCount); } @@ -199,12 +145,9 @@ public void setProfileUseStatsForTesting(final String guid, final int count, final long date) throws InterruptedException, TimeoutException { int callCount = mOnPersonalDataChangedHelper.getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - PersonalDataManager.getInstance().setProfileUseStatsForTesting(guid, count, date); - } - }); + ThreadUtils.runOnUiThreadBlocking( + () -> PersonalDataManager.getInstance().setProfileUseStatsForTesting(guid, count, + date)); mOnPersonalDataChangedHelper.waitForCallback(callCount); } @@ -216,12 +159,8 @@ */ public int getProfileUseCountForTesting(final String guid) throws InterruptedException, ExecutionException { - return ThreadUtils.runOnUiThreadBlocking(new Callable<Integer>() { - @Override - public Integer call() { - return PersonalDataManager.getInstance().getProfileUseCountForTesting(guid); - } - }); + return ThreadUtils.runOnUiThreadBlocking( + () -> PersonalDataManager.getInstance().getProfileUseCountForTesting(guid)); } /** @@ -234,12 +173,8 @@ */ public long getProfileUseDateForTesting(final String guid) throws InterruptedException, ExecutionException { - return ThreadUtils.runOnUiThreadBlocking(new Callable<Long>() { - @Override - public Long call() { - return PersonalDataManager.getInstance().getProfileUseDateForTesting(guid); - } - }); + return ThreadUtils.runOnUiThreadBlocking( + () -> PersonalDataManager.getInstance().getProfileUseDateForTesting(guid)); } /** @@ -252,12 +187,8 @@ public void recordAndLogCreditCardUse(final String guid) throws InterruptedException, TimeoutException { int callCount = mOnPersonalDataChangedHelper.getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - PersonalDataManager.getInstance().recordAndLogCreditCardUse(guid); - } - }); + ThreadUtils.runOnUiThreadBlocking( + () -> PersonalDataManager.getInstance().recordAndLogCreditCardUse(guid)); mOnPersonalDataChangedHelper.waitForCallback(callCount); } @@ -275,13 +206,9 @@ public void setCreditCardUseStatsForTesting(final String guid, final int count, final long date) throws InterruptedException, TimeoutException { int callCount = mOnPersonalDataChangedHelper.getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - PersonalDataManager.getInstance().setCreditCardUseStatsForTesting( - guid, count, date); - } - }); + ThreadUtils.runOnUiThreadBlocking( + () -> PersonalDataManager.getInstance().setCreditCardUseStatsForTesting( + guid, count, date)); mOnPersonalDataChangedHelper.waitForCallback(callCount); } @@ -293,12 +220,8 @@ */ public int getCreditCardUseCountForTesting(final String guid) throws InterruptedException, ExecutionException { - return ThreadUtils.runOnUiThreadBlocking(new Callable<Integer>() { - @Override - public Integer call() { - return PersonalDataManager.getInstance().getCreditCardUseCountForTesting(guid); - } - }); + return ThreadUtils.runOnUiThreadBlocking( + () -> PersonalDataManager.getInstance().getCreditCardUseCountForTesting(guid)); } /** @@ -311,12 +234,8 @@ */ public long getCreditCardUseDateForTesting(final String guid) throws InterruptedException, ExecutionException { - return ThreadUtils.runOnUiThreadBlocking(new Callable<Long>() { - @Override - public Long call() { - return PersonalDataManager.getInstance().getCreditCardUseDateForTesting(guid); - } - }); + return ThreadUtils.runOnUiThreadBlocking( + () -> PersonalDataManager.getInstance().getCreditCardUseDateForTesting(guid)); } /** @@ -327,29 +246,16 @@ * For more details see the comment header in time.h. */ public long getCurrentDateForTesting() throws InterruptedException, ExecutionException { - return ThreadUtils.runOnUiThreadBlocking(new Callable<Long>() { - @Override - public Long call() { - return PersonalDataManager.getInstance().getCurrentDateForTesting(); - } - }); + return ThreadUtils.runOnUiThreadBlocking( + () -> PersonalDataManager.getInstance().getCurrentDateForTesting()); } private void registerDataObserver() { try { int callCount = mOnPersonalDataChangedHelper.getCallCount(); - boolean isDataLoaded = ThreadUtils.runOnUiThreadBlocking(new Callable<Boolean>() { - @Override - public Boolean call() { - return PersonalDataManager.getInstance().registerDataObserver( - new PersonalDataManagerObserver() { - @Override - public void onPersonalDataChanged() { - mOnPersonalDataChangedHelper.notifyCalled(); - } - }); - } - }); + boolean isDataLoaded = ThreadUtils.runOnUiThreadBlocking( + () -> PersonalDataManager.getInstance().registerDataObserver( + () -> mOnPersonalDataChangedHelper.notifyCalled())); if (isDataLoaded) return; mOnPersonalDataChangedHelper.waitForCallback(callCount); } catch (TimeoutException | InterruptedException | ExecutionException e) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java index f9d50e2..b7e33118 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
@@ -3113,7 +3113,7 @@ @Test @SmallTest @Feature({"ContextualSearch"}) - public void testLongPressHidesFindInPageOverlay() throws Exception { + public void testTriggeringContextualSearchHidesFindInPageOverlay() throws Exception { MenuUtils.invokeCustomMenuActionSync(InstrumentationRegistry.getInstrumentation(), mActivityTestRule.getActivity(), R.id.find_in_page_id); @@ -3133,7 +3133,7 @@ View findToolbar = mActivityTestRule.getActivity().findViewById(R.id.find_toolbar); Assert.assertTrue(findToolbar.isShown()); - longPressNode("states"); + simulateTapSearch("search"); waitForPanelToPeek(); Assert.assertFalse(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/OmniboxTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/OmniboxTest.java index dc4da257..8539873 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/OmniboxTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/OmniboxTest.java
@@ -28,13 +28,13 @@ import org.chromium.base.ThreadUtils; import org.chromium.base.test.util.CommandLineFlags; -import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.EnormousTest; import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.MinAndroidSdkLevel; import org.chromium.base.test.util.RetryOnFailure; import org.chromium.base.test.util.ScalableTimeout; import org.chromium.base.test.util.parameter.CommandLineParameter; +import org.chromium.base.test.util.parameter.SkipCommandLineParameterization; import org.chromium.chrome.R; import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeFeatureList; @@ -597,8 +597,8 @@ * Test to verify that the security icon is present when visiting http:// URLs. */ @Test - //@MediumTest - @DisabledTest(message = "crbug.com/754723") + @MediumTest + @SkipCommandLineParameterization public void testSecurityIconOnHTTP() throws InterruptedException { EmbeddedTestServer testServer = EmbeddedTestServer.createAndStartServer( InstrumentationRegistry.getInstrumentation().getContext()); @@ -613,8 +613,15 @@ (LocationBarLayout) mActivityTestRule.getActivity().findViewById( R.id.location_bar); boolean securityIcon = locationBar.isSecurityButtonShown(); - Assert.assertFalse("Omnibox should not have a Security icon", securityIcon); - Assert.assertFalse(securityButton.isShown()); + if (DeviceFormFactor.isTablet()) { + Assert.assertTrue("Omnibox should have a Security icon", securityIcon); + Assert.assertTrue(securityButton.isShown()); + Assert.assertEquals( + R.drawable.omnibox_info, locationBar.getSecurityIconResourceId()); + } else { + Assert.assertFalse("Omnibox should not have a Security icon", securityIcon); + Assert.assertFalse(securityButton.isShown()); + } } finally { testServer.stopAndDestroyServer(); } @@ -625,6 +632,7 @@ */ @Test @MediumTest + @SkipCommandLineParameterization public void testSecurityIconOnHTTPS() throws InterruptedException { EmbeddedTestServer httpsTestServer = EmbeddedTestServer.createAndStartHTTPSServer( InstrumentationRegistry.getInstrumentation().getContext(), @@ -645,6 +653,8 @@ Assert.assertEquals("security_button with wrong resource-id", R.id.security_button, securityButton.getId()); Assert.assertTrue(securityButton.isShown()); + Assert.assertEquals( + R.drawable.omnibox_https_valid, locationBar.getSecurityIconResourceId()); } finally { httpsTestServer.stopAndDestroyServer(); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinderTest.java index f793e32..0318a131 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinderTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinderTest.java
@@ -1077,15 +1077,10 @@ } private void findApps(final Set<String> methodNames) throws Throwable { - mRule.runOnUiThread(new Runnable() { - @Override - public void run() { - AndroidPaymentAppFinder.find( - mRule.getActivity().getCurrentContentViewCore().getWebContents(), - methodNames, new PaymentManifestWebDataService(), mDownloader, mParser, - mPackageManager, AndroidPaymentAppFinderTest.this); - } - }); + mRule.runOnUiThread((Runnable) () -> AndroidPaymentAppFinder.find( + mRule.getActivity().getCurrentContentViewCore().getWebContents(), + methodNames, new PaymentManifestWebDataService(), mDownloader, mParser, + mPackageManager, AndroidPaymentAppFinderTest.this)); CriteriaHelper.pollInstrumentationThread(new Criteria() { @Override public boolean isSatisfied() {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentManifestDownloaderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentManifestDownloaderTest.java index 55868a9..592e8283 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentManifestDownloaderTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentManifestDownloaderTest.java
@@ -94,13 +94,10 @@ mRule.startMainActivityOnBlankPage(); mServer = EmbeddedTestServer.createAndStartServer( InstrumentationRegistry.getInstrumentation().getContext()); - mRule.runOnUiThread(new Runnable() { - @Override - public void run() { - mDownloader.initialize( - mRule.getActivity().getCurrentContentViewCore().getWebContents()); - mDownloader.allowHttpForTest(); - } + mRule.runOnUiThread((Runnable) () -> { + mDownloader.initialize( + mRule.getActivity().getCurrentContentViewCore().getWebContents()); + mDownloader.allowHttpForTest(); }); mDownloadComplete = false; mDownloadPaymentMethodManifestSuccess = false; @@ -112,12 +109,7 @@ @After public void tearDown() throws Throwable { - mRule.runOnUiThread(new Runnable() { - @Override - public void run() { - mDownloader.destroy(); - } - }); + mRule.runOnUiThread((Runnable) () -> mDownloader.destroy()); mServer.stopAndDestroyServer(); } @@ -126,12 +118,8 @@ public void testDownloadWebAppManifest() throws Throwable { final URI uri = new URI(mServer.getURL("/components/test/data/payments/bobpay.com/app.json")); - mRule.runOnUiThread(new Runnable() { - @Override - public void run() { - mDownloader.downloadWebAppManifest(uri, PaymentManifestDownloaderTest.this); - } - }); + mRule.runOnUiThread((Runnable) () -> mDownloader.downloadWebAppManifest(uri, + PaymentManifestDownloaderTest.this)); CriteriaHelper.pollInstrumentationThread(new Criteria() { @Override public boolean isSatisfied() { @@ -148,12 +136,8 @@ @Feature({"Payments"}) public void testUnableToDownloadWebAppManifest() throws Throwable { final URI uri = new URI(mServer.getURL("/no-such-app.json")); - mRule.runOnUiThread(new Runnable() { - @Override - public void run() { - mDownloader.downloadWebAppManifest(uri, PaymentManifestDownloaderTest.this); - } - }); + mRule.runOnUiThread((Runnable) () -> mDownloader.downloadWebAppManifest(uri, + PaymentManifestDownloaderTest.this)); CriteriaHelper.pollInstrumentationThread(new Criteria() { @Override public boolean isSatisfied() { @@ -168,12 +152,8 @@ @Feature({"Payments"}) public void testDownloadPaymentMethodManifest() throws Throwable { final URI uri = new URI(mServer.getURL("/components/test/data/payments/bobpay.com/webpay")); - mRule.runOnUiThread(new Runnable() { - @Override - public void run() { - mDownloader.downloadPaymentMethodManifest(uri, PaymentManifestDownloaderTest.this); - } - }); + mRule.runOnUiThread((Runnable) () -> mDownloader.downloadPaymentMethodManifest(uri, + PaymentManifestDownloaderTest.this)); CriteriaHelper.pollInstrumentationThread(new Criteria() { @Override public boolean isSatisfied() { @@ -190,12 +170,8 @@ @Feature({"Payments"}) public void testUnableToDownloadPaymentMethodManifest() throws Throwable { final URI uri = new URI(mServer.getURL("/no-such-payment-method-name")); - mRule.runOnUiThread(new Runnable() { - @Override - public void run() { - mDownloader.downloadPaymentMethodManifest(uri, PaymentManifestDownloaderTest.this); - } - }); + mRule.runOnUiThread((Runnable) () -> mDownloader.downloadPaymentMethodManifest(uri, + PaymentManifestDownloaderTest.this)); CriteriaHelper.pollInstrumentationThread(new Criteria() { @Override public boolean isSatisfied() { @@ -216,16 +192,13 @@ final URI webAppUri1 = new URI(mServer.getURL("/no-such-app.json")); final URI webAppUri2 = new URI(mServer.getURL("/components/test/data/payments/bobpay.com/app.json")); - mRule.runOnUiThread(new Runnable() { - @Override - public void run() { - mDownloader.downloadPaymentMethodManifest( - paymentMethodUri1, PaymentManifestDownloaderTest.this); - mDownloader.downloadPaymentMethodManifest( - paymentMethodUri2, PaymentManifestDownloaderTest.this); - mDownloader.downloadWebAppManifest(webAppUri1, PaymentManifestDownloaderTest.this); - mDownloader.downloadWebAppManifest(webAppUri2, PaymentManifestDownloaderTest.this); - } + mRule.runOnUiThread((Runnable) () -> { + mDownloader.downloadPaymentMethodManifest( + paymentMethodUri1, PaymentManifestDownloaderTest.this); + mDownloader.downloadPaymentMethodManifest( + paymentMethodUri2, PaymentManifestDownloaderTest.this); + mDownloader.downloadWebAppManifest(webAppUri1, PaymentManifestDownloaderTest.this); + mDownloader.downloadWebAppManifest(webAppUri2, PaymentManifestDownloaderTest.this); }); CriteriaHelper.pollInstrumentationThread(new Criteria() { @Override
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentManifestParserTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentManifestParserTest.java index 2e41989..4116aa2f 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentManifestParserTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentManifestParserTest.java
@@ -70,12 +70,7 @@ @Before public void setUp() throws Throwable { mRule.startMainActivityOnBlankPage(); - mRule.runOnUiThread(new Runnable() { - @Override - public void run() { - mParser.startUtilityProcess(); - } - }); + mRule.runOnUiThread((Runnable) () -> mParser.startUtilityProcess()); mWebAppManifestUris = null; mSupportedOrigins = null; mAllOriginsSupported = false; @@ -87,25 +82,15 @@ @After public void tearDown() throws Throwable { - mRule.runOnUiThread(new Runnable() { - @Override - public void run() { - mParser.stopUtilityProcess(); - } - }); + mRule.runOnUiThread((Runnable) () -> mParser.stopUtilityProcess()); } @Test @MediumTest @Feature({"Payments"}) public void testParseInvalidPaymentMethodManifest() throws Throwable { - mRule.runOnUiThread(new Runnable() { - @Override - public void run() { - mParser.parsePaymentMethodManifest( - "invalid payment method manifest", PaymentManifestParserTest.this); - } - }); + mRule.runOnUiThread((Runnable) () -> mParser.parsePaymentMethodManifest( + "invalid payment method manifest", PaymentManifestParserTest.this)); CriteriaHelper.pollInstrumentationThread(new Criteria() { @Override public boolean isSatisfied() { @@ -118,22 +103,17 @@ @MediumTest @Feature({"Payments"}) public void testParsePaymentMethodManifest() throws Throwable { - mRule.runOnUiThread(new Runnable() { - @Override - public void run() { - mParser.parsePaymentMethodManifest("{" - + " \"default_applications\": [" - + " \"https://bobpay.com/app.json\"," - + " \"https://alicepay.com/app.json\"" - + " ]," - + " \"supported_origins\": [" - + " \"https://charliepay.com\"," - + " \"https://evepay.com\"" - + " ]" - + "}", - PaymentManifestParserTest.this); - } - }); + mRule.runOnUiThread((Runnable) () -> mParser.parsePaymentMethodManifest("{" + + " \"default_applications\": [" + + " \"https://bobpay.com/app.json\"," + + " \"https://alicepay.com/app.json\"" + + " ]," + + " \"supported_origins\": [" + + " \"https://charliepay.com\"," + + " \"https://evepay.com\"" + + " ]" + + "}", + PaymentManifestParserTest.this)); CriteriaHelper.pollInstrumentationThread(new Criteria() { @Override public boolean isSatisfied() { @@ -155,13 +135,8 @@ @MediumTest @Feature({"Payments"}) public void testParsePaymentMethodManifestWithAllOriginsSupported() throws Throwable { - mRule.runOnUiThread(new Runnable() { - @Override - public void run() { - mParser.parsePaymentMethodManifest( - "{\"supported_origins\": \"*\"}", PaymentManifestParserTest.this); - } - }); + mRule.runOnUiThread((Runnable) () -> mParser.parsePaymentMethodManifest( + "{\"supported_origins\": \"*\"}", PaymentManifestParserTest.this)); CriteriaHelper.pollInstrumentationThread(new Criteria() { @Override public boolean isSatisfied() { @@ -179,13 +154,8 @@ @MediumTest @Feature({"Payments"}) public void testParseInvalidWebAppManifest() throws Throwable { - mRule.runOnUiThread(new Runnable() { - @Override - public void run() { - mParser.parseWebAppManifest( - "invalid web app manifest", PaymentManifestParserTest.this); - } - }); + mRule.runOnUiThread((Runnable) () -> mParser.parseWebAppManifest( + "invalid web app manifest", PaymentManifestParserTest.this)); CriteriaHelper.pollInstrumentationThread(new Criteria() { @Override public boolean isSatisfied() { @@ -198,26 +168,21 @@ @MediumTest @Feature({"Payments"}) public void testParseWebAppManifest() throws Throwable { - mRule.runOnUiThread(new Runnable() { - @Override - public void run() { - mParser.parseWebAppManifest("{" - + " \"related_applications\": [{" - + " \"platform\": \"play\", " - + " \"id\": \"com.bobpay.app\", " - + " \"min_version\": \"1\", " - + " \"fingerprints\": [{" - + " \"type\": \"sha256_cert\", " - + " \"value\": \"" - + "00:01:02:03:04:05:06:07:08:09:" - + "A0:A1:A2:A3:A4:A5:A6:A7:A8:A9:" - + "B0:B1:B2:B3:B4:B5:B6:B7:B8:B9:C0:C1\"" - + " }]" - + " }]" - + "}", - PaymentManifestParserTest.this); - } - }); + mRule.runOnUiThread((Runnable) () -> mParser.parseWebAppManifest("{" + + " \"related_applications\": [{" + + " \"platform\": \"play\", " + + " \"id\": \"com.bobpay.app\", " + + " \"min_version\": \"1\", " + + " \"fingerprints\": [{" + + " \"type\": \"sha256_cert\", " + + " \"value\": \"" + + "00:01:02:03:04:05:06:07:08:09:" + + "A0:A1:A2:A3:A4:A5:A6:A7:A8:A9:" + + "B0:B1:B2:B3:B4:B5:B6:B7:B8:B9:C0:C1\"" + + " }]" + + " }]" + + "}", + PaymentManifestParserTest.this)); CriteriaHelper.pollInstrumentationThread(new Criteria() { @Override public boolean isSatisfied() {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentMetricsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentMetricsTest.java index d79613c8..4f020bf 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentMetricsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentMetricsTest.java
@@ -68,17 +68,15 @@ // Press the back button. int callCount = mPaymentRequestTestRule.getDismissed().getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mPaymentRequestTestRule.getPaymentRequestUI().getDialogForTest().onBackPressed(); - } - }); + ThreadUtils.runOnUiThreadBlocking( + () -> mPaymentRequestTestRule.getPaymentRequestUI().getDialogForTest() + .onBackPressed()); mPaymentRequestTestRule.getDismissed().waitForCallback(callCount); mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"}); // Make sure the canMakePayment events were logged correctly. - int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.CAN_MAKE_PAYMENT_FALSE; + int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.CAN_MAKE_PAYMENT_FALSE + | Event.REQUEST_METHOD_BASIC_CARD | Event.REQUEST_METHOD_OTHER; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample)); @@ -118,7 +116,8 @@ // Make sure the canMakePayment events were logged correctly. int expectedSample = Event.SHOWN | Event.PAY_CLICKED | Event.RECEIVED_INSTRUMENT_DETAILS - | Event.COMPLETED | Event.CAN_MAKE_PAYMENT_FALSE; + | Event.COMPLETED | Event.CAN_MAKE_PAYMENT_FALSE | Event.REQUEST_METHOD_BASIC_CARD + | Event.REQUEST_METHOD_OTHER; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample)); @@ -147,7 +146,8 @@ // Make sure the canMakePayment events were logged correctly. int expectedSample = Event.SHOWN | Event.OTHER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT - | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.CAN_MAKE_PAYMENT_TRUE; + | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.CAN_MAKE_PAYMENT_TRUE + | Event.REQUEST_METHOD_BASIC_CARD | Event.REQUEST_METHOD_OTHER; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample)); @@ -175,7 +175,8 @@ // Make sure the canMakePayment events were logged correctly. int expectedSample = Event.SHOWN | Event.PAY_CLICKED | Event.RECEIVED_INSTRUMENT_DETAILS | Event.COMPLETED | Event.HAD_INITIAL_FORM_OF_PAYMENT - | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.CAN_MAKE_PAYMENT_TRUE; + | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.CAN_MAKE_PAYMENT_TRUE + | Event.REQUEST_METHOD_BASIC_CARD | Event.REQUEST_METHOD_OTHER; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample)); @@ -196,17 +197,15 @@ // Press the back button. int callCount = mPaymentRequestTestRule.getDismissed().getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mPaymentRequestTestRule.getPaymentRequestUI().getDialogForTest().onBackPressed(); - } - }); + ThreadUtils.runOnUiThreadBlocking( + () -> mPaymentRequestTestRule.getPaymentRequestUI().getDialogForTest() + .onBackPressed()); mPaymentRequestTestRule.getDismissed().waitForCallback(callCount); mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"}); // Make sure no canMakePayment events were logged. - int expectedSample = Event.SHOWN | Event.USER_ABORTED; + int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.REQUEST_METHOD_BASIC_CARD + | Event.REQUEST_METHOD_OTHER; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample)); @@ -233,7 +232,8 @@ // Make sure no canMakePayment events were logged. int expectedSample = Event.SHOWN | Event.PAY_CLICKED | Event.RECEIVED_INSTRUMENT_DETAILS | Event.COMPLETED | Event.HAD_INITIAL_FORM_OF_PAYMENT - | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS; + | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_METHOD_BASIC_CARD + | Event.REQUEST_METHOD_OTHER; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCardEditorAutoAdvanceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCardEditorAutoAdvanceTest.java index 54bf1ae..1c138d5 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCardEditorAutoAdvanceTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCardEditorAutoAdvanceTest.java
@@ -87,12 +87,7 @@ Assert.assertTrue(mPaymentRequestTestRule.getCardEditorFocusedView() != focusedChildView); // Request focus to card number field after auto advancing above. - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - focusedChildView.requestFocus(); - } - }); + ThreadUtils.runOnUiThreadBlocking((Runnable) () -> focusedChildView.requestFocus()); mPaymentRequestTestRule.setTextInCardEditorAndWait( new String[] {"3056 9309 0259 041"}, mPaymentRequestTestRule.getEditorTextUpdate()); Assert.assertTrue(mPaymentRequestTestRule.getCardEditorFocusedView() == focusedChildView); @@ -127,12 +122,7 @@ Assert.assertTrue(mPaymentRequestTestRule.getCardEditorFocusedView() != focusedChildView); // Request focus to card number field after auto advancing above. - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - focusedChildView.requestFocus(); - } - }); + ThreadUtils.runOnUiThreadBlocking((Runnable) () -> focusedChildView.requestFocus()); mPaymentRequestTestRule.setTextInCardEditorAndWait(new String[] {"3782 822463 10005 1"}, mPaymentRequestTestRule.getEditorTextUpdate()); Assert.assertTrue(mPaymentRequestTestRule.getCardEditorFocusedView() == focusedChildView); @@ -177,12 +167,7 @@ Assert.assertTrue(mPaymentRequestTestRule.getCardEditorFocusedView() != focusedChildView); // Request focus to card number field after auto advancing above. - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - focusedChildView.requestFocus(); - } - }); + ThreadUtils.runOnUiThreadBlocking((Runnable) () -> focusedChildView.requestFocus()); mPaymentRequestTestRule.setTextInCardEditorAndWait(new String[] {"4012 8888 8888 1881 1"}, mPaymentRequestTestRule.getEditorTextUpdate()); Assert.assertTrue(mPaymentRequestTestRule.getCardEditorFocusedView() == focusedChildView); @@ -226,12 +211,7 @@ Assert.assertTrue(mPaymentRequestTestRule.getCardEditorFocusedView() != focusedChildView); // Request focus to card number field after auto advancing above. - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - focusedChildView.requestFocus(); - } - }); + ThreadUtils.runOnUiThreadBlocking((Runnable) () -> focusedChildView.requestFocus()); mPaymentRequestTestRule.setTextInCardEditorAndWait( new String[] {"6212 3456 7890 0000 0031"}, mPaymentRequestTestRule.getEditorTextUpdate());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsAndFreeShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsAndFreeShippingTest.java index a2138b2..ed619fff 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsAndFreeShippingTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsAndFreeShippingTest.java
@@ -103,7 +103,8 @@ int expectedSample = Event.SHOWN | Event.PAY_CLICKED | Event.RECEIVED_INSTRUMENT_DETAILS | Event.COMPLETED | Event.HAD_INITIAL_FORM_OF_PAYMENT | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_PAYER_PHONE - | Event.REQUEST_PAYER_EMAIL | Event.REQUEST_PAYER_NAME | Event.REQUEST_SHIPPING; + | Event.REQUEST_PAYER_EMAIL | Event.REQUEST_PAYER_NAME | Event.REQUEST_SHIPPING + | Event.REQUEST_METHOD_BASIC_CARD | Event.REQUEST_METHOD_OTHER; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsTest.java index df69312..210f44f1 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsTest.java
@@ -143,18 +143,15 @@ // Quickly press on "add contact info" and then [X]. int callCount = mPaymentRequestTestRule.getReadyToEdit().getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mPaymentRequestTestRule.getPaymentRequestUI() - .getContactDetailsSectionForTest() - .findViewById(R.id.payments_add_option_button) - .performClick(); - mPaymentRequestTestRule.getPaymentRequestUI() - .getDialogForTest() - .findViewById(R.id.close_button) - .performClick(); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + mPaymentRequestTestRule.getPaymentRequestUI() + .getContactDetailsSectionForTest() + .findViewById(R.id.payments_add_option_button) + .performClick(); + mPaymentRequestTestRule.getPaymentRequestUI() + .getDialogForTest() + .findViewById(R.id.close_button) + .performClick(); }); mPaymentRequestTestRule.getReadyToEdit().waitForCallback(callCount); @@ -177,18 +174,15 @@ // Quickly press on [X] and then "add contact info." int callCount = mPaymentRequestTestRule.getDismissed().getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mPaymentRequestTestRule.getPaymentRequestUI() - .getDialogForTest() - .findViewById(R.id.close_button) - .performClick(); - mPaymentRequestTestRule.getPaymentRequestUI() - .getContactDetailsSectionForTest() - .findViewById(R.id.payments_add_option_button) - .performClick(); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + mPaymentRequestTestRule.getPaymentRequestUI() + .getDialogForTest() + .findViewById(R.id.close_button) + .performClick(); + mPaymentRequestTestRule.getPaymentRequestUI() + .getContactDetailsSectionForTest() + .findViewById(R.id.payments_add_option_button) + .performClick(); }); mPaymentRequestTestRule.getDismissed().waitForCallback(callCount); @@ -249,18 +243,15 @@ // Quickly press on "add contact info" and then "cancel." int callCount = mPaymentRequestTestRule.getReadyToEdit().getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mPaymentRequestTestRule.getPaymentRequestUI() - .getContactDetailsSectionForTest() - .findViewById(R.id.payments_add_option_button) - .performClick(); - mPaymentRequestTestRule.getPaymentRequestUI() - .getDialogForTest() - .findViewById(R.id.button_secondary) - .performClick(); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + mPaymentRequestTestRule.getPaymentRequestUI() + .getContactDetailsSectionForTest() + .findViewById(R.id.payments_add_option_button) + .performClick(); + mPaymentRequestTestRule.getPaymentRequestUI() + .getDialogForTest() + .findViewById(R.id.button_secondary) + .performClick(); }); mPaymentRequestTestRule.getReadyToEdit().waitForCallback(callCount); @@ -283,18 +274,15 @@ // Quickly press on "cancel" and then "add contact info." int callCount = mPaymentRequestTestRule.getDismissed().getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mPaymentRequestTestRule.getPaymentRequestUI() - .getDialogForTest() - .findViewById(R.id.button_secondary) - .performClick(); - mPaymentRequestTestRule.getPaymentRequestUI() - .getContactDetailsSectionForTest() - .findViewById(R.id.payments_add_option_button) - .performClick(); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + mPaymentRequestTestRule.getPaymentRequestUI() + .getDialogForTest() + .findViewById(R.id.button_secondary) + .performClick(); + mPaymentRequestTestRule.getPaymentRequestUI() + .getContactDetailsSectionForTest() + .findViewById(R.id.payments_add_option_button) + .performClick(); }); mPaymentRequestTestRule.getDismissed().waitForCallback(callCount); @@ -335,7 +323,8 @@ int expectedSample = Event.SHOWN | Event.COMPLETED | Event.PAY_CLICKED | Event.HAD_INITIAL_FORM_OF_PAYMENT | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.RECEIVED_INSTRUMENT_DETAILS | Event.REQUEST_PAYER_EMAIL - | Event.REQUEST_PAYER_PHONE | Event.REQUEST_PAYER_NAME; + | Event.REQUEST_PAYER_PHONE | Event.REQUEST_PAYER_NAME + | Event.REQUEST_METHOD_BASIC_CARD | Event.REQUEST_METHOD_OTHER; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDynamicShippingSingleAddressTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDynamicShippingSingleAddressTest.java index a8cca016..3a60612 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDynamicShippingSingleAddressTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDynamicShippingSingleAddressTest.java
@@ -229,18 +229,15 @@ // Quickly press "add address" and then [X]. int callCount = mPaymentRequestTestRule.getReadyToEdit().getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mPaymentRequestTestRule.getPaymentRequestUI() - .getShippingAddressSectionForTest() - .findViewById(R.id.payments_add_option_button) - .performClick(); - mPaymentRequestTestRule.getPaymentRequestUI() - .getDialogForTest() - .findViewById(R.id.close_button) - .performClick(); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + mPaymentRequestTestRule.getPaymentRequestUI() + .getShippingAddressSectionForTest() + .findViewById(R.id.payments_add_option_button) + .performClick(); + mPaymentRequestTestRule.getPaymentRequestUI() + .getDialogForTest() + .findViewById(R.id.close_button) + .performClick(); }); mPaymentRequestTestRule.getReadyToEdit().waitForCallback(callCount); @@ -263,18 +260,15 @@ // Quickly press [X] and then "add address." int callCount = mPaymentRequestTestRule.getDismissed().getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mPaymentRequestTestRule.getPaymentRequestUI() - .getDialogForTest() - .findViewById(R.id.close_button) - .performClick(); - mPaymentRequestTestRule.getPaymentRequestUI() - .getShippingAddressSectionForTest() - .findViewById(R.id.payments_add_option_button) - .performClick(); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + mPaymentRequestTestRule.getPaymentRequestUI() + .getDialogForTest() + .findViewById(R.id.close_button) + .performClick(); + mPaymentRequestTestRule.getPaymentRequestUI() + .getShippingAddressSectionForTest() + .findViewById(R.id.payments_add_option_button) + .performClick(); }); mPaymentRequestTestRule.getDismissed().waitForCallback(callCount); @@ -293,18 +287,15 @@ // Quickly press "add address" and then "cancel." int callCount = mPaymentRequestTestRule.getReadyToEdit().getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mPaymentRequestTestRule.getPaymentRequestUI() - .getShippingAddressSectionForTest() - .findViewById(R.id.payments_add_option_button) - .performClick(); - mPaymentRequestTestRule.getPaymentRequestUI() - .getDialogForTest() - .findViewById(R.id.button_secondary) - .performClick(); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + mPaymentRequestTestRule.getPaymentRequestUI() + .getShippingAddressSectionForTest() + .findViewById(R.id.payments_add_option_button) + .performClick(); + mPaymentRequestTestRule.getPaymentRequestUI() + .getDialogForTest() + .findViewById(R.id.button_secondary) + .performClick(); }); mPaymentRequestTestRule.getReadyToEdit().waitForCallback(callCount); @@ -327,18 +318,15 @@ // Quickly press on "cancel" and then "add address." int callCount = mPaymentRequestTestRule.getDismissed().getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mPaymentRequestTestRule.getPaymentRequestUI() - .getDialogForTest() - .findViewById(R.id.button_secondary) - .performClick(); - mPaymentRequestTestRule.getPaymentRequestUI() - .getShippingAddressSectionForTest() - .findViewById(R.id.payments_add_option_button) - .performClick(); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + mPaymentRequestTestRule.getPaymentRequestUI() + .getDialogForTest() + .findViewById(R.id.button_secondary) + .performClick(); + mPaymentRequestTestRule.getPaymentRequestUI() + .getShippingAddressSectionForTest() + .findViewById(R.id.payments_add_option_button) + .performClick(); }); mPaymentRequestTestRule.getDismissed().waitForCallback(callCount);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndFreeShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndFreeShippingTest.java index ea2454771..d356eaa 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndFreeShippingTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndFreeShippingTest.java
@@ -89,7 +89,7 @@ int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_PAYER_EMAIL - | Event.REQUEST_SHIPPING; + | Event.REQUEST_SHIPPING | Event.REQUEST_METHOD_BASIC_CARD; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndPhoneTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndPhoneTest.java index 3a07cee..9d991b6 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndPhoneTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndPhoneTest.java
@@ -161,7 +161,8 @@ int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_PAYER_EMAIL - | Event.REQUEST_PAYER_PHONE; + | Event.REQUEST_PAYER_PHONE | Event.REQUEST_METHOD_BASIC_CARD + | Event.REQUEST_METHOD_OTHER; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailTest.java index 275e152..4fc1a0b 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailTest.java
@@ -159,7 +159,8 @@ int expectedSample = Event.SHOWN | Event.COMPLETED | Event.PAY_CLICKED | Event.HAD_INITIAL_FORM_OF_PAYMENT | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS - | Event.RECEIVED_INSTRUMENT_DETAILS | Event.REQUEST_PAYER_EMAIL; + | Event.RECEIVED_INSTRUMENT_DETAILS | Event.REQUEST_PAYER_EMAIL + | Event.REQUEST_METHOD_BASIC_CARD | Event.REQUEST_METHOD_OTHER; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestFreeShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestFreeShippingTest.java index 0973925..2677700 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestFreeShippingTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestFreeShippingTest.java
@@ -169,18 +169,15 @@ // Quickly press on "add address" and then [X]. int callCount = mPaymentRequestTestRule.getReadyToEdit().getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mPaymentRequestTestRule.getPaymentRequestUI() - .getShippingAddressSectionForTest() - .findViewById(R.id.payments_add_option_button) - .performClick(); - mPaymentRequestTestRule.getPaymentRequestUI() - .getDialogForTest() - .findViewById(R.id.close_button) - .performClick(); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + mPaymentRequestTestRule.getPaymentRequestUI() + .getShippingAddressSectionForTest() + .findViewById(R.id.payments_add_option_button) + .performClick(); + mPaymentRequestTestRule.getPaymentRequestUI() + .getDialogForTest() + .findViewById(R.id.close_button) + .performClick(); }); mPaymentRequestTestRule.getReadyToEdit().waitForCallback(callCount); @@ -203,18 +200,15 @@ // Quickly press on [X] and then "add address." int callCount = mPaymentRequestTestRule.getDismissed().getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mPaymentRequestTestRule.getPaymentRequestUI() - .getDialogForTest() - .findViewById(R.id.close_button) - .performClick(); - mPaymentRequestTestRule.getPaymentRequestUI() - .getShippingAddressSectionForTest() - .findViewById(R.id.payments_add_option_button) - .performClick(); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + mPaymentRequestTestRule.getPaymentRequestUI() + .getDialogForTest() + .findViewById(R.id.close_button) + .performClick(); + mPaymentRequestTestRule.getPaymentRequestUI() + .getShippingAddressSectionForTest() + .findViewById(R.id.payments_add_option_button) + .performClick(); }); mPaymentRequestTestRule.getDismissed().waitForCallback(callCount); @@ -234,18 +228,15 @@ // Quickly press on "add address" and then "cancel." int callCount = mPaymentRequestTestRule.getReadyToEdit().getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mPaymentRequestTestRule.getPaymentRequestUI() - .getShippingAddressSectionForTest() - .findViewById(R.id.payments_add_option_button) - .performClick(); - mPaymentRequestTestRule.getPaymentRequestUI() - .getDialogForTest() - .findViewById(R.id.button_secondary) - .performClick(); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + mPaymentRequestTestRule.getPaymentRequestUI() + .getShippingAddressSectionForTest() + .findViewById(R.id.payments_add_option_button) + .performClick(); + mPaymentRequestTestRule.getPaymentRequestUI() + .getDialogForTest() + .findViewById(R.id.button_secondary) + .performClick(); }); mPaymentRequestTestRule.getReadyToEdit().waitForCallback(callCount); @@ -268,18 +259,15 @@ // Quickly press on "cancel" and then "add address." int callCount = mPaymentRequestTestRule.getDismissed().getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mPaymentRequestTestRule.getPaymentRequestUI() - .getDialogForTest() - .findViewById(R.id.button_secondary) - .performClick(); - mPaymentRequestTestRule.getPaymentRequestUI() - .getShippingAddressSectionForTest() - .findViewById(R.id.payments_add_option_button) - .performClick(); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + mPaymentRequestTestRule.getPaymentRequestUI() + .getDialogForTest() + .findViewById(R.id.button_secondary) + .performClick(); + mPaymentRequestTestRule.getPaymentRequestUI() + .getShippingAddressSectionForTest() + .findViewById(R.id.payments_add_option_button) + .performClick(); }); mPaymentRequestTestRule.getDismissed().waitForCallback(callCount); @@ -302,7 +290,8 @@ mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"}); int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT - | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING; + | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING + | Event.REQUEST_METHOD_BASIC_CARD; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestJourneyLoggerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestJourneyLoggerTest.java index 774b983..d901f34 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestJourneyLoggerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestJourneyLoggerTest.java
@@ -578,7 +578,8 @@ // Make sure the events were logged correctly. int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT - | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING; + | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING + | Event.REQUEST_METHOD_BASIC_CARD; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample)); @@ -611,7 +612,7 @@ // Make sure the events were logged correctly. int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT - | Event.REQUEST_SHIPPING; + | Event.REQUEST_SHIPPING | Event.REQUEST_METHOD_BASIC_CARD; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample)); @@ -644,7 +645,7 @@ // Make sure the events were logged correctly. int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT - | Event.REQUEST_SHIPPING; + | Event.REQUEST_SHIPPING | Event.REQUEST_METHOD_BASIC_CARD; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample)); @@ -676,7 +677,8 @@ mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"}); // Make sure the events were logged correctly. - int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.REQUEST_SHIPPING; + int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.REQUEST_SHIPPING + | Event.REQUEST_METHOD_BASIC_CARD; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample)); @@ -706,7 +708,8 @@ mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"}); // Make sure the events were logged correctly. - int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.REQUEST_SHIPPING; + int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.REQUEST_SHIPPING + | Event.REQUEST_METHOD_BASIC_CARD; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample)); @@ -736,7 +739,8 @@ mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"}); // Make sure the events were logged correctly. - int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.REQUEST_SHIPPING; + int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.REQUEST_SHIPPING + | Event.REQUEST_METHOD_BASIC_CARD | Event.REQUEST_METHOD_OTHER; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample)); @@ -767,7 +771,8 @@ // Make sure the events were logged correctly. int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT - | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING; + | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING + | Event.REQUEST_METHOD_BASIC_CARD | Event.REQUEST_METHOD_OTHER; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample)); @@ -800,7 +805,8 @@ // Make sure the events were logged correctly. int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT - | Event.REQUEST_SHIPPING; + | Event.REQUEST_SHIPPING | Event.REQUEST_METHOD_BASIC_CARD + | Event.REQUEST_METHOD_OTHER; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample)); @@ -834,7 +840,8 @@ // Make sure the events were logged correctly. int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT - | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING; + | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING + | Event.REQUEST_METHOD_BASIC_CARD | Event.REQUEST_METHOD_OTHER; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample)); @@ -866,7 +873,8 @@ // Make sure the events were logged correctly. int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT - | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING; + | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING + | Event.REQUEST_METHOD_BASIC_CARD | Event.REQUEST_METHOD_OTHER; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample)); @@ -901,7 +909,8 @@ // Make sure the events were logged correctly. int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT - | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING; + | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING + | Event.REQUEST_METHOD_BASIC_CARD | Event.REQUEST_METHOD_OTHER; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample)); @@ -930,7 +939,8 @@ mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"}); // Make sure the events were logged correctly. - int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.REQUEST_SHIPPING; + int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.REQUEST_SHIPPING + | Event.REQUEST_METHOD_BASIC_CARD | Event.REQUEST_METHOD_OTHER; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample)); @@ -1030,10 +1040,20 @@ Assert.assertEquals(2, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.NumberOfSelectionEdits.ShippingAddress.Completed", 0)); + + // Make sure the events were logged correctly. + int expectedSample = Event.SHOWN | Event.COMPLETED | Event.REQUEST_SHIPPING + | Event.REQUEST_METHOD_BASIC_CARD | Event.HAD_INITIAL_FORM_OF_PAYMENT + | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.RECEIVED_INSTRUMENT_DETAILS + | Event.PAY_CLICKED; + Assert.assertEquals(2, + RecordHistogram.getHistogramValueCountForTesting( + "PaymentRequest.Events", expectedSample)); } /** - * Expect that no journey metrics are logged if the payment request was not shown to the user. + * Expect that only some journey metrics are logged if the payment request was not shown to the + * user. */ @Test @MediumTest
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMetricsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMetricsTest.java index 1021786e..ccfea79 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMetricsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMetricsTest.java
@@ -90,7 +90,8 @@ // Make sure the events were logged correctly. int expectedSample = Event.SHOWN | Event.PAY_CLICKED | Event.RECEIVED_INSTRUMENT_DETAILS | Event.COMPLETED | Event.HAD_INITIAL_FORM_OF_PAYMENT - | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING; + | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING + | Event.REQUEST_METHOD_BASIC_CARD; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample)); @@ -112,15 +113,11 @@ // Cancel the Payment Request. int callCount = mPaymentRequestTestRule.getDismissed().getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mPaymentRequestTestRule.getPaymentRequestUI() + ThreadUtils.runOnUiThreadBlocking( + (Runnable) () -> mPaymentRequestTestRule.getPaymentRequestUI() .getDialogForTest() .findViewById(R.id.button_secondary) - .performClick(); - } - }); + .performClick()); mPaymentRequestTestRule.getDismissed().waitForCallback(callCount); mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"}); @@ -128,7 +125,8 @@ // Make sure the events were logged correctly. int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT - | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING; + | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING + | Event.REQUEST_METHOD_BASIC_CARD; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample)); @@ -157,7 +155,8 @@ // Make sure the events were logged correctly. int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT - | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING; + | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING + | Event.REQUEST_METHOD_BASIC_CARD; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample)); @@ -179,12 +178,9 @@ // Press the back button. int callCount = mPaymentRequestTestRule.getDismissed().getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mPaymentRequestTestRule.getPaymentRequestUI().getDialogForTest().onBackPressed(); - } - }); + ThreadUtils.runOnUiThreadBlocking( + () -> mPaymentRequestTestRule.getPaymentRequestUI().getDialogForTest() + .onBackPressed()); mPaymentRequestTestRule.getDismissed().waitForCallback(callCount); mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"}); @@ -192,7 +188,8 @@ // Make sure the events were logged correctly. int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT - | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING; + | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING + | Event.REQUEST_METHOD_BASIC_CARD; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample)); @@ -221,7 +218,8 @@ // Make sure the events were logged correctly. int expectedSample = Event.SHOWN | Event.OTHER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT - | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING; + | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING + | Event.REQUEST_METHOD_BASIC_CARD; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample)); @@ -248,7 +246,8 @@ // Make sure the events were logged correctly. int expectedSample = Event.SHOWN | Event.OTHER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT - | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING; + | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING + | Event.REQUEST_METHOD_BASIC_CARD; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample)); @@ -382,7 +381,8 @@ // Make sure the events were logged correctly. int expectedSample = Event.SKIPPED_SHOW | Event.PAY_CLICKED | Event.RECEIVED_INSTRUMENT_DETAILS | Event.COMPLETED - | Event.HAD_INITIAL_FORM_OF_PAYMENT | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS; + | Event.HAD_INITIAL_FORM_OF_PAYMENT | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS + | Event.REQUEST_METHOD_GOOGLE; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample)); @@ -412,7 +412,7 @@ // Make sure the events were logged correctly. int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT - | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS; + | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_METHOD_GOOGLE; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample)); @@ -447,9 +447,12 @@ R.id.close_button, mPaymentRequestTestRule.getDismissed()); mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"}); - // Make sure only one set of events was logged. - Assert.assertEquals( - 1, RecordHistogram.getHistogramTotalCountForTesting("PaymentRequest.Events")); + // Make sure the events were logged correctly. + int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT + | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_METHOD_BASIC_CARD; + Assert.assertEquals(1, + RecordHistogram.getHistogramValueCountForTesting( + "PaymentRequest.Events", expectedSample)); } /**
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameAndFreeShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameAndFreeShippingTest.java index 7bd2ab2..bfe8611 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameAndFreeShippingTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameAndFreeShippingTest.java
@@ -89,7 +89,7 @@ int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING - | Event.REQUEST_PAYER_NAME; + | Event.REQUEST_PAYER_NAME | Event.REQUEST_METHOD_BASIC_CARD; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameTest.java index 469b9ed8..ed0c70f0a 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameTest.java
@@ -171,7 +171,8 @@ int expectedSample = Event.SHOWN | Event.PAY_CLICKED | Event.RECEIVED_INSTRUMENT_DETAILS | Event.COMPLETED | Event.HAD_INITIAL_FORM_OF_PAYMENT - | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_PAYER_NAME; + | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_PAYER_NAME + | Event.REQUEST_METHOD_BASIC_CARD; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoShippingTest.java index 6c55b0db..4c5e7463bd 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoShippingTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoShippingTest.java
@@ -283,18 +283,15 @@ // Quickly press on "add card" and then [X]. int callCount = mPaymentRequestTestRule.getReadyToEdit().getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mPaymentRequestTestRule.getPaymentRequestUI() - .getPaymentMethodSectionForTest() - .findViewById(R.id.payments_add_option_button) - .performClick(); - mPaymentRequestTestRule.getPaymentRequestUI() - .getDialogForTest() - .findViewById(R.id.close_button) - .performClick(); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + mPaymentRequestTestRule.getPaymentRequestUI() + .getPaymentMethodSectionForTest() + .findViewById(R.id.payments_add_option_button) + .performClick(); + mPaymentRequestTestRule.getPaymentRequestUI() + .getDialogForTest() + .findViewById(R.id.close_button) + .performClick(); }); mPaymentRequestTestRule.getReadyToEdit().waitForCallback(callCount); @@ -317,18 +314,15 @@ // Quickly press on [X] and then "add card." int callCount = mPaymentRequestTestRule.getDismissed().getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mPaymentRequestTestRule.getPaymentRequestUI() - .getDialogForTest() - .findViewById(R.id.close_button) - .performClick(); - mPaymentRequestTestRule.getPaymentRequestUI() - .getPaymentMethodSectionForTest() - .findViewById(R.id.payments_add_option_button) - .performClick(); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + mPaymentRequestTestRule.getPaymentRequestUI() + .getDialogForTest() + .findViewById(R.id.close_button) + .performClick(); + mPaymentRequestTestRule.getPaymentRequestUI() + .getPaymentMethodSectionForTest() + .findViewById(R.id.payments_add_option_button) + .performClick(); }); mPaymentRequestTestRule.getDismissed().waitForCallback(callCount); @@ -347,18 +341,15 @@ // Quickly press on "add card" and then "cancel." int callCount = mPaymentRequestTestRule.getReadyToEdit().getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mPaymentRequestTestRule.getPaymentRequestUI() - .getPaymentMethodSectionForTest() - .findViewById(R.id.payments_add_option_button) - .performClick(); - mPaymentRequestTestRule.getPaymentRequestUI() - .getDialogForTest() - .findViewById(R.id.button_secondary) - .performClick(); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + mPaymentRequestTestRule.getPaymentRequestUI() + .getPaymentMethodSectionForTest() + .findViewById(R.id.payments_add_option_button) + .performClick(); + mPaymentRequestTestRule.getPaymentRequestUI() + .getDialogForTest() + .findViewById(R.id.button_secondary) + .performClick(); }); mPaymentRequestTestRule.getReadyToEdit().waitForCallback(callCount); @@ -381,18 +372,15 @@ // Quickly press on "cancel" and then "add card." int callCount = mPaymentRequestTestRule.getDismissed().getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mPaymentRequestTestRule.getPaymentRequestUI() - .getDialogForTest() - .findViewById(R.id.button_secondary) - .performClick(); - mPaymentRequestTestRule.getPaymentRequestUI() - .getPaymentMethodSectionForTest() - .findViewById(R.id.payments_add_option_button) - .performClick(); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + mPaymentRequestTestRule.getPaymentRequestUI() + .getDialogForTest() + .findViewById(R.id.button_secondary) + .performClick(); + mPaymentRequestTestRule.getPaymentRequestUI() + .getPaymentMethodSectionForTest() + .findViewById(R.id.payments_add_option_button) + .performClick(); }); mPaymentRequestTestRule.getDismissed().waitForCallback(callCount); @@ -412,15 +400,12 @@ // Quickly dismiss and then press on "pay." int callCount = mPaymentRequestTestRule.getDismissed().getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mPaymentRequestTestRule.getPaymentRequestUI().getDialogForTest().onBackPressed(); - mPaymentRequestTestRule.getPaymentRequestUI() - .getDialogForTest() - .findViewById(R.id.button_primary) - .performClick(); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + mPaymentRequestTestRule.getPaymentRequestUI().getDialogForTest().onBackPressed(); + mPaymentRequestTestRule.getPaymentRequestUI() + .getDialogForTest() + .findViewById(R.id.button_primary) + .performClick(); }); mPaymentRequestTestRule.getDismissed().waitForCallback(callCount); @@ -440,15 +425,12 @@ // Quickly dismiss and then press on [X]. int callCount = mPaymentRequestTestRule.getDismissed().getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mPaymentRequestTestRule.getPaymentRequestUI().getDialogForTest().onBackPressed(); - mPaymentRequestTestRule.getPaymentRequestUI() - .getDialogForTest() - .findViewById(R.id.close_button) - .performClick(); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + mPaymentRequestTestRule.getPaymentRequestUI().getDialogForTest().onBackPressed(); + mPaymentRequestTestRule.getPaymentRequestUI() + .getDialogForTest() + .findViewById(R.id.close_button) + .performClick(); }); mPaymentRequestTestRule.getDismissed().waitForCallback(callCount); @@ -468,15 +450,12 @@ // Quickly press on [X] and then dismiss. int callCount = mPaymentRequestTestRule.getDismissed().getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mPaymentRequestTestRule.getPaymentRequestUI() - .getDialogForTest() - .findViewById(R.id.close_button) - .performClick(); - mPaymentRequestTestRule.getPaymentRequestUI().getDialogForTest().onBackPressed(); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + mPaymentRequestTestRule.getPaymentRequestUI() + .getDialogForTest() + .findViewById(R.id.close_button) + .performClick(); + mPaymentRequestTestRule.getPaymentRequestUI().getDialogForTest().onBackPressed(); }); mPaymentRequestTestRule.getDismissed().waitForCallback(callCount); @@ -500,7 +479,7 @@ mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"}); int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT - | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS; + | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_METHOD_BASIC_CARD; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppTest.java index 556da561..afa071a 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppTest.java
@@ -21,14 +21,10 @@ import org.chromium.base.test.util.Feature; import org.chromium.chrome.R; import org.chromium.chrome.browser.ChromeSwitches; -import org.chromium.chrome.browser.payments.PaymentAppFactory.PaymentAppCreatedCallback; -import org.chromium.chrome.browser.payments.PaymentAppFactory.PaymentAppFactoryAddition; import org.chromium.chrome.browser.payments.PaymentRequestTestCommon.TestPay; import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; -import org.chromium.content_public.browser.WebContents; -import java.util.Set; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; @@ -96,23 +92,15 @@ public void testPaymentWithInstrumentsAppResponseAfterDismissShouldNotCrash() throws InterruptedException, ExecutionException, TimeoutException { final TestPay app = new TestPay("https://bobpay.com", HAVE_INSTRUMENTS, IMMEDIATE_RESPONSE); - PaymentAppFactory.getInstance().addAdditionalFactory(new PaymentAppFactoryAddition() { - @Override - public void create(WebContents webContents, Set<String> methodNames, - PaymentAppFactory.PaymentAppCreatedCallback callback) { - callback.onPaymentAppCreated(app); - callback.onAllPaymentAppsCreated(); - } - }); + PaymentAppFactory.getInstance().addAdditionalFactory( + (webContents, methodNames, callback) -> { + callback.onPaymentAppCreated(app); + callback.onAllPaymentAppsCreated(); + }); mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickAndWait( R.id.close_button, mPaymentRequestTestRule.getDismissed()); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - app.respond(); - } - }); + ThreadUtils.runOnUiThreadBlocking(() -> app.respond()); mPaymentRequestTestRule.expectResultContains( new String[] {"show() rejected", "Request cancelled"}); } @@ -126,21 +114,13 @@ public void testPaymentAppNoInstrumentsResponseAfterDismissShouldNotCrash() throws InterruptedException, ExecutionException, TimeoutException { final TestPay app = new TestPay("https://bobpay.com", NO_INSTRUMENTS, IMMEDIATE_RESPONSE); - PaymentAppFactory.getInstance().addAdditionalFactory(new PaymentAppFactoryAddition() { - @Override - public void create(WebContents webContents, Set<String> methodNames, - PaymentAppCreatedCallback callback) { - callback.onPaymentAppCreated(app); - callback.onAllPaymentAppsCreated(); - } - }); + PaymentAppFactory.getInstance().addAdditionalFactory( + (webContents, methodNames, callback) -> { + callback.onPaymentAppCreated(app); + callback.onAllPaymentAppsCreated(); + }); mPaymentRequestTestRule.openPageAndClickBuyAndWait(mPaymentRequestTestRule.getShowFailed()); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - app.respond(); - } - }); + ThreadUtils.runOnUiThreadBlocking(() -> app.respond()); mPaymentRequestTestRule.expectResultContains( new String[] {"show() rejected", "The payment method is not supported"}); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppsSortingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppsSortingTest.java index 54ea441..61e2038 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppsSortingTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppsSortingTest.java
@@ -22,15 +22,11 @@ import org.chromium.chrome.browser.autofill.CardType; import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile; import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard; -import org.chromium.chrome.browser.payments.PaymentAppFactory.PaymentAppCreatedCallback; -import org.chromium.chrome.browser.payments.PaymentAppFactory.PaymentAppFactoryAddition; import org.chromium.chrome.browser.payments.PaymentRequestTestCommon.TestPay; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; -import org.chromium.content_public.browser.WebContents; -import java.util.Set; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; @@ -72,16 +68,13 @@ new TestPay("https://bobpay.com", HAVE_INSTRUMENTS, IMMEDIATE_RESPONSE); final TestPay appC = new TestPay("https://charliepay.com", HAVE_INSTRUMENTS, IMMEDIATE_RESPONSE); - PaymentAppFactory.getInstance().addAdditionalFactory(new PaymentAppFactoryAddition() { - @Override - public void create(WebContents webContents, Set<String> methodNames, - PaymentAppCreatedCallback callback) { - callback.onPaymentAppCreated(appA); - callback.onPaymentAppCreated(appB); - callback.onPaymentAppCreated(appC); - callback.onAllPaymentAppsCreated(); - } - }); + PaymentAppFactory.getInstance().addAdditionalFactory( + (webContents, methodNames, callback) -> { + callback.onPaymentAppCreated(appA); + callback.onPaymentAppCreated(appB); + callback.onPaymentAppCreated(appC); + callback.onAllPaymentAppsCreated(); + }); String alicePayId = appA.getAppIdentifier() + "https://alicepay.com"; String bobPayId = appB.getAppIdentifier() + "https://bobpay.com"; String charliePayId = appC.getAppIdentifier() + "https://charliepay.com";
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneAndFreeShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneAndFreeShippingTest.java index 1fe1867..de300066e 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneAndFreeShippingTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneAndFreeShippingTest.java
@@ -96,7 +96,7 @@ int expectedSample = Event.SHOWN | Event.PAY_CLICKED | Event.RECEIVED_INSTRUMENT_DETAILS | Event.COMPLETED | Event.HAD_INITIAL_FORM_OF_PAYMENT | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_PAYER_PHONE - | Event.REQUEST_SHIPPING; + | Event.REQUEST_SHIPPING | Event.REQUEST_METHOD_BASIC_CARD; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneTest.java index a49b0384..cee5599 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneTest.java
@@ -158,7 +158,8 @@ mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"}); int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT - | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_PAYER_PHONE; + | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_PAYER_PHONE + | Event.REQUEST_METHOD_BASIC_CARD | Event.REQUEST_METHOD_OTHER; Assert.assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( "PaymentRequest.Events", expectedSample));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServiceWorkerPaymentAppTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServiceWorkerPaymentAppTest.java index 97b9a03..59addaa9 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServiceWorkerPaymentAppTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServiceWorkerPaymentAppTest.java
@@ -15,9 +15,7 @@ import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; -import org.chromium.content_public.browser.WebContents; -import java.util.Set; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; @@ -41,19 +39,15 @@ */ private void installMockServiceWorkerPaymentApp(final boolean hasSupportedMethods) { PaymentAppFactory.getInstance().addAdditionalFactory( - new PaymentAppFactory.PaymentAppFactoryAddition() { - @Override - public void create(WebContents webContents, Set<String> methodNames, - PaymentAppFactory.PaymentAppCreatedCallback callback) { - String[] supportedMethodNames = {"https://bobpay.com", "basic-card"}; - callback.onPaymentAppCreated(new ServiceWorkerPaymentApp(webContents, - 0 /* registrationId */, "BobPay" /* label */, - "https://bobpay.com" /* sublabel */, null /* icon */, - hasSupportedMethods ? supportedMethodNames - : new String[0] /* methodNames */, - new String[0] /* preferredRelatedApplicationIds */)); - callback.onAllPaymentAppsCreated(); - } + (webContents, methodNames, callback) -> { + String[] supportedMethodNames = {"https://bobpay.com", "basic-card"}; + callback.onPaymentAppCreated(new ServiceWorkerPaymentApp(webContents, + 0 /* registrationId */, "BobPay" /* label */, + "https://bobpay.com" /* sublabel */, null /* icon */, + hasSupportedMethods ? supportedMethodNames + : new String[0] /* methodNames */, + new String[0] /* preferredRelatedApplicationIds */)); + callback.onAllPaymentAppsCreated(); }); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTabTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTabTest.java index b51c625e..3dae6f24 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTabTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTabTest.java
@@ -66,13 +66,10 @@ throws InterruptedException, ExecutionException, TimeoutException { mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); Assert.assertEquals(0, mPaymentRequestTestRule.getDismissed().getCallCount()); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mPaymentRequestTestRule.getActivity().getTabCreator(false).createNewTab( - new LoadUrlParams("about:blank"), TabLaunchType.FROM_CHROME_UI, null); - } - }); + ThreadUtils.runOnUiThreadBlocking( + (Runnable) () -> mPaymentRequestTestRule.getActivity().getTabCreator( + false).createNewTab( + new LoadUrlParams("about:blank"), TabLaunchType.FROM_CHROME_UI, null)); mPaymentRequestTestRule.getDismissed().waitForCallback(0); } @@ -86,12 +83,9 @@ throws InterruptedException, ExecutionException, TimeoutException { mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); Assert.assertEquals(0, mPaymentRequestTestRule.getDismissed().getCallCount()); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - TabModel currentModel = mPaymentRequestTestRule.getActivity().getCurrentTabModel(); - TabModelUtils.closeCurrentTab(currentModel); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + TabModel currentModel = mPaymentRequestTestRule.getActivity().getCurrentTabModel(); + TabModelUtils.closeCurrentTab(currentModel); }); mPaymentRequestTestRule.getDismissed().waitForCallback(0); } @@ -104,12 +98,9 @@ throws InterruptedException, ExecutionException, TimeoutException { mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); Assert.assertEquals(0, mPaymentRequestTestRule.getDismissed().getCallCount()); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - TabModel currentModel = mPaymentRequestTestRule.getActivity().getCurrentTabModel(); - TabModelUtils.getCurrentTab(currentModel).loadUrl(new LoadUrlParams("about:blank")); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + TabModel currentModel = mPaymentRequestTestRule.getActivity().getCurrentTabModel(); + TabModelUtils.getCurrentTab(currentModel).loadUrl(new LoadUrlParams("about:blank")); }); mPaymentRequestTestRule.getDismissed().waitForCallback(0); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestCommon.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestCommon.java index 112218e..7e2d48ae 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestCommon.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestCommon.java
@@ -23,7 +23,6 @@ import org.chromium.chrome.browser.ChromeTabbedActivity; import org.chromium.chrome.browser.autofill.CardUnmaskPrompt; import org.chromium.chrome.browser.autofill.CardUnmaskPrompt.CardUnmaskObserverForTest; -import org.chromium.chrome.browser.payments.PaymentAppFactory.PaymentAppFactoryAddition; import org.chromium.chrome.browser.payments.PaymentRequestImpl.PaymentRequestServiceObserverForTest; import org.chromium.chrome.browser.payments.ui.EditorTextField; import org.chromium.chrome.browser.payments.ui.PaymentRequestSection.OptionSection; @@ -141,15 +140,12 @@ private void openPage() throws InterruptedException, ExecutionException, TimeoutException { mCallback.onMainActivityStarted(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mViewCoreRef.set(mCallback.getActivity().getCurrentContentViewCore()); - mWebContentsRef.set(mViewCoreRef.get().getWebContents()); - PaymentRequestUI.setObserverForTest(PaymentRequestTestCommon.this); - PaymentRequestImpl.setObserverForTest(PaymentRequestTestCommon.this); - CardUnmaskPrompt.setObserverForTest(PaymentRequestTestCommon.this); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + mViewCoreRef.set(mCallback.getActivity().getCurrentContentViewCore()); + mWebContentsRef.set(mViewCoreRef.get().getWebContents()); + PaymentRequestUI.setObserverForTest(PaymentRequestTestCommon.this); + PaymentRequestImpl.setObserverForTest(PaymentRequestTestCommon.this); + CardUnmaskPrompt.setObserverForTest(PaymentRequestTestCommon.this); }); mCallback.assertWaitForPageScaleFactorMatch(1); } @@ -200,86 +196,62 @@ protected void clickAndWait(final int resourceId, CallbackHelper helper) throws InterruptedException, TimeoutException { int callCount = helper.getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mUI.getDialogForTest().findViewById(resourceId).performClick(); - } - }); + ThreadUtils.runOnUiThreadBlocking( + (Runnable) () -> mUI.getDialogForTest().findViewById(resourceId).performClick()); helper.waitForCallback(callCount); } protected void clickInShippingAddressAndWait(final int resourceId, CallbackHelper helper) throws InterruptedException, TimeoutException { int callCount = helper.getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mUI.getShippingAddressSectionForTest().findViewById(resourceId).performClick(); - } - }); + ThreadUtils.runOnUiThreadBlocking( + (Runnable) () -> mUI.getShippingAddressSectionForTest().findViewById( + resourceId).performClick()); helper.waitForCallback(callCount); } protected void clickInPaymentMethodAndWait(final int resourceId, CallbackHelper helper) throws InterruptedException, TimeoutException { int callCount = helper.getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mUI.getPaymentMethodSectionForTest().findViewById(resourceId).performClick(); - } - }); + ThreadUtils.runOnUiThreadBlocking( + (Runnable) () -> mUI.getPaymentMethodSectionForTest().findViewById( + resourceId).performClick()); helper.waitForCallback(callCount); } protected void clickInContactInfoAndWait(final int resourceId, CallbackHelper helper) throws InterruptedException, TimeoutException { int callCount = helper.getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mUI.getContactDetailsSectionForTest().findViewById(resourceId).performClick(); - } - }); + ThreadUtils.runOnUiThreadBlocking( + (Runnable) () -> mUI.getContactDetailsSectionForTest().findViewById( + resourceId).performClick()); helper.waitForCallback(callCount); } protected void clickInCardEditorAndWait(final int resourceId, CallbackHelper helper) throws InterruptedException, TimeoutException { int callCount = helper.getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mUI.getCardEditorDialog().findViewById(resourceId).performClick(); - } - }); + ThreadUtils.runOnUiThreadBlocking( + (Runnable) () -> mUI.getCardEditorDialog().findViewById(resourceId).performClick()); helper.waitForCallback(callCount); } protected void clickInEditorAndWait(final int resourceId, CallbackHelper helper) throws InterruptedException, TimeoutException { int callCount = helper.getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mUI.getEditorDialog().findViewById(resourceId).performClick(); - } - }); + ThreadUtils.runOnUiThreadBlocking( + (Runnable) () -> mUI.getEditorDialog().findViewById(resourceId).performClick()); helper.waitForCallback(callCount); } protected void clickAndroidBackButtonInEditorAndWait(CallbackHelper helper) throws InterruptedException, TimeoutException { int callCount = helper.getCallCount(); - ThreadUtils.runOnUiThread(new Runnable() { - @Override - public void run() { - mUI.getEditorDialog().dispatchKeyEvent( - new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK)); - mUI.getEditorDialog().dispatchKeyEvent( - new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK)); - } + ThreadUtils.runOnUiThread(() -> { + mUI.getEditorDialog().dispatchKeyEvent( + new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK)); + mUI.getEditorDialog().dispatchKeyEvent( + new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK)); }); helper.waitForCallback(callCount); } @@ -287,152 +259,98 @@ protected void clickCardUnmaskButtonAndWait(final int dialogButtonId, CallbackHelper helper) throws InterruptedException, TimeoutException { int callCount = helper.getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mCardUnmaskPrompt.getDialogForTest().getButton(dialogButtonId).performClick(); - } - }); + ThreadUtils.runOnUiThreadBlocking( + (Runnable) () -> mCardUnmaskPrompt.getDialogForTest().getButton( + dialogButtonId).performClick()); helper.waitForCallback(callCount); } protected int getShippingAddressSectionButtonState() throws ExecutionException { - return ThreadUtils.runOnUiThreadBlocking(new Callable<Integer>() { - @Override - public Integer call() { - return mUI.getShippingAddressSectionForTest().getEditButtonState(); - } - }); + return ThreadUtils.runOnUiThreadBlocking( + () -> mUI.getShippingAddressSectionForTest().getEditButtonState()); } protected int getContactDetailsButtonState() throws ExecutionException { - return ThreadUtils.runOnUiThreadBlocking(new Callable<Integer>() { - @Override - public Integer call() { - return mUI.getContactDetailsSectionForTest().getEditButtonState(); - } - }); + return ThreadUtils.runOnUiThreadBlocking( + () -> mUI.getContactDetailsSectionForTest().getEditButtonState()); } protected String getPaymentInstrumentLabel(final int index) throws ExecutionException { - return ThreadUtils.runOnUiThreadBlocking(new Callable<String>() { - @Override - public String call() { - return ((OptionSection) mUI.getPaymentMethodSectionForTest()) + return ThreadUtils.runOnUiThreadBlocking( + () -> ((OptionSection) mUI.getPaymentMethodSectionForTest()) .getOptionLabelsForTest(index) .getText() - .toString(); - } - }); + .toString()); } protected String getSelectedPaymentInstrumentLabel() throws ExecutionException { - return ThreadUtils.runOnUiThreadBlocking(new Callable<String>() { - @Override - public String call() { - OptionSection section = ((OptionSection) mUI.getPaymentMethodSectionForTest()); - int size = section.getNumberOfOptionLabelsForTest(); - for (int i = 0; i < size; i++) { - if (section.getOptionRowAtIndex(i).isChecked()) { - return section.getOptionRowAtIndex(i).getLabelText().toString(); - } + return ThreadUtils.runOnUiThreadBlocking(() -> { + OptionSection section = ((OptionSection) mUI.getPaymentMethodSectionForTest()); + int size = section.getNumberOfOptionLabelsForTest(); + for (int i = 0; i < size; i++) { + if (section.getOptionRowAtIndex(i).isChecked()) { + return section.getOptionRowAtIndex(i).getLabelText().toString(); } - return null; } + return null; }); } protected String getOrderSummaryTotal() throws ExecutionException { - return ThreadUtils.runOnUiThreadBlocking(new Callable<String>() { - @Override - public String call() { - return mUI.getOrderSummaryTotalTextViewForTest().getText().toString(); - } - }); + return ThreadUtils.runOnUiThreadBlocking( + () -> mUI.getOrderSummaryTotalTextViewForTest().getText().toString()); } protected String getContactDetailsSuggestionLabel(final int suggestionIndex) throws ExecutionException { - return ThreadUtils.runOnUiThreadBlocking(new Callable<String>() { - @Override - public String call() { - return ((OptionSection) mUI.getContactDetailsSectionForTest()) + return ThreadUtils.runOnUiThreadBlocking( + () -> ((OptionSection) mUI.getContactDetailsSectionForTest()) .getOptionLabelsForTest(suggestionIndex) .getText() - .toString(); - } - }); + .toString()); } protected int getNumberOfPaymentInstruments() throws ExecutionException { - return ThreadUtils.runOnUiThreadBlocking(new Callable<Integer>() { - @Override - public Integer call() { - return ((OptionSection) mUI.getPaymentMethodSectionForTest()) - .getNumberOfOptionLabelsForTest(); - } - }); + return ThreadUtils.runOnUiThreadBlocking( + () -> ((OptionSection) mUI.getPaymentMethodSectionForTest()) + .getNumberOfOptionLabelsForTest()); } protected int getNumberOfContactDetailSuggestions() throws ExecutionException { - return ThreadUtils.runOnUiThreadBlocking(new Callable<Integer>() { - @Override - public Integer call() { - return ((OptionSection) mUI.getContactDetailsSectionForTest()) - .getNumberOfOptionLabelsForTest(); - } - }); + return ThreadUtils.runOnUiThreadBlocking( + () -> ((OptionSection) mUI.getContactDetailsSectionForTest()) + .getNumberOfOptionLabelsForTest()); } protected String getShippingAddressSuggestionLabel(final int suggestionIndex) throws ExecutionException { Assert.assertTrue(suggestionIndex < getNumberOfShippingAddressSuggestions()); - return ThreadUtils.runOnUiThreadBlocking(new Callable<String>() { - @Override - public String call() { - return mUI.getShippingAddressSectionForTest() - .getOptionLabelsForTest(suggestionIndex) - .getText() - .toString(); - } - }); + return ThreadUtils.runOnUiThreadBlocking(() -> mUI.getShippingAddressSectionForTest() + .getOptionLabelsForTest(suggestionIndex) + .getText() + .toString()); } protected String getShippingAddressSummary() throws ExecutionException { - return ThreadUtils.runOnUiThreadBlocking(new Callable<String>() { - @Override - public String call() { - return mUI.getShippingAddressSectionForTest() - .getLeftSummaryLabelForTest() - .getText() - .toString(); - } - }); + return ThreadUtils.runOnUiThreadBlocking(() -> mUI.getShippingAddressSectionForTest() + .getLeftSummaryLabelForTest() + .getText() + .toString()); } protected String getShippingOptionSummary() throws ExecutionException { - return ThreadUtils.runOnUiThreadBlocking(new Callable<String>() { - @Override - public String call() { - return mUI.getShippingOptionSectionForTest() - .getLeftSummaryLabelForTest() - .getText() - .toString(); - } - }); + return ThreadUtils.runOnUiThreadBlocking(() -> mUI.getShippingOptionSectionForTest() + .getLeftSummaryLabelForTest() + .getText() + .toString()); } protected String getShippingOptionCostSummaryOnBottomSheet() throws ExecutionException { - return ThreadUtils.runOnUiThreadBlocking(new Callable<String>() { - @Override - public String call() { - return mUI.getShippingOptionSectionForTest() - .getRightSummaryLabelForTest() - .getText() - .toString(); - } - }); + return ThreadUtils.runOnUiThreadBlocking(() -> mUI.getShippingOptionSectionForTest() + .getRightSummaryLabelForTest() + .getText() + .toString()); } protected View getCardEditorFocusedView() { @@ -445,14 +363,10 @@ Assert.assertTrue(suggestionIndex < getNumberOfShippingAddressSuggestions()); int callCount = helper.getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - ((OptionSection) mUI.getShippingAddressSectionForTest()) + ThreadUtils.runOnUiThreadBlocking( + (Runnable) () -> ((OptionSection) mUI.getShippingAddressSectionForTest()) .getOptionLabelsForTest(suggestionIndex) - .performClick(); - } - }); + .performClick()); helper.waitForCallback(callCount); } @@ -462,14 +376,10 @@ Assert.assertTrue(suggestionIndex < getNumberOfPaymentInstruments()); int callCount = helper.getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - ((OptionSection) mUI.getPaymentMethodSectionForTest()) + ThreadUtils.runOnUiThreadBlocking( + (Runnable) () -> ((OptionSection) mUI.getPaymentMethodSectionForTest()) .getOptionLabelsForTest(suggestionIndex) - .performClick(); - } - }); + .performClick()); helper.waitForCallback(callCount); } @@ -479,14 +389,10 @@ Assert.assertTrue(suggestionIndex < getNumberOfContactDetailSuggestions()); int callCount = helper.getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - ((OptionSection) mUI.getContactDetailsSectionForTest()) + ThreadUtils.runOnUiThreadBlocking( + (Runnable) () -> ((OptionSection) mUI.getContactDetailsSectionForTest()) .getOptionLabelsForTest(suggestionIndex) - .performClick(); - } - }); + .performClick()); helper.waitForCallback(callCount); } @@ -496,78 +402,51 @@ Assert.assertTrue(suggestionIndex < getNumberOfPaymentInstruments()); int callCount = helper.getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - ((OptionSection) mUI.getPaymentMethodSectionForTest()) + ThreadUtils.runOnUiThreadBlocking( + (Runnable) () -> ((OptionSection) mUI.getPaymentMethodSectionForTest()) .getOptionRowAtIndex(suggestionIndex) .getEditIconForTest() - .performClick(); - } - }); + .performClick()); helper.waitForCallback(callCount); } protected int getNumberOfShippingAddressSuggestions() throws ExecutionException { - return ThreadUtils.runOnUiThreadBlocking(new Callable<Integer>() { - @Override - public Integer call() { - return ((OptionSection) mUI.getShippingAddressSectionForTest()) - .getNumberOfOptionLabelsForTest(); - } - }); + return ThreadUtils.runOnUiThreadBlocking( + () -> ((OptionSection) mUI.getShippingAddressSectionForTest()) + .getNumberOfOptionLabelsForTest()); } protected OptionRow getShippingAddressOptionRowAtIndex(final int index) throws ExecutionException { - return ThreadUtils.runOnUiThreadBlocking(new Callable<OptionRow>() { - @Override - public OptionRow call() { - return ((OptionSection) mUI.getShippingAddressSectionForTest()) - .getOptionRowAtIndex(index); - } - }); + return ThreadUtils.runOnUiThreadBlocking( + () -> ((OptionSection) mUI.getShippingAddressSectionForTest()) + .getOptionRowAtIndex(index)); } protected String getSpinnerSelectionTextInCardEditor(final int dropdownIndex) throws ExecutionException { - return ThreadUtils.runOnUiThreadBlocking(new Callable<String>() { - @Override - public String call() { - return mUI.getCardEditorDialog() - .getDropdownFieldsForTest() - .get(dropdownIndex) - .getSelectedItem() - .toString(); - } - }); + return ThreadUtils.runOnUiThreadBlocking(() -> mUI.getCardEditorDialog() + .getDropdownFieldsForTest() + .get(dropdownIndex) + .getSelectedItem() + .toString()); } protected String getSpinnerTextAtPositionInCardEditor( final int dropdownIndex, final int itemPosition) throws ExecutionException { - return ThreadUtils.runOnUiThreadBlocking(new Callable<String>() { - @Override - public String call() { - return mUI.getCardEditorDialog() - .getDropdownFieldsForTest() - .get(dropdownIndex) - .getItemAtPosition(itemPosition) - .toString(); - } - }); + return ThreadUtils.runOnUiThreadBlocking(() -> mUI.getCardEditorDialog() + .getDropdownFieldsForTest() + .get(dropdownIndex) + .getItemAtPosition(itemPosition) + .toString()); } protected int getSpinnerItemCountInCardEditor(final int dropdownIndex) throws ExecutionException { - return ThreadUtils.runOnUiThreadBlocking(new Callable<Integer>() { - @Override - public Integer call() { - return mUI.getCardEditorDialog() - .getDropdownFieldsForTest() - .get(dropdownIndex) - .getCount(); - } - }); + return ThreadUtils.runOnUiThreadBlocking(() -> mUI.getCardEditorDialog() + .getDropdownFieldsForTest() + .get(dropdownIndex) + .getCount()); } protected String getUnmaskPromptErrorMessage() { @@ -577,13 +456,10 @@ protected void setSpinnerSelectionsInCardEditorAndWait(final int[] selections, CallbackHelper helper) throws InterruptedException, TimeoutException { int callCount = helper.getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - List<Spinner> fields = mUI.getCardEditorDialog().getDropdownFieldsForTest(); - for (int i = 0; i < selections.length && i < fields.size(); i++) { - fields.get(i).setSelection(selections[i]); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + List<Spinner> fields = mUI.getCardEditorDialog().getDropdownFieldsForTest(); + for (int i = 0; i < selections.length && i < fields.size(); i++) { + fields.get(i).setSelection(selections[i]); } }); helper.waitForCallback(callCount); @@ -592,30 +468,23 @@ protected void setSpinnerSelectionInEditorAndWait(final int selection, CallbackHelper helper) throws InterruptedException, TimeoutException { int callCount = helper.getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - ((Spinner) mUI.getEditorDialog().findViewById(R.id.spinner)) - .setSelection(selection); - } - }); + ThreadUtils.runOnUiThreadBlocking(() -> ((Spinner) mUI.getEditorDialog().findViewById( + R.id.spinner)) + .setSelection(selection)); helper.waitForCallback(callCount); } protected void setTextInCardEditorAndWait(final String[] values, CallbackHelper helper) throws InterruptedException, TimeoutException { int callCount = helper.getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - ViewGroup contents = - (ViewGroup) mUI.getCardEditorDialog().findViewById(R.id.contents); - Assert.assertNotNull(contents); - for (int i = 0, j = 0; i < contents.getChildCount() && j < values.length; i++) { - View view = contents.getChildAt(i); - if (view instanceof EditorTextField) { - ((EditorTextField) view).getEditText().setText(values[j++]); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + ViewGroup contents = + (ViewGroup) mUI.getCardEditorDialog().findViewById(R.id.contents); + Assert.assertNotNull(contents); + for (int i = 0, j = 0; i < contents.getChildCount() && j < values.length; i++) { + View view = contents.getChildAt(i); + if (view instanceof EditorTextField) { + ((EditorTextField) view).getEditText().setText(values[j++]); } } }); @@ -625,13 +494,10 @@ protected void setTextInEditorAndWait(final String[] values, CallbackHelper helper) throws InterruptedException, TimeoutException { int callCount = helper.getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - List<EditText> fields = mUI.getEditorDialog().getEditableTextFieldsForTest(); - for (int i = 0; i < values.length; i++) { - fields.get(i).setText(values[i]); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + List<EditText> fields = mUI.getEditorDialog().getEditableTextFieldsForTest(); + for (int i = 0; i < values.length; i++) { + fields.get(i).setText(values[i]); } }); helper.waitForCallback(callCount); @@ -640,27 +506,20 @@ protected void selectCheckboxAndWait(final int resourceId, final boolean isChecked, CallbackHelper helper) throws InterruptedException, TimeoutException { int callCount = helper.getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - ((CheckBox) mUI.getCardEditorDialog().findViewById(resourceId)) - .setChecked(isChecked); - } - }); + ThreadUtils.runOnUiThreadBlocking(() -> ((CheckBox) mUI.getCardEditorDialog().findViewById( + resourceId)) + .setChecked(isChecked)); helper.waitForCallback(callCount); } protected void setTextInCardUnmaskDialogAndWait(final int resourceId, final String input, CallbackHelper helper) throws InterruptedException, TimeoutException { int callCount = helper.getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - EditText editText = - ((EditText) mCardUnmaskPrompt.getDialogForTest().findViewById(resourceId)); - editText.setText(input); - editText.getOnFocusChangeListener().onFocusChange(null, false); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + EditText editText = + ((EditText) mCardUnmaskPrompt.getDialogForTest().findViewById(resourceId)); + editText.setText(input); + editText.getOnFocusChangeListener().onFocusChange(null, false); }); helper.waitForCallback(callCount); } @@ -670,16 +529,13 @@ throws InterruptedException, TimeoutException { assert resourceIds.length == values.length; int callCount = helper.getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - for (int i = 0; i < resourceIds.length; ++i) { - EditText editText = - ((EditText) mCardUnmaskPrompt.getDialogForTest().findViewById( - resourceIds[i])); - editText.setText(values[i]); - editText.getOnFocusChangeListener().onFocusChange(null, false); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + for (int i = 0; i < resourceIds.length; ++i) { + EditText editText = + ((EditText) mCardUnmaskPrompt.getDialogForTest().findViewById( + resourceIds[i])); + editText.setText(values[i]); + editText.getOnFocusChangeListener().onFocusChange(null, false); } }); helper.waitForCallback(callCount); @@ -688,14 +544,11 @@ /* package */ void hitSoftwareKeyboardSubmitButtonAndWait(final int resourceId, CallbackHelper helper) throws InterruptedException, TimeoutException { int callCount = helper.getCallCount(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - EditText editText = - (EditText) mCardUnmaskPrompt.getDialogForTest().findViewById(resourceId); - editText.requestFocus(); - editText.onEditorAction(EditorInfo.IME_ACTION_DONE); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + EditText editText = + (EditText) mCardUnmaskPrompt.getDialogForTest().findViewById(resourceId); + editText.requestFocus(); + editText.onEditorAction(EditorInfo.IME_ACTION_DONE); }); helper.waitForCallback(callCount); } @@ -794,13 +647,9 @@ } /* package */ View getCardUnmaskView() throws Throwable { - return ThreadUtils.runOnUiThreadBlocking(new Callable<View>() { - @Override - public View call() { - return mCardUnmaskPrompt.getDialogForTest().findViewById( - R.id.autofill_card_unmask_prompt); - } - }); + return ThreadUtils.runOnUiThreadBlocking( + () -> mCardUnmaskPrompt.getDialogForTest().findViewById( + R.id.autofill_card_unmask_prompt)); } @Override @@ -937,25 +786,20 @@ void installPaymentApp(final String appMethodName, final int instrumentPresence, final int responseSpeed, final int creationSpeed) { - PaymentAppFactory.getInstance().addAdditionalFactory(new PaymentAppFactoryAddition() { - @Override - public void create(WebContents webContents, Set<String> methodNames, - final PaymentAppFactory.PaymentAppCreatedCallback callback) { - final TestPay app = new TestPay(appMethodName, instrumentPresence, responseSpeed); - if (creationSpeed == IMMEDIATE_CREATION) { - callback.onPaymentAppCreated(app); - callback.onAllPaymentAppsCreated(); - } else { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { + PaymentAppFactory.getInstance().addAdditionalFactory( + (webContents, methodNames, callback) -> { + final TestPay app = new TestPay(appMethodName, instrumentPresence, + responseSpeed); + if (creationSpeed == IMMEDIATE_CREATION) { + callback.onPaymentAppCreated(app); + callback.onAllPaymentAppsCreated(); + } else { + new Handler().postDelayed(() -> { callback.onPaymentAppCreated(app); callback.onAllPaymentAppsCreated(); - } - }, 100); - } - } - }); + }, 100); + } + }); } /** A payment app implementation for test. */ @@ -985,12 +829,9 @@ instruments.add(new TestPayInstrument( getAppIdentifier(), mDefaultMethodName, mDefaultMethodName)); } - Runnable instrumentsReady = new Runnable() { - @Override - public void run() { - ThreadUtils.assertOnUiThread(); - mCallback.onInstrumentsReady(TestPay.this, instruments); - } + Runnable instrumentsReady = () -> { + ThreadUtils.assertOnUiThread(); + mCallback.onInstrumentsReady(TestPay.this, instruments); }; if (mResponseSpeed == IMMEDIATE_RESPONSE) { instrumentsReady.run();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/WebVrTransitionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/WebVrTransitionTest.java index c9051fa3..ac306b75 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/WebVrTransitionTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/WebVrTransitionTest.java
@@ -59,6 +59,23 @@ } /** + * Tests that WebVR is not exposed if the flag is not on and the page does + * not have an origin trial token. + */ + @Test + @MediumTest + @CommandLineFlags.Remove({"enable-webvr"}) + public void testWebVrDisabledWithoutFlagSet() throws InterruptedException { + // TODO(bsheedy): Remove this test once WebVR is on by default without + // requiring an origin trial. + mVrTestRule.loadUrlAndAwaitInitialization( + VrTestRule.getHtmlTestFile("test_webvr_disabled_without_flag_set"), + PAGE_LOAD_TIMEOUT_S); + mVrTestRule.waitOnJavaScriptStep(mVrTestRule.getFirstTabWebContents()); + mVrTestRule.endTest(mVrTestRule.getFirstTabWebContents()); + } + + /** * Tests that scanning the Daydream View NFC tag on supported devices fires the * vrdisplayactivate event. */
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcherTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcherTest.java index 24ffa6c..f1961cd 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcherTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcherTest.java
@@ -25,7 +25,6 @@ import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeTabbedActivityTestRule; -import org.chromium.chrome.test.util.browser.TabLoadObserver; import org.chromium.chrome.test.util.browser.WebappTestPage; import org.chromium.net.test.EmbeddedTestServer; @@ -74,12 +73,6 @@ private String mPrimaryIconMurmur2Hash; @Override - public void onWebManifestForInitialUrlNotWebApkCompatible() { - mWebApkCompatible = false; - notifyCalled(); - } - - @Override public void onGotManifestData( WebApkInfo fetchedInfo, String primaryIconUrl, String badgeIconUrl) { Assert.assertNull(mName); @@ -165,35 +158,15 @@ CallbackWaiter waiter = new CallbackWaiter(); startWebApkUpdateDataFetcher(mTestServer.getURL(WEB_MANIFEST_SCOPE), mTestServer.getURL(WEB_MANIFEST_URL2), waiter); - waiter.waitForCallback(0); - Assert.assertFalse(waiter.isWebApkCompatible()); WebappTestPage.navigateToPageWithServiceWorkerAndManifest( mTestServer, mTab, WEB_MANIFEST_URL2); - waiter.waitForCallback(1); + waiter.waitForCallback(0); Assert.assertTrue(waiter.isWebApkCompatible()); Assert.assertEquals(WEB_MANIFEST_NAME2, waiter.name()); } /** - * Test that {@link onWebManifestForInitialUrlNotWebApkCompatible()} is called after attempting - * to fetch Web Manifest for page with no Web Manifest. - */ - @Test - @MediumTest - @Feature({"Webapps"}) - public void testNoWebManifest() throws Exception { - new TabLoadObserver(mTab).fullyLoadUrl( - mTestServer.getURL("/chrome/test/data/banners/no_manifest_test_page.html")); - - CallbackWaiter waiter = new CallbackWaiter(); - startWebApkUpdateDataFetcher(mTestServer.getURL(WEB_MANIFEST_SCOPE), - mTestServer.getURL(WEB_MANIFEST_URL2), waiter); - waiter.waitForCallback(0); - Assert.assertFalse(waiter.isWebApkCompatible()); - } - - /** * Test that large icon murmur2 hashes are correctly plumbed to Java. The hash can take on * values up to 2^64 - 1 which is greater than {@link Long#MAX_VALUE}. */
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java index 4dd0085..4150a62d 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java
@@ -80,12 +80,6 @@ } @Override - public void onWebManifestForInitialUrlNotWebApkCompatible() { - super.onWebManifestForInitialUrlNotWebApkCompatible(); - mWaiter.notifyCalled(); - } - - @Override public void onGotManifestData(WebApkInfo fetchedInfo, String primaryIconUrl, String badgeIconUrl) { super.onGotManifestData(fetchedInfo, primaryIconUrl, badgeIconUrl);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappModeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappModeTest.java index 5ec7b597..6988c51 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappModeTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappModeTest.java
@@ -246,8 +246,9 @@ * Ensure WebappActivities can't be launched without proper security checks. */ @Test - @MediumTest - @Feature({"Webapps"}) + //@MediumTest + //@Feature({"Webapps"}) + @DisabledTest(message = "crbug.com/755114") public void testWebappRequiresValidMac() throws Exception { // Try to start a WebappActivity. Fail because the Intent is insecure. fireWebappIntent(WEBAPP_1_ID, WEBAPP_1_URL, WEBAPP_1_TITLE, WEBAPP_ICON, false);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java index 41ba2f3b..4eed153 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java
@@ -370,8 +370,7 @@ } // Chrome is killed. Neither - // {@link WebApkUpdateManager#onWebManifestForInitialUrlNotWebApkCompatible()} nor - // {@link WebApkUpdateManager#OnGotManifestData()} is called. + // {@link WebApkUpdateManager#OnGotManifestData()} is not called. { // Relaunching the WebAPK should do an is-update-needed check. @@ -483,13 +482,12 @@ updateIfNeeded(updateManager); assertTrue(updateManager.updateCheckStarted()); - updateManager.onWebManifestForInitialUrlNotWebApkCompatible(); + updateManager.onGotManifestData(null, null, null); assertTrue(updateManager.updateRequested()); assertEquals(NAME, updateManager.requestedUpdateName()); // Check that the {@link ManifestUpgradeDetector} has been destroyed. This prevents - // {@link #onWebManifestForInitialUrlNotWebApkCompatible()} and {@link #onGotManifestData()} - // from getting called. + // {@link #onGotManifestData()} from getting called. assertTrue(updateManager.destroyedFetcher()); } @@ -534,7 +532,6 @@ assertTrue(updateManager.updateCheckStarted()); // start_url does not have a Web Manifest. No update should be requested. - updateManager.onWebManifestForInitialUrlNotWebApkCompatible(); assertFalse(updateManager.updateRequested()); // {@link ManifestUpgradeDetector} should still be alive so that it can get // {@link #onGotManifestData} when page with the Web Manifest finishes loading. @@ -566,7 +563,6 @@ TestWebApkUpdateManager updateManager = new TestWebApkUpdateManager(getStorage(WEBAPK_PACKAGE_NAME)); updateIfNeeded(updateManager); - updateManager.onWebManifestForInitialUrlNotWebApkCompatible(); onGotManifestData(updateManager, defaultManifestData()); assertFalse(updateManager.updateRequested());
diff --git a/chrome/app/media_router_strings.grdp b/chrome/app/media_router_strings.grdp index 6f6b689..78db4368 100644 --- a/chrome/app/media_router_strings.grdp +++ b/chrome/app/media_router_strings.grdp
@@ -169,6 +169,12 @@ <message name="IDS_MEDIA_ROUTER_ROUTE_DETAILS_VOLUME_TITLE" desc="The title label for a volume control bar for media contents."> Volume </message> + <message name="IDS_MEDIA_ROUTER_ROUTE_DETAILS_CURRENT_TIME_LABEL" desc="The label for the current time position of media contents."> + Current time + </message> + <message name="IDS_MEDIA_ROUTER_ROUTE_DETAILS_DURATION_LABEL" desc="The label for the total duration of media contents."> + Duration + </message> <!-- Sink List --> <message name="IDS_MEDIA_ROUTER_DESTINATION_MISSING" desc="Link to display when no Cast destinations are found which, on click, opens a page to the Chromecast help center explaining possible reasons why none are detected.">
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp index 509d1d97..ed0a6ef 100644 --- a/chrome/app/settings_strings.grdp +++ b/chrome/app/settings_strings.grdp
@@ -924,9 +924,6 @@ <message name="IDS_SETTINGS_PRINTING_CUPS_PRINTERS_ADD_PRINTER" desc="In CUPS printing settings subpage, text for the link adding a new CUPS printer."> Add Printer </message> - <message name="IDS_SETTINGS_PRINTING_CUPS_PRINTERS_DETAILS" desc="Text for the drop down menu which allows the user to see the printer details."> - Details - </message> <message name="IDS_SETTINGS_PRINTING_CUPS_PRINTERS_EDIT" desc="Text for the drop down menu which allows the user to edit the printer details."> Edit </message>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index b1f3d01..f8f04b38 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -3693,10 +3693,16 @@ if ((is_linux && !is_chromeos) || is_win) { sources += [ + "feature_engagement/feature_tracker.cc", + "feature_engagement/feature_tracker.h", "feature_engagement/new_tab/new_tab_tracker.cc", "feature_engagement/new_tab/new_tab_tracker.h", "feature_engagement/new_tab/new_tab_tracker_factory.cc", "feature_engagement/new_tab/new_tab_tracker_factory.h", + "feature_engagement/session_duration_updater.cc", + "feature_engagement/session_duration_updater.h", + "feature_engagement/session_duration_updater_factory.cc", + "feature_engagement/session_duration_updater_factory.h", ] }
diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS index 1251b2d..2d8234d 100644 --- a/chrome/browser/DEPS +++ b/chrome/browser/DEPS
@@ -151,7 +151,29 @@ # are commonly referenced by renderer-side and browser-side code, and # does not use Blink types like WTF. "+third_party/WebKit/common", + + # The following restrictions are for ChromeOS and in particular mus/mash where + # Ozone does not run in process. If the linux build transitions to Ozone then + # we likely need to make these restrictions applicable only to ChromeOS files. + "-ui/events/ozone", + "-ui/ozone", + "+ui/ozone/public/ozone_switches.h", + # ui/events/devices is tied with ozone, which is controlled by mus, and + # shouldn't be used by Chrome directly. + "-ui/events/devices", + # Enums and supporting classes or observers that are safe (should be moved to + # services/ui/public/cpp). http://crbug.com/747544. + "+ui/events/devices/device_hotplug_event_observer.h", + "+ui/events/devices/input_device.h", + "+ui/events/devices/input_device_event_observer.h", + "+ui/events/devices/stylus_state.h", + "+ui/events/devices/touchscreen_device.h", + "+ui/events/devices/input_device_manager.h", + + # Only used by X11 (non-ChromeOS) code, which can use X directly. + "+ui/events/devices/x11", ] + specific_include_rules = { # TODO(mash): Remove. http://crbug.com/678705 "fullscreen_chromeos\.cc": [
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 0d6c1c459..c30ae496 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -2973,7 +2973,7 @@ FEATURE_VALUE_TYPE(omnibox::kOmniboxTailSuggestions)}, {"enable-new-app-menu-icon", flag_descriptions::kEnableNewAppMenuIconName, flag_descriptions::kEnableNewAppMenuIconDescription, kOsDesktop, - SINGLE_VALUE_TYPE(switches::kEnableNewAppMenuIcon)}, + FEATURE_VALUE_TYPE(features::kAnimatedAppMenuIcon)}, #endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN) #if defined(OS_ANDROID)
diff --git a/chrome/browser/android/contextualsearch/contextual_search_delegate.cc b/chrome/browser/android/contextualsearch/contextual_search_delegate.cc index 3c691113..eb341dd 100644 --- a/chrome/browser/android/contextualsearch/contextual_search_delegate.cc +++ b/chrome/browser/android/contextualsearch/contextual_search_delegate.cc
@@ -343,7 +343,7 @@ media->set_mime_type(context.GetBasePageEncoding()); discourse_context::Selection* selection = display->mutable_selection(); - selection->set_content(UTF16ToUTF8(context.GetSurroundingText())); + selection->set_content(base::UTF16ToUTF8(context.GetSurroundingText())); selection->set_start(context.GetStartOffset()); selection->set_end(context.GetEndOffset()); selection->set_is_uri_encoded(false);
diff --git a/chrome/browser/android/favicon_helper.cc b/chrome/browser/android/favicon_helper.cc index 3fec960..bfa7006 100644 --- a/chrome/browser/android/favicon_helper.cc +++ b/chrome/browser/android/favicon_helper.cc
@@ -68,6 +68,14 @@ j_favicon_bitmap, j_icon_url); } +void OnEnsureIconIsAvailableFinished( + const ScopedJavaGlobalRef<jobject>& j_availability_callback, + bool newly_available) { + JNIEnv* env = AttachCurrentThread(); + Java_IconAvailabilityCallback_onIconAvailabilityChecked( + env, j_availability_callback, newly_available); +} + } // namespace static jlong Init(JNIEnv* env, const JavaParamRef<jclass>& clazz) { @@ -157,7 +165,6 @@ const JavaParamRef<jstring>& j_page_url, const JavaParamRef<jstring>& j_icon_url, jboolean j_is_large_icon, - jboolean j_is_temporary, const JavaParamRef<jobject>& j_availability_callback) { Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile); DCHECK(profile); @@ -174,7 +181,7 @@ ScopedJavaGlobalRef<jobject> j_scoped_callback(env, j_availability_callback); favicon_base::FaviconImageCallback callback_runner = base::Bind( &FaviconHelper::OnFaviconImageResultAvailable, j_scoped_callback, profile, - web_contents, page_url, icon_url, icon_type, j_is_temporary); + web_contents, page_url, icon_url, icon_type); favicon::FaviconService* service = FaviconServiceFactory::GetForProfile( profile, ServiceAccessType::IMPLICIT_ACCESS); favicon::GetFaviconImageForPageURL(service, page_url, icon_type, @@ -182,6 +189,20 @@ cancelable_task_tracker_.get()); } +void FaviconHelper::TouchOnDemandFavicon( + JNIEnv* env, + const JavaParamRef<jobject>& obj, + const JavaParamRef<jobject>& j_profile, + const JavaParamRef<jstring>& j_icon_url) { + Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile); + DCHECK(profile); + GURL icon_url(ConvertJavaStringToUTF8(env, j_icon_url)); + + favicon::FaviconService* service = FaviconServiceFactory::GetForProfile( + profile, ServiceAccessType::IMPLICIT_ACCESS); + service->TouchOnDemandFavicon(icon_url); +} + FaviconHelper::~FaviconHelper() {} // Return the index of |sizes| whose area is largest but not exceeds int type @@ -213,29 +234,27 @@ Profile* profile, const GURL& page_url, favicon_base::IconType icon_type, - bool is_temporary, int download_request_id, int http_status_code, const GURL& image_url, const std::vector<SkBitmap>& bitmaps, const std::vector<gfx::Size>& original_sizes) { - bool success = !bitmaps.empty(); - if (success) { - // Only keep the largest icon available. - gfx::Image image = gfx::Image(gfx::ImageSkia( - gfx::ImageSkiaRep(bitmaps[GetLargestSizeIndex(original_sizes)], 0))); - favicon_base::SetFaviconColorSpace(&image); - favicon::FaviconService* service = FaviconServiceFactory::GetForProfile( - profile, ServiceAccessType::IMPLICIT_ACCESS); - service->SetFavicons(page_url, image_url, icon_type, image); - - if (is_temporary) - service->SetFaviconOutOfDateForPage(page_url); + if (bitmaps.empty()) { + OnEnsureIconIsAvailableFinished(j_availability_callback, + /*newly_available=*/false); + return; } - JNIEnv* env = AttachCurrentThread(); - Java_IconAvailabilityCallback_onIconAvailabilityChecked( - env, j_availability_callback, /*newly_available=*/success); + // Only keep the largest icon available. + gfx::Image image = gfx::Image(gfx::ImageSkia( + gfx::ImageSkiaRep(bitmaps[GetLargestSizeIndex(original_sizes)], 0))); + favicon_base::SetFaviconColorSpace(&image); + favicon::FaviconService* service = FaviconServiceFactory::GetForProfile( + profile, ServiceAccessType::IMPLICIT_ACCESS); + + service->SetOnDemandFavicons( + page_url, image_url, icon_type, image, + base::Bind(&OnEnsureIconIsAvailableFinished, j_availability_callback)); } void FaviconHelper::OnFaviconImageResultAvailable( @@ -245,21 +264,19 @@ const GURL& page_url, const GURL& icon_url, favicon_base::IconType icon_type, - bool is_temporary, const favicon_base::FaviconImageResult& result) { // If there already is a favicon, return immediately. // Can |web_contents| be null here? crbug.com/688249 if (!result.image.IsEmpty() || !web_contents) { // Either the image already exists in the FaviconService, or it doesn't and // we can't download it. Either way, it's not *newly* available. - JNIEnv* env = AttachCurrentThread(); - Java_IconAvailabilityCallback_onIconAvailabilityChecked( - env, j_availability_callback, /*newly_available=*/false); + OnEnsureIconIsAvailableFinished(j_availability_callback, + /*newly_available=*/false); return; } web_contents->DownloadImage( icon_url, true, 0, false, base::Bind(&FaviconHelper::OnFaviconDownloaded, j_availability_callback, - profile, page_url, icon_type, is_temporary)); + profile, page_url, icon_type)); }
diff --git a/chrome/browser/android/favicon_helper.h b/chrome/browser/android/favicon_helper.h index 730622a..b9dfe62 100644 --- a/chrome/browser/android/favicon_helper.h +++ b/chrome/browser/android/favicon_helper.h
@@ -39,6 +39,7 @@ const base::android::JavaParamRef<jobject>& obj, const base::android::JavaParamRef<jobject>& jprofile, const base::android::JavaParamRef<jstring>& j_page_url); + void EnsureIconIsAvailable( JNIEnv* env, const base::android::JavaParamRef<jobject>& obj, @@ -47,8 +48,12 @@ const base::android::JavaParamRef<jstring>& j_page_url, const base::android::JavaParamRef<jstring>& j_icon_url, jboolean j_is_large_icon, - jboolean j_is_temporary, const base::android::JavaParamRef<jobject>& j_availability_callback); + void TouchOnDemandFavicon( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& obj, + const base::android::JavaParamRef<jobject>& j_profile, + const base::android::JavaParamRef<jstring>& j_icon_url); private: FRIEND_TEST_ALL_PREFIXES(FaviconHelperTest, GetLargestSizeIndex); @@ -61,7 +66,6 @@ const GURL& page_url, const GURL& icon_url, favicon_base::IconType icon_type, - bool is_temporary, const favicon_base::FaviconImageResult& result); static void OnFaviconDownloaded( @@ -70,7 +74,6 @@ Profile* profile, const GURL& page_url, favicon_base::IconType icon_type, - bool is_temporary, int download_request_id, int http_status_code, const GURL& image_url,
diff --git a/chrome/browser/android/instantapps/instant_apps_infobar_delegate.cc b/chrome/browser/android/instantapps/instant_apps_infobar_delegate.cc index 4d3fc0c..459795c 100644 --- a/chrome/browser/android/instantapps/instant_apps_infobar_delegate.cc +++ b/chrome/browser/android/instantapps/instant_apps_infobar_delegate.cc
@@ -78,6 +78,17 @@ } } +bool InstantAppsInfoBarDelegate::ShouldExpire( + const NavigationDetails& details) const { + content::WebContents* web_contents = + InfoBarService::WebContentsFromInfoBar(infobar()); + bool navigation_url_is_launch_url = + web_contents != NULL && + web_contents->GetURL().EqualsIgnoringRef(GURL(url_)); + return !navigation_url_is_launch_url && + ConfirmInfoBarDelegate::ShouldExpire(details); +} + void Launch(JNIEnv* env, const base::android::JavaParamRef<jclass>& clazz, const base::android::JavaParamRef<jobject>& jweb_contents,
diff --git a/chrome/browser/android/instantapps/instant_apps_infobar_delegate.h b/chrome/browser/android/instantapps/instant_apps_infobar_delegate.h index c9933a99..cdf20ea8 100644 --- a/chrome/browser/android/instantapps/instant_apps_infobar_delegate.h +++ b/chrome/browser/android/instantapps/instant_apps_infobar_delegate.h
@@ -24,6 +24,9 @@ base::android::ScopedJavaGlobalRef<jobject> data() { return data_; } + // ConfirmInfoBarDelegate: + bool ShouldExpire(const NavigationDetails& details) const override; + // WebContentsObserver: void DidFinishNavigation( content::NavigationHandle* navigation_handle) override;
diff --git a/chrome/browser/android/webapk/webapk_update_data_fetcher.cc b/chrome/browser/android/webapk/webapk_update_data_fetcher.cc index b7a9d96..61950caa 100644 --- a/chrome/browser/android/webapk/webapk_update_data_fetcher.cc +++ b/chrome/browser/android/webapk/webapk_update_data_fetcher.cc
@@ -54,7 +54,6 @@ : content::WebContentsObserver(nullptr), scope_(scope), web_manifest_url_(web_manifest_url), - is_initial_fetch_(false), info_(GURL()), weak_ptr_factory_(this) { java_ref_.Reset(env, obj); @@ -96,13 +95,11 @@ // installable data the first time. if (url == last_fetched_url_) return; - is_initial_fetch_ = last_fetched_url_.is_empty(); + last_fetched_url_ = url; - if (!IsInScope(url, scope_)) { - OnWebManifestNotWebApkCompatible(); + if (!IsInScope(url, scope_)) return; - } InstallableParams params; params.ideal_primary_icon_size_in_px = @@ -142,7 +139,6 @@ if (data.error_code != NO_ERROR_DETECTED || data.manifest.IsEmpty() || web_manifest_url_ != data.manifest_url || !AreWebManifestUrlsWebApkCompatible(data.manifest)) { - OnWebManifestNotWebApkCompatible(); return; } @@ -167,10 +163,8 @@ void WebApkUpdateDataFetcher::OnGotPrimaryIconMurmur2Hash( const std::string& primary_icon_murmur2_hash) { - if (primary_icon_murmur2_hash.empty()) { - OnWebManifestNotWebApkCompatible(); + if (primary_icon_murmur2_hash.empty()) return; - } if (!info_.best_badge_icon_url.is_empty() && info_.best_badge_icon_url != info_.best_primary_icon_url) { @@ -191,10 +185,8 @@ const std::string& primary_icon_murmur2_hash, bool did_fetch_badge_icon, const std::string& badge_icon_murmur2_hash) { - if (did_fetch_badge_icon && badge_icon_murmur2_hash.empty()) { - OnWebManifestNotWebApkCompatible(); + if (did_fetch_badge_icon && badge_icon_murmur2_hash.empty()) return; - } JNIEnv* env = base::android::AttachCurrentThread(); @@ -233,11 +225,3 @@ java_badge_icon, java_icon_urls, info_.display, info_.orientation, info_.theme_color, info_.background_color); } - -void WebApkUpdateDataFetcher::OnWebManifestNotWebApkCompatible() { - if (!is_initial_fetch_) - return; - - Java_WebApkUpdateDataFetcher_onWebManifestForInitialUrlNotWebApkCompatible( - base::android::AttachCurrentThread(), java_ref_); -}
diff --git a/chrome/browser/android/webapk/webapk_update_data_fetcher.h b/chrome/browser/android/webapk/webapk_update_data_fetcher.h index 777a760..1b9d4d2 100644 --- a/chrome/browser/android/webapk/webapk_update_data_fetcher.h +++ b/chrome/browser/android/webapk/webapk_update_data_fetcher.h
@@ -77,9 +77,6 @@ // The WebAPK's Web Manifest URL that the detector is looking for. const GURL web_manifest_url_; - // Whether this is the initial URL fetch. - bool is_initial_fetch_; - // The URL for which the installable data is being fetched / was last fetched. GURL last_fetched_url_;
diff --git a/chrome/browser/app_controller_mac_browsertest.mm b/chrome/browser/app_controller_mac_browsertest.mm index 63324c0..765b6527 100644 --- a/chrome/browser/app_controller_mac_browsertest.mm +++ b/chrome/browser/app_controller_mac_browsertest.mm
@@ -54,6 +54,8 @@ #include "extensions/test/extension_test_message_listener.h" #include "net/test/embedded_test_server/embedded_test_server.h" +using base::SysUTF16ToNSString; + namespace { GURL g_open_shortcut_url = GURL::EmptyGURL();
diff --git a/chrome/browser/apps/guest_view/web_view_browsertest.cc b/chrome/browser/apps/guest_view/web_view_browsertest.cc index 3358114..e011d41 100644 --- a/chrome/browser/apps/guest_view/web_view_browsertest.cc +++ b/chrome/browser/apps/guest_view/web_view_browsertest.cc
@@ -62,6 +62,7 @@ #include "content/public/common/child_process_host.h" #include "content/public/common/content_features.h" #include "content/public/common/content_switches.h" +#include "content/public/common/url_constants.h" #include "content/public/test/browser_test_utils.h" #include "content/public/test/download_test_observer.h" #include "content/public/test/fake_speech_recognition_manager.h" @@ -79,6 +80,7 @@ #include "extensions/common/extensions_client.h" #include "extensions/test/extension_test_message_listener.h" #include "media/base/media_switches.h" +#include "net/dns/mock_host_resolver.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "net/test/embedded_test_server/http_request.h" #include "net/test/embedded_test_server/http_response.h" @@ -4222,3 +4224,164 @@ chrome::CloseTab(browser()); } #endif + +// This test class makes "isolated.com" an isolated origin, to be used in +// testing isolated origins inside of a WebView. +class IsolatedOriginWebViewTest : public WebViewTest { + public: + IsolatedOriginWebViewTest() {} + ~IsolatedOriginWebViewTest() override {} + + protected: + void SetUpCommandLine(base::CommandLine* command_line) override { + ASSERT_TRUE(embedded_test_server()->InitializeAndListen()); + + std::string origin = + embedded_test_server()->GetURL("isolated.com", "/").spec(); + command_line->AppendSwitchASCII(switches::kIsolateOrigins, origin); + WebViewTest::SetUpCommandLine(command_line); + } + + void SetUpOnMainThread() override { + host_resolver()->AddRule("*", "127.0.0.1"); + embedded_test_server()->StartAcceptingConnections(); + WebViewTest::SetUpOnMainThread(); + } +}; +INSTANTIATE_TEST_CASE_P(WebViewTests, + IsolatedOriginWebViewTest, + testing::Bool()); + +// Test isolated origins inside a WebView, and make sure that loading an +// isolated origin in a regular tab's subframe doesn't reuse a WebView process +// that had loaded it previously, which would result in renderer kills. See +// https://crbug.com/751916 and https://crbug.com/751920. +IN_PROC_BROWSER_TEST_P(IsolatedOriginWebViewTest, IsolatedOriginInWebview) { + LoadAppWithGuest("web_view/simple"); + content::WebContents* guest = GetGuestWebContents(); + + // Navigate <webview> to an isolated origin. + GURL isolated_url( + embedded_test_server()->GetURL("isolated.com", "/title1.html")); + { + content::TestNavigationObserver load_observer(guest); + EXPECT_TRUE( + ExecuteScript(guest, "location.href = '" + isolated_url.spec() + "';")); + load_observer.Wait(); + } + + // TODO(alexmos, creis): The isolated origin currently has to use the + // chrome-guest:// SiteInstance, rather than a SiteInstance with its own + // meaningful site URL. This should be fixed as part of + // https://crbug.com/734722. + EXPECT_TRUE(guest->GetMainFrame()->GetSiteInstance()->GetSiteURL().SchemeIs( + content::kGuestScheme)); + + // Now, navigate <webview> to a regular page with a subframe. + GURL foo_url(embedded_test_server()->GetURL("foo.com", "/iframe.html")); + { + content::TestNavigationObserver load_observer(guest); + EXPECT_TRUE( + ExecuteScript(guest, "location.href = '" + foo_url.spec() + "';")); + load_observer.Wait(); + } + + // Navigate subframe in <webview> to an isolated origin. + EXPECT_TRUE(NavigateIframeToURL(guest, "test", isolated_url)); + + // TODO(alexmos, creis): Unfortunately, the subframe currently has to stay in + // the guest process. The expectations here should change once WebViews + // can support OOPIFs. See https://crbug.com/614463. + content::RenderFrameHost* webview_subframe = + ChildFrameAt(guest->GetMainFrame(), 0); + EXPECT_EQ(webview_subframe->GetProcess(), + guest->GetMainFrame()->GetProcess()); + EXPECT_EQ(webview_subframe->GetSiteInstance(), + guest->GetMainFrame()->GetSiteInstance()); + + // Load a page with subframe in a regular tab. + AddTabAtIndex(0, foo_url, ui::PAGE_TRANSITION_TYPED); + content::WebContents* tab = + browser()->tab_strip_model()->GetActiveWebContents(); + + // Navigate that subframe to an isolated origin. This should not join the + // WebView process, which has isolated.foo.com committed in a different + // storage partition. + EXPECT_TRUE(NavigateIframeToURL(tab, "test", isolated_url)); + content::RenderFrameHost* subframe = ChildFrameAt(tab->GetMainFrame(), 0); + EXPECT_NE(guest->GetMainFrame()->GetProcess(), subframe->GetProcess()); + + // Check that the guest process hasn't crashed. + EXPECT_TRUE(guest->GetMainFrame()->IsRenderFrameLive()); + + // Check that accessing a foo.com cookie from the WebView doesn't result in a + // renderer kill. This might happen if we erroneously applied an isolated.com + // origin lock to the WebView process when committing isolated.com. + bool cookie_is_correct = false; + EXPECT_TRUE(ExecuteScriptAndExtractBool( + guest, + "document.cookie = 'foo=bar';\n" + "window.domAutomationController.send(document.cookie == 'foo=bar');\n", + &cookie_is_correct)); + EXPECT_TRUE(cookie_is_correct); +} + +// This test is similar to IsolatedOriginInWebview above, but loads an isolated +// origin in a <webview> subframe *after* loading the same isolated origin in a +// regular tab's subframe. The isolated origin's subframe in the <webview> +// subframe should not reuse the regular tab's subframe process. See +// https://crbug.com/751916 and https://crbug.com/751920. +IN_PROC_BROWSER_TEST_P(IsolatedOriginWebViewTest, + LoadIsolatedOriginInWebviewAfterLoadingInRegularTab) { + LoadAppWithGuest("web_view/simple"); + content::WebContents* guest = GetGuestWebContents(); + + // Load a page with subframe in a regular tab. + GURL foo_url(embedded_test_server()->GetURL("foo.com", "/iframe.html")); + AddTabAtIndex(0, foo_url, ui::PAGE_TRANSITION_TYPED); + content::WebContents* tab = + browser()->tab_strip_model()->GetActiveWebContents(); + + // Navigate that subframe to an isolated origin. + GURL isolated_url( + embedded_test_server()->GetURL("isolated.com", "/title1.html")); + EXPECT_TRUE(NavigateIframeToURL(tab, "test", isolated_url)); + content::RenderFrameHost* subframe = ChildFrameAt(tab->GetMainFrame(), 0); + EXPECT_NE(tab->GetMainFrame()->GetProcess(), subframe->GetProcess()); + + // Navigate <webview> to a regular page with an isolated origin subframe. + { + content::TestNavigationObserver load_observer(guest); + EXPECT_TRUE( + ExecuteScript(guest, "location.href = '" + foo_url.spec() + "';")); + load_observer.Wait(); + } + EXPECT_TRUE(NavigateIframeToURL(guest, "test", isolated_url)); + + // TODO(alexmos, creis): The subframe currently has to stay in the guest + // process. The expectations here should change once WebViews can support + // OOPIFs. See https://crbug.com/614463. + content::RenderFrameHost* webview_subframe = + ChildFrameAt(guest->GetMainFrame(), 0); + EXPECT_EQ(webview_subframe->GetProcess(), + guest->GetMainFrame()->GetProcess()); + EXPECT_EQ(webview_subframe->GetSiteInstance(), + guest->GetMainFrame()->GetSiteInstance()); + EXPECT_NE(webview_subframe->GetProcess(), subframe->GetProcess()); + + // Check that the guest and regular tab processes haven't crashed. + EXPECT_TRUE(guest->GetMainFrame()->IsRenderFrameLive()); + EXPECT_TRUE(tab->GetMainFrame()->IsRenderFrameLive()); + EXPECT_TRUE(subframe->IsRenderFrameLive()); + + // Check that accessing a foo.com cookie from the WebView doesn't result in a + // renderer kill. This might happen if we erroneously applied an isolated.com + // origin lock to the WebView process when committing isolated.com. + bool cookie_is_correct = false; + EXPECT_TRUE(ExecuteScriptAndExtractBool( + guest, + "document.cookie = 'foo=bar';\n" + "window.domAutomationController.send(document.cookie == 'foo=bar');\n", + &cookie_is_correct)); + EXPECT_TRUE(cookie_is_correct); +}
diff --git a/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc b/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc index 6ec3b8ed..943de7f 100644 --- a/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc +++ b/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc
@@ -47,7 +47,7 @@ #include "extensions/test/extension_test_message_listener.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "ui/base/ime/composition_text.h" -#include "ui/base/ime/composition_underline.h" +#include "ui/base/ime/ime_text_span.h" #include "ui/base/ime/text_input_client.h" #include "ui/base/test/ui_controls.h" #include "ui/events/keycodes/keyboard_codes.h" @@ -1724,7 +1724,7 @@ target_web_contents->GetRenderWidgetHostView()->GetRenderWidgetHost(); content::SendImeCommitTextToWidget( target_rwh_for_input, base::UTF8ToUTF16("C"), - std::vector<ui::CompositionUnderline>(), gfx::Range(4, 5), 0); + std::vector<ui::ImeTextSpan>(), gfx::Range(4, 5), 0); input_listener.WaitUntilSatisfied(); // Get the input value from the guest. @@ -1790,7 +1790,7 @@ CompositionRangeUpdateObserver observer(embedder_web_contents); content::SendImeSetCompositionTextToWidget( target_web_contents->GetRenderWidgetHostView()->GetRenderWidgetHost(), - base::UTF8ToUTF16("ABC"), std::vector<ui::CompositionUnderline>(), + base::UTF8ToUTF16("ABC"), std::vector<ui::ImeTextSpan>(), gfx::Range::InvalidRange(), 0, 3); observer.WaitForCompositionRangeLength(3U); }
diff --git a/chrome/browser/chrome_service.cc b/chrome/browser/chrome_service.cc index 372235e..e90a954 100644 --- a/chrome/browser/chrome_service.cc +++ b/chrome/browser/chrome_service.cc
@@ -12,10 +12,10 @@ } ChromeService::ChromeService() { +#if defined(OS_CHROMEOS) #if defined(USE_OZONE) input_device_controller_.AddInterface(®istry_); #endif -#if defined(OS_CHROMEOS) registry_.AddInterface( base::Bind(&chromeos::Launchable::Bind, base::Unretained(&launchable_))); #endif
diff --git a/chrome/browser/chrome_service.h b/chrome/browser/chrome_service.h index ffc1f9f6..2c7e8eb 100644 --- a/chrome/browser/chrome_service.h +++ b/chrome/browser/chrome_service.h
@@ -10,10 +10,10 @@ #if defined(OS_CHROMEOS) #include "chrome/browser/chromeos/launchable.h" -#endif #if defined(USE_OZONE) #include "services/ui/public/cpp/input_devices/input_device_controller.h" #endif +#endif class ChromeService : public service_manager::Service { public: @@ -32,10 +32,10 @@ #if defined(OS_CHROMEOS) chromeos::Launchable launchable_; -#endif #if defined(USE_OZONE) ui::InputDeviceController input_device_controller_; #endif +#endif DISALLOW_COPY_AND_ASSIGN(ChromeService); };
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index b31a4a0..ea42528a 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -362,6 +362,8 @@ "arc/fileapi/arc_file_system_operation_runner_util.h", "arc/fileapi/arc_media_view_util.cc", "arc/fileapi/arc_media_view_util.h", + "arc/fileapi/file_stream_forwarder.cc", + "arc/fileapi/file_stream_forwarder.h", "arc/intent_helper/arc_external_protocol_dialog.cc", "arc/intent_helper/arc_external_protocol_dialog.h", "arc/intent_helper/arc_navigation_throttle.cc", @@ -782,6 +784,8 @@ "lock_screen_apps/app_manager.h", "lock_screen_apps/app_manager_impl.cc", "lock_screen_apps/app_manager_impl.h", + "lock_screen_apps/app_window_metrics_tracker.cc", + "lock_screen_apps/app_window_metrics_tracker.h", "lock_screen_apps/focus_cycler_delegate.h", "lock_screen_apps/state_controller.cc", "lock_screen_apps/state_controller.h", @@ -1668,6 +1672,7 @@ "arc/fileapi/arc_documents_provider_root_unittest.cc", "arc/fileapi/arc_documents_provider_util_unittest.cc", "arc/fileapi/arc_file_system_operation_runner_unittest.cc", + "arc/fileapi/file_stream_forwarder_unittest.cc", "arc/intent_helper/arc_external_protocol_dialog_unittest.cc", "arc/intent_helper/arc_navigation_throttle_unittest.cc", "arc/kiosk/arc_kiosk_bridge_unittest.cc",
diff --git a/chrome/browser/chromeos/arc/fileapi/file_stream_forwarder.cc b/chrome/browser/chromeos/arc/fileapi/file_stream_forwarder.cc new file mode 100644 index 0000000..2b1e958 --- /dev/null +++ b/chrome/browser/chromeos/arc/fileapi/file_stream_forwarder.cc
@@ -0,0 +1,146 @@ +// 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 "chrome/browser/chromeos/arc/fileapi/file_stream_forwarder.h" + +#include "base/files/file_util.h" +#include "base/task_scheduler/task_scheduler.h" +#include "base/task_scheduler/task_traits.h" +#include "content/public/browser/browser_thread.h" +#include "net/base/net_errors.h" + +using content::BrowserThread; + +namespace arc { + +namespace { + +constexpr int kBufSize = 32 * 1024; + +} // namespace + +FileStreamForwarder::FileStreamForwarder( + scoped_refptr<storage::FileSystemContext> context, + const storage::FileSystemURL& url, + int64_t offset, + int64_t size, + base::ScopedFD fd_dest, + ResultCallback callback) + : context_(context), + url_(url), + offset_(offset), + remaining_size_(size), + fd_dest_(std::move(fd_dest)), + callback_(std::move(callback)), + task_runner_(base::TaskScheduler::GetInstance() + ->CreateSequencedTaskRunnerWithTraits( + // It's safe to shutdown without waiting for the + // completion of tasks running with this task runner. + {base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN, + base::MayBlock()})), + buf_(new net::IOBufferWithSize(kBufSize)), + weak_ptr_factory_(this) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + BrowserThread::PostTask( + BrowserThread::IO, FROM_HERE, + base::BindOnce(&FileStreamForwarder::Start, base::Unretained(this))); +} + +void FileStreamForwarder::Destroy() { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + BrowserThread::PostTask( + BrowserThread::IO, FROM_HERE, + base::BindOnce(&FileStreamForwarder::DestroyOnIOThread, + base::Unretained(this))); +} + +FileStreamForwarder::~FileStreamForwarder() { + DCHECK_CURRENTLY_ON(BrowserThread::IO); + if (!callback_.is_null()) // Aborted before completion. + NotifyCompleted(false); + // Use the task runner to close the FD. + task_runner_->PostTask( + FROM_HERE, base::BindOnce([](base::ScopedFD fd) {}, std::move(fd_dest_))); +} + +void FileStreamForwarder::DestroyOnIOThread() { + DCHECK_CURRENTLY_ON(BrowserThread::IO); + delete this; +} + +void FileStreamForwarder::Start() { + DCHECK_CURRENTLY_ON(BrowserThread::IO); + stream_reader_ = context_->CreateFileStreamReader( + url_, offset_, remaining_size_, base::Time()); + if (!stream_reader_) { + LOG(ERROR) << "CreateFileStreamReader failed."; + NotifyCompleted(false); + return; + } + DoRead(); +} + +void FileStreamForwarder::DoRead() { + DCHECK_CURRENTLY_ON(BrowserThread::IO); + if (remaining_size_ == 0) { + NotifyCompleted(true); + return; + } + const int result = stream_reader_->Read( + buf_.get(), std::min<int64_t>(buf_->size(), remaining_size_), + base::Bind(&FileStreamForwarder::OnReadCompleted, + weak_ptr_factory_.GetWeakPtr())); + if (result != net::ERR_IO_PENDING) { + // Read result is returned synchronously. + OnReadCompleted(result); + } +} + +void FileStreamForwarder::OnReadCompleted(int result) { + DCHECK_CURRENTLY_ON(BrowserThread::IO); + if (result <= 0) { + if (result == 0) { + LOG(ERROR) << remaining_size_ << " more bytes to read, but reached EOF."; + } else { + LOG(ERROR) << "Read failed " << net::ErrorToString(result); + } + NotifyCompleted(false); + return; + } + remaining_size_ -= result; + DCHECK_GE(remaining_size_, 0); + + base::PostTaskAndReplyWithResult( + task_runner_.get(), FROM_HERE, + base::BindOnce( + [](int fd, scoped_refptr<net::IOBuffer> buf, int size) { + const bool result = + base::WriteFileDescriptor(fd, buf->data(), size); + PLOG_IF(ERROR, !result) << "Write failed."; + return result; + }, + fd_dest_.get(), buf_, result), + base::BindOnce(&FileStreamForwarder::OnWriteCompleted, + weak_ptr_factory_.GetWeakPtr())); +} + +void FileStreamForwarder::OnWriteCompleted(bool result) { + DCHECK_CURRENTLY_ON(BrowserThread::IO); + if (!result) { + NotifyCompleted(false); + return; + } + // Continue reading. + DoRead(); +} + +void FileStreamForwarder::NotifyCompleted(bool result) { + DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK(!callback_.is_null()); + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, + base::BindOnce(std::move(callback_), result)); + callback_.Reset(); // Not to leave the callback in an undefined state. +} + +} // namespace arc
diff --git a/chrome/browser/chromeos/arc/fileapi/file_stream_forwarder.h b/chrome/browser/chromeos/arc/fileapi/file_stream_forwarder.h new file mode 100644 index 0000000..93bdc00d --- /dev/null +++ b/chrome/browser/chromeos/arc/fileapi/file_stream_forwarder.h
@@ -0,0 +1,93 @@ +// 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 CHROME_BROWSER_CHROMEOS_ARC_FILEAPI_FILE_STREAM_FORWARDER_H_ +#define CHROME_BROWSER_CHROMEOS_ARC_FILEAPI_FILE_STREAM_FORWARDER_H_ + +#include <memory> + +#include "base/callback.h" +#include "base/files/scoped_file.h" +#include "base/memory/weak_ptr.h" +#include "net/base/io_buffer.h" +#include "storage/browser/fileapi/file_stream_reader.h" +#include "storage/browser/fileapi/file_system_context.h" + +namespace arc { + +// FileStreamForwarder reads data of the given FileSystemURL, and writes it to +// the given FD. While all internal actions happen on the IO thread, all public +// methods should be called on the UI thread. If this object is destroyed before +// the completion, the in-flight operation may abort before finishing, and the +// callback will be called with false when aborted. +class FileStreamForwarder { + public: + struct DestroyHelper { + void operator()(FileStreamForwarder* object) const { object->Destroy(); } + }; + + // |result| is true when the specified amount of data was successfully + // forwarded. + using ResultCallback = base::OnceCallback<void(bool result)>; + + // Starts reading the part of the file specified by |offset| and |size|, and + // writes the data to |fd_dest|, and runs |callback| with true iff |size| + // bytes of data were successfully read and written. + FileStreamForwarder(scoped_refptr<storage::FileSystemContext> context, + const storage::FileSystemURL& url, + int64_t offset, + int64_t size, + base::ScopedFD fd_dest, + ResultCallback callback); + + // Posts a task to destruct this object on the IO thread. + // Must not be called multiple times for the same object. + void Destroy(); + + private: + // Use Destroy() to destruct this object. + ~FileStreamForwarder(); + + // Destructs this object. + void DestroyOnIOThread(); + + // Starts reading the data. + void Start(); + + // Does the actual reading. + void DoRead(); + + // Called when read is completed. |result| is the number of bytes read, or an + // error code if it's negative. + void OnReadCompleted(int result); + + // Called when write is completed. + void OnWriteCompleted(bool result); + + // Runs the result callback on the UI thread. + void NotifyCompleted(bool result); + + scoped_refptr<storage::FileSystemContext> context_; + const storage::FileSystemURL url_; + const int64_t offset_; + int64_t remaining_size_; + base::ScopedFD fd_dest_; + ResultCallback callback_; + scoped_refptr<base::SequencedTaskRunner> task_runner_; // For blocking IO. + scoped_refptr<net::IOBufferWithSize> buf_; + std::unique_ptr<storage::FileStreamReader> stream_reader_; + + base::WeakPtrFactory<FileStreamForwarder> weak_ptr_factory_; + + DISALLOW_COPY_AND_ASSIGN(FileStreamForwarder); +}; + +// FileStreamForwarderPtr is unique_ptr with a custom deleter. Use this to +// safely handle the ownership of FileStreamForwarder. +using FileStreamForwarderPtr = + std::unique_ptr<FileStreamForwarder, FileStreamForwarder::DestroyHelper>; + +} // namespace arc + +#endif // CHROME_BROWSER_CHROMEOS_ARC_FILEAPI_FILE_STREAM_FORWARDER_H_
diff --git a/chrome/browser/chromeos/arc/fileapi/file_stream_forwarder_unittest.cc b/chrome/browser/chromeos/arc/fileapi/file_stream_forwarder_unittest.cc new file mode 100644 index 0000000..a2090c2 --- /dev/null +++ b/chrome/browser/chromeos/arc/fileapi/file_stream_forwarder_unittest.cc
@@ -0,0 +1,198 @@ +// 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 "chrome/browser/chromeos/arc/fileapi/file_stream_forwarder.h" + +#include "base/files/file_util.h" +#include "base/files/scoped_temp_dir.h" +#include "base/optional.h" +#include "base/rand_util.h" +#include "base/run_loop.h" +#include "content/public/test/test_browser_thread_bundle.h" +#include "storage/browser/fileapi/file_system_context.h" +#include "storage/browser/test/async_file_test_helper.h" +#include "storage/browser/test/test_file_system_context.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace arc { + +namespace { + +class FileStreamForwarderTest : public testing::Test { + public: + FileStreamForwarderTest() {} + + void SetUp() override { + // Prepare a temporary directory and the destination file. + ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); + + dest_file_path_ = temp_dir_.GetPath().AppendASCII("dest"); + base::File dest_file(dest_file_path_, + base::File::FLAG_CREATE | base::File::FLAG_WRITE); + ASSERT_TRUE(dest_file.IsValid()); + dest_fd_ = base::ScopedFD(dest_file.TakePlatformFile()); + + context_ = content::CreateFileSystemContextForTesting(nullptr, + temp_dir_.GetPath()); + + // Prepare a file system. + constexpr char kURLOrigin[] = "http://origin/"; + + context_->OpenFileSystem( + GURL(kURLOrigin), storage::kFileSystemTypeTemporary, + storage::OPEN_FILE_SYSTEM_CREATE_IF_NONEXISTENT, + base::Bind([](const GURL& root_url, const std::string& name, + base::File::Error result) { + EXPECT_EQ(base::File::FILE_OK, result); + })); + base::RunLoop().RunUntilIdle(); + + // Prepare a 64KB file in the file system. + url_ = context_->CreateCrackedFileSystemURL( + GURL(kURLOrigin), storage::kFileSystemTypeTemporary, + base::FilePath().AppendASCII("test.dat")); + + constexpr int kTestDataSize = 1024 * 64; + test_data_ = base::RandBytesAsString(kTestDataSize); + + ASSERT_EQ(base::File::FILE_OK, + content::AsyncFileTestHelper::CreateFileWithData( + context_.get(), url_, test_data_.data(), test_data_.size())); + } + + protected: + content::TestBrowserThreadBundle test_browser_thread_bundle_; + base::ScopedTempDir temp_dir_; + base::FilePath dest_file_path_; + base::ScopedFD dest_fd_; + scoped_refptr<storage::FileSystemContext> context_; + storage::FileSystemURL url_; + std::string test_data_; +}; + +TEST_F(FileStreamForwarderTest, ForwardAll) { + constexpr int kOffset = 0; + const int kSize = test_data_.size(); + base::RunLoop run_loop; + FileStreamForwarderPtr forwarder(new FileStreamForwarder( + context_, url_, kOffset, kSize, std::move(dest_fd_), + base::BindOnce( + [](base::RunLoop* run_loop, bool result) { + EXPECT_TRUE(result); + run_loop->Quit(); + }, + &run_loop))); + run_loop.Run(); + + std::string contents; + ASSERT_TRUE(base::ReadFileToString(dest_file_path_, &contents)); + EXPECT_EQ(test_data_, contents); +} + +TEST_F(FileStreamForwarderTest, ForwardPartially) { + constexpr int kOffset = 12345; + constexpr int kSize = 6789; + base::RunLoop run_loop; + FileStreamForwarderPtr forwarder(new FileStreamForwarder( + context_, url_, kOffset, kSize, std::move(dest_fd_), + base::BindOnce( + [](base::RunLoop* run_loop, bool result) { + EXPECT_TRUE(result); + run_loop->Quit(); + }, + &run_loop))); + run_loop.Run(); + + std::string contents; + ASSERT_TRUE(base::ReadFileToString(dest_file_path_, &contents)); + EXPECT_EQ(std::string(test_data_.begin() + kOffset, + test_data_.begin() + kOffset + kSize), + contents); +} + +TEST_F(FileStreamForwarderTest, ForwardPartially2) { + constexpr int kOffset = 1; + const int kSize = test_data_.size() - 1; + base::RunLoop run_loop; + FileStreamForwarderPtr forwarder(new FileStreamForwarder( + context_, url_, kOffset, kSize, std::move(dest_fd_), + base::BindOnce( + [](base::RunLoop* run_loop, bool result) { + EXPECT_TRUE(result); + run_loop->Quit(); + }, + &run_loop))); + run_loop.Run(); + + std::string contents; + ASSERT_TRUE(base::ReadFileToString(dest_file_path_, &contents)); + EXPECT_EQ(std::string(test_data_.begin() + kOffset, + test_data_.begin() + kOffset + kSize), + contents); +} + +TEST_F(FileStreamForwarderTest, ForwardTooMuch) { + constexpr int kOffset = 0; + const int kSize = test_data_.size() + 1; // Request more than provided. + base::RunLoop run_loop; + FileStreamForwarderPtr forwarder(new FileStreamForwarder( + context_, url_, kOffset, kSize, std::move(dest_fd_), + base::BindOnce( + [](base::RunLoop* run_loop, bool result) { + EXPECT_FALSE(result); + run_loop->Quit(); + }, + &run_loop))); + run_loop.Run(); + + std::string contents; + ASSERT_TRUE(base::ReadFileToString(dest_file_path_, &contents)); + EXPECT_EQ(test_data_, contents); +} + +TEST_F(FileStreamForwarderTest, ForwardTooMuch2) { + constexpr int kOffset = 1; + const int kSize = test_data_.size(); // Request more than provided. + base::RunLoop run_loop; + FileStreamForwarderPtr forwarder(new FileStreamForwarder( + context_, url_, kOffset, kSize, std::move(dest_fd_), + base::BindOnce( + [](base::RunLoop* run_loop, bool result) { + EXPECT_FALSE(result); + run_loop->Quit(); + }, + &run_loop))); + run_loop.Run(); + + std::string contents; + ASSERT_TRUE(base::ReadFileToString(dest_file_path_, &contents)); + EXPECT_EQ(std::string(test_data_.begin() + kOffset, test_data_.end()), + contents); +} + +TEST_F(FileStreamForwarderTest, InvalidURL) { + storage::FileSystemURL invalid_url = context_->CreateCrackedFileSystemURL( + GURL("http://invalid-origin/"), storage::kFileSystemTypeTemporary, + base::FilePath().AppendASCII("invalid.dat")); + constexpr int kOffset = 0; + const int kSize = test_data_.size(); + base::RunLoop run_loop; + FileStreamForwarderPtr forwarder(new FileStreamForwarder( + context_, invalid_url, kOffset, kSize, std::move(dest_fd_), + base::BindOnce( + [](base::RunLoop* run_loop, bool result) { + EXPECT_FALSE(result); + run_loop->Quit(); + }, + &run_loop))); + run_loop.Run(); + + std::string contents; + ASSERT_TRUE(base::ReadFileToString(dest_file_path_, &contents)); + EXPECT_TRUE(contents.empty()); +} + +} // namespace + +} // namespace arc
diff --git a/chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_framework_service.cc b/chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_framework_service.cc index a2a2c17..ebeb068 100644 --- a/chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_framework_service.cc +++ b/chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_framework_service.cc
@@ -283,7 +283,16 @@ void ArcVoiceInteractionFrameworkService::SetVoiceInteractionRunning( bool running) { - ash::Shell::Get()->NotifyVoiceInteractionStatusChanged(running); + ash::Shell::Get()->NotifyVoiceInteractionStatusChanged( + running ? ash::VoiceInteractionState::RUNNING + : ash::VoiceInteractionState::STOPPED); +} + +void ArcVoiceInteractionFrameworkService::SetVoiceInteractionState( + ash::VoiceInteractionState state) { + DCHECK_NE(state_, state); + state_ = state; + ash::Shell::Get()->NotifyVoiceInteractionStatusChanged(state); } void ArcVoiceInteractionFrameworkService::OnMetalayerClosed() { @@ -414,6 +423,12 @@ return; } + if (state_ == ash::VoiceInteractionState::NOT_READY) { + // If the container side is not ready, we will be waiting for a while. + ash::Shell::Get()->NotifyVoiceInteractionStatusChanged( + ash::VoiceInteractionState::NOT_READY); + } + if (!arc_bridge_service_->voice_interaction_framework()->has_instance()) { VLOG(1) << "Instance not ready."; SetArcCpuRestriction(false);
diff --git a/chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_framework_service.h b/chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_framework_service.h index 7335e00a..507e264 100644 --- a/chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_framework_service.h +++ b/chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_framework_service.h
@@ -62,6 +62,7 @@ void OnMetalayerClosed() override; void SetMetalayerEnabled(bool enabled) override; void SetVoiceInteractionRunning(bool running) override; + void SetVoiceInteractionState(ash::VoiceInteractionState state) override; bool IsMetalayerSupported(); void ShowMetalayer(const base::Closure& closed); @@ -117,6 +118,12 @@ // Whether there is a pending request to start voice interaction. bool is_request_pending_ = false; + // The current state voice interaction service is. There is usually a long + // delay after boot before the service is ready. We wait for the container + // to tell us if it is ready to quickly serve voice interaction requests. + // We also give user proper feedback based on the state. + ash::VoiceInteractionState state_ = ash::VoiceInteractionState::NOT_READY; + // The time when a user initated an interaction. base::TimeTicks user_interaction_start_time_;
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc index fbf927a..721c39f0 100644 --- a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc
@@ -94,7 +94,7 @@ ProfileInfo profile_info; profile_info.profile_id = multi_user_util::GetAccountIdFromProfile(profile).GetUserEmail(); - profile_info.display_name = UTF16ToUTF8(user->GetDisplayName()); + profile_info.display_name = base::UTF16ToUTF8(user->GetDisplayName()); // TODO(hirono): Remove the property from the profile_info. profile_info.is_current_profile = true; @@ -188,8 +188,8 @@ result.allow_redeem_offers = true; } result.timezone = - UTF16ToUTF8(chromeos::system::TimezoneSettings::GetInstance() - ->GetCurrentTimezoneID()); + base::UTF16ToUTF8(chromeos::system::TimezoneSettings::GetInstance() + ->GetCurrentTimezoneID()); drive::EventLogger* logger = file_manager::util::GetLogger(profile); if (logger)
diff --git a/chrome/browser/chromeos/feedback_util.cc b/chrome/browser/chromeos/feedback_util.cc index c629cd6..4c8eb3b 100644 --- a/chrome/browser/chromeos/feedback_util.cc +++ b/chrome/browser/chromeos/feedback_util.cc
@@ -6,10 +6,11 @@ #include "base/bind.h" #include "base/callback.h" -#include "base/logging.h" #include "chrome/browser/extensions/api/feedback_private/feedback_private_api.h" #include "chrome/browser/extensions/api/feedback_private/feedback_service.h" +#include "chrome/browser/feedback/system_logs/chrome_system_logs_fetcher.h" #include "chrome/browser/profiles/profile.h" +#include "components/feedback/system_logs/system_logs_fetcher.h" using feedback::FeedbackData; @@ -34,7 +35,7 @@ feedback_data->set_description(description); feedback_data->SetAndCompressSystemInfo(std::move(sys_info)); - GetFeedbackService(profile)->SendFeedback(profile, feedback_data, callback); + GetFeedbackService(profile)->SendFeedback(feedback_data, callback); } } // namespace @@ -42,7 +43,10 @@ void SendSysLogFeedback(Profile* profile, const std::string& description, const SendSysLogFeedbackCallback& callback) { - GetFeedbackService(profile)->GetSystemInformation( + // |fetcher| deletes itself after calling its callback. + system_logs::SystemLogsFetcher* fetcher = + system_logs::BuildChromeSystemLogsFetcher(); + fetcher->Fetch( base::Bind(&OnGetSystemInformation, profile, description, callback)); }
diff --git a/chrome/browser/chromeos/file_manager/external_filesystem_apitest.cc b/chrome/browser/chromeos/file_manager/external_filesystem_apitest.cc index 150f3500..928d1c5 100644 --- a/chrome/browser/chromeos/file_manager/external_filesystem_apitest.cc +++ b/chrome/browser/chromeos/file_manager/external_filesystem_apitest.cc
@@ -467,9 +467,12 @@ // DriveIntegrationService factory function for this test. drive::DriveIntegrationService* CreateDriveIntegrationService( Profile* profile) { - // Ignore signin profile. - if (profile->GetPath() == chromeos::ProfileHelper::GetSigninProfileDir()) + // Ignore signin and lock screen apps profile. + if (profile->GetPath() == chromeos::ProfileHelper::GetSigninProfileDir() || + profile->GetPath() == + chromeos::ProfileHelper::GetLockScreenAppProfilePath()) { return nullptr; + } // DriveFileSystemExtensionApiTest doesn't expect that several user profiles // could exist simultaneously.
diff --git a/chrome/browser/chromeos/first_run/first_run.cc b/chrome/browser/chromeos/first_run/first_run.cc index 9b211159..9c836edd 100644 --- a/chrome/browser/chromeos/first_run/first_run.cc +++ b/chrome/browser/chromeos/first_run/first_run.cc
@@ -14,6 +14,8 @@ #include "chrome/browser/chromeos/login/wizard_controller.h" #include "chrome/browser/chromeos/profiles/profile_helper.h" #include "chrome/browser/extensions/extension_service.h" +#include "chrome/browser/policy/profile_policy_connector.h" +#include "chrome/browser/policy/profile_policy_connector_factory.h" #include "chrome/browser/prefs/pref_service_syncable_util.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/signin/signin_manager_factory.h" @@ -72,6 +74,10 @@ return; } + if (policy::ProfilePolicyConnectorFactory::GetForBrowserContext(profile) + ->IsManaged()) + return; + if (command_line->HasSwitch(::switches::kTestType)) return; @@ -152,10 +158,10 @@ } // namespace void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) { - registry->RegisterBooleanPref( - prefs::kFirstRunTutorialShown, - false, - user_prefs::PrefRegistrySyncable::SYNCABLE_PRIORITY_PREF); + // This preference used to be syncable, change it to non-syncable so new + // users will always see the welcome app on a new device. + // See crbug.com/752361 + registry->RegisterBooleanPref(prefs::kFirstRunTutorialShown, false); } void MaybeLaunchDialogAfterSessionStart() {
diff --git a/chrome/browser/chromeos/first_run/goodies_displayer_browsertest.cc b/chrome/browser/chromeos/first_run/goodies_displayer_browsertest.cc index e19be6e..1915915b 100644 --- a/chrome/browser/chromeos/first_run/goodies_displayer_browsertest.cc +++ b/chrome/browser/chromeos/first_run/goodies_displayer_browsertest.cc
@@ -2,9 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "chrome/browser/chromeos/first_run/goodies_displayer.h" + #include "base/command_line.h" #include "chrome/browser/browser_process.h" -#include "chrome/browser/chromeos/first_run/goodies_displayer.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" @@ -84,6 +85,13 @@ // InProcessBrowserTest overrides. void SetUpDefaultCommandLine(base::CommandLine* command_line) override { base::CommandLine default_command_line(base::CommandLine::NO_PROGRAM); + if (command_line->HasSwitch(switches::kMus)) { + default_command_line.AppendSwitch(switches::kMus); + } else if (command_line->HasSwitch(switches::kMusConfig)) { + default_command_line.AppendSwitchASCII( + switches::kMusConfig, + command_line->GetSwitchValueASCII(switches::kMusConfig)); + } InProcessBrowserTest::SetUpDefaultCommandLine(&default_command_line); if (NoFirstRunSpecified()) { // --no-first-run is present by default. *command_line = default_command_line;
diff --git a/chrome/browser/chromeos/input_method/input_method_engine_browsertests.cc b/chrome/browser/chromeos/input_method/input_method_engine_browsertests.cc index 37740abc..2ccc952 100644 --- a/chrome/browser/chromeos/input_method/input_method_engine_browsertests.cc +++ b/chrome/browser/chromeos/input_method/input_method_engine_browsertests.cc
@@ -563,20 +563,20 @@ const ui::CompositionText& composition_text = mock_input_context->last_update_composition_arg().composition_text; EXPECT_EQ(base::UTF8ToUTF16("COMPOSITION_TEXT"), composition_text.text); - const ui::CompositionUnderlines underlines = composition_text.underlines; + const ui::ImeTextSpans ime_text_spans = composition_text.ime_text_spans; - ASSERT_EQ(2U, underlines.size()); + ASSERT_EQ(2U, ime_text_spans.size()); // single underline - EXPECT_EQ(SK_ColorBLACK, underlines[0].color); - EXPECT_FALSE(underlines[0].thick); - EXPECT_EQ(0U, underlines[0].start_offset); - EXPECT_EQ(5U, underlines[0].end_offset); + EXPECT_EQ(SK_ColorBLACK, ime_text_spans[0].color); + EXPECT_FALSE(ime_text_spans[0].thick); + EXPECT_EQ(0U, ime_text_spans[0].start_offset); + EXPECT_EQ(5U, ime_text_spans[0].end_offset); // double underline - EXPECT_EQ(SK_ColorBLACK, underlines[1].color); - EXPECT_TRUE(underlines[1].thick); - EXPECT_EQ(6U, underlines[1].start_offset); - EXPECT_EQ(10U, underlines[1].end_offset); + EXPECT_EQ(SK_ColorBLACK, ime_text_spans[1].color); + EXPECT_TRUE(ime_text_spans[1].thick); + EXPECT_EQ(6U, ime_text_spans[1].start_offset); + EXPECT_EQ(10U, ime_text_spans[1].end_offset); } { SCOPED_TRACE("clearComposition test"); @@ -1027,14 +1027,14 @@ const ui::CompositionText& composition_text = mock_input_context->last_update_composition_arg().composition_text; EXPECT_EQ(base::UTF8ToUTF16("us"), composition_text.text); - const ui::CompositionUnderlines underlines = composition_text.underlines; + const ui::ImeTextSpans ime_text_spans = composition_text.ime_text_spans; - ASSERT_EQ(1U, underlines.size()); + ASSERT_EQ(1U, ime_text_spans.size()); // single underline - EXPECT_EQ(SK_ColorBLACK, underlines[0].color); - EXPECT_FALSE(underlines[0].thick); - EXPECT_EQ(0U, underlines[0].start_offset); - EXPECT_EQ(1U, underlines[0].end_offset); + EXPECT_EQ(SK_ColorBLACK, ime_text_spans[0].color); + EXPECT_FALSE(ime_text_spans[0].thick); + EXPECT_EQ(0U, ime_text_spans[0].start_offset); + EXPECT_EQ(1U, ime_text_spans[0].end_offset); EXPECT_TRUE(mock_input_context->last_commit_text().empty()); InputMethodManager::Get()->GetActiveIMEState()->ChangeInputMethod(
diff --git a/chrome/browser/chromeos/input_method/textinput_surroundingtext_browsertest.cc b/chrome/browser/chromeos/input_method/textinput_surroundingtext_browsertest.cc index d8ac3f04..f03a9a1 100644 --- a/chrome/browser/chromeos/input_method/textinput_surroundingtext_browsertest.cc +++ b/chrome/browser/chromeos/input_method/textinput_surroundingtext_browsertest.cc
@@ -10,7 +10,6 @@ #include "content/public/browser/web_contents.h" #include "content/public/test/browser_test_utils.h" #include "testing/gtest/include/gtest/gtest.h" -#include "ui/base/ime/composition_underline.h" namespace chromeos {
diff --git a/chrome/browser/chromeos/lock_screen_apps/app_manager_impl.cc b/chrome/browser/chromeos/lock_screen_apps/app_manager_impl.cc index 92181d0..5c96c03 100644 --- a/chrome/browser/chromeos/lock_screen_apps/app_manager_impl.cc +++ b/chrome/browser/chromeos/lock_screen_apps/app_manager_impl.cc
@@ -15,9 +15,11 @@ #include "base/files/scoped_temp_dir.h" #include "base/memory/ptr_util.h" #include "base/memory/ref_counted.h" +#include "base/metrics/histogram_macros.h" #include "base/sequenced_task_runner.h" #include "base/strings/string16.h" #include "base/threading/thread_task_runner_handle.h" +#include "base/time/tick_clock.h" #include "chrome/browser/chromeos/note_taking_helper.h" #include "chrome/browser/chromeos/profiles/profile_helper.h" #include "chrome/browser/extensions/extension_assets_manager.h" @@ -40,6 +42,38 @@ using ExtensionCallback = base::Callback<void( const scoped_refptr<const extensions::Extension>& extension)>; +// The lock screen note taking availability state. +// Used to report UMA histograms - the values should map to +// LockScreenActionAvailability UMA enum values, and the values assigned to +// enum states should NOT be changed. +enum class ActionAvailability { + kAvailable = 0, + kNoActionHandlerApp = 1, + kAppNotSupportingLockScreen = 2, + kActionNotEnabledOnLockScreen = 3, + kDisallowedByPolicy = 4, + kCount, +}; + +ActionAvailability GetLockScreenNoteTakingAvailability( + chromeos::NoteTakingAppInfo* app_info) { + if (!app_info || !app_info->preferred) + return ActionAvailability::kNoActionHandlerApp; + + switch (app_info->lock_screen_support) { + case chromeos::NoteTakingLockScreenSupport::kNotSupported: + return ActionAvailability::kAppNotSupportingLockScreen; + case chromeos::NoteTakingLockScreenSupport::kSupported: + return ActionAvailability::kActionNotEnabledOnLockScreen; + case chromeos::NoteTakingLockScreenSupport::kNotAllowedByPolicy: + return ActionAvailability::kDisallowedByPolicy; + case chromeos::NoteTakingLockScreenSupport::kEnabled: + return ActionAvailability::kAvailable; + } + + return ActionAvailability::kAppNotSupportingLockScreen; +} + void InvokeCallbackOnTaskRunner( const ExtensionCallback& callback, const scoped_refptr<base::SequencedTaskRunner>& task_runner, @@ -113,8 +147,9 @@ } // namespace -AppManagerImpl::AppManagerImpl() - : extensions_observer_(this), +AppManagerImpl::AppManagerImpl(base::TickClock* tick_clock) + : tick_clock_(tick_clock), + extensions_observer_(this), note_taking_helper_observer_(this), weak_ptr_factory_(this) {} @@ -264,12 +299,15 @@ std::unique_ptr<chromeos::NoteTakingAppInfo> note_taking_app = chromeos::NoteTakingHelper::Get()->GetPreferredChromeAppInfo( primary_profile_); + ActionAvailability availability = + GetLockScreenNoteTakingAvailability(note_taking_app.get()); - if (!note_taking_app || !note_taking_app->preferred || - note_taking_app->lock_screen_support != - chromeos::NoteTakingLockScreenSupport::kEnabled) { + UMA_HISTOGRAM_ENUMERATION( + "Apps.LockScreen.NoteTakingApp.AvailabilityOnScreenLock", availability, + ActionAvailability::kCount); + + if (availability != ActionAvailability::kAvailable) return std::string(); - } return note_taking_app->app_id; } @@ -325,14 +363,20 @@ lock_screen_service->install_directory(), lock_screen_profile_, base::Bind(&InvokeCallbackOnTaskRunner, base::Bind(&AppManagerImpl::CompleteLockScreenAppInstall, - weak_ptr_factory_.GetWeakPtr(), install_count_), + weak_ptr_factory_.GetWeakPtr(), install_count_, + tick_clock_->NowTicks()), base::ThreadTaskRunnerHandle::Get()))); return State::kActivating; } void AppManagerImpl::CompleteLockScreenAppInstall( int install_id, + base::TimeTicks install_start_time, const scoped_refptr<const extensions::Extension>& app) { + UMA_HISTOGRAM_TIMES( + "Apps.LockScreen.NoteTakingApp.LockScreenInstallationDuration", + tick_clock_->NowTicks() - install_start_time); + // Bail out if the app manager is no longer waiting for this app's // installation - the copied resources will be cleaned up when the (ephemeral) // lock screen profile is destroyed.
diff --git a/chrome/browser/chromeos/lock_screen_apps/app_manager_impl.h b/chrome/browser/chromeos/lock_screen_apps/app_manager_impl.h index 4f658cd..61a230e 100644 --- a/chrome/browser/chromeos/lock_screen_apps/app_manager_impl.h +++ b/chrome/browser/chromeos/lock_screen_apps/app_manager_impl.h
@@ -11,12 +11,17 @@ #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "base/scoped_observer.h" +#include "base/time/time.h" #include "chrome/browser/chromeos/lock_screen_apps/app_manager.h" #include "chrome/browser/chromeos/note_taking_helper.h" #include "extensions/browser/extension_registry_observer.h" class Profile; +namespace base { +class TickClock; +} + namespace extensions { class Extension; class ExtensionRegistry; @@ -29,7 +34,7 @@ public chromeos::NoteTakingHelper::Observer, public extensions::ExtensionRegistryObserver { public: - AppManagerImpl(); + explicit AppManagerImpl(base::TickClock* tick_clock); ~AppManagerImpl() override; // AppManager implementation: @@ -77,6 +82,7 @@ // installation failed. void CompleteLockScreenAppInstall( int install_id, + base::TimeTicks install_start_time, const scoped_refptr<const extensions::Extension>& app); // Installs app to the lock screen profile's extension service and enables @@ -106,6 +112,8 @@ State state_ = State::kNotInitialized; std::string lock_screen_app_id_; + base::TickClock* tick_clock_; + ScopedObserver<extensions::ExtensionRegistry, extensions::ExtensionRegistryObserver> extensions_observer_;
diff --git a/chrome/browser/chromeos/lock_screen_apps/app_manager_impl_unittest.cc b/chrome/browser/chromeos/lock_screen_apps/app_manager_impl_unittest.cc index 4ff90d6e..d459dd5c 100644 --- a/chrome/browser/chromeos/lock_screen_apps/app_manager_impl_unittest.cc +++ b/chrome/browser/chromeos/lock_screen_apps/app_manager_impl_unittest.cc
@@ -14,6 +14,7 @@ #include "base/json/json_file_value_serializer.h" #include "base/memory/ptr_util.h" #include "base/test/scoped_command_line.h" +#include "base/test/simple_test_tick_clock.h" #include "base/values.h" #include "chrome/browser/chromeos/arc/arc_session_manager.h" #include "chrome/browser/chromeos/login/users/scoped_test_user_manager.h" @@ -358,7 +359,9 @@ AppManager* app_manager() { return app_manager_.get(); } - void ResetAppManager() { app_manager_ = base::MakeUnique<AppManagerImpl>(); } + void ResetAppManager() { + app_manager_ = base::MakeUnique<AppManagerImpl>(&tick_clock_); + } int note_taking_changed_count() const { return note_taking_changed_count_; } @@ -378,6 +381,9 @@ int NoteTakingChangedCountOnStart() { return IsInstallAsync() ? 1 : 0; } + protected: + base::SimpleTestTickClock tick_clock_; + private: void OnNoteTakingChanged() { ++note_taking_changed_count_; }
diff --git a/chrome/browser/chromeos/lock_screen_apps/app_window_metrics_tracker.cc b/chrome/browser/chromeos/lock_screen_apps/app_window_metrics_tracker.cc new file mode 100644 index 0000000..2f82e60 --- /dev/null +++ b/chrome/browser/chromeos/lock_screen_apps/app_window_metrics_tracker.cc
@@ -0,0 +1,172 @@ +// 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 "chrome/browser/chromeos/lock_screen_apps/app_window_metrics_tracker.h" + +#include "base/metrics/histogram_macros.h" +#include "base/time/tick_clock.h" +#include "base/time/time.h" +#include "extensions/browser/app_window/app_window.h" + +namespace { + +// Name of the count histogram used to keep track of (1-indexed) app launch +// request ordinal number in a lock screen session. +const char kAppLaunchOrdinalNumberInLockSession[] = + "Apps.LockScreen.NoteTakingApp.LaunchRequestOrdinalNumber"; + +// Name of the histogram that tracks total amount of time an app window was +// active for a single launch event - i.e. time from app window being shown to +// app window closure. +const char kTotalAppWindowSessionTime[] = + "Apps.LockScreen.NoteTakingApp.AppWindowLifeTime.TotalActive"; + +// Name of the histogram that tracks amount of time an app window was in +// foreground, on top the lock screen. +const char kTimeAppWindowInForeground[] = + "Apps.LockScreen.NoteTakingApp.AppWindowLifeTime.Foreground"; + +// Name of the histogram that track amount of time an app window was in +// background, behind the lock screen. +const char kTimeAppWindowInBackground[] = + "Apps.LockScreen.NoteTakingApp.AppWindowLifeTime.Background"; + +// Name of the histogram that tracks the amount time needed to show an app +// window (the window render view being created) after the app launch was +// requested. +const char kTimeFromLaunchToWindowBeingShown[] = + "Apps.LockScreen.NoteTakingApp.TimeToShowWindow"; + +// Name of the histogram that tracks the amount of time needed to load the an +// app window contents after the app launch was requested. +const char kTimeToLoadAppWindowContents[] = + "Apps.LockScreen.NoteTakingApp.TimeToLoadAppWindowContents"; + +// The name of the histogram that tracks the amount of time the app was in +// launching state when the launch got canceled. +const char kLaunchDurationAtLaunchCancel[] = + "Apps.LockScreen.NoteTakingApp.LaunchDurationAtLaunchCancel"; + +// The name of the histogram that track the app state when the app lock screen +// ends. +const char kAppWindowStateOnRemoval[] = + "Apps.LockScreen.NoteTakingApp.FinalAppSessionState"; + +} // namespace + +namespace lock_screen_apps { + +AppWindowMetricsTracker::AppWindowMetricsTracker(base::TickClock* clock) + : clock_(clock) {} + +AppWindowMetricsTracker::~AppWindowMetricsTracker() = default; + +void AppWindowMetricsTracker::AppLaunchRequested() { + DCHECK_EQ(State::kInitial, state_); + SetState(State::kLaunchRequested); + + ++app_launch_count_; + UMA_HISTOGRAM_COUNTS_100(kAppLaunchOrdinalNumberInLockSession, + app_launch_count_); +} + +void AppWindowMetricsTracker::MovedToForeground() { + DCHECK_NE(State::kInitial, state_); + + if (state_ == State::kForeground) + return; + + if (state_ == State::kBackground) { + SetState(State::kForeground); + return; + } + + // Not expected to be in a state different than foreground or background + // after |state_after_window_contents_load_| is reset. + DCHECK(state_after_window_contents_load_.has_value()); + state_after_window_contents_load_ = State::kForeground; +} + +void AppWindowMetricsTracker::MovedToBackground() { + DCHECK_NE(State::kInitial, state_); + + if (state_ == State::kBackground) + return; + + if (state_ == State::kForeground) { + SetState(State::kBackground); + return; + } + + // Not expected to be in a state different than foreground or background + // after |state_after_window_contents_load_| is reset. + DCHECK(state_after_window_contents_load_.has_value()); + state_after_window_contents_load_ = State::kBackground; +} + +void AppWindowMetricsTracker::AppWindowCreated( + extensions::AppWindow* app_window) { + Observe(app_window->web_contents()); + + SetState(State::kWindowCreated); +} + +void AppWindowMetricsTracker::Reset() { + if (state_ == State::kInitial) + return; + + UMA_HISTOGRAM_ENUMERATION(kAppWindowStateOnRemoval, state_, State::kCount); + + if (state_ != State::kLaunchRequested && state_ != State::kWindowCreated) { + UMA_HISTOGRAM_LONG_TIMES( + kTotalAppWindowSessionTime, + clock_->NowTicks() - time_stamps_[State::kWindowShown]); + } else { + UMA_HISTOGRAM_TIMES( + kLaunchDurationAtLaunchCancel, + clock_->NowTicks() - time_stamps_[State::kLaunchRequested]); + } + + SetState(State::kInitial); + + state_after_window_contents_load_ = State::kForeground; + + time_stamps_.clear(); +} + +void AppWindowMetricsTracker::RenderViewCreated( + content::RenderViewHost* render_view_host) { + SetState(State::kWindowShown); + + UMA_HISTOGRAM_TIMES( + kTimeFromLaunchToWindowBeingShown, + clock_->NowTicks() - time_stamps_[State::kLaunchRequested]); +} + +void AppWindowMetricsTracker::DocumentOnLoadCompletedInMainFrame() { + State next_state = state_after_window_contents_load_.value(); + state_after_window_contents_load_.reset(); + SetState(next_state); + + UMA_HISTOGRAM_TIMES(kTimeToLoadAppWindowContents, + clock_->NowTicks() - time_stamps_[State::kWindowShown]); +} + +void AppWindowMetricsTracker::SetState(State state) { + if (state_ == state) + return; + + if (state_ == State::kForeground) { + UMA_HISTOGRAM_MEDIUM_TIMES(kTimeAppWindowInForeground, + clock_->NowTicks() - time_stamps_[state_]); + } else if (state_ == State::kBackground) { + UMA_HISTOGRAM_MEDIUM_TIMES(kTimeAppWindowInBackground, + clock_->NowTicks() - time_stamps_[state_]); + } + + state_ = state; + time_stamps_[state] = clock_->NowTicks(); +} + +} // namespace lock_screen_apps
diff --git a/chrome/browser/chromeos/lock_screen_apps/app_window_metrics_tracker.h b/chrome/browser/chromeos/lock_screen_apps/app_window_metrics_tracker.h new file mode 100644 index 0000000..a5c95ab --- /dev/null +++ b/chrome/browser/chromeos/lock_screen_apps/app_window_metrics_tracker.h
@@ -0,0 +1,86 @@ +// 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 CHROME_BROWSER_CHROMEOS_LOCK_SCREEN_APPS_APP_WINDOW_METRICS_TRACKER_H_ +#define CHROME_BROWSER_CHROMEOS_LOCK_SCREEN_APPS_APP_WINDOW_METRICS_TRACKER_H_ + +#include <map> + +#include "base/macros.h" +#include "base/optional.h" +#include "base/time/time.h" +#include "content/public/browser/web_contents_observer.h" + +namespace base { +class TickClock; +} + +namespace extensions { +class AppWindow; +} + +namespace lock_screen_apps { + +// Helper for tracking metrics for lock screen app window launches. +class AppWindowMetricsTracker : public content::WebContentsObserver { + public: + explicit AppWindowMetricsTracker(base::TickClock* clock); + ~AppWindowMetricsTracker() override; + + // Register app launch request. + void AppLaunchRequested(); + + // Registers the app window created for lock screen action - the class + // will begin observing the app window state as a result. + void AppWindowCreated(extensions::AppWindow* app_window); + + // Updates metrics state for app window being moved to foreground. + void MovedToForeground(); + + // Updates metrics state for app window being moved to background. + void MovedToBackground(); + + // Stops tracking current app window state, and resets collected timestamps. + void Reset(); + + // content::WebContentsObserver: + void RenderViewCreated(content::RenderViewHost* render_view_host) override; + void DocumentOnLoadCompletedInMainFrame() override; + + private: + // NOTE: Used in histograms - do not change order, or remove entries. + // Also, update LockScreenAppSessionState enum. + enum class State { + kInitial = 0, + kLaunchRequested = 1, + kWindowCreated = 2, + kWindowShown = 3, + kForeground = 4, + kBackground = 5, + kCount + }; + + void SetState(State state); + + base::TickClock* clock_; + + State state_ = State::kInitial; + + // Maps states to their last occurrence time. + std::map<State, base::TimeTicks> time_stamps_; + + // Number of times app launch was requested during the + int app_launch_count_ = 0; + + // The state to which the metrics tracker should move after + // the window contents is loaded. + // Should be either kForeground or kBackground. + base::Optional<State> state_after_window_contents_load_ = State::kForeground; + + DISALLOW_COPY_AND_ASSIGN(AppWindowMetricsTracker); +}; + +} // namespace lock_screen_apps + +#endif // CHROME_BROWSER_CHROMEOS_LOCK_SCREEN_APPS_APP_WINDOW_METRICS_TRACKER_H_
diff --git a/chrome/browser/chromeos/lock_screen_apps/state_controller.cc b/chrome/browser/chromeos/lock_screen_apps/state_controller.cc index 843225e6..18b8f214 100644 --- a/chrome/browser/chromeos/lock_screen_apps/state_controller.cc +++ b/chrome/browser/chromeos/lock_screen_apps/state_controller.cc
@@ -11,10 +11,13 @@ #include "base/bind.h" #include "base/command_line.h" #include "base/memory/ptr_util.h" +#include "base/metrics/histogram_macros.h" #include "base/path_service.h" #include "base/strings/string16.h" +#include "base/time/default_tick_clock.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/chromeos/lock_screen_apps/app_manager_impl.h" +#include "chrome/browser/chromeos/lock_screen_apps/app_window_metrics_tracker.h" #include "chrome/browser/chromeos/lock_screen_apps/focus_cycler_delegate.h" #include "chrome/browser/chromeos/note_taking_helper.h" #include "chrome/browser/chromeos/profiles/profile_helper.h" @@ -25,6 +28,7 @@ #include "chromeos/dbus/dbus_thread_manager.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" +#include "components/safe_browsing/common/safe_browsing_prefs.h" #include "components/session_manager/core/session_manager.h" #include "content/public/browser/web_contents.h" #include "content/public/common/service_manager_connection.h" @@ -118,6 +122,8 @@ } void StateController::Initialize() { + tick_clock_ = base::MakeUnique<base::DefaultTickClock>(); + // The tray action ptr might be set previously if the client was being created // for testing. if (!tray_action_ptr_) { @@ -144,7 +150,8 @@ lock_screen_data_.reset(); if (app_manager_) { app_manager_->Stop(); - ResetNoteTakingWindowAndMoveToNextState(true /*close_window*/); + ResetNoteTakingWindowAndMoveToNextState(true /*close_window*/, + NoteTakingExitReason::kShutdown); app_manager_.reset(); } focus_cycler_delegate_ = nullptr; @@ -159,8 +166,15 @@ Profile::CreateStatus status) { // Ignore CREATED status - wait for profile to be initialized before // continuing. - if (status == Profile::CREATE_STATUS_CREATED) + if (status == Profile::CREATE_STATUS_CREATED) { + // Disable safe browsing for the profile to avoid activating + // SafeBrowsingService when the user has safe browsing disabled (reasoning + // similar to http://crbug.com/461493). + // TODO(tbarzic): Revisit this if webviews get enabled for lock screen apps. + lock_screen_profile->GetPrefs()->SetBoolean(prefs::kSafeBrowsingEnabled, + false); return; + } // On error, bail out - this will cause the lock screen apps to remain // unavailable on the device. @@ -219,7 +233,7 @@ // App manager might have been set previously by a test. if (!app_manager_) - app_manager_ = base::MakeUnique<AppManagerImpl>(); + app_manager_ = base::MakeUnique<AppManagerImpl>(tick_clock_.get()); app_manager_->Initialize(profile, lock_screen_profile_->GetOriginalProfile()); input_devices_observer_.Add(ui::InputDeviceManager::GetInstance()); @@ -262,23 +276,19 @@ } void StateController::RequestNewLockScreenNote() { - if (lock_screen_note_state_ != TrayActionState::kAvailable) - return; - - DCHECK(app_manager_->IsNoteTakingAppAvailable()); - - // Update state to launching even if app fails to launch - this is to notify - // listeners that a lock screen note request was handled. - UpdateLockScreenNoteState(TrayActionState::kLaunching); - if (!app_manager_->LaunchNoteTaking()) - UpdateLockScreenNoteState(TrayActionState::kAvailable); + HandleNewNoteRequest(NewNoteRequestType::kTrayAction); } void StateController::OnSessionStateChanged() { if (!session_manager::SessionManager::Get()->IsScreenLocked()) { lock_screen_data_->SetSessionLocked(false); app_manager_->Stop(); - ResetNoteTakingWindowAndMoveToNextState(true /*close_window*/); + if (lock_screen_note_state_ == TrayActionState::kBackground) { + RecordLockScreenAppUnlockAction(LockScreenUnlockAction::kSessionUnlocked); + } + ResetNoteTakingWindowAndMoveToNextState( + true /*close_window*/, NoteTakingExitReason::kSessionUnlock); + note_app_window_metrics_.reset(); return; } @@ -288,14 +298,23 @@ app_manager_->Start( base::Bind(&StateController::OnNoteTakingAvailabilityChanged, base::Unretained(this))); + note_app_window_metrics_ = + base::MakeUnique<AppWindowMetricsTracker>(tick_clock_.get()); lock_screen_data_->SetSessionLocked(true); OnNoteTakingAvailabilityChanged(); } +void StateController::OnAppWindowAdded(extensions::AppWindow* app_window) { + if (note_app_window_ != app_window) + return; + note_app_window_metrics_->AppWindowCreated(app_window); +} + void StateController::OnAppWindowRemoved(extensions::AppWindow* app_window) { if (note_app_window_ != app_window) return; - ResetNoteTakingWindowAndMoveToNextState(false /*close_window*/); + ResetNoteTakingWindowAndMoveToNextState( + false /*close_window*/, NoteTakingExitReason::kAppWindowClosed); } void StateController::OnStylusStateChanged(ui::StylusState state) { @@ -303,16 +322,19 @@ return; if (state == ui::StylusState::REMOVED) - RequestNewLockScreenNote(); + HandleNewNoteRequest(NewNoteRequestType::kStylusEject); } void StateController::BrightnessChanged(int level, bool user_initiated) { - if (level == 0 && !user_initiated) - ResetNoteTakingWindowAndMoveToNextState(true /*close_window*/); + if (level == 0 && !user_initiated) { + ResetNoteTakingWindowAndMoveToNextState( + true /*close_window*/, NoteTakingExitReason::kScreenDimmed); + } } void StateController::SuspendImminent() { - ResetNoteTakingWindowAndMoveToNextState(true /*close_window*/); + ResetNoteTakingWindowAndMoveToNextState(true /*close_window*/, + NoteTakingExitReason::kSuspend); } extensions::AppWindow* StateController::CreateAppWindowForLockScreenAction( @@ -362,8 +384,10 @@ void StateController::MoveToBackground() { if (GetLockScreenNoteState() == TrayActionState::kLaunching) { + note_app_window_metrics_->Reset(); UpdateLockScreenNoteState(TrayActionState::kAvailable); } else if (GetLockScreenNoteState() == TrayActionState::kActive) { + note_app_window_metrics_->MovedToBackground(); UpdateLockScreenNoteState(TrayActionState::kBackground); } } @@ -371,14 +395,58 @@ void StateController::MoveToForeground() { if (GetLockScreenNoteState() != TrayActionState::kBackground) return; + + RecordLockScreenAppUnlockAction(LockScreenUnlockAction::kUnlockCancelled); + + note_app_window_metrics_->MovedToForeground(); UpdateLockScreenNoteState(TrayActionState::kActive); } +void StateController::HandleNewNoteRequestFromLockScreen( + NewNoteRequestType type) { + DCHECK(type == NewNoteRequestType::kLockScreenUiTap || + type == NewNoteRequestType::kLockScreenUiSwipe || + type == NewNoteRequestType::kLockScreenUiKeyboard); + + HandleNewNoteRequest(type); +} + +void StateController::RecordLockScreenAppUnlockAction( + LockScreenUnlockAction action) { + if (lock_screen_note_state_ != TrayActionState::kBackground) + return; + + UMA_HISTOGRAM_ENUMERATION("Apps.LockScreen.NoteTakingApp.UnlockUIAction", + action, LockScreenUnlockAction::kCount); +} + +void StateController::HandleNewNoteRequest(NewNoteRequestType type) { + if (lock_screen_note_state_ != TrayActionState::kAvailable) + return; + + DCHECK(app_manager_->IsNoteTakingAppAvailable()); + + UMA_HISTOGRAM_ENUMERATION("Apps.LockScreen.NoteTakingApp.LaunchRequestReason", + type, NewNoteRequestType::kCount); + + // Update state to launching even if app fails to launch - this is to notify + // listeners that a lock screen note request was handled. + UpdateLockScreenNoteState(TrayActionState::kLaunching); + if (!app_manager_->LaunchNoteTaking()) { + UpdateLockScreenNoteState(TrayActionState::kAvailable); + return; + } + + note_app_window_metrics_->AppLaunchRequested(); +} + void StateController::OnNoteTakingAvailabilityChanged() { if (!app_manager_->IsNoteTakingAppAvailable() || (note_app_window_ && note_app_window_->GetExtension()->id() != app_manager_->GetNoteTakingAppId())) { - ResetNoteTakingWindowAndMoveToNextState(true /*close_window*/); + ResetNoteTakingWindowAndMoveToNextState( + true /*close_window*/, + NoteTakingExitReason::kAppLockScreenSupportDisabled); return; } @@ -407,9 +475,20 @@ } void StateController::ResetNoteTakingWindowAndMoveToNextState( - bool close_window) { + bool close_window, + NoteTakingExitReason exit_reason) { app_window_observer_.RemoveAll(); + if (note_app_window_metrics_) + note_app_window_metrics_->Reset(); + + if (lock_screen_note_state_ != TrayActionState::kAvailable && + lock_screen_note_state_ != TrayActionState::kNotAvailable) { + UMA_HISTOGRAM_ENUMERATION( + "Apps.LockScreen.NoteTakingApp.NoteTakingExitReason", exit_reason, + NoteTakingExitReason::kCount); + } + if (note_app_window_) { if (focus_cycler_delegate_) focus_cycler_delegate_->UnregisterLockScreenAppFocusHandler();
diff --git a/chrome/browser/chromeos/lock_screen_apps/state_controller.h b/chrome/browser/chromeos/lock_screen_apps/state_controller.h index a1ee49c..715366c 100644 --- a/chrome/browser/chromeos/lock_screen_apps/state_controller.h +++ b/chrome/browser/chromeos/lock_screen_apps/state_controller.h
@@ -25,6 +25,10 @@ class PrefRegistrySimple; +namespace base { +class TickClock; +} + namespace content { class BrowserContext; } @@ -49,6 +53,7 @@ namespace lock_screen_apps { +class AppWindowMetricsTracker; class FocusCyclerDelegate; class StateObserver; @@ -61,6 +66,47 @@ public ui::InputDeviceEventObserver, public chromeos::PowerManagerClient::Observer { public: + // Type of action that triggered a request for new note. + // Used in histograms - should be kept in sync with + // NewLockScreenNoteRequestType histogram enum, and assigned values should + // never be changed. + enum class NewNoteRequestType { + kTrayAction = 0, + kLockScreenUiTap = 1, + kLockScreenUiSwipe = 2, + kLockScreenUiKeyboard = 3, + kStylusEject = 4, + kCount, + }; + + // Reason for resetting note taking app window, and exiting note taking app. + // Used primarily for metrics reporting. + // IMPORTANT: The values should be kept in sync with + // LockScreenNoteTakingExitReason histogram enum, and assigned values should + // never be changed. + enum class NoteTakingExitReason { + kSessionUnlock = 0, + kShutdown = 1, + kScreenDimmed = 2, + kSuspend = 3, + kAppWindowClosed = 4, + kAppLockScreenSupportDisabled = 5, + kCount + }; + + // Action taken by the user on lock screen when a lock screen app window was + // in the background - used primarily for metrics reporting. + // IMPORTANT: The values should be kept in sync with + // LockScreenNoteTakingUnlockUIAction, and assigned values should never be + // changed. + enum class LockScreenUnlockAction { + kSessionUnlocked = 0, + kUnlockCancelled = 1, + kShutdown = 2, + kSignOut = 3, + kCount + }; + // Returns whether the StateController is enabled - it is currently guarded by // a feature flag. If not enabled, |StateController| instance is not allowed // to be created. |Get| will still work, but it will return nullptr. @@ -122,6 +168,7 @@ void OnSessionStateChanged() override; // extensions::AppWindowRegistry::Observer: + void OnAppWindowAdded(extensions::AppWindow* app_window) override; void OnAppWindowRemoved(extensions::AppWindow* app_window) override; // ui::InputDeviceEventObserver: @@ -157,6 +204,14 @@ // windows back to foreground (i.e. visible over lock screen UI). void MoveToForeground(); + // Handles new note requests that come from lock screen UI. + void HandleNewNoteRequestFromLockScreen(NewNoteRequestType type); + + // Records the user action taken on lock screen when the lock screen app + // unlock UI is shown - i.e. when lock UI is shown on top of backgrounded + // lock screen app window. + void RecordLockScreenAppUnlockAction(LockScreenUnlockAction action); + private: // Called when profiles needed to run lock screen apps are ready - i.e. when // primary user profile was set using |SetPrimaryProfile| and the profile in @@ -178,6 +233,9 @@ // lock screen context. void InitializeWithCryptoKey(Profile* profile, const std::string& crypto_key); + // Handles request to launch a new-note lock screen flow. + void HandleNewNoteRequest(NewNoteRequestType type); + // Called when app manager reports that note taking availability has changed. void OnNoteTakingAvailabilityChanged(); @@ -185,7 +243,9 @@ // on lock screen, unregisters the window, and closes is if |close_window| is // set. It changes the current state to kAvailable or kNotAvailable, depending // on whether lock screen note taking action can still be handled. - void ResetNoteTakingWindowAndMoveToNextState(bool close_window); + void ResetNoteTakingWindowAndMoveToNextState( + bool close_window, + NoteTakingExitReason exit_reason); // Requests lock screen note action state change to |state|. // Returns whether the action state has changed. @@ -218,6 +278,11 @@ FocusCyclerDelegate* focus_cycler_delegate_ = nullptr; extensions::AppWindow* note_app_window_ = nullptr; + // Used to track metrics for app window launches - it is set when the user + // session is locked (and reset on unlock). Note that a single instance + // should not be reused for different lock sessions - it tracks number of app + // launches per lock screen. + std::unique_ptr<AppWindowMetricsTracker> note_app_window_metrics_; ScopedObserver<extensions::AppWindowRegistry, extensions::AppWindowRegistry::Observer> @@ -237,6 +302,10 @@ // to session / app manager changes. base::Closure ready_callback_; + // The clock used to keep track of time, for example to report app window + // lifetime metrics. + std::unique_ptr<base::TickClock> tick_clock_; + base::WeakPtrFactory<StateController> weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(StateController);
diff --git a/chrome/browser/chromeos/login/users/chrome_user_manager_impl.cc b/chrome/browser/chromeos/login/users/chrome_user_manager_impl.cc index 75f6af9..577eda73 100644 --- a/chrome/browser/chromeos/login/users/chrome_user_manager_impl.cc +++ b/chrome/browser/chromeos/login/users/chrome_user_manager_impl.cc
@@ -855,6 +855,13 @@ // for the first time. Tell the UserImageManager that this user is not new to // prevent the avatar from getting changed. GetUserImageManager(user->GetAccountId())->UserLoggedIn(false, true); + + // For public account, it's possible that the user-policy controlled wallpaper + // was fetched/cleared at the login screen (while for a regular user it was + // always fetched/cleared inside a user session), in the case the user-policy + // controlled wallpaper was cached/cleared by not updated in the login screen, + // so we need to update the wallpaper after the public user logged in. + WallpaperManager::Get()->SetUserWallpaperNow(user->GetAccountId()); WallpaperManager::Get()->EnsureLoggedInUserWallpaperLoaded(); SetPublicAccountDelegates();
diff --git a/chrome/browser/chromeos/login/users/default_user_image/default_user_images.cc b/chrome/browser/chromeos/login/users/default_user_image/default_user_images.cc index ff776ec0..96c0000 100644 --- a/chrome/browser/chromeos/login/users/default_user_image/default_user_images.cc +++ b/chrome/browser/chromeos/login/users/default_user_image/default_user_images.cc
@@ -91,6 +91,14 @@ IDR_LOGIN_DEFAULT_USER_55, IDR_LOGIN_DEFAULT_USER_56, IDR_LOGIN_DEFAULT_USER_57, + IDR_LOGIN_DEFAULT_USER_58, + IDR_LOGIN_DEFAULT_USER_59, + IDR_LOGIN_DEFAULT_USER_60, + IDR_LOGIN_DEFAULT_USER_61, + IDR_LOGIN_DEFAULT_USER_62, + IDR_LOGIN_DEFAULT_USER_63, + IDR_LOGIN_DEFAULT_USER_64, + IDR_LOGIN_DEFAULT_USER_65, }; const int kDefaultImagesCount = arraysize(kDefaultImageResourceIDs); @@ -250,6 +258,14 @@ IDS_LOGIN_DEFAULT_USER_DESC_55, IDS_LOGIN_DEFAULT_USER_DESC_56, IDS_LOGIN_DEFAULT_USER_DESC_57, + IDS_LOGIN_DEFAULT_USER_DESC_58, + IDS_LOGIN_DEFAULT_USER_DESC_59, + IDS_LOGIN_DEFAULT_USER_DESC_60, + IDS_LOGIN_DEFAULT_USER_DESC_61, + IDS_LOGIN_DEFAULT_USER_DESC_62, + IDS_LOGIN_DEFAULT_USER_DESC_63, + IDS_LOGIN_DEFAULT_USER_DESC_64, + IDS_LOGIN_DEFAULT_USER_DESC_65, }; const int kDefaultImageDescriptionsMaxID = arraysize(kDefaultImageDescriptions);
diff --git a/chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.cc b/chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.cc index 8f376eb..82cda76 100644 --- a/chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.cc +++ b/chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.cc
@@ -1011,10 +1011,14 @@ if (!wallpaper_files_id.is_valid()) LOG(FATAL) << "Wallpaper flies id if invalid!"; + // If we're at the login screen, do not change the wallpaper to the user + // policy controlled wallpaper but only update the cache. It will be later + // updated after the user logs in. SetCustomWallpaper(account_id, wallpaper_files_id, "policy-controlled.jpeg", wallpaper::WALLPAPER_LAYOUT_CENTER_CROPPED, wallpaper::POLICY, user_image->image(), - true /* update wallpaper */); + user_manager::UserManager::Get() + ->IsUserLoggedIn() /* update wallpaper */); } void WallpaperManager::OnDeviceWallpaperPolicyChanged() {
diff --git a/chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager_policy_browsertest.cc b/chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager_policy_browsertest.cc index 6dfaae3..41191b9b 100644 --- a/chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager_policy_browsertest.cc +++ b/chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager_policy_browsertest.cc
@@ -51,6 +51,7 @@ #include "components/policy/proto/cloud_policy.pb.h" #include "components/user_manager/user.h" #include "components/user_manager/user_manager.h" +#include "components/user_manager/user_names.h" #include "content/public/test/browser_test_utils.h" #include "crypto/rsa_private_key.h" #include "net/test/embedded_test_server/embedded_test_server.h" @@ -287,6 +288,27 @@ store->validation_status()); } + // Inject |filename| as the device wallpaper policy. Set empty |filename| to + // clear policy. + void InjectDevicePolicy(const std::string& filename) { + if (!filename.empty()) { + device_policy_.payload() + .mutable_device_wallpaper_image() + ->set_device_wallpaper_image(ConstructPolicy(filename)); + } else { + device_policy_.payload().Clear(); + } + device_policy_.Build(); + fake_session_manager_client_->set_device_policy(device_policy_.GetBlob()); + fake_session_manager_client_->OnPropertyChangeComplete(true /* success */); + } + + bool ShouldSetDeviceWallpaper(const AccountId& account_id) { + std::string url, hash; + return WallpaperManager::Get()->ShouldSetDeviceWallpaper(account_id, &url, + &hash); + } + // Obtain WallpaperInfo for |user_number| from WallpaperManager. void GetUserWallpaperInfo(int user_number, wallpaper::WallpaperInfo* wallpaper_info) { @@ -441,4 +463,41 @@ ASSERT_EQ(kRedImageColor, GetAverageWallpaperColor()); } +IN_PROC_BROWSER_TEST_F(WallpaperManagerPolicyTest, PRE_DevicePolicyTest) { + SetSystemSalt(); + RegisterUser(testUsers_[0].GetUserEmail()); + StartupUtils::MarkOobeCompleted(); +} + +// Test that if device policy wallpaper and user policy wallpaper are both +// specified, the device policy wallpaper is used in the login screen and the +// user policy wallpaper is used inside of a user session. +IN_PROC_BROWSER_TEST_F(WallpaperManagerPolicyTest, DevicePolicyTest) { + SetSystemSalt(); + + // Wait until default wallpaper has been loaded in the login screen. + RunUntilWallpaperChangeCount(1); + + // Set the device wallpaper policy. Test that the device policy controlled + // wallpaper shows up in the login screen. + InjectDevicePolicy(kRedImageFileName); + RunUntilWallpaperChangeCount(2); + EXPECT_TRUE(ShouldSetDeviceWallpaper(user_manager::SignInAccountId())); + EXPECT_EQ(kRedImageColor, GetAverageWallpaperColor()); + + // Log in a test user and set the user wallpaper policy. The user policy + // controlled wallpaper shows up in the user session. + LoginUser(testUsers_[0].GetUserEmail()); + InjectPolicy(0, kGreenImageFileName); + RunUntilWallpaperChangeCount(3); + EXPECT_EQ(kGreenImageColor, GetAverageWallpaperColor()); + + // Set the device wallpaper policy inside the user session. That that the + // user wallpaper doesn't change. + InjectDevicePolicy(kBlueImageFileName); + EXPECT_FALSE(ShouldSetDeviceWallpaper( + user_manager::UserManager::Get()->GetActiveUser()->GetAccountId())); + EXPECT_EQ(kGreenImageColor, GetAverageWallpaperColor()); +} + } // namespace chromeos
diff --git a/chrome/browser/chromeos/policy/blocking_login_browsertest.cc b/chrome/browser/chromeos/policy/blocking_login_browsertest.cc index 15a0484..aa9e1895 100644 --- a/chrome/browser/chromeos/policy/blocking_login_browsertest.cc +++ b/chrome/browser/chromeos/policy/blocking_login_browsertest.cc
@@ -18,6 +18,7 @@ #include "chrome/browser/chromeos/login/ui/webui_login_display.h" #include "chrome/browser/chromeos/login/wizard_controller.h" #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" +#include "chrome/browser/chromeos/profiles/profile_helper.h" #include "chrome/browser/chromeos/settings/install_attributes.h" #include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h" #include "chrome/common/chrome_switches.h" @@ -124,6 +125,10 @@ const content::NotificationSource& source, const content::NotificationDetails& details) override { ASSERT_EQ(chrome::NOTIFICATION_PROFILE_ADDED, type); + if (chromeos::ProfileHelper::IsLockScreenAppProfile( + content::Source<Profile>(source).ptr())) { + return; + } ASSERT_FALSE(profile_added_); profile_added_ = content::Source<Profile>(source).ptr(); }
diff --git a/chrome/browser/chromeos/policy/device_local_account_browsertest.cc b/chrome/browser/chromeos/policy/device_local_account_browsertest.cc index 66ec6d60..b3533f4 100644 --- a/chrome/browser/chromeos/policy/device_local_account_browsertest.cc +++ b/chrome/browser/chromeos/policy/device_local_account_browsertest.cc
@@ -61,6 +61,7 @@ #include "chrome/browser/chromeos/policy/device_policy_builder.h" #include "chrome/browser/chromeos/policy/device_policy_cros_browser_test.h" #include "chrome/browser/chromeos/policy/proto/chrome_device_policy.pb.h" +#include "chrome/browser/chromeos/profiles/profile_helper.h" #include "chrome/browser/extensions/crx_installer.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/updater/chromeos_extension_cache_delegate.h" @@ -833,6 +834,9 @@ DCHECK_EQ(chrome::NOTIFICATION_PROFILE_CREATED, type); Profile* profile = content::Source<Profile>(source).ptr(); + // Ignore lock screen apps profile. + if (chromeos::ProfileHelper::IsLockScreenAppProfile(profile)) + return; registry_ = extensions::ExtensionRegistry::Get(profile); // Check if extension is already installed with newly created profile.
diff --git a/chrome/browser/chromeos/preferences.cc b/chrome/browser/chromeos/preferences.cc index 52e9b6c..363f8ef 100644 --- a/chrome/browser/chromeos/preferences.cc +++ b/chrome/browser/chromeos/preferences.cc
@@ -584,9 +584,9 @@ if (reason != REASON_PREF_CHANGED || pref_name == prefs::kUnifiedDesktopEnabledByDefault) { const bool enabled = unified_desktop_enabled_by_default_.GetValue(); - // TODO: this needs to work in Config::MUS. http://crbug.com/705591. + // TODO: this needs to work in Config::MASH. http://crbug.com/705591. if (ash::Shell::HasInstance() && - chromeos::GetAshConfig() == ash::Config::CLASSIC) { + chromeos::GetAshConfig() != ash::Config::MASH) { ash::Shell::Get()->display_manager()->SetUnifiedDesktopEnabled(enabled); } }
diff --git a/chrome/browser/chromeos/profiles/profile_helper.cc b/chrome/browser/chromeos/profiles/profile_helper.cc index bd4bb1b..55a41b3 100644 --- a/chrome/browser/chromeos/profiles/profile_helper.cc +++ b/chrome/browser/chromeos/profiles/profile_helper.cc
@@ -357,6 +357,11 @@ const user_manager::User* ProfileHelper::GetUserByProfile( const Profile* profile) const { + if (ProfileHelper::IsSigninProfile(profile) || + ProfileHelper::IsLockScreenAppProfile(profile)) { + return nullptr; + } + // This map is non-empty only in tests. if (enable_profile_to_user_testing || !user_list_for_testing_.empty()) { if (always_return_primary_user_for_testing) @@ -378,10 +383,6 @@ DCHECK(!content::BrowserThread::IsThreadInitialized( content::BrowserThread::UI) || content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); - if (ProfileHelper::IsSigninProfile(profile) || - ProfileHelper::IsLockScreenAppProfile(profile)) { - return nullptr; - } user_manager::UserManager* user_manager = user_manager::UserManager::Get();
diff --git a/chrome/browser/chromeos/profiles/profile_util.cc b/chrome/browser/chromeos/profiles/profile_util.cc index ed4fa10..66550e4 100644 --- a/chrome/browser/chromeos/profiles/profile_util.cc +++ b/chrome/browser/chromeos/profiles/profile_util.cc
@@ -25,6 +25,8 @@ // not try to access the sign-in profile. if (profile->GetPath() == ProfileHelper::GetSigninProfileDir()) return false; + if (profile->GetPath() == ProfileHelper::GetLockScreenAppProfilePath()) + return false; return true; }
diff --git a/chrome/browser/conflicts/installed_programs_win.cc b/chrome/browser/conflicts/installed_programs_win.cc index a6a8dbc37..0e82fce 100644 --- a/chrome/browser/conflicts/installed_programs_win.cc +++ b/chrome/browser/conflicts/installed_programs_win.cc
@@ -8,6 +8,7 @@ #include "base/callback.h" #include "base/memory/ptr_util.h" +#include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/task_scheduler/post_task.h" #include "base/win/registry.h" @@ -113,7 +114,7 @@ // Ignore Microsoft programs. base::string16 publisher; if (GetValue(candidate, L"Publisher", &publisher) && - publisher == L"Microsoft Corporation") { + base::StartsWith(publisher, L"Microsoft", base::CompareCase::SENSITIVE)) { return; }
diff --git a/chrome/browser/devtools/chrome_devtools_manager_delegate.cc b/chrome/browser/devtools/chrome_devtools_manager_delegate.cc index 53337dd..8d5bc7ca 100644 --- a/chrome/browser/devtools/chrome_devtools_manager_delegate.cc +++ b/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
@@ -365,9 +365,9 @@ if (method == chrome::devtools::Page::disable::kName) TogglePageEnable(false /* enable */, agent_host); - if (agent_host->GetType() == DevToolsAgentHost::kTypeBrowser && - method.find("Browser.") == 0) - return HandleBrowserCommand(id, method, params).release(); + auto* result = HandleBrowserCommand(id, method, params).release(); + if (result) + return result; if (method == chrome::devtools::Page::setAdBlockingEnabled::kName) return SetAdBlockingEnabled(agent_host, id, params).release();
diff --git a/chrome/browser/devtools/devtools_ui_bindings.cc b/chrome/browser/devtools/devtools_ui_bindings.cc index 9a2fedaa..c409fcc 100644 --- a/chrome/browser/devtools/devtools_ui_bindings.cc +++ b/chrome/browser/devtools/devtools_ui_bindings.cc
@@ -226,6 +226,7 @@ void ReadyForTest() override {} InfoBarService* GetInfoBarService() override; void RenderProcessGone(bool crashed) override {} + void ShowCertificateViewer(const std::string& cert_chain) override{}; content::WebContents* web_contents_; DISALLOW_COPY_AND_ASSIGN(DefaultBindingsDelegate); @@ -864,49 +865,7 @@ } void DevToolsUIBindings::ShowCertificateViewer(const std::string& cert_chain) { - std::unique_ptr<base::Value> value = - base::JSONReader::Read(cert_chain); - if (!value || value->GetType() != base::Value::Type::LIST) { - NOTREACHED(); - return; - } - - std::unique_ptr<base::ListValue> list = - base::ListValue::From(std::move(value)); - std::vector<std::string> decoded; - for (size_t i = 0; i < list->GetSize(); ++i) { - base::Value* item; - if (!list->Get(i, &item) || item->GetType() != base::Value::Type::STRING) { - NOTREACHED(); - return; - } - std::string temp; - if (!item->GetAsString(&temp)) { - NOTREACHED(); - return; - } - if (!base::Base64Decode(temp, &temp)) { - NOTREACHED(); - return; - } - decoded.push_back(temp); - } - - std::vector<base::StringPiece> cert_string_piece; - for (const auto& str : decoded) - cert_string_piece.push_back(str); - scoped_refptr<net::X509Certificate> cert = - net::X509Certificate::CreateFromDERCertChain(cert_string_piece); - if (!cert) { - NOTREACHED(); - return; - } - - if (!agent_host_ || !agent_host_->GetWebContents()) - return; - content::WebContents* inspected_wc = agent_host_->GetWebContents(); - web_contents_->GetDelegate()->ShowCertificateViewerInDevTools( - inspected_wc, cert.get()); + delegate_->ShowCertificateViewer(cert_chain); } void DevToolsUIBindings::ZoomIn() {
diff --git a/chrome/browser/devtools/devtools_ui_bindings.h b/chrome/browser/devtools/devtools_ui_bindings.h index 4dd51b7..827d8f07 100644 --- a/chrome/browser/devtools/devtools_ui_bindings.h +++ b/chrome/browser/devtools/devtools_ui_bindings.h
@@ -65,6 +65,7 @@ virtual void ReadyForTest() = 0; virtual InfoBarService* GetInfoBarService() = 0; virtual void RenderProcessGone(bool crashed) = 0; + virtual void ShowCertificateViewer(const std::string& cert_chain) = 0; }; explicit DevToolsUIBindings(content::WebContents* web_contents);
diff --git a/chrome/browser/devtools/devtools_window.cc b/chrome/browser/devtools/devtools_window.cc index dc0dfd6..3bda5f78 100644 --- a/chrome/browser/devtools/devtools_window.cc +++ b/chrome/browser/devtools/devtools_window.cc
@@ -7,6 +7,7 @@ #include <algorithm> #include <utility> +#include "base/base64.h" #include "base/command_line.h" #include "base/json/json_reader.h" #include "base/macros.h" @@ -997,18 +998,6 @@ return main_web_contents_; } -void DevToolsWindow::ShowCertificateViewer( - scoped_refptr<net::X509Certificate> certificate) { - WebContents* inspected_contents = is_docked_ ? - GetInspectedWebContents() : main_web_contents_; - Browser* browser = NULL; - int tab = 0; - if (!FindInspectedBrowserAndTabIndex(inspected_contents, &browser, &tab)) - return; - gfx::NativeWindow parent = browser->window()->GetNativeWindow(); - ::ShowCertificateViewer(inspected_contents, parent, certificate.get()); -} - void DevToolsWindow::ActivateContents(WebContents* contents) { if (is_docked_) { WebContents* inspected_tab = GetInspectedWebContents(); @@ -1154,12 +1143,6 @@ return blink::WebInputEvent::IsPinchGestureEventType(event.GetType()); } -void DevToolsWindow::ShowCertificateViewerInDevTools( - content::WebContents* web_contents, - scoped_refptr<net::X509Certificate> certificate) { - ShowCertificateViewer(certificate); -} - void DevToolsWindow::ActivateWindow() { if (life_stage_ != kLoadCompleted) return; @@ -1297,6 +1280,54 @@ } } +void DevToolsWindow::ShowCertificateViewer(const std::string& cert_chain) { + std::unique_ptr<base::Value> value = base::JSONReader::Read(cert_chain); + if (!value || value->GetType() != base::Value::Type::LIST) { + NOTREACHED(); + return; + } + + std::unique_ptr<base::ListValue> list = + base::ListValue::From(std::move(value)); + std::vector<std::string> decoded; + for (size_t i = 0; i < list->GetSize(); ++i) { + base::Value* item; + if (!list->Get(i, &item) || item->GetType() != base::Value::Type::STRING) { + NOTREACHED(); + return; + } + std::string temp; + if (!item->GetAsString(&temp)) { + NOTREACHED(); + return; + } + if (!base::Base64Decode(temp, &temp)) { + NOTREACHED(); + return; + } + decoded.push_back(temp); + } + + std::vector<base::StringPiece> cert_string_piece; + for (const auto& str : decoded) + cert_string_piece.push_back(str); + scoped_refptr<net::X509Certificate> cert = + net::X509Certificate::CreateFromDERCertChain(cert_string_piece); + if (!cert) { + NOTREACHED(); + return; + } + + WebContents* inspected_contents = + is_docked_ ? GetInspectedWebContents() : main_web_contents_; + Browser* browser = NULL; + int tab = 0; + if (!FindInspectedBrowserAndTabIndex(inspected_contents, &browser, &tab)) + return; + gfx::NativeWindow parent = browser->window()->GetNativeWindow(); + ::ShowCertificateViewer(inspected_contents, parent, cert.get()); +} + void DevToolsWindow::OnLoadCompleted() { // First seed inspected tab id for extension APIs. WebContents* inspected_web_contents = GetInspectedWebContents();
diff --git a/chrome/browser/devtools/devtools_window.h b/chrome/browser/devtools/devtools_window.h index ca3e0ef..c9c7121 100644 --- a/chrome/browser/devtools/devtools_window.h +++ b/chrome/browser/devtools/devtools_window.h
@@ -127,8 +127,6 @@ content::WebContents* source, const content::OpenURLParams& params) override; - void ShowCertificateViewer(scoped_refptr<net::X509Certificate> certificate); - // BeforeUnload interception //////////////////////////////////////////////// // In order to preserve any edits the user may have made in devtools, the @@ -315,9 +313,6 @@ const content::FileChooserParams& params) override; bool PreHandleGestureEvent(content::WebContents* source, const blink::WebGestureEvent& event) override; - void ShowCertificateViewerInDevTools( - content::WebContents* web_contents, - scoped_refptr<net::X509Certificate> certificate) override; // content::DevToolsUIBindings::Delegate overrides void ActivateWindow() override; @@ -335,6 +330,7 @@ void ReadyForTest() override; InfoBarService* GetInfoBarService() override; void RenderProcessGone(bool crashed) override; + void ShowCertificateViewer(const std::string& cert_viewer) override; void ColorPickedInEyeDropper(int r, int g, int b, int a); void CreateDevToolsBrowser();
diff --git a/chrome/browser/download/DEPS b/chrome/browser/download/DEPS index dba1ce6..32d7dc92b 100644 --- a/chrome/browser/download/DEPS +++ b/chrome/browser/download/DEPS
@@ -1,4 +1,4 @@ include_rules = [ "+components/drive/drive_pref_names.h", - "+components/safe_browsing/csd.pb.h", + "+components/safe_browsing/proto/csd.pb.h", ]
diff --git a/chrome/browser/download/download_browsertest.cc b/chrome/browser/download/download_browsertest.cc index b3d47ee..dc37e2a 100644 --- a/chrome/browser/download/download_browsertest.cc +++ b/chrome/browser/download/download_browsertest.cc
@@ -83,7 +83,7 @@ #include "components/infobars/core/infobar.h" #include "components/prefs/pref_service.h" #include "components/safe_browsing/common/safe_browsing_prefs.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "content/public/browser/download_danger_type.h" #include "content/public/browser/download_interrupt_reasons.h" #include "content/public/browser/download_item.h" @@ -502,6 +502,12 @@ return GetDownloadDirectory(browser).Append(file.BaseName()); } + base::FilePath TemporaryFile(const base::FilePath& file) { + base::FilePath tmp; + base::GetTempDir(&tmp); + return tmp.Append(file.BaseName()); + } + // Must be called after browser creation. Creates a temporary // directory for downloads that is auto-deleted on destruction. // Returning false indicates a failure of the function, and should be asserted @@ -2025,7 +2031,7 @@ // As long as we're here, confirmed everything else is good. EXPECT_EQ(1, browser()->tab_strip_model()->count()); - CheckDownload(browser(), file, file); + CheckDownloadFullPaths(browser(), TemporaryFile(file), OriginFile(file)); } // Download an extension. Expect a dangerous download warning.
diff --git a/chrome/browser/download/download_commands.cc b/chrome/browser/download/download_commands.cc index a4a6040e..40baa910 100644 --- a/chrome/browser/download/download_commands.cc +++ b/chrome/browser/download/download_commands.cc
@@ -28,7 +28,7 @@ #include "chrome/common/url_constants.h" #include "chrome/grit/theme_resources.h" #include "components/google/core/browser/google_util.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "net/base/url_util.h" #include "ui/base/clipboard/scoped_clipboard_writer.h" #include "ui/base/resource/resource_bundle.h"
diff --git a/chrome/browser/download/download_danger_prompt.h b/chrome/browser/download/download_danger_prompt.h index 55fa38e7a7..10331bed 100644 --- a/chrome/browser/download/download_danger_prompt.h +++ b/chrome/browser/download/download_danger_prompt.h
@@ -6,7 +6,7 @@ #define CHROME_BROWSER_DOWNLOAD_DOWNLOAD_DANGER_PROMPT_H_ #include "base/callback_forward.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" namespace content { class DownloadItem;
diff --git a/chrome/browser/download/download_danger_prompt_browsertest.cc b/chrome/browser/download/download_danger_prompt_browsertest.cc index 82eab21..dbc0f6f 100644 --- a/chrome/browser/download/download_danger_prompt_browsertest.cc +++ b/chrome/browser/download/download_danger_prompt_browsertest.cc
@@ -18,7 +18,7 @@ #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/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "components/safe_browsing_db/database_manager.h" #include "content/public/test/mock_download_item.h" #include "testing/gmock/include/gmock/gmock.h"
diff --git a/chrome/browser/download/download_prefs.cc b/chrome/browser/download/download_prefs.cc index c6b31c58..f7a60c11 100644 --- a/chrome/browser/download/download_prefs.cc +++ b/chrome/browser/download/download_prefs.cc
@@ -79,6 +79,7 @@ class DefaultDownloadDirectory { public: const base::FilePath& path() const { return path_; } + const base::FilePath& temp_path() const { return temp_path_; } private: friend struct base::LazyInstanceTraitsBase<DefaultDownloadDirectory>; @@ -87,6 +88,11 @@ if (!PathService::Get(chrome::DIR_DEFAULT_DOWNLOADS, &path_)) { NOTREACHED(); } + + if (!base::GetTempDir(&temp_path_)) { + NOTREACHED(); + } + if (DownloadPathIsDangerous(path_)) { // This is only useful on platforms that support // DIR_DEFAULT_DOWNLOADS_SAFE. @@ -97,6 +103,7 @@ } base::FilePath path_; + base::FilePath temp_path_; DISALLOW_COPY_AND_ASSIGN(DefaultDownloadDirectory); }; @@ -238,6 +245,11 @@ } // static +const base::FilePath& DownloadPrefs::GetTempDownloadDirectory() { + return g_default_download_directory.Get().temp_path(); +} + +// static DownloadPrefs* DownloadPrefs::FromDownloadManager( DownloadManager* download_manager) { ChromeDownloadManagerDelegate* delegate =
diff --git a/chrome/browser/download/download_prefs.h b/chrome/browser/download/download_prefs.h index 0499d71..58855983 100644 --- a/chrome/browser/download/download_prefs.h +++ b/chrome/browser/download/download_prefs.h
@@ -40,6 +40,9 @@ static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); + // Returns the download directory for temporary files. + static const base::FilePath& GetTempDownloadDirectory(); + // Returns the default download directory. static const base::FilePath& GetDefaultDownloadDirectory();
diff --git a/chrome/browser/download/download_target_determiner.cc b/chrome/browser/download/download_target_determiner.cc index d3677b9..faca8fe6 100644 --- a/chrome/browser/download/download_target_determiner.cc +++ b/chrome/browser/download/download_target_determiner.cc
@@ -220,7 +220,14 @@ // If the user is going to be prompted and the user has been prompted // before, then always prefer the last directory that the user selected. target_directory = download_prefs_->SaveFilePath(); + } else if (download_prefs_->IsAutoOpenEnabledBasedOnExtension( + generated_filename)) { + // If we do not need user confirmation and we are going to auto-open the + // file, just download it to the system temp directory. + target_directory = download_prefs_->GetTempDownloadDirectory(); } else { + // The user has not configured this file to be auto-opened. Download it to + // the standard location. target_directory = download_prefs_->DownloadPath(); } virtual_path_ = target_directory.Append(generated_filename);
diff --git a/chrome/browser/download/download_target_determiner_unittest.cc b/chrome/browser/download/download_target_determiner_unittest.cc index 5398afe7..32476fe4 100644 --- a/chrome/browser/download/download_target_determiner_unittest.cc +++ b/chrome/browser/download/download_target_determiner_unittest.cc
@@ -10,6 +10,7 @@ #include "base/at_exit.h" #include "base/files/file_path.h" +#include "base/files/file_util.h" #include "base/files/scoped_temp_dir.h" #include "base/location.h" #include "base/macros.h" @@ -123,6 +124,10 @@ // marked interrupted or cancelled. }; +// Used with DownloadTestCase. Whether the file is expected to be downloaded to +// the default download directory or the system-wide temp directory. +enum TestCaseExpectDirectory { DEFAULT_DIRECTORY, TEMP_DIRECTORY }; + // Typical download test case. Used with // DownloadTargetDeterminerTest::RunTestCase(). struct DownloadTestCase { @@ -154,6 +159,9 @@ // Type of intermediate path to expect. TestCaseExpectIntermediate expected_intermediate; + + // The destination directory where the file is expected to be downloaded to. + TestCaseExpectDirectory expected_directory; }; class MockDownloadTargetDeterminerDelegate @@ -238,10 +246,19 @@ // Set the kPromptForDownload user preference to |prompt|. void SetPromptForDownload(bool prompt); + // Utility function to get the full path for |relative_path| within + // |base_path|. + base::FilePath GetPathInDir(const base::FilePath::StringType& relative_path, + const base::FilePath& base_path); + // Given the relative path |path|, returns the full path under the temporary // downloads directory. base::FilePath GetPathInDownloadDir(const base::FilePath::StringType& path); + // Given the relative path |path|, returns the full path under the system + // temporary directory where auto-open files are saved. + base::FilePath GetPathInTempDir(const base::FilePath::StringType& path); + // Run |test_case| using |item|. void RunTestCase(const DownloadTestCase& test_case, const base::FilePath& initial_virtual_path, @@ -273,6 +290,8 @@ return test_virtual_dir_; } + const base::FilePath& test_temp_dir() const { return test_temp_dir_; } + MockDownloadTargetDeterminerDelegate* delegate() { return &delegate_; } @@ -289,6 +308,7 @@ NullWebContentsDelegate web_contents_delegate_; base::ScopedTempDir test_download_dir_; base::FilePath test_virtual_dir_; + base::FilePath test_temp_dir_; safe_browsing::FileTypePoliciesTestOverlay file_type_configuration_; }; @@ -299,6 +319,7 @@ web_contents()->SetDelegate(&web_contents_delegate_); ASSERT_TRUE(test_download_dir_.CreateUniqueTempDir()); test_virtual_dir_ = test_download_dir().Append(FILE_PATH_LITERAL("virtual")); + ASSERT_TRUE(base::GetTempDir(&test_temp_dir_)); download_prefs_->SetDownloadPath(test_download_dir()); delegate_.SetupDefaults(); SetUpFileTypePolicies(); @@ -384,14 +405,25 @@ SetBoolean(prefs::kPromptForDownload, prompt); } -base::FilePath DownloadTargetDeterminerTest::GetPathInDownloadDir( - const base::FilePath::StringType& relative_path) { +base::FilePath DownloadTargetDeterminerTest::GetPathInDir( + const base::FilePath::StringType& relative_path, + const base::FilePath& base_path) { if (relative_path.empty()) return base::FilePath(); - base::FilePath full_path(test_download_dir().Append(relative_path)); + base::FilePath full_path(base_path.Append(relative_path)); return full_path.NormalizePathSeparators(); } +base::FilePath DownloadTargetDeterminerTest::GetPathInDownloadDir( + const base::FilePath::StringType& relative_path) { + return GetPathInDir(relative_path, test_download_dir()); +} + +base::FilePath DownloadTargetDeterminerTest::GetPathInTempDir( + const base::FilePath::StringType& relative_path) { + return GetPathInDir(relative_path, test_temp_dir()); +} + void DownloadTargetDeterminerTest::RunTestCase( const DownloadTestCase& test_case, const base::FilePath& initial_virtual_path, @@ -439,8 +471,16 @@ void DownloadTargetDeterminerTest::VerifyDownloadTarget( const DownloadTestCase& test_case, const DownloadTargetInfo* target_info) { - base::FilePath expected_local_path( - GetPathInDownloadDir(test_case.expected_local_path)); + base::FilePath expected_local_path; + switch (test_case.expected_directory) { + case DEFAULT_DIRECTORY: + expected_local_path = GetPathInDownloadDir(test_case.expected_local_path); + break; + case TEMP_DIRECTORY: + expected_local_path = GetPathInTempDir(test_case.expected_local_path); + break; + } + EXPECT_EQ(expected_local_path.value(), target_info->target_path.value()); EXPECT_EQ(test_case.expected_disposition, target_info->target_disposition); EXPECT_EQ(test_case.expected_danger_type, target_info->danger_type); @@ -561,7 +601,7 @@ FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_CRDOWNLOAD}, + EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY}, {// Save_As Safe SAVE_AS, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, @@ -570,7 +610,7 @@ FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_PROMPT, - EXPECT_CRDOWNLOAD}, + EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY}, {// Automatic Dangerous AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE, @@ -580,7 +620,7 @@ FILE_PATH_LITERAL("foo.kindabad"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_UNCONFIRMED}, + EXPECT_UNCONFIRMED, DEFAULT_DIRECTORY}, {// Forced Safe FORCED, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, @@ -590,7 +630,7 @@ FILE_PATH_LITERAL("forced-foo.txt"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_LOCAL_PATH}, + EXPECT_LOCAL_PATH, DEFAULT_DIRECTORY}, }; // The test assumes that .kindabad files have a danger level of @@ -610,7 +650,7 @@ FILE_PATH_LITERAL(""), DownloadItem::TARGET_DISPOSITION_PROMPT, - EXPECT_LOCAL_PATH}}; + EXPECT_LOCAL_PATH, DEFAULT_DIRECTORY}}; ON_CALL(*delegate(), RequestConfirmation(_, _, _, _)) .WillByDefault(WithArg<3>(ScheduleCallback2( DownloadConfirmationResult::CANCELED, base::FilePath()))); @@ -629,7 +669,7 @@ FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_UNCONFIRMED}, + EXPECT_UNCONFIRMED, DEFAULT_DIRECTORY}, {// 1: Save As Dangerous URL SAVE_AS, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL, @@ -638,7 +678,7 @@ FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_PROMPT, - EXPECT_UNCONFIRMED}, + EXPECT_UNCONFIRMED, DEFAULT_DIRECTORY}, {// 2: Forced Dangerous URL FORCED, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL, @@ -648,7 +688,7 @@ FILE_PATH_LITERAL("forced-foo.txt"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_UNCONFIRMED}, + EXPECT_UNCONFIRMED, DEFAULT_DIRECTORY}, {// 3: Automatic Dangerous URL + Dangerous file. Dangerous URL takes // precedence. @@ -659,7 +699,7 @@ FILE_PATH_LITERAL("foo.html"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_UNCONFIRMED}, + EXPECT_UNCONFIRMED, DEFAULT_DIRECTORY}, {// 4: Save As Dangerous URL + Dangerous file SAVE_AS, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL, @@ -668,7 +708,7 @@ FILE_PATH_LITERAL("foo.html"), DownloadItem::TARGET_DISPOSITION_PROMPT, - EXPECT_UNCONFIRMED}, + EXPECT_UNCONFIRMED, DEFAULT_DIRECTORY}, {// 5: Forced Dangerous URL + Dangerous file FORCED, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL, @@ -678,7 +718,7 @@ FILE_PATH_LITERAL("forced-foo.html"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_UNCONFIRMED}, + EXPECT_UNCONFIRMED, DEFAULT_DIRECTORY}, }; ON_CALL(*delegate(), CheckDownloadUrl(_, _, _)) @@ -698,7 +738,8 @@ "http://phishing.example.com/foo.kindabad", "", FILE_PATH_LITERAL(""), FILE_PATH_LITERAL("foo.kindabad"), - DownloadItem::TARGET_DISPOSITION_OVERWRITE, EXPECT_UNCONFIRMED}, + DownloadItem::TARGET_DISPOSITION_OVERWRITE, EXPECT_UNCONFIRMED, + DEFAULT_DIRECTORY}, {// 1: Automatic Maybe dangerous content with DANGEROUS type. AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT, @@ -706,7 +747,7 @@ FILE_PATH_LITERAL(""), FILE_PATH_LITERAL("foo.bad"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_UNCONFIRMED}, + EXPECT_UNCONFIRMED, DEFAULT_DIRECTORY}, {// 2: Save As Maybe dangerous content SAVE_AS, content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT, @@ -716,7 +757,7 @@ FILE_PATH_LITERAL("foo.kindabad"), DownloadItem::TARGET_DISPOSITION_PROMPT, - EXPECT_UNCONFIRMED}, + EXPECT_UNCONFIRMED, DEFAULT_DIRECTORY}, {// 3: Forced Maybe dangerous content FORCED, content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT, @@ -727,7 +768,7 @@ FILE_PATH_LITERAL("forced-foo.kindabad"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_UNCONFIRMED}}; + EXPECT_UNCONFIRMED, DEFAULT_DIRECTORY}}; // Test assumptions: ASSERT_EQ(DownloadFileType::ALLOW_ON_USER_GESTURE, @@ -755,7 +796,7 @@ FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_PROMPT, - EXPECT_CRDOWNLOAD}}; + EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY}}; // These test cases are run with a last save path set to a non-emtpy local // download directory. @@ -769,7 +810,7 @@ FILE_PATH_LITERAL("foo/foo.txt"), DownloadItem::TARGET_DISPOSITION_PROMPT, - EXPECT_CRDOWNLOAD}, + EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY}, {// 1: Start an automatic download. This should be saved to the user's // default download directory and not the last used Save As directory. @@ -779,7 +820,7 @@ FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_CRDOWNLOAD}, + EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY}, }; // This test case is run with the last save path set to a non-empty virtual @@ -791,7 +832,7 @@ FILE_PATH_LITERAL("bar.txt"), DownloadItem::TARGET_DISPOSITION_PROMPT, - EXPECT_LOCAL_PATH}, + EXPECT_LOCAL_PATH, DEFAULT_DIRECTORY}, }; { @@ -857,7 +898,8 @@ FILE_PATH_LITERAL("foo-local.txt"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_LOCAL_PATH}; + EXPECT_LOCAL_PATH, + DEFAULT_DIRECTORY}; EXPECT_CALL(*delegate(), DetermineLocalPath(_, _, _)) .WillOnce(WithArg<2>(ScheduleCallback( GetPathInDownloadDir(FILE_PATH_LITERAL("foo-local.txt"))))); @@ -877,7 +919,8 @@ FILE_PATH_LITERAL("foo-local.txt"), DownloadItem::TARGET_DISPOSITION_PROMPT, - EXPECT_LOCAL_PATH}; + EXPECT_LOCAL_PATH, + DEFAULT_DIRECTORY}; EXPECT_CALL(*delegate(), DetermineLocalPath(_, _, _)) .WillOnce(WithArg<2>(ScheduleCallback( GetPathInDownloadDir(FILE_PATH_LITERAL("foo-local.txt"))))); @@ -904,7 +947,8 @@ FILE_PATH_LITERAL("foo-x.txt"), DownloadItem::TARGET_DISPOSITION_PROMPT, - EXPECT_CRDOWNLOAD}; + EXPECT_CRDOWNLOAD, + DEFAULT_DIRECTORY}; EXPECT_CALL(*delegate(), RequestConfirmation( _, test_virtual_dir().AppendASCII("bar.txt"), DownloadConfirmationReason::SAVE_AS, _)) @@ -927,7 +971,8 @@ FILE_PATH_LITERAL("forced-foo.txt"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_LOCAL_PATH}; + EXPECT_LOCAL_PATH, + DEFAULT_DIRECTORY}; RunTestCasesWithActiveItem(&kForcedSafe, 1); } } @@ -944,7 +989,8 @@ FILE_PATH_LITERAL(""), FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_CRDOWNLOAD}; + EXPECT_CRDOWNLOAD, + DEFAULT_DIRECTORY}; const struct { TestCaseType type; @@ -988,7 +1034,8 @@ FILE_PATH_LITERAL("bar.txt"), DownloadItem::TARGET_DISPOSITION_PROMPT, - EXPECT_CRDOWNLOAD}; + EXPECT_CRDOWNLOAD, + DEFAULT_DIRECTORY}; struct TestCase { PathValidationResult result; @@ -1039,7 +1086,7 @@ FILE_PATH_LITERAL(""), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_LOCAL_PATH}, + EXPECT_LOCAL_PATH, DEFAULT_DIRECTORY}, }; // The default download directory is the virtual path. @@ -1068,7 +1115,7 @@ FILE_PATH_LITERAL("foo.kindabad"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_CRDOWNLOAD}, + EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY}, {// 1: Dangerous due to not having visited referrer before. AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE, @@ -1079,7 +1126,7 @@ FILE_PATH_LITERAL("foo.kindabad"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_UNCONFIRMED}, + EXPECT_UNCONFIRMED, DEFAULT_DIRECTORY}, {// 2: Safe because the user is being prompted. SAVE_AS, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, @@ -1090,7 +1137,7 @@ FILE_PATH_LITERAL("foo.kindabad"), DownloadItem::TARGET_DISPOSITION_PROMPT, - EXPECT_CRDOWNLOAD}, + EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY}, {// 3: Safe because of forced path. FORCED, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, @@ -1101,7 +1148,7 @@ FILE_PATH_LITERAL("foo.kindabad"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_LOCAL_PATH}, + EXPECT_LOCAL_PATH, DEFAULT_DIRECTORY}, }; // This test assumes that the danger level of .kindabad files is @@ -1140,7 +1187,8 @@ FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_CRDOWNLOAD}; + EXPECT_CRDOWNLOAD, + DEFAULT_DIRECTORY}; const DownloadTestCase kAllowOnUserGesture = { AUTOMATIC, @@ -1153,7 +1201,8 @@ FILE_PATH_LITERAL("foo.kindabad"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_UNCONFIRMED}; + EXPECT_UNCONFIRMED, + DEFAULT_DIRECTORY}; const DownloadTestCase kDangerousFile = { AUTOMATIC, @@ -1166,7 +1215,8 @@ FILE_PATH_LITERAL("foo.bad"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_UNCONFIRMED}; + EXPECT_UNCONFIRMED, + DEFAULT_DIRECTORY}; const struct { ui::PageTransition page_transition; @@ -1263,7 +1313,8 @@ FILE_PATH_LITERAL("automatic.txt"), DownloadItem::TARGET_DISPOSITION_PROMPT, - EXPECT_CRDOWNLOAD}; + EXPECT_CRDOWNLOAD, + DEFAULT_DIRECTORY}; SetPromptForDownload(true); EXPECT_CALL(*delegate(), @@ -1286,7 +1337,8 @@ FILE_PATH_LITERAL("save-as.txt"), DownloadItem::TARGET_DISPOSITION_PROMPT, - EXPECT_CRDOWNLOAD}; + EXPECT_CRDOWNLOAD, + DEFAULT_DIRECTORY}; SetPromptForDownload(true); EXPECT_CALL(*delegate(), @@ -1309,7 +1361,8 @@ FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_LOCAL_PATH}; + EXPECT_LOCAL_PATH, + DEFAULT_DIRECTORY}; SetPromptForDownload(true); RunTestCasesWithActiveItem(&kSafeForced, 1); @@ -1329,13 +1382,56 @@ FILE_PATH_LITERAL("foo.dummy"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_CRDOWNLOAD}; + EXPECT_CRDOWNLOAD, + TEMP_DIRECTORY}; SetPromptForDownload(true); EnableAutoOpenBasedOnExtension( base::FilePath(FILE_PATH_LITERAL("dummy.dummy"))); RunTestCasesWithActiveItem(&kAutoOpen, 1); } +// In an automatic download, auto-opened files should be saved to a temp +// directory. +TEST_F(DownloadTargetDeterminerTest, AutoOpen_Automatic) { + const DownloadTestCase kTestCase = { + AUTOMATIC, + content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, + DownloadFileType::NOT_DANGEROUS, + "http://example.com/foo.dummy", + "", + FILE_PATH_LITERAL(""), + + FILE_PATH_LITERAL("foo.dummy"), + DownloadItem::TARGET_DISPOSITION_OVERWRITE, + + EXPECT_CRDOWNLOAD, + TEMP_DIRECTORY}; + EnableAutoOpenBasedOnExtension( + base::FilePath(FILE_PATH_LITERAL("dummy.dummy"))); + RunTestCasesWithActiveItem(&kTestCase, 1); +} + +// Even if we are set to auto-open this file, save the file to a permanent +// location if triggered by a Save As. +TEST_F(DownloadTargetDeterminerTest, AutoOpen_SaveAs) { + const DownloadTestCase kTestCase = { + SAVE_AS, + content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, + DownloadFileType::NOT_DANGEROUS, + "http://example.com/foo.dummy", + "", + FILE_PATH_LITERAL(""), + + FILE_PATH_LITERAL("foo.dummy"), + DownloadItem::TARGET_DISPOSITION_PROMPT, + + EXPECT_CRDOWNLOAD, + DEFAULT_DIRECTORY}; + EnableAutoOpenBasedOnExtension( + base::FilePath(FILE_PATH_LITERAL("dummy.dummy"))); + RunTestCasesWithActiveItem(&kTestCase, 1); +} + // If an embedder responds to a RequestConfirmation with a new path and a // CONTINUE_WITHOUT_CONFIRMATION, then we shouldn't consider the file as safe. TEST_F(DownloadTargetDeterminerTest, ContinueWithoutConfirmation_SaveAs) { @@ -1350,7 +1446,8 @@ FILE_PATH_LITERAL("foo.kindabad"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_UNCONFIRMED}; + EXPECT_UNCONFIRMED, + DEFAULT_DIRECTORY}; EXPECT_CALL( *delegate(), @@ -1378,7 +1475,8 @@ FILE_PATH_LITERAL("foo.kindabad"), DownloadItem::TARGET_DISPOSITION_PROMPT, - EXPECT_CRDOWNLOAD}; + EXPECT_CRDOWNLOAD, + DEFAULT_DIRECTORY}; EXPECT_CALL( *delegate(), @@ -1408,7 +1506,7 @@ FILE_PATH_LITERAL("foo.kindabad"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_UNCONFIRMED}, + EXPECT_UNCONFIRMED, DEFAULT_DIRECTORY}, {// 1: Automatic User Script - Shouldn't prompt for user script downloads // even if "Prompt for download" preference is set. @@ -1419,7 +1517,7 @@ FILE_PATH_LITERAL("foo.user.js"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_CRDOWNLOAD}, + EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY}, }; SetPromptForDownload(true); @@ -1439,7 +1537,7 @@ FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_CRDOWNLOAD}, + EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY}, {// 1: Save_As Safe SAVE_AS, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, @@ -1448,7 +1546,7 @@ FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_CRDOWNLOAD}, + EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY}, }; SetManagedDownloadPath(test_download_dir()); @@ -1469,7 +1567,7 @@ FILE_PATH_LITERAL("overridden/foo.txt"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_CRDOWNLOAD}, + EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY}, {// 1: Save_As Safe SAVE_AS, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, @@ -1479,7 +1577,7 @@ FILE_PATH_LITERAL("overridden/foo.txt"), DownloadItem::TARGET_DISPOSITION_PROMPT, - EXPECT_CRDOWNLOAD}, + EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY}, {// 2: Automatic Dangerous AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE, @@ -1489,7 +1587,7 @@ FILE_PATH_LITERAL("overridden/foo.kindabad"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_UNCONFIRMED}, + EXPECT_UNCONFIRMED, DEFAULT_DIRECTORY}, {// 3: Forced Safe FORCED, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, @@ -1499,7 +1597,7 @@ FILE_PATH_LITERAL("forced-foo.txt"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_LOCAL_PATH}, + EXPECT_LOCAL_PATH, DEFAULT_DIRECTORY}, }; ON_CALL(*delegate(), NotifyExtensions(_, _, _)) @@ -1522,7 +1620,8 @@ FILE_PATH_LITERAL("overridden/foo.kindabad"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_UNCONFIRMED}; + EXPECT_UNCONFIRMED, + DEFAULT_DIRECTORY}; const DownloadTestCase kHandledBySafeBrowsing = { AUTOMATIC, @@ -1535,7 +1634,8 @@ FILE_PATH_LITERAL("overridden/foo.kindabad"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_UNCONFIRMED}; + EXPECT_UNCONFIRMED, + DEFAULT_DIRECTORY}; ON_CALL(*delegate(), NotifyExtensions(_, _, _)) .WillByDefault(Invoke(&NotifyExtensionsOverridePath)); @@ -1561,7 +1661,8 @@ FILE_PATH_LITERAL("overridden/foo.txt"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_CRDOWNLOAD}; + EXPECT_CRDOWNLOAD, + DEFAULT_DIRECTORY}; const DownloadTestCase& test_case = kNotifyExtensionsTestCase; std::unique_ptr<content::MockDownloadItem> item = @@ -1610,7 +1711,8 @@ FILE_PATH_LITERAL("overridden/foo.txt"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_CRDOWNLOAD}; + EXPECT_CRDOWNLOAD, + DEFAULT_DIRECTORY}; const DownloadTestCase& test_case = kNotifyExtensionsTestCase; std::unique_ptr<content::MockDownloadItem> item = @@ -1647,7 +1749,8 @@ kInitialPath, DownloadItem::TARGET_DISPOSITION_PROMPT, - EXPECT_CRDOWNLOAD}; + EXPECT_CRDOWNLOAD, + DEFAULT_DIRECTORY}; const DownloadTestCase& test_case = kInitialPathTestCase; std::unique_ptr<content::MockDownloadItem> item = @@ -1680,7 +1783,7 @@ FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_CRDOWNLOAD}, + EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY}, {// 1: Save_As Safe: Initial path used. SAVE_AS, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, @@ -1689,7 +1792,7 @@ kInitialPath, DownloadItem::TARGET_DISPOSITION_PROMPT, - EXPECT_CRDOWNLOAD}, + EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY}, {// 2: Automatic Dangerous: Initial path is ignored since the user hasn't // been prompted before. @@ -1700,7 +1803,7 @@ FILE_PATH_LITERAL("foo.kindabad"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_UNCONFIRMED}, + EXPECT_UNCONFIRMED, DEFAULT_DIRECTORY}, {// 3: Forced Safe: Initial path is ignored due to the forced path. FORCED, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, @@ -1710,7 +1813,7 @@ FILE_PATH_LITERAL("forced-foo.txt"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_LOCAL_PATH}, + EXPECT_LOCAL_PATH, DEFAULT_DIRECTORY}, }; // The test assumes that .kindabad files have a danger level of @@ -1759,7 +1862,8 @@ FILE_PATH_LITERAL("forced-foo.txt"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_LOCAL_PATH}; + EXPECT_LOCAL_PATH, + DEFAULT_DIRECTORY}; const DownloadTestCase& test_case = kResumedForcedDownload; base::FilePath expected_path = @@ -1804,27 +1908,24 @@ kInitialPath, DownloadItem::TARGET_DISPOSITION_PROMPT, - EXPECT_CRDOWNLOAD}, + EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY}, - { - // 2: Automatic Dangerous - AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, - DownloadFileType::NOT_DANGEROUS, "http://example.com/foo.kindabad", - "", FILE_PATH_LITERAL(""), + {// 2: Automatic Dangerous + AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, + DownloadFileType::NOT_DANGEROUS, "http://example.com/foo.kindabad", "", + FILE_PATH_LITERAL(""), - FILE_PATH_LITERAL("foo.kindabad"), - DownloadItem::TARGET_DISPOSITION_PROMPT, EXPECT_CRDOWNLOAD, - }, + FILE_PATH_LITERAL("foo.kindabad"), + DownloadItem::TARGET_DISPOSITION_PROMPT, EXPECT_CRDOWNLOAD, + DEFAULT_DIRECTORY}, - { - // 3: Automatic Dangerous - AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, - DownloadFileType::NOT_DANGEROUS, "http://example.com/foo.bad", "", - FILE_PATH_LITERAL(""), + {// 3: Automatic Dangerous + AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, + DownloadFileType::NOT_DANGEROUS, "http://example.com/foo.bad", "", + FILE_PATH_LITERAL(""), - FILE_PATH_LITERAL("foo.bad"), DownloadItem::TARGET_DISPOSITION_PROMPT, - EXPECT_CRDOWNLOAD, - }, + FILE_PATH_LITERAL("foo.bad"), DownloadItem::TARGET_DISPOSITION_PROMPT, + EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY}, }; ASSERT_EQ(DownloadFileType::ALLOW_ON_USER_GESTURE, @@ -1878,7 +1979,7 @@ FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_CRDOWNLOAD}, + EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY}, FILE_PATH_LITERAL("bar.txt.crdownload"), FILE_PATH_LITERAL("foo.txt.crdownload")}, @@ -1889,7 +1990,7 @@ kInitialPath, DownloadItem::TARGET_DISPOSITION_PROMPT, - EXPECT_CRDOWNLOAD}, + EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY}, FILE_PATH_LITERAL("foo.txt.crdownload"), FILE_PATH_LITERAL("some_path/bar.txt.crdownload")}, @@ -1901,7 +2002,7 @@ FILE_PATH_LITERAL("foo.kindabad"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_UNCONFIRMED}, + EXPECT_UNCONFIRMED, DEFAULT_DIRECTORY}, FILE_PATH_LITERAL("Unconfirmed abcd.crdownload"), FILE_PATH_LITERAL("Unconfirmed abcd.crdownload")}, @@ -1913,7 +2014,7 @@ FILE_PATH_LITERAL("foo.kindabad"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_UNCONFIRMED}, + EXPECT_UNCONFIRMED, DEFAULT_DIRECTORY}, FILE_PATH_LITERAL("other_path/Unconfirmed abcd.crdownload"), // Rely on the EXPECT_UNCONFIRMED check in the general test settings. A // new intermediate path of the form "Unconfirmed <number>.crdownload" @@ -1929,7 +2030,7 @@ FILE_PATH_LITERAL("forced-foo.txt"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_LOCAL_PATH}, + EXPECT_LOCAL_PATH, DEFAULT_DIRECTORY}, FILE_PATH_LITERAL("forced-foo.txt"), FILE_PATH_LITERAL("forced-foo.txt")}, }; @@ -1988,7 +2089,7 @@ FILE_PATH_LITERAL("foo.png"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_CRDOWNLOAD}, + EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY}, "image/png"}, {{// 1: Empty MIME type in response. AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, @@ -1998,7 +2099,7 @@ FILE_PATH_LITERAL("foo.png"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_CRDOWNLOAD}, + EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY}, "image/png"}, {{// 2: Forced path. FORCED, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, @@ -2008,7 +2109,7 @@ FILE_PATH_LITERAL("foo.png"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_CRDOWNLOAD}, + EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY}, "image/png"}, {{// 3: Unknown file type. AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, @@ -2018,7 +2119,7 @@ FILE_PATH_LITERAL("foo.notarealext"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_CRDOWNLOAD}, + EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY}, ""}, {{// 4: Unknown file type. AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, @@ -2028,7 +2129,7 @@ FILE_PATH_LITERAL("foo.notarealext"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_CRDOWNLOAD}, + EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY}, ""}, {{// 5: x-x509-user-cert mime-type. AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, @@ -2038,7 +2139,7 @@ FILE_PATH_LITERAL("user.crt"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_CRDOWNLOAD}, + EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY}, ""}, }; @@ -2075,7 +2176,8 @@ FILE_PATH_LITERAL(""), FILE_PATH_LITERAL("foo.crx"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_CRDOWNLOAD}; + EXPECT_CRDOWNLOAD, + DEFAULT_DIRECTORY}; const DownloadTestCase& test_case = kUserValidatedTestCase; std::unique_ptr<content::MockDownloadItem> item( @@ -2227,7 +2329,8 @@ FILE_PATH_LITERAL("foo.fakeext"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_CRDOWNLOAD}; + EXPECT_CRDOWNLOAD, + DEFAULT_DIRECTORY}; content::PluginService* plugin_service = content::PluginService::GetInstance(); @@ -2296,7 +2399,8 @@ FILE_PATH_LITERAL("foo.fakeext"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, - EXPECT_CRDOWNLOAD}; + EXPECT_CRDOWNLOAD, + DEFAULT_DIRECTORY}; content::PluginService* plugin_service = content::PluginService::GetInstance();
diff --git a/chrome/browser/extensions/api/developer_private/developer_private_api.cc b/chrome/browser/extensions/api/developer_private/developer_private_api.cc index c8a2423..44d26a7 100644 --- a/chrome/browser/extensions/api/developer_private/developer_private_api.cc +++ b/chrome/browser/extensions/api/developer_private/developer_private_api.cc
@@ -902,6 +902,7 @@ PackExtensionJob::StandardSuccessMessage(crx_file, pem_file)); response.status = developer::PACK_STATUS_SUCCESS; Respond(OneArgument(response.ToValue())); + pack_job_.reset(); Release(); // Balanced in Run(). } @@ -919,6 +920,7 @@ response.status = developer::PACK_STATUS_ERROR; } Respond(OneArgument(response.ToValue())); + pack_job_.reset(); Release(); // Balanced in Run(). } @@ -958,8 +960,8 @@ AddRef(); // Balanced in OnPackSuccess / OnPackFailure. - // TODO(devlin): Why is PackExtensionJob ref-counted? - pack_job_ = new PackExtensionJob(this, root_directory, key_file, flags); + pack_job_ = + base::MakeUnique<PackExtensionJob>(this, root_directory, key_file, flags); pack_job_->Start(); return RespondLater(); }
diff --git a/chrome/browser/extensions/api/developer_private/developer_private_api.h b/chrome/browser/extensions/api/developer_private/developer_private_api.h index 7580156..84e0e8c 100644 --- a/chrome/browser/extensions/api/developer_private/developer_private_api.h +++ b/chrome/browser/extensions/api/developer_private/developer_private_api.h
@@ -466,7 +466,7 @@ ResponseAction Run() override; private: - scoped_refptr<PackExtensionJob> pack_job_; + std::unique_ptr<PackExtensionJob> pack_job_; std::string item_path_str_; std::string key_path_str_; };
diff --git a/chrome/browser/extensions/api/feedback_private/chrome_feedback_private_delegate.cc b/chrome/browser/extensions/api/feedback_private/chrome_feedback_private_delegate.cc index 13c4e52..3e925eae 100644 --- a/chrome/browser/extensions/api/feedback_private/chrome_feedback_private_delegate.cc +++ b/chrome/browser/extensions/api/feedback_private/chrome_feedback_private_delegate.cc
@@ -9,7 +9,9 @@ #include "base/memory/ptr_util.h" #include "base/values.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/feedback/system_logs/chrome_system_logs_fetcher.h" #include "chrome/grit/generated_resources.h" +#include "components/feedback/system_logs/system_logs_fetcher.h" #include "components/strings/grit/components_strings.h" #include "content/public/browser/browser_context.h" #include "ui/base/l10n/l10n_util.h" @@ -86,4 +88,10 @@ return dict; } +system_logs::SystemLogsFetcher* +ChromeFeedbackPrivateDelegate::CreateSystemLogsFetcher( + content::BrowserContext* context) const { + return system_logs::BuildChromeSystemLogsFetcher(); +} + } // namespace extensions
diff --git a/chrome/browser/extensions/api/feedback_private/chrome_feedback_private_delegate.h b/chrome/browser/extensions/api/feedback_private/chrome_feedback_private_delegate.h index 0e02e5b..27a881e 100644 --- a/chrome/browser/extensions/api/feedback_private/chrome_feedback_private_delegate.h +++ b/chrome/browser/extensions/api/feedback_private/chrome_feedback_private_delegate.h
@@ -22,6 +22,8 @@ std::unique_ptr<base::DictionaryValue> GetStrings( content::BrowserContext* browser_context, bool from_crash) const override; + system_logs::SystemLogsFetcher* CreateSystemLogsFetcher( + content::BrowserContext* context) const override; private: DISALLOW_COPY_AND_ASSIGN(ChromeFeedbackPrivateDelegate);
diff --git a/chrome/browser/extensions/api/feedback_private/feedback_private_api.cc b/chrome/browser/extensions/api/feedback_private/feedback_private_api.cc index 534533b..993f9dc 100644 --- a/chrome/browser/extensions/api/feedback_private/feedback_private_api.cc +++ b/chrome/browser/extensions/api/feedback_private/feedback_private_api.cc
@@ -27,6 +27,7 @@ #include "chrome/common/extensions/api/feedback_private.h" #include "chrome/common/extensions/extension_constants.h" #include "chrome/grit/generated_resources.h" +#include "components/feedback/system_logs/system_logs_fetcher.h" #include "components/feedback/tracing_manager.h" #include "components/signin/core/browser/signin_manager.h" #include "extensions/browser/api/extensions_api_client.h" @@ -92,9 +93,9 @@ FeedbackPrivateAPI::FeedbackPrivateAPI(content::BrowserContext* context) : browser_context_(context), #if !defined(OS_CHROMEOS) - service_(new FeedbackService()) { + service_(new FeedbackService(context)) { #else - service_(new FeedbackService()), + service_(new FeedbackService(context)), log_source_access_manager_(new LogSourceAccessManager(context)){ #endif // defined(OS_CHROMEOS) } @@ -211,13 +212,16 @@ ExtensionFunction::ResponseAction FeedbackPrivateGetSystemInformationFunction::Run() { - FeedbackService* service = FeedbackPrivateAPI::GetFactoryInstance() - ->Get(browser_context()) - ->GetService(); - DCHECK(service); - service->GetSystemInformation( - base::Bind( - &FeedbackPrivateGetSystemInformationFunction::OnCompleted, this)); + FeedbackPrivateDelegate* feedback_private_delegate = + ExtensionsAPIClient::Get()->GetFeedbackPrivateDelegate(); + DCHECK(feedback_private_delegate); + + // Self-deleting object. + system_logs::SystemLogsFetcher* fetcher = + feedback_private_delegate->CreateSystemLogsFetcher(browser_context()); + fetcher->Fetch(base::Bind( + &FeedbackPrivateGetSystemInformationFunction::OnCompleted, this)); + return RespondLater(); } @@ -329,7 +333,7 @@ } service->SendFeedback( - browser_context(), feedback_data, + feedback_data, base::Bind(&FeedbackPrivateSendFeedbackFunction::OnCompleted, this)); return RespondLater();
diff --git a/chrome/browser/extensions/api/feedback_private/feedback_service.cc b/chrome/browser/extensions/api/feedback_private/feedback_service.cc index 8d1fcef..7baa7cfd 100644 --- a/chrome/browser/extensions/api/feedback_private/feedback_service.cc +++ b/chrome/browser/extensions/api/feedback_private/feedback_service.cc
@@ -9,7 +9,6 @@ #include "base/callback.h" #include "base/memory/weak_ptr.h" #include "base/strings/string_number_conversions.h" -#include "chrome/browser/feedback/system_logs/chrome_system_logs_fetcher.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_thread.h" #include "extensions/browser/blob_reader.h" @@ -22,14 +21,13 @@ namespace extensions { -FeedbackService::FeedbackService() { -} +FeedbackService::FeedbackService(content::BrowserContext* browser_context) + : browser_context_(browser_context) {} FeedbackService::~FeedbackService() { } -void FeedbackService::SendFeedback(content::BrowserContext* browser_context, - scoped_refptr<FeedbackData> feedback_data, +void FeedbackService::SendFeedback(scoped_refptr<FeedbackData> feedback_data, const SendFeedbackCallback& callback) { feedback_data->set_locale( ExtensionsBrowserClient::Get()->GetApplicationLocale()); @@ -38,7 +36,7 @@ if (!feedback_data->attached_file_uuid().empty()) { // Self-deleting object. BlobReader* attached_file_reader = - new BlobReader(browser_context, feedback_data->attached_file_uuid(), + new BlobReader(browser_context_, feedback_data->attached_file_uuid(), base::Bind(&FeedbackService::AttachedFileCallback, AsWeakPtr(), feedback_data, callback)); attached_file_reader->Start(); @@ -47,7 +45,7 @@ if (!feedback_data->screenshot_uuid().empty()) { // Self-deleting object. BlobReader* screenshot_reader = - new BlobReader(browser_context, feedback_data->screenshot_uuid(), + new BlobReader(browser_context_, feedback_data->screenshot_uuid(), base::Bind(&FeedbackService::ScreenshotCallback, AsWeakPtr(), feedback_data, callback)); screenshot_reader->Start(); @@ -56,14 +54,6 @@ CompleteSendFeedback(feedback_data, callback); } -void FeedbackService::GetSystemInformation( - const system_logs::SysLogsFetcherCallback& callback) { - // Self-deleting object. - system_logs::SystemLogsFetcher* fetcher = - system_logs::BuildChromeSystemLogsFetcher(); - fetcher->Fetch(callback); -} - void FeedbackService::AttachedFileCallback( scoped_refptr<feedback::FeedbackData> feedback_data, const SendFeedbackCallback& callback,
diff --git a/chrome/browser/extensions/api/feedback_private/feedback_service.h b/chrome/browser/extensions/api/feedback_private/feedback_service.h index d51ca86f..f6530de 100644 --- a/chrome/browser/extensions/api/feedback_private/feedback_service.h +++ b/chrome/browser/extensions/api/feedback_private/feedback_service.h
@@ -13,11 +13,10 @@ #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "components/feedback/feedback_data.h" -#include "components/feedback/system_logs/system_logs_fetcher.h" namespace content { class BrowserContext; -} +} // namespace content namespace extensions { @@ -32,19 +31,13 @@ // offline). using SendFeedbackCallback = base::Callback<void(bool)>; - FeedbackService(); + explicit FeedbackService(content::BrowserContext* browser_context); virtual ~FeedbackService(); // Sends a feedback report. - void SendFeedback(content::BrowserContext* browser_context, - scoped_refptr<feedback::FeedbackData> feedback_data, + void SendFeedback(scoped_refptr<feedback::FeedbackData> feedback_data, const SendFeedbackCallback& callback); - // Start to gather system information. - // The |callback| will be invoked once the query is completed. - void GetSystemInformation( - const system_logs::SysLogsFetcherCallback& callback); - private: // Callbacks to receive blob data. void AttachedFileCallback(scoped_refptr<feedback::FeedbackData> feedback_data, @@ -61,6 +54,8 @@ void CompleteSendFeedback(scoped_refptr<feedback::FeedbackData> feedback_data, const SendFeedbackCallback& callback); + content::BrowserContext* browser_context_; + DISALLOW_COPY_AND_ASSIGN(FeedbackService); };
diff --git a/chrome/browser/extensions/api/file_system/file_system_apitest_chromeos.cc b/chrome/browser/extensions/api/file_system/file_system_apitest_chromeos.cc index 103a946..cf7da480 100644 --- a/chrome/browser/extensions/api/file_system/file_system_apitest_chromeos.cc +++ b/chrome/browser/extensions/api/file_system/file_system_apitest_chromeos.cc
@@ -152,8 +152,11 @@ drive::DriveIntegrationService* CreateDriveIntegrationService( Profile* profile) { // Ignore signin profile. - if (profile->GetPath() == chromeos::ProfileHelper::GetSigninProfileDir()) + if (profile->GetPath() == chromeos::ProfileHelper::GetSigninProfileDir() || + profile->GetPath() == + chromeos::ProfileHelper::GetLockScreenAppProfilePath()) { return nullptr; + } // FileSystemApiTestForDrive doesn't expect that several user profiles could // exist simultaneously.
diff --git a/chrome/browser/extensions/extension_context_menu_browsertest.cc b/chrome/browser/extensions/extension_context_menu_browsertest.cc index ec76b112..30e3ef8 100644 --- a/chrome/browser/extensions/extension_context_menu_browsertest.cc +++ b/chrome/browser/extensions/extension_context_menu_browsertest.cc
@@ -76,13 +76,11 @@ const extensions::ExtensionSet& extensions = extensions::ExtensionRegistry::Get( browser()->profile())->enabled_extensions(); - for (extensions::ExtensionSet::const_iterator i = extensions.begin(); - i != extensions.end(); ++i) { - if ((*i)->name() == name) { - return i->get(); - } + for (const auto& ext : extensions) { + if (ext->name() == name) + return ext.get(); } - return NULL; + return nullptr; } // This gets all the items that any extension has registered for possible @@ -178,10 +176,8 @@ bool MenuHasExtensionItemWithLabel(TestRenderViewContextMenu* menu, const std::string& label) { base::string16 label16 = base::UTF8ToUTF16(label); - std::map<int, MenuItem::Id>::iterator i; - for (i = menu->extension_items().extension_item_map_.begin(); - i != menu->extension_items().extension_item_map_.end(); ++i) { - const MenuItem::Id& id = i->second; + for (const auto& it : menu->extension_items().extension_item_map_) { + const MenuItem::Id& id = it.second; base::string16 tmp_label; EXPECT_TRUE(GetItemLabel(menu, id, &tmp_label)); if (tmp_label == label16) @@ -195,12 +191,12 @@ // false. bool GetItemLabel(TestRenderViewContextMenu* menu, const MenuItem::Id& id, - base::string16* result) { + base::string16* result) const { int command_id = 0; if (!FindCommandId(menu, id, &command_id)) return false; - MenuModel* model = NULL; + MenuModel* model = nullptr; int index = -1; if (!menu->GetMenuModelAndItemIndex(command_id, &model, &index)) { return false; @@ -213,12 +209,10 @@ // in the menu. bool FindCommandId(TestRenderViewContextMenu* menu, const MenuItem::Id& id, - int* command_id) { - std::map<int, MenuItem::Id>::const_iterator i; - for (i = menu->extension_items().extension_item_map_.begin(); - i != menu->extension_items().extension_item_map_.end(); ++i) { - if (i->second == id) { - *command_id = i->first; + int* command_id) const { + for (const auto& it : menu->extension_items().extension_item_map_) { + if (it.second == id) { + *command_id = it.first; return true; } } @@ -312,8 +306,8 @@ ASSERT_TRUE(listener_update2.WaitUntilSatisfied()); // Rebuild the context menu and click on the second extension item. - menu.reset(TestRenderViewContextMenu::Create(GetWebContents(), page_url, - GURL(), GURL())); + menu = TestRenderViewContextMenu::Create(GetWebContents(), page_url, GURL(), + GURL()); id.string_uid = "id2"; ASSERT_TRUE(FindCommandId(menu.get(), id, &command_id)); menu->ExecuteCommand(command_id, 0); @@ -542,7 +536,7 @@ TestRenderViewContextMenu::Create(GetWebContents(), url, GURL(), GURL())); int index = 0; - MenuModel* model = NULL; + MenuModel* model = nullptr; ASSERT_TRUE(menu->GetMenuModelAndItemIndex( ContextMenuMatcher::ConvertToExtensionsCustomCommandId(0), @@ -612,7 +606,7 @@ // Load the extension. ASSERT_TRUE(LoadContextMenuExtension("separators")); const extensions::Extension* extension = GetExtensionNamed("Separators Test"); - ASSERT_TRUE(extension != NULL); + ASSERT_TRUE(extension); // Navigate to test1.html inside the extension, which should create a bunch // of items at the top-level (but they'll get pushed into an auto-generated @@ -628,7 +622,7 @@ // The top-level item should be an "automagic parent" with the extension's // name. - MenuModel* model = NULL; + MenuModel* model = nullptr; int index = 0; base::string16 label; ASSERT_TRUE(menu->GetMenuModelAndItemIndex( @@ -640,7 +634,7 @@ // Get the submenu and verify the items there. MenuModel* submenu = model->GetSubmenuModelAt(index); - ASSERT_TRUE(submenu != NULL); + ASSERT_TRUE(submenu); VerifyMenuForSeparatorsTest(*submenu); // Now run our second test - navigate to test2.html which creates an explicit @@ -649,15 +643,15 @@ ui_test_utils::NavigateToURL(browser(), GURL(extension->GetResourceURL("test2.html"))); listener2.WaitUntilSatisfied(); - menu.reset( - TestRenderViewContextMenu::Create(GetWebContents(), url, GURL(), GURL())); + menu = + TestRenderViewContextMenu::Create(GetWebContents(), url, GURL(), GURL()); ASSERT_TRUE(menu->GetMenuModelAndItemIndex( ContextMenuMatcher::ConvertToExtensionsCustomCommandId(0), &model, &index)); EXPECT_EQ(base::UTF8ToUTF16("parent"), model->GetLabelAt(index)); submenu = model->GetSubmenuModelAt(index); - ASSERT_TRUE(submenu != NULL); + ASSERT_TRUE(submenu); VerifyMenuForSeparatorsTest(*submenu); }
diff --git a/chrome/browser/extensions/extension_service_unittest.cc b/chrome/browser/extensions/extension_service_unittest.cc index 9be8d26..07c82e0 100644 --- a/chrome/browser/extensions/extension_service_unittest.cc +++ b/chrome/browser/extensions/extension_service_unittest.cc
@@ -1912,18 +1912,20 @@ temp_dir.GetPath().Append(expected_private_key_names[i]); PackExtensionTestClient pack_client(expected_crx_path, expected_private_key_path); - scoped_refptr<extensions::PackExtensionJob> packer( - new extensions::PackExtensionJob(&pack_client, output_dir, - base::FilePath(), - ExtensionCreator::kOverwriteCRX)); - packer->Start(); + { + extensions::PackExtensionJob packer(&pack_client, output_dir, + base::FilePath(), + ExtensionCreator::kOverwriteCRX); + packer.Start(); - // The packer will post a notification task to the current thread's message - // loop when it is finished. We manually run the loop here so that we - // block and catch the notification; otherwise, the process would exit. - // This call to |Run()| is matched by a call to |Quit()| in the - // |PackExtensionTestClient|'s notification handling code. - base::RunLoop().Run(); + // The packer will post a notification task to the current thread's + // message loop when it is finished. We manually run the loop here so + // that we block and catch the notification; otherwise, the process would + // exit. + // This call to |Run()| is matched by a call to |Quit()| in the + // |PackExtensionTestClient|'s notification handling code. + base::RunLoop().Run(); + } if (HasFatalFailure()) return;
diff --git a/chrome/browser/extensions/pack_extension_job.cc b/chrome/browser/extensions/pack_extension_job.cc index 330b028..87d07d9 100644 --- a/chrome/browser/extensions/pack_extension_job.cc +++ b/chrome/browser/extensions/pack_extension_job.cc
@@ -8,8 +8,11 @@ #include "base/message_loop/message_loop.h" #include "base/strings/sys_string_conversions.h" #include "base/strings/utf_string_conversions.h" +#include "base/threading/sequenced_task_runner_handle.h" #include "chrome/browser/extensions/extension_creator.h" #include "chrome/grit/generated_resources.h" +#include "content/public/browser/browser_thread.h" +#include "extensions/browser/extension_file_task_runner.h" #include "extensions/common/constants.h" #include "ui/base/l10n/l10n_util.h" @@ -21,70 +24,92 @@ const base::FilePath& root_directory, const base::FilePath& key_file, int run_flags) - : client_(client), key_file_(key_file), asynchronous_(true), + : client_(client), + key_file_(key_file), run_flags_(run_flags | ExtensionCreator::kRequireModernManifestVersion) { root_directory_ = root_directory.StripTrailingSeparators(); - CHECK(BrowserThread::GetCurrentThreadIdentifier(&client_thread_id_)); -} - -void PackExtensionJob::Start() { - if (asynchronous_) { - BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, - base::BindOnce(&PackExtensionJob::Run, this)); - } else { - Run(); - } -} - -void PackExtensionJob::ClearClient() { - client_ = NULL; } PackExtensionJob::~PackExtensionJob() {} -void PackExtensionJob::Run() { - crx_file_out_ = base::FilePath(root_directory_.value() + - kExtensionFileExtension); +void PackExtensionJob::Start() { + if (run_mode_ == RunMode::ASYNCHRONOUS) { + scoped_refptr<base::SequencedTaskRunner> task_runner = + base::SequencedTaskRunnerHandle::Get(); + GetExtensionFileTaskRunner()->PostTask( + FROM_HERE, + base::BindOnce(&PackExtensionJob::Run, + // See class level comments for why Unretained is safe. + base::Unretained(this), std::move(task_runner))); + } else { + DCHECK_EQ(RunMode::SYNCHRONOUS, run_mode_); + Run(nullptr); + } +} - if (key_file_.empty()) - key_file_out_ = base::FilePath(root_directory_.value() + - kExtensionKeyFileExtension); +void PackExtensionJob::Run( + scoped_refptr<base::SequencedTaskRunner> async_reply_task_runner) { + DCHECK_EQ(!!async_reply_task_runner, run_mode_ == RunMode::ASYNCHRONOUS) + << "Provide task runner iff we are running in asynchronous mode."; + // TODO(lazyboy): Use root_directory_.AddExtension(kExtensionFileExtension). + auto crx_file_out = base::MakeUnique<base::FilePath>(root_directory_.value() + + kExtensionFileExtension); + + auto key_file_out = base::MakeUnique<base::FilePath>(); + if (key_file_.empty()) { + // TODO(lazyboy): Use + // root_directory_.AddExtension(kExtensionKeyFileExtension). + *key_file_out = + base::FilePath(root_directory_.value() + kExtensionKeyFileExtension); + } // TODO(aa): Need to internationalize the errors that ExtensionCreator // returns. See bug 20734. ExtensionCreator creator; - if (creator.Run(root_directory_, crx_file_out_, key_file_, key_file_out_, + if (creator.Run(root_directory_, *crx_file_out, key_file_, *key_file_out, run_flags_)) { - if (asynchronous_) { - BrowserThread::PostTask( - client_thread_id_, FROM_HERE, - base::BindOnce(&PackExtensionJob::ReportSuccessOnClientThread, this)); + if (run_mode_ == RunMode::ASYNCHRONOUS) { + async_reply_task_runner->PostTask( + FROM_HERE, + base::BindOnce(&PackExtensionJob::ReportSuccessOnClientSequence, + // See class level comments for why Unretained is safe. + base::Unretained(this), std::move(crx_file_out), + std::move(key_file_out))); + } else { - ReportSuccessOnClientThread(); + ReportSuccessOnClientSequence(std::move(crx_file_out), + std::move(key_file_out)); } } else { - if (asynchronous_) { - BrowserThread::PostTask( - client_thread_id_, FROM_HERE, - base::BindOnce(&PackExtensionJob::ReportFailureOnClientThread, this, - creator.error_message(), creator.error_type())); + if (run_mode_ == RunMode::ASYNCHRONOUS) { + async_reply_task_runner->PostTask( + FROM_HERE, + base::BindOnce(&PackExtensionJob::ReportFailureOnClientSequence, + // See class level comments for why Unretained is safe. + base::Unretained(this), creator.error_message(), + creator.error_type())); } else { - ReportFailureOnClientThread(creator.error_message(), - creator.error_type()); + DCHECK_EQ(RunMode::SYNCHRONOUS, run_mode_); + ReportFailureOnClientSequence(creator.error_message(), + creator.error_type()); } } } -void PackExtensionJob::ReportSuccessOnClientThread() { - if (client_) - client_->OnPackSuccess(crx_file_out_, key_file_out_); +void PackExtensionJob::ReportSuccessOnClientSequence( + std::unique_ptr<base::FilePath> crx_file_out, + std::unique_ptr<base::FilePath> key_file_out) { + DCHECK(client_); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + client_->OnPackSuccess(*crx_file_out, *key_file_out); } -void PackExtensionJob::ReportFailureOnClientThread( +void PackExtensionJob::ReportFailureOnClientSequence( const std::string& error, ExtensionCreator::ErrorType error_type) { - if (client_) - client_->OnPackFailure(error, error_type); + DCHECK(client_); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + client_->OnPackFailure(error, error_type); } // static
diff --git a/chrome/browser/extensions/pack_extension_job.h b/chrome/browser/extensions/pack_extension_job.h index 7d663b0f..62fdc254 100644 --- a/chrome/browser/extensions/pack_extension_job.h +++ b/chrome/browser/extensions/pack_extension_job.h
@@ -9,16 +9,20 @@ #include "base/files/file_path.h" #include "base/macros.h" -#include "base/memory/ref_counted.h" +#include "base/memory/ptr_util.h" +#include "base/sequenced_task_runner.h" #include "base/strings/string16.h" #include "chrome/browser/extensions/extension_creator.h" -#include "content/public/browser/browser_thread.h" namespace extensions { // Manages packing an extension on the file thread and reporting the result // back to the UI. -class PackExtensionJob : public base::RefCountedThreadSafe<PackExtensionJob> { +// Ownership note: In "asynchronous" mode, |Client| has to make sure this +// class's instances are kept alive until OnPackSuccess|OnPackFailure is called. +// Therefore this class assumes that posting task with base::Unretained(this) +// is safe. +class PackExtensionJob { public: // Interface for people who want to use PackExtensionJob to implement. class Client { @@ -36,41 +40,38 @@ const base::FilePath& root_directory, const base::FilePath& key_file, int run_flags); + ~PackExtensionJob(); // Starts the packing job. void Start(); - // The client should call this when it is destroyed to prevent - // PackExtensionJob from attempting to access it. - void ClearClient(); - // The standard packing success message. static base::string16 StandardSuccessMessage(const base::FilePath& crx_file, const base::FilePath& key_file); - void set_asynchronous(bool async) { asynchronous_ = async; } + void set_synchronous() { run_mode_ = RunMode::SYNCHRONOUS; } private: - friend class base::RefCountedThreadSafe<PackExtensionJob>; + enum class RunMode { SYNCHRONOUS, ASYNCHRONOUS }; - virtual ~PackExtensionJob(); + // If |run_mode_| is SYNCHRONOUS, this is run on whichever thread calls it. + void Run(scoped_refptr<base::SequencedTaskRunner> async_reply_task_runner); + void ReportSuccessOnClientSequence( + std::unique_ptr<base::FilePath> crx_file_out, + std::unique_ptr<base::FilePath> key_file_out); + void ReportFailureOnClientSequence(const std::string& error, + ExtensionCreator::ErrorType error_type); - // If |asynchronous_| is false, this is run on whichever thread calls it. - void Run(); - void ReportSuccessOnClientThread(); - void ReportFailureOnClientThread(const std::string& error, - ExtensionCreator::ErrorType error_type); - - content::BrowserThread::ID client_thread_id_; - Client* client_; + Client* const client_; // Owns us. base::FilePath root_directory_; base::FilePath key_file_; - base::FilePath crx_file_out_; - base::FilePath key_file_out_; - bool asynchronous_; + RunMode run_mode_ = RunMode::ASYNCHRONOUS; int run_flags_; // Bitset of ExtensionCreator::RunFlags values - we always // assume kRequireModernManifestVersion, though. + // Used to check methods that run on |client_|'s sequence. + SEQUENCE_CHECKER(sequence_checker_); + DISALLOW_COPY_AND_ASSIGN(PackExtensionJob); };
diff --git a/chrome/browser/extensions/startup_helper.cc b/chrome/browser/extensions/startup_helper.cc index fef26b7..4bfaaa1 100644 --- a/chrome/browser/extensions/startup_helper.cc +++ b/chrome/browser/extensions/startup_helper.cc
@@ -62,12 +62,12 @@ private_key_path = cmd_line.GetSwitchValuePath(switches::kPackExtensionKey); } - // Launch a job to perform the packing on the file thread. Ignore warnings - // from the packing process. (e.g. Overwrite any existing crx file.) - pack_job_ = new PackExtensionJob(this, src_dir, private_key_path, - ExtensionCreator::kOverwriteCRX); - pack_job_->set_asynchronous(false); - pack_job_->Start(); + // Launch a job to perform the packing on the blocking thread. Ignore + // warnings from the packing process. (e.g. Overwrite any existing crx file.) + PackExtensionJob pack_job(this, src_dir, private_key_path, + ExtensionCreator::kOverwriteCRX); + pack_job.set_synchronous(); + pack_job.Start(); return pack_job_succeeded_; } @@ -186,9 +186,6 @@ return success; } -StartupHelper::~StartupHelper() { - if (pack_job_.get()) - pack_job_->ClearClient(); -} +StartupHelper::~StartupHelper() {} } // namespace extensions
diff --git a/chrome/browser/extensions/startup_helper.h b/chrome/browser/extensions/startup_helper.h index 43a0d2e..f1f8e37 100644 --- a/chrome/browser/extensions/startup_helper.h +++ b/chrome/browser/extensions/startup_helper.h
@@ -37,7 +37,6 @@ bool ValidateCrx(const base::CommandLine& cmd_line, std::string* error); private: - scoped_refptr<PackExtensionJob> pack_job_; bool pack_job_succeeded_; DISALLOW_COPY_AND_ASSIGN(StartupHelper);
diff --git a/chrome/browser/feature_engagement/feature_tracker.cc b/chrome/browser/feature_engagement/feature_tracker.cc new file mode 100644 index 0000000..f98a607 --- /dev/null +++ b/chrome/browser/feature_engagement/feature_tracker.cc
@@ -0,0 +1,54 @@ +// 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 "chrome/browser/feature_engagement/feature_tracker.h" + +#include "base/time/time.h" +#include "chrome/browser/feature_engagement/tracker_factory.h" +#include "components/feature_engagement/public/event_constants.h" +#include "components/feature_engagement/public/feature_constants.h" +#include "components/feature_engagement/public/tracker.h" + +namespace feature_engagement { + +FeatureTracker::FeatureTracker(Profile* profile, + SessionDurationUpdater* session_duration_updater) + : profile_(profile), + session_duration_updater_(session_duration_updater), + session_duration_observer_(this) { + AddSessionDurationObserver(); +} + +FeatureTracker::~FeatureTracker() = default; + +void FeatureTracker::AddSessionDurationObserver() { + session_duration_observer_.Add(session_duration_updater_); +} + +void FeatureTracker::RemoveSessionDurationObserver() { + session_duration_observer_.Remove(session_duration_updater_); +} + +bool FeatureTracker::IsObserving() { + return session_duration_observer_.IsObserving(session_duration_updater_); +} + +Tracker* FeatureTracker::GetTracker() const { + return TrackerFactory::GetForBrowserContext(profile_); +} + +void FeatureTracker::OnSessionEnded(base::TimeDelta total_session_time) { + if (HasEnoughSessionTimeElapsed(total_session_time)) { + OnSessionTimeMet(); + RemoveSessionDurationObserver(); + } +} + +bool FeatureTracker::HasEnoughSessionTimeElapsed( + base::TimeDelta total_session_time) { + return total_session_time.InMinutes() >= + GetSessionTimeRequiredToShowInMinutes(); +} + +} // namespace feature_engagement
diff --git a/chrome/browser/feature_engagement/feature_tracker.h b/chrome/browser/feature_engagement/feature_tracker.h new file mode 100644 index 0000000..295f8c36 --- /dev/null +++ b/chrome/browser/feature_engagement/feature_tracker.h
@@ -0,0 +1,81 @@ +// 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 CHROME_BROWSER_FEATURE_ENGAGEMENT_FEATURE_TRACKER_H_ +#define CHROME_BROWSER_FEATURE_ENGAGEMENT_FEATURE_TRACKER_H_ + +#include "base/scoped_observer.h" +#include "chrome/browser/feature_engagement/session_duration_updater.h" +#include "chrome/browser/profiles/profile.h" +#include "components/keyed_service/core/keyed_service.h" + +namespace feature_engagement { + +class Tracker; + +// The rFeatureTracker provides a backend for displaying in-product help for the +// various features by collecting all common funcitonality. All subclasses of +// FeatureTracker's factories depend on +// SessionDurationUpdaterFactory::GetInstance() as SessionDurationUpdater is +// responsible for letting all FeatureTrackers know how much active session time +// has passed. +// +// SessionDurationUpdater keeps track of the observed session time and, upon +// each session ending, updates all of the FeatureTrackers with the new total +// observed session time. Once the observed session time exceeds the time +// requirement provided by GetSessionTimeRequiredToShowInMinutes(), the +// FeatureTracker unregisters itself as an obsever of SessionDurationUpdater. +// SessionDurationUpdater stops updating the observed session time if no +// features are observing it, and will start tracking the observed sesion time +// again if another feature is added as an observer later. +class FeatureTracker : public SessionDurationUpdater::Observer, + public KeyedService { + public: + FeatureTracker(Profile* profile, + SessionDurationUpdater* session_duration_updater); + + // Adds the SessionDurationUpdater observer. + void AddSessionDurationObserver(); + // Removes the SessionDurationUpdater observer. + void RemoveSessionDurationObserver(); + + // Returns the whether |session_duration_observer_| is observing sources for + // testing purposes. + bool IsObserving(); + + // SessionDurationUpdater::Observer: + void OnSessionEnded(base::TimeDelta total_session_time) override; + + protected: + ~FeatureTracker() override; + // Returns the required session time in minutes for the FeatureTracker's + // subclass to show its promo. + virtual int GetSessionTimeRequiredToShowInMinutes() = 0; + // Alerts the feature tracker that the session time is up. + virtual void OnSessionTimeMet() = 0; + // Returns the Tracker associated with this FeatureTracker. + virtual Tracker* GetTracker() const; + + private: + // Returns whether the active session time of a user has elapsed more than the + // required active session time for the feature. + bool HasEnoughSessionTimeElapsed(base::TimeDelta total_session_time); + + // Owned by the ProfileManager. + Profile* const profile_; + + // Singleton instance of KeyedService. + SessionDurationUpdater* const session_duration_updater_; + + // Observes the SessionDurationUpdater and notifies when a desktop session + // starts and ends. + ScopedObserver<SessionDurationUpdater, SessionDurationUpdater::Observer> + session_duration_observer_; + + DISALLOW_COPY_AND_ASSIGN(FeatureTracker); +}; + +} // namespace feature_engagement + +#endif // CHROME_BROWSER_FEATURE_ENGAGEMENT_FEATURE_TRACKER_H_
diff --git a/chrome/browser/feature_engagement/feature_tracker_unittest.cc b/chrome/browser/feature_engagement/feature_tracker_unittest.cc new file mode 100644 index 0000000..85ef03d --- /dev/null +++ b/chrome/browser/feature_engagement/feature_tracker_unittest.cc
@@ -0,0 +1,131 @@ +// 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 "chrome/browser/feature_engagement/feature_tracker.h" + +#include "base/feature_list.h" +#include "base/metrics/field_trial.h" +#include "base/metrics/field_trial_param_associator.h" +#include "base/metrics/field_trial_params.h" +#include "base/run_loop.h" +#include "base/sequenced_task_runner.h" +#include "base/test/scoped_feature_list.h" +#include "chrome/browser/feature_engagement/session_duration_updater.h" +#include "chrome/browser/feature_engagement/session_duration_updater_factory.h" +#include "chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/test/base/testing_browser_process.h" +#include "chrome/test/base/testing_profile_manager.h" +#include "components/feature_engagement/public/event_constants.h" +#include "components/feature_engagement/public/feature_constants.h" +#include "components/sync_preferences/testing_pref_service_syncable.h" +#include "components/variations/variations_params_manager.h" +#include "content/public/test/test_browser_thread_bundle.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace feature_engagement { + +namespace { + +const int kTestTimeInMinutes = 100; +const int kTestTimeSufficentInMinutes = 110; +const int kTestTimeInsufficientInMinutes = 90; +const char kTestProfileName[] = "test-profile"; + +class TestFeatureTracker : public FeatureTracker { + public: + explicit TestFeatureTracker(Profile* profile) + : FeatureTracker( + profile, + feature_engagement::SessionDurationUpdaterFactory::GetInstance() + ->GetForProfile(profile)), + pref_service_( + base::MakeUnique<sync_preferences::TestingPrefServiceSyncable>()) { + SessionDurationUpdater::RegisterProfilePrefs(pref_service_->registry()); + } + + int GetSessionTimeRequiredToShowInMinutes() override { + return kTestTimeInMinutes; + } + + void OnSessionTimeMet() override {} + + private: + const std::unique_ptr<sync_preferences::TestingPrefServiceSyncable> + pref_service_; +}; + +class MockTestFeatureTracker : public TestFeatureTracker { + public: + explicit MockTestFeatureTracker(Profile* profile) + : TestFeatureTracker(profile) {} + MOCK_METHOD0(OnSessionTimeMet, void()); +}; + +class FeatureTrackerTest : public testing::Test { + public: + FeatureTrackerTest() = default; + ~FeatureTrackerTest() override = default; + + // testing::Test: + void SetUp() override { + // Start the DesktopSessionDurationTracker to track active session time. + metrics::DesktopSessionDurationTracker::Initialize(); + testing_profile_manager_ = base::MakeUnique<TestingProfileManager>( + TestingBrowserProcess::GetGlobal()); + ASSERT_TRUE(testing_profile_manager_->SetUp()); + mock_feature_tracker_ = + base::MakeUnique<testing::StrictMock<MockTestFeatureTracker>>( + testing_profile_manager_->CreateTestingProfile(kTestProfileName)); + } + + void TearDown() override { + metrics::DesktopSessionDurationTracker::CleanupForTesting(); + testing_profile_manager_.reset(); + } + + protected: + std::unique_ptr<TestingProfileManager> testing_profile_manager_; + std::unique_ptr<MockTestFeatureTracker> mock_feature_tracker_; + + private: + content::TestBrowserThreadBundle thread_bundle_; + + DISALLOW_COPY_AND_ASSIGN(FeatureTrackerTest); +}; + +// If OnSessionEnded parameter is greater than HasEnoughSessionTimeElapsed +// then OnSessionTimeMet should be called. +// +// Note: in this case, RemoveSessionDurationObserver is called inside of +// OnSessionTimeMet, so it doesn't need to be called after the fact. +TEST_F(FeatureTrackerTest, TestExpectOnSessionTimeMet) { + EXPECT_CALL(*mock_feature_tracker_, OnSessionTimeMet()); + mock_feature_tracker_.get()->OnSessionEnded( + base::TimeDelta::FromMinutes(kTestTimeSufficentInMinutes)); +} + +// If OnSessionEnded parameter is less than than HasEnoughSessionTimeElapsed +// then OnSessionTimeMet should not be called. +TEST_F(FeatureTrackerTest, TestDontExpectOnSessionTimeMet) { + mock_feature_tracker_.get()->OnSessionEnded( + base::TimeDelta::FromMinutes(kTestTimeInsufficientInMinutes)); + mock_feature_tracker_.get()->RemoveSessionDurationObserver(); +} + +// The FeatureTracker should be observing sources until the +// RemoveSessionDurationObserver is called. +TEST_F(FeatureTrackerTest, TestAddAndRemoveObservers) { + // AddSessionDurationObserver is called on initialization. + ASSERT_TRUE(mock_feature_tracker_->IsObserving()); + + mock_feature_tracker_.get()->RemoveSessionDurationObserver(); + + EXPECT_FALSE(mock_feature_tracker_->IsObserving()); +} + +} // namespace + +} // namespace feature_engagement
diff --git a/chrome/browser/feature_engagement/new_tab/new_tab_tracker.cc b/chrome/browser/feature_engagement/new_tab/new_tab_tracker.cc index e735dde..fc57d4f0 100644 --- a/chrome/browser/feature_engagement/new_tab/new_tab_tracker.cc +++ b/chrome/browser/feature_engagement/new_tab/new_tab_tracker.cc
@@ -14,8 +14,6 @@ #include "components/feature_engagement/public/event_constants.h" #include "components/feature_engagement/public/feature_constants.h" #include "components/feature_engagement/public/tracker.h" -#include "components/pref_registry/pref_registry_syncable.h" -#include "components/prefs/pref_service.h" namespace { @@ -25,31 +23,21 @@ namespace feature_engagement { -NewTabTracker::NewTabTracker(Profile* profile) - : profile_(profile), duration_tracker_observer_(this) { - AddDurationTrackerObserver(); -} +NewTabTracker::NewTabTracker(Profile* profile, + SessionDurationUpdater* session_duration_updater) + : FeatureTracker(profile, session_duration_updater) {} -NewTabTracker::NewTabTracker() : NewTabTracker(nullptr) {} +NewTabTracker::NewTabTracker(SessionDurationUpdater* session_duration_updater) + : NewTabTracker(nullptr, session_duration_updater) {} NewTabTracker::~NewTabTracker() = default; -// static -void NewTabTracker::RegisterProfilePrefs( - user_prefs::PrefRegistrySyncable* registry) { - registry->RegisterIntegerPref(prefs::kSessionTimeTotal, 0); -} - void NewTabTracker::OnNewTabOpened() { - GetFeatureTracker()->NotifyEvent(events::kNewTabOpened); + GetTracker()->NotifyEvent(events::kNewTabOpened); } void NewTabTracker::OnOmniboxNavigation() { - GetFeatureTracker()->NotifyEvent(events::kOmniboxInteraction); -} - -void NewTabTracker::OnSessionTimeMet() { - GetFeatureTracker()->NotifyEvent(events::kSessionTime); + GetTracker()->NotifyEvent(events::kOmniboxInteraction); } void NewTabTracker::OnOmniboxFocused() { @@ -58,61 +46,23 @@ } void NewTabTracker::OnPromoClosed() { - GetFeatureTracker()->Dismissed(kIPHNewTabFeature); + GetTracker()->Dismissed(kIPHNewTabFeature); } bool NewTabTracker::ShouldShowPromo() { - return GetFeatureTracker()->ShouldTriggerHelpUI(kIPHNewTabFeature); + return GetTracker()->ShouldTriggerHelpUI(kIPHNewTabFeature); } -void NewTabTracker::AddDurationTrackerObserver() { - duration_tracker_observer_.Add(metrics::DesktopSessionDurationTracker::Get()); +void NewTabTracker::OnSessionTimeMet() { + GetTracker()->NotifyEvent(events::kNewTabSessionTimeMet); } -void NewTabTracker::RemoveDurationTrackerObserver() { - duration_tracker_observer_.Remove( - metrics::DesktopSessionDurationTracker::Get()); -} - -bool NewTabTracker::HasEnoughSessionTimeElapsed() { - return GetPrefs()->GetInteger(prefs::kSessionTimeTotal) >= kTwoHoursInMinutes; +int NewTabTracker::GetSessionTimeRequiredToShowInMinutes() { + return kTwoHoursInMinutes; } void NewTabTracker::ShowPromo() { NewTabButton::ShowPromoForLastActiveBrowser(); } -Tracker* NewTabTracker::GetFeatureTracker() { - return TrackerFactory::GetForBrowserContext(profile_); -} - -PrefService* NewTabTracker::GetPrefs() { - return profile_->GetPrefs(); -} - -void NewTabTracker::UpdateSessionTime(base::TimeDelta elapsed) { - // Session time does not need to be tracked anymore if the - // in-product help has been shown already. - // This prevents unnecessary interaction with prefs. - if (GetFeatureTracker()->GetTriggerState(kIPHNewTabFeature) == - Tracker::TriggerState::HAS_BEEN_DISPLAYED) { - return; - } - - base::TimeDelta elapsed_session_time; - elapsed_session_time += base::TimeDelta::FromMinutes(GetPrefs()->GetInteger( - prefs::kSessionTimeTotal)) + - elapsed; - GetPrefs()->SetInteger(prefs::kSessionTimeTotal, - elapsed_session_time.InMinutes()); -} - -void NewTabTracker::OnSessionEnded(base::TimeDelta delta) { - UpdateSessionTime(delta); - if (HasEnoughSessionTimeElapsed()) { - OnSessionTimeMet(); - RemoveDurationTrackerObserver(); - } -} - } // namespace feature_engagement
diff --git a/chrome/browser/feature_engagement/new_tab/new_tab_tracker.h b/chrome/browser/feature_engagement/new_tab/new_tab_tracker.h index 5cb02f8..19d8f7cc 100644 --- a/chrome/browser/feature_engagement/new_tab/new_tab_tracker.h +++ b/chrome/browser/feature_engagement/new_tab/new_tab_tracker.h
@@ -5,33 +5,34 @@ #ifndef CHROME_BROWSER_FEATURE_ENGAGEMENT_NEW_TAB_NEW_TAB_TRACKER_H_ #define CHROME_BROWSER_FEATURE_ENGAGEMENT_NEW_TAB_NEW_TAB_TRACKER_H_ -#include "base/scoped_observer.h" -#include "chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker.h" -#include "chrome/browser/profiles/profile.h" -#include "components/feature_engagement/public/tracker.h" -#include "components/keyed_service/core/keyed_service.h" +#include "chrome/browser/feature_engagement/feature_tracker.h" -namespace user_prefs { -class PrefRegistrySyncable; -} // namespace user_prefs +#include "chrome/browser/feature_engagement/session_duration_updater.h" +#include "chrome/browser/feature_engagement/session_duration_updater_factory.h" namespace feature_engagement { -// The NewTabTracker provides a backend for displaying -// in-product help for the new tab button. -class NewTabTracker : public metrics::DesktopSessionDurationTracker::Observer, - public KeyedService { +// The NewTabTracker provides a backend for displaying in-product help for the +// new tab button. NewTabTracker is the interface through which the event +// constants for the NewTab feature can be be altered. Once all of the event +// constants are met, NewTabTracker calls for the NewTabPromo to be shown, along +// with recording when the NewTabPromo is dimissed. The requirements to show +// the NewTabPromo are as follows: +// +// - At least two hours of observed session time have elapsed. +// - The user has never opened another tab through any means. +// - The user has navigated away from the start home screen. +// - The omnibox is in focus, which implies the user is intending on navigating +// to a new page. +class NewTabTracker : public FeatureTracker { public: - explicit NewTabTracker(Profile* profile); - - static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); + NewTabTracker(Profile* profile, + SessionDurationUpdater* session_duration_updater); // Alerts the new tab tracker that a new tab was opened. void OnNewTabOpened(); // Alerts the new tab tracker that the omnibox has been used. void OnOmniboxNavigation(); - // Alerts the new tab tracker that the session time is up. - void OnSessionTimeMet(); // Checks if the promo should be displayed since the omnibox is on focus. void OnOmniboxFocused(); // Clears the flag for whether there is any in-product help being displayed. @@ -39,44 +40,24 @@ // Returns whether or not the promo should be displayed. bool ShouldShowPromo(); - // Adding the DesktopSessionDurationTracker observer. - void AddDurationTrackerObserver(); - // Removing the DesktopSessionDurationTracker observer. - void RemoveDurationTrackerObserver(); - protected: - NewTabTracker(); + // Alternate constructor to support unit testing. + explicit NewTabTracker(SessionDurationUpdater* session_duration_updater); ~NewTabTracker() override; private: - // Returns whether the active session time of a user has elapsed - // more than two hours. - bool HasEnoughSessionTimeElapsed(); + FRIEND_TEST_ALL_PREFIXES(NewTabTrackerEventTest, TestOnSessionTimeMet); + FRIEND_TEST_ALL_PREFIXES(NewTabTrackerTest, TestShouldNotShowPromo); + FRIEND_TEST_ALL_PREFIXES(NewTabTrackerTest, TestShouldShowPromo); + FRIEND_TEST_ALL_PREFIXES(NewTabTrackerBrowserTest, TestShowPromo); + + // FeatureTracker: + int GetSessionTimeRequiredToShowInMinutes() override; + void OnSessionTimeMet() override; // Sets the NewTabInProductHelp pref to true and calls the New Tab Promo. void ShowPromo(); - // Virtual to support mocking by unit tests. - virtual Tracker* GetFeatureTracker(); - - virtual PrefService* GetPrefs(); - - // Updates the pref that stores active session time per user unless the - // new tab in-product help has been displayed already. - void UpdateSessionTime(base::TimeDelta elapsed); - - // metrics::DesktopSessionDurationTracker::Observer:: - void OnSessionEnded(base::TimeDelta delta) override; - - // Owned by ProfileManager. - Profile* const profile_; - - // Observes the DesktopSessionDurationTracker and notifies when a desktop - // session starts and ends. - ScopedObserver<metrics::DesktopSessionDurationTracker, - metrics::DesktopSessionDurationTracker::Observer> - duration_tracker_observer_; - DISALLOW_COPY_AND_ASSIGN(NewTabTracker); };
diff --git a/chrome/browser/feature_engagement/new_tab/new_tab_tracker_browsertest.cc b/chrome/browser/feature_engagement/new_tab/new_tab_tracker_browsertest.cc index 9c638fb..ca4c502 100644 --- a/chrome/browser/feature_engagement/new_tab/new_tab_tracker_browsertest.cc +++ b/chrome/browser/feature_engagement/new_tab/new_tab_tracker_browsertest.cc
@@ -89,7 +89,8 @@ IN_PROC_BROWSER_TEST_F(NewTabTrackerBrowserTest, TestShowPromo) { // Bypassing the 2 hour active session time requirement. - EXPECT_CALL(*feature_engagement_tracker_, NotifyEvent(events::kSessionTime)); + EXPECT_CALL(*feature_engagement_tracker_, + NotifyEvent(events::kNewTabSessionTimeMet)); NewTabTrackerFactory::GetInstance() ->GetForProfile(browser()->profile()) ->OnSessionTimeMet();
diff --git a/chrome/browser/feature_engagement/new_tab/new_tab_tracker_factory.cc b/chrome/browser/feature_engagement/new_tab/new_tab_tracker_factory.cc index 91f85ea..1f48ca5 100644 --- a/chrome/browser/feature_engagement/new_tab/new_tab_tracker_factory.cc +++ b/chrome/browser/feature_engagement/new_tab/new_tab_tracker_factory.cc
@@ -6,6 +6,8 @@ #include "base/memory/singleton.h" #include "chrome/browser/feature_engagement/new_tab/new_tab_tracker.h" +#include "chrome/browser/feature_engagement/session_duration_updater.h" +#include "chrome/browser/feature_engagement/session_duration_updater_factory.h" #include "chrome/browser/feature_engagement/tracker_factory.h" #include "chrome/browser/profiles/incognito_helpers.h" #include "chrome/browser/profiles/profile.h" @@ -28,6 +30,7 @@ : BrowserContextKeyedServiceFactory( "NewTabTracker", BrowserContextDependencyManager::GetInstance()) { + DependsOn(SessionDurationUpdaterFactory::GetInstance()); DependsOn(TrackerFactory::GetInstance()); } @@ -35,7 +38,10 @@ KeyedService* NewTabTrackerFactory::BuildServiceInstanceFor( content::BrowserContext* context) const { - return new NewTabTracker(Profile::FromBrowserContext(context)); + return new NewTabTracker( + Profile::FromBrowserContext(context), + feature_engagement::SessionDurationUpdaterFactory::GetInstance() + ->GetForProfile(Profile::FromBrowserContext(context))); } content::BrowserContext* NewTabTrackerFactory::GetBrowserContextToUse(
diff --git a/chrome/browser/feature_engagement/new_tab/new_tab_tracker_unittest.cc b/chrome/browser/feature_engagement/new_tab/new_tab_tracker_unittest.cc index d5e12872..c838edf 100644 --- a/chrome/browser/feature_engagement/new_tab/new_tab_tracker_unittest.cc +++ b/chrome/browser/feature_engagement/new_tab/new_tab_tracker_unittest.cc
@@ -11,8 +11,14 @@ #include "base/run_loop.h" #include "base/sequenced_task_runner.h" #include "base/test/scoped_feature_list.h" +#include "chrome/browser/feature_engagement/feature_tracker.h" +#include "chrome/browser/feature_engagement/session_duration_updater.h" +#include "chrome/browser/feature_engagement/session_duration_updater_factory.h" #include "chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker.h" +#include "chrome/browser/profiles/profile.h" #include "chrome/common/pref_names.h" +#include "chrome/test/base/testing_browser_process.h" +#include "chrome/test/base/testing_profile_manager.h" #include "components/feature_engagement/public/event_constants.h" #include "components/feature_engagement/public/feature_constants.h" #include "components/feature_engagement/public/tracker.h" @@ -29,6 +35,7 @@ const char kGroupName[] = "Enabled"; const char kNewTabTrialName[] = "NewTabTrial"; +const char kTestProfileName[] = "test-profile"; class MockTracker : public Tracker { public: @@ -44,17 +51,20 @@ class FakeNewTabTracker : public NewTabTracker { public: - explicit FakeNewTabTracker(Tracker* feature_tracker) - : feature_tracker_(feature_tracker), + FakeNewTabTracker(Tracker* feature_tracker, Profile* profile) + : NewTabTracker( + feature_engagement::SessionDurationUpdaterFactory::GetInstance() + ->GetForProfile(profile)), + feature_tracker_(feature_tracker), pref_service_( base::MakeUnique<sync_preferences::TestingPrefServiceSyncable>()) { - NewTabTracker::RegisterProfilePrefs(pref_service_->registry()); + SessionDurationUpdater::RegisterProfilePrefs(pref_service_->registry()); } - // feature_engagement::NewTabTracker:: - Tracker* GetFeatureTracker() override { return feature_tracker_; } + PrefService* GetPrefs() { return pref_service_.get(); } - PrefService* GetPrefs() override { return pref_service_.get(); } + // feature_engagement::NewTabTracker: + Tracker* GetTracker() const override { return feature_tracker_; } private: Tracker* const feature_tracker_; @@ -71,18 +81,25 @@ void SetUp() override { // Start the DesktopSessionDurationTracker to track active session time. metrics::DesktopSessionDurationTracker::Initialize(); + testing_profile_manager_ = base::MakeUnique<TestingProfileManager>( + TestingBrowserProcess::GetGlobal()); + ASSERT_TRUE(testing_profile_manager_->SetUp()); mock_tracker_ = base::MakeUnique<testing::StrictMock<MockTracker>>(); - new_tab_tracker_ = base::MakeUnique<FakeNewTabTracker>(mock_tracker_.get()); + new_tab_tracker_ = base::MakeUnique<FakeNewTabTracker>( + mock_tracker_.get(), + testing_profile_manager_->CreateTestingProfile(kTestProfileName)); } void TearDown() override { - new_tab_tracker_->RemoveDurationTrackerObserver(); + new_tab_tracker_->RemoveSessionDurationObserver(); metrics::DesktopSessionDurationTracker::CleanupForTesting(); + testing_profile_manager_.reset(); } protected: - std::unique_ptr<FakeNewTabTracker> new_tab_tracker_; + std::unique_ptr<TestingProfileManager> testing_profile_manager_; std::unique_ptr<MockTracker> mock_tracker_; + std::unique_ptr<FakeNewTabTracker> new_tab_tracker_; private: content::TestBrowserThreadBundle thread_bundle_; @@ -111,7 +128,7 @@ // If OnSessionTimeMet() is called, the feature_engagement::Tracker // receives the kSessionTime event. TEST_F(NewTabTrackerEventTest, TestOnSessionTimeMet) { - EXPECT_CALL(*mock_tracker_, NotifyEvent(events::kSessionTime)); + EXPECT_CALL(*mock_tracker_, NotifyEvent(events::kNewTabSessionTimeMet)); new_tab_tracker_->OnSessionTimeMet(); } @@ -144,8 +161,8 @@ "name:new_tab_opened;comparator:==0;window:3650;storage:3650"; new_tab_params["event_omnibox_used"] = "name:omnibox_used;comparator:>=1;window:3650;storage:3650"; - new_tab_params["event_session_time"] = - "name:session_time;comparator:>=1;window:3650;storage:3650"; + new_tab_params["event_new_tab_session_time_met"] = + "name:new_tab_session_time_met;comparator:>=1;window:3650;storage:3650"; new_tab_params["event_trigger"] = "name:new_tab_trigger;comparator:any;window:3650;storage:3650"; new_tab_params["event_used"] = @@ -158,10 +175,15 @@ // Start the DesktopSessionDurationTracker to track active session time. metrics::DesktopSessionDurationTracker::Initialize(); + testing_profile_manager_ = base::MakeUnique<TestingProfileManager>( + TestingBrowserProcess::GetGlobal()); + ASSERT_TRUE(testing_profile_manager_->SetUp()); + feature_engagement_tracker_ = CreateTestTracker(); - new_tab_tracker_ = - base::MakeUnique<FakeNewTabTracker>(feature_engagement_tracker_.get()); + new_tab_tracker_ = base::MakeUnique<FakeNewTabTracker>( + feature_engagement_tracker_.get(), + testing_profile_manager_->CreateTestingProfile(kTestProfileName)); // The feature engagement tracker does async initialization. base::RunLoop().RunUntilIdle(); @@ -169,7 +191,8 @@ } void TearDown() override { - new_tab_tracker_->RemoveDurationTrackerObserver(); + new_tab_tracker_->RemoveSessionDurationObserver(); + testing_profile_manager_->DeleteTestingProfile(kTestProfileName); metrics::DesktopSessionDurationTracker::CleanupForTesting(); // This is required to ensure each test can define its own params. @@ -194,6 +217,7 @@ variations::testing::VariationParamsManager params_manager_; private: + std::unique_ptr<TestingProfileManager> testing_profile_manager_; base::test::ScopedFeatureList scoped_feature_list_; content::TestBrowserThreadBundle thread_bundle_; std::map<std::string, base::FieldTrial*> trials_; @@ -232,22 +256,4 @@ EXPECT_TRUE(new_tab_tracker_->ShouldShowPromo()); } -// Test that the correct duration of session is being recorded. -TEST_F(NewTabTrackerTest, TestOnSessionEnded) { - metrics::DesktopSessionDurationTracker::Observer* observer = - dynamic_cast<FakeNewTabTracker*>(new_tab_tracker_.get()); - - // Simulate passing 30 active minutes. - observer->OnSessionEnded(base::TimeDelta::FromMinutes(30)); - - EXPECT_EQ(30, - new_tab_tracker_->GetPrefs()->GetInteger(prefs::kSessionTimeTotal)); - - // Simulate passing 50 minutes. - observer->OnSessionEnded(base::TimeDelta::FromMinutes(50)); - - EXPECT_EQ(80, - new_tab_tracker_->GetPrefs()->GetInteger(prefs::kSessionTimeTotal)); -} - } // namespace feature_engagement
diff --git a/chrome/browser/feature_engagement/session_duration_updater.cc b/chrome/browser/feature_engagement/session_duration_updater.cc new file mode 100644 index 0000000..46468ac --- /dev/null +++ b/chrome/browser/feature_engagement/session_duration_updater.cc
@@ -0,0 +1,85 @@ +// 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 "chrome/browser/feature_engagement/session_duration_updater.h" + +#include "base/observer_list.h" +#include "base/time/time.h" +#include "chrome/browser/feature_engagement/tracker_factory.h" +#include "chrome/common/pref_names.h" +#include "components/feature_engagement/public/event_constants.h" +#include "components/feature_engagement/public/feature_constants.h" +#include "components/pref_registry/pref_registry_syncable.h" +#include "components/prefs/pref_service.h" + +namespace feature_engagement { + +SessionDurationUpdater::SessionDurationUpdater(PrefService* pref_service) + : duration_tracker_observer_(this), pref_service_(pref_service) { + AddDurationTrackerObserver(); +} + +SessionDurationUpdater::~SessionDurationUpdater() = default; + +// static +void SessionDurationUpdater::RegisterProfilePrefs( + user_prefs::PrefRegistrySyncable* registry) { + registry->RegisterIntegerPref(prefs::kObservedSessionTime, 0); +} + +void SessionDurationUpdater::AddObserver(Observer* observer) { + observer_list_.AddObserver(observer); + + // Re-adds SessionDurationUpdater as an observer of + // DesktopSessionDurationTracker if another feature is added after + // SessionDurationUpdater was removed. + if (!duration_tracker_observer_.IsObserving( + metrics::DesktopSessionDurationTracker::Get())) + AddDurationTrackerObserver(); +} + +void SessionDurationUpdater::RemoveObserver(Observer* observer) { + observer_list_.RemoveObserver(observer); + // If all the observer Features have removed themselves due to their active + // time limits have been reached, the SessionDurationUpdater removes itself + // as an observer of DesktopSessionDurationTracker. + if (!observer_list_.might_have_observers()) + RemoveDurationTrackerObserver(); +} + +void SessionDurationUpdater::OnSessionEnded(base::TimeDelta elapsed) { + // This case is only used during testing as that is the only case that + // DesktopSessionDurationTracker isn't calling this on its observer. + if (!duration_tracker_observer_.IsObserving( + metrics::DesktopSessionDurationTracker::Get())) { + return; + } + + base::TimeDelta elapsed_session_time; + + elapsed_session_time += + base::TimeDelta::FromMinutes( + pref_service_->GetInteger(prefs::kObservedSessionTime)) + + elapsed; + pref_service_->SetInteger(prefs::kObservedSessionTime, + elapsed_session_time.InMinutes()); + + for (Observer& observer : observer_list_) + observer.OnSessionEnded(elapsed_session_time); +} + +void SessionDurationUpdater::AddDurationTrackerObserver() { + duration_tracker_observer_.Add(metrics::DesktopSessionDurationTracker::Get()); +} + +void SessionDurationUpdater::RemoveDurationTrackerObserver() { + duration_tracker_observer_.Remove( + metrics::DesktopSessionDurationTracker::Get()); +} + +PrefService* SessionDurationUpdater::GetPrefs() { + return pref_service_; +} + +} // namespace feature_engagement
diff --git a/chrome/browser/feature_engagement/session_duration_updater.h b/chrome/browser/feature_engagement/session_duration_updater.h new file mode 100644 index 0000000..df41ac31 --- /dev/null +++ b/chrome/browser/feature_engagement/session_duration_updater.h
@@ -0,0 +1,87 @@ +// 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 CHROME_BROWSER_FEATURE_ENGAGEMENT_SESSION_DURATION_UPDATER_H_ +#define CHROME_BROWSER_FEATURE_ENGAGEMENT_SESSION_DURATION_UPDATER_H_ + +#include "base/scoped_observer.h" +#include "chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker.h" +#include "components/keyed_service/core/keyed_service.h" +#include "components/prefs/pref_service.h" + +namespace user_prefs { +class PrefRegistrySyncable; +} // namespace user_prefs + +namespace feature_engagement { + +// The SessionDurationUpdater tracks the total amount of observed time across +// Chrome restarts. Observed time in this context is active session time that +// occurs while there is a FeatureTracker whose active session time requirement +// has not been satisfied. This allows subclasses of FeatureTracker to check how +// much active time has passed, and decide whether to show their respective +// promos accordingly. +// +// When an active session is closed, DesktopSessionDurationTracker calls +// OnSessionEnded and the observed time is incremented and persisted. Then, +// OnSessionEnded is called on all of Features observing SessionDurationUpdater. +// If the feature has its time limit exceeded, it should remove itself as an +// observer of SessionDurationUpdater. If SessionDurationUpdater has no +// observers, it means that the time limits of all the observing features has +// been exceeded, so the SessionDurationUpdater removes itself as an observer of +// DesktopSessionDurationTracker and stops updating observed session time. +// +// If all observers are removed, SessionDurationUpdater doesn't continue +// updating the observed session time. However, if another feature is added as +// an observer later, SessionDurationUpdater starts incrementing the observed +// session time again. + +class SessionDurationUpdater + : public metrics::DesktopSessionDurationTracker::Observer, + public KeyedService { + public: + // The methods for the observer will be called on the UI thread. + class Observer { + public: + virtual ~Observer() = default; + virtual void OnSessionEnded(base::TimeDelta total_session_time) = 0; + }; + + explicit SessionDurationUpdater(PrefService* pref_service); + ~SessionDurationUpdater() override; + + static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); + + // For observing the status of the session tracker. + void AddObserver(Observer* observer); + void RemoveObserver(Observer* observer); + + // metrics::DesktopSessionDurationtracker::Observer: + void OnSessionEnded(base::TimeDelta delta) override; + + private: + // Adds the DesktopSessionDurationTracker observer. + void AddDurationTrackerObserver(); + // Removes the DesktopSessionDurationTracker observer. + void RemoveDurationTrackerObserver(); + // Returns the pref service associated with this SessionDurationUpdater. + virtual PrefService* GetPrefs(); + + // Observes the DesktopSessionDurationTracker and notifies when a desktop + // session starts and ends. + ScopedObserver<metrics::DesktopSessionDurationTracker, + metrics::DesktopSessionDurationTracker::Observer> + duration_tracker_observer_; + + // Owned by Profile manager. + PrefService* const pref_service_; + + base::ObserverList<Observer> observer_list_; + + DISALLOW_COPY_AND_ASSIGN(SessionDurationUpdater); +}; + +} // namespace feature_engagement + +#endif // CHROME_BROWSER_FEATURE_ENGAGEMENT_SESSION_DURATION_UPDATER_H_
diff --git a/chrome/browser/feature_engagement/session_duration_updater_factory.cc b/chrome/browser/feature_engagement/session_duration_updater_factory.cc new file mode 100644 index 0000000..8e78ac8c --- /dev/null +++ b/chrome/browser/feature_engagement/session_duration_updater_factory.cc
@@ -0,0 +1,46 @@ +// 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 "chrome/browser/feature_engagement/session_duration_updater_factory.h" + +#include "base/memory/singleton.h" +#include "chrome/browser/feature_engagement/session_duration_updater.h" +#include "chrome/browser/feature_engagement/tracker_factory.h" +#include "chrome/browser/profiles/incognito_helpers.h" +#include "chrome/browser/profiles/profile.h" +#include "components/keyed_service/content/browser_context_dependency_manager.h" +#include "content/public/browser/browser_context.h" + +namespace feature_engagement { + +// static +SessionDurationUpdaterFactory* SessionDurationUpdaterFactory::GetInstance() { + return base::Singleton<SessionDurationUpdaterFactory>::get(); +} + +SessionDurationUpdater* SessionDurationUpdaterFactory::GetForProfile( + Profile* profile) { + return static_cast<SessionDurationUpdater*>( + GetInstance()->GetServiceForBrowserContext(profile, true)); +} + +SessionDurationUpdaterFactory::SessionDurationUpdaterFactory() + : BrowserContextKeyedServiceFactory( + "SessionDurationUpdater", + BrowserContextDependencyManager::GetInstance()) {} + +SessionDurationUpdaterFactory::~SessionDurationUpdaterFactory() = default; + +KeyedService* SessionDurationUpdaterFactory::BuildServiceInstanceFor( + content::BrowserContext* context) const { + return new SessionDurationUpdater( + Profile::FromBrowserContext(context)->GetPrefs()); +} + +content::BrowserContext* SessionDurationUpdaterFactory::GetBrowserContextToUse( + content::BrowserContext* context) const { + return chrome::GetBrowserContextRedirectedInIncognito(context); +} + +} // namespace feature_engagement
diff --git a/chrome/browser/feature_engagement/session_duration_updater_factory.h b/chrome/browser/feature_engagement/session_duration_updater_factory.h new file mode 100644 index 0000000..55f1f2be --- /dev/null +++ b/chrome/browser/feature_engagement/session_duration_updater_factory.h
@@ -0,0 +1,53 @@ +// 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 CHROME_BROWSER_FEATURE_ENGAGEMENT_SESSION_DURATION_UPDATER_FACTORY_H_ +#define CHROME_BROWSER_FEATURE_ENGAGEMENT_SESSION_DURATION_UPDATER_FACTORY_H_ + +#include "base/macros.h" +#include "components/keyed_service/content/browser_context_keyed_service_factory.h" + +class Profile; + +namespace base { +template <typename T> +struct DefaultSingletonTraits; +} // namespace base + +namespace content { +class BrowserContext; +} // namespace content + +namespace feature_engagement { + +class SessionDurationUpdater; + +// SessionDurationUpdaterFactory is the main client class for interaction with +// the SessionDurationUpdater component. +class SessionDurationUpdaterFactory : public BrowserContextKeyedServiceFactory { + public: + // Returns singleton instance of SessionDurationUpdaterFactory. + static SessionDurationUpdaterFactory* GetInstance(); + + // Returns the SessionDurationUpdater associated with the profile. + SessionDurationUpdater* GetForProfile(Profile* profile); + + private: + friend struct base::DefaultSingletonTraits<SessionDurationUpdaterFactory>; + + SessionDurationUpdaterFactory(); + ~SessionDurationUpdaterFactory() override; + + // BrowserContextKeyedServiceFactory overrides: + KeyedService* BuildServiceInstanceFor( + content::BrowserContext* context) const override; + content::BrowserContext* GetBrowserContextToUse( + content::BrowserContext* context) const override; + + DISALLOW_COPY_AND_ASSIGN(SessionDurationUpdaterFactory); +}; + +} // namespace feature_engagement + +#endif // CHROME_BROWSER_FEATURE_ENGAGEMENT_SESSION_DURATION_UPDATER_FACTORY_H_
diff --git a/chrome/browser/feature_engagement/session_duration_updater_unittest.cc b/chrome/browser/feature_engagement/session_duration_updater_unittest.cc new file mode 100644 index 0000000..b0740cb5 --- /dev/null +++ b/chrome/browser/feature_engagement/session_duration_updater_unittest.cc
@@ -0,0 +1,146 @@ +// 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 "chrome/browser/feature_engagement/session_duration_updater.h" + +#include "base/feature_list.h" +#include "base/metrics/field_trial.h" +#include "base/metrics/field_trial_param_associator.h" +#include "base/metrics/field_trial_params.h" +#include "base/run_loop.h" +#include "base/sequenced_task_runner.h" +#include "base/test/scoped_feature_list.h" +#include "chrome/browser/feature_engagement/feature_tracker.h" +#include "chrome/browser/feature_engagement/session_duration_updater.h" +#include "chrome/browser/feature_engagement/session_duration_updater_factory.h" +#include "chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker.h" +#include "chrome/common/pref_names.h" +#include "chrome/test/base/testing_browser_process.h" +#include "components/feature_engagement/public/event_constants.h" +#include "components/feature_engagement/public/feature_constants.h" +#include "components/feature_engagement/test/test_tracker.h" +#include "components/pref_registry/pref_registry_syncable.h" +#include "components/prefs/pref_service.h" +#include "components/sync_preferences/testing_pref_service_syncable.h" +#include "content/public/test/test_browser_thread_bundle.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace feature_engagement { + +namespace { + +class TestObserver : public SessionDurationUpdater::Observer { + public: + TestObserver() + : pref_service_( + base::MakeUnique<sync_preferences::TestingPrefServiceSyncable>()), + session_duration_updater_( + new SessionDurationUpdater(pref_service_.get())), + session_duration_observer_(this) { + SessionDurationUpdater::RegisterProfilePrefs(pref_service_->registry()); + } + + void AddSessionDurationObserver() { + session_duration_observer_.Add(session_duration_updater_.get()); + } + + void RemoveSessionDurationObserver() { + session_duration_observer_.Remove(session_duration_updater_.get()); + } + + // SessionDurationUpdater::Observer: + void OnSessionEnded(base::TimeDelta total_session_time) override {} + + PrefService* GetPrefs() { return pref_service_.get(); } + + SessionDurationUpdater* GetSessionDurationUpdater() { + return session_duration_updater_.get(); + } + + private: + const std::unique_ptr<sync_preferences::TestingPrefServiceSyncable> + pref_service_; + std::unique_ptr<SessionDurationUpdater> session_duration_updater_; + ScopedObserver<SessionDurationUpdater, SessionDurationUpdater::Observer> + session_duration_observer_; + + DISALLOW_COPY_AND_ASSIGN(TestObserver); +}; + +class SessionDurationUpdaterTest : public testing::Test { + public: + SessionDurationUpdaterTest() = default; + ~SessionDurationUpdaterTest() override = default; + + // testing::Test: + void SetUp() override { + // Start the DesktopSessionDurationTracker to track active session time. + metrics::DesktopSessionDurationTracker::Initialize(); + + test_observer_ = base::MakeUnique<TestObserver>(); + test_observer_->AddSessionDurationObserver(); + } + + void TearDown() override { + test_observer_->RemoveSessionDurationObserver(); + metrics::DesktopSessionDurationTracker::CleanupForTesting(); + } + + protected: + std::unique_ptr<TestObserver> test_observer_; + + private: + content::TestBrowserThreadBundle thread_bundle_; + + DISALLOW_COPY_AND_ASSIGN(SessionDurationUpdaterTest); +}; + +} // namespace + +// kObservedSessionTime should be 0 on initalization and 50 after simulation. +TEST_F(SessionDurationUpdaterTest, TestTimeAdded) { + // Tests the pref is registered to 0 before any session time passes. + EXPECT_EQ( + 0, test_observer_->GetPrefs()->GetInteger(prefs::kObservedSessionTime)); + + // Tests 50 minutes passing with an observer added. + test_observer_->GetSessionDurationUpdater()->OnSessionEnded( + base::TimeDelta::FromMinutes(50)); + + EXPECT_EQ( + 50, test_observer_->GetPrefs()->GetInteger(prefs::kObservedSessionTime)); +} + +// kObservedSessionTime should not be updated when SessionDurationUpdater has +// no observers, but should start updating again if another observer is added. +TEST_F(SessionDurationUpdaterTest, TestAddingAndRemovingObservers) { + // Tests 50 minutes passing with an observer added. + test_observer_->GetSessionDurationUpdater()->OnSessionEnded( + base::TimeDelta::FromMinutes(50)); + + EXPECT_EQ( + 50, test_observer_->GetPrefs()->GetInteger(prefs::kObservedSessionTime)); + + // Tests 50 minutes passing without any observers. No time should be added to + // the pref in this case. + test_observer_->RemoveSessionDurationObserver(); + + test_observer_->GetSessionDurationUpdater()->OnSessionEnded( + base::TimeDelta::FromMinutes(50)); + + EXPECT_EQ( + 50, test_observer_->GetPrefs()->GetInteger(prefs::kObservedSessionTime)); + + // Tests 50 minutes passing with an observer re-added. Time should be added + // again now. + test_observer_->AddSessionDurationObserver(); + + test_observer_->GetSessionDurationUpdater()->OnSessionEnded( + base::TimeDelta::FromMinutes(50)); + + EXPECT_EQ( + 100, test_observer_->GetPrefs()->GetInteger(prefs::kObservedSessionTime)); +} + +} // namespace feature_engagement
diff --git a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.cc b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.cc index f350c63..fd02e1c 100644 --- a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.cc +++ b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.cc
@@ -7,6 +7,7 @@ #include "base/bind.h" #include "base/memory/ptr_util.h" #include "base/strings/string_number_conversions.h" +#include "chrome/browser/media/router/discovery/discovery_network_monitor.h" #include "chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl.h" #include "chrome/browser/media/router/discovery/mdns/dns_sd_delegate.h" #include "chrome/browser/media/router/discovery/mdns/dns_sd_registry.h" @@ -114,7 +115,8 @@ cast_media_sink_service_impl_.reset(new CastMediaSinkServiceImpl( base::BindRepeating(&CastMediaSinkService::OnSinksDiscoveredOnIOThread, this), - cast_channel::CastSocketService::GetInstance())); + cast_channel::CastSocketService::GetInstance(), + DiscoveryNetworkMonitor::GetInstance())); } content::BrowserThread::PostTask(
diff --git a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl.cc b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl.cc index 26cf335..a5bdc99 100644 --- a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl.cc +++ b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl.cc
@@ -36,21 +36,35 @@ namespace media_router { +namespace { + +bool IsNetworkIdUnknownOrDisconnected(const std::string& network_id) { + return network_id == DiscoveryNetworkMonitor::kNetworkIdUnknown || + network_id == DiscoveryNetworkMonitor::kNetworkIdDisconnected; +} + +} // namespace + // static const int CastMediaSinkServiceImpl::kCastControlPort = 8009; CastMediaSinkServiceImpl::CastMediaSinkServiceImpl( const OnSinksDiscoveredCallback& callback, - cast_channel::CastSocketService* cast_socket_service) + cast_channel::CastSocketService* cast_socket_service, + DiscoveryNetworkMonitor* network_monitor) : MediaSinkServiceBase(callback), - cast_socket_service_(cast_socket_service) { + cast_socket_service_(cast_socket_service), + network_monitor_(network_monitor) { DETACH_FROM_SEQUENCE(sequence_checker_); DCHECK(cast_socket_service_); + DCHECK(network_monitor_); + network_monitor_->AddObserver(this); } CastMediaSinkServiceImpl::~CastMediaSinkServiceImpl() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); cast_channel::CastSocketService::GetInstance()->RemoveObserver(this); + network_monitor_->RemoveObserver(this); } // MediaSinkService implementation @@ -114,9 +128,9 @@ DVLOG(1) << "OnError [ip_endpoint]: " << socket.ip_endpoint().ToString() << " [error_state]: " << cast_channel::ChannelErrorToString(error_state); - net::IPEndPoint ip_endpoint = socket.ip_endpoint(); - current_sinks_by_dial_.erase(ip_endpoint); - current_sinks_by_mdns_.erase(ip_endpoint); + auto& ip_address = socket.ip_endpoint().address(); + current_sinks_by_dial_.erase(ip_address); + current_sinks_by_mdns_.erase(ip_address); MediaSinkServiceBase::RestartTimer(); } @@ -137,6 +151,36 @@ this); } +void CastMediaSinkServiceImpl::OnNetworksChanged( + const std::string& network_id) { + std::string last_network_id = current_network_id_; + current_network_id_ = network_id; + if (IsNetworkIdUnknownOrDisconnected(network_id)) { + if (!IsNetworkIdUnknownOrDisconnected(last_network_id)) { + // Collect current sinks even if OnFetchCompleted hasn't collected the + // latest sinks. + std::vector<MediaSinkInternal> current_sinks; + for (const auto& sink_it : current_sinks_by_mdns_) { + current_sinks.push_back(sink_it.second); + } + for (const auto& sink_it : current_sinks_by_dial_) { + if (!base::ContainsKey(current_sinks_by_mdns_, sink_it.first)) + current_sinks.push_back(sink_it.second); + } + sink_cache_[last_network_id] = std::move(current_sinks); + } + return; + } + auto cache_entry = sink_cache_.find(network_id); + // Check if we have any cached sinks for this network ID. + if (cache_entry == sink_cache_.end()) + return; + + DVLOG(2) << "Cache restored " << cache_entry->second.size() + << " sink(s) for network " << network_id; + OpenChannels(cache_entry->second); +} + void CastMediaSinkServiceImpl::OnChannelOpened( MediaSinkInternal cast_sink, cast_channel::CastSocket* socket) { @@ -158,21 +202,19 @@ DVLOG(2) << "Ading sink to current_sinks_ [name]: " << updated_sink.sink().name(); - net::IPEndPoint ip_endpoint(cast_sink.cast_data().ip_address, - cast_sink.cast_data().port); + auto& ip_address = cast_sink.cast_data().ip_address; // Add or update existing cast sink. if (updated_sink.cast_data().discovered_by_dial) { - current_sinks_by_dial_[ip_endpoint] = updated_sink; + current_sinks_by_dial_[ip_address] = updated_sink; } else { - current_sinks_by_mdns_[ip_endpoint] = updated_sink; + current_sinks_by_mdns_[ip_address] = updated_sink; } MediaSinkServiceBase::RestartTimer(); } void CastMediaSinkServiceImpl::OnDialSinkAdded(const MediaSinkInternal& sink) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - auto ip_address = sink.dial_data().ip_address; - net::IPEndPoint ip_endpoint(ip_address, kCastControlPort); + net::IPEndPoint ip_endpoint(sink.dial_data().ip_address, kCastControlPort); if (base::ContainsKey(current_service_ip_endpoints_, ip_endpoint)) { DVLOG(2) << "Sink discovered by mDNS, skip adding [name]: "
diff --git a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl.h b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl.h index f82ffa94..4498b8b 100644 --- a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl.h +++ b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl.h
@@ -11,6 +11,7 @@ #include "base/gtest_prod_util.h" #include "base/memory/weak_ptr.h" #include "base/sequence_checker.h" +#include "chrome/browser/media/router/discovery/discovery_network_monitor.h" #include "chrome/browser/media/router/discovery/media_sink_discovery_metrics.h" #include "chrome/browser/media/router/discovery/media_sink_service_base.h" #include "components/cast_channel/cast_channel_enum.h" @@ -27,14 +28,15 @@ class CastMediaSinkServiceImpl : public MediaSinkServiceBase, public cast_channel::CastSocket::Observer, - public base::SupportsWeakPtr<CastMediaSinkServiceImpl> { + public base::SupportsWeakPtr<CastMediaSinkServiceImpl>, + public DiscoveryNetworkMonitor::Observer { public: // Default Cast control port to open Cast Socket from DIAL sink. static const int kCastControlPort; - CastMediaSinkServiceImpl( - const OnSinksDiscoveredCallback& callback, - cast_channel::CastSocketService* cast_socket_service); + CastMediaSinkServiceImpl(const OnSinksDiscoveredCallback& callback, + cast_channel::CastSocketService* cast_socket_service, + DiscoveryNetworkMonitor* network_monitor); ~CastMediaSinkServiceImpl() override; // MediaSinkService implementation @@ -69,6 +71,9 @@ void OnMessage(const cast_channel::CastSocket& socket, const cast_channel::CastMessage& message) override; + // DiscoveryNetworkMonitor::Observer implementation + void OnNetworksChanged(const std::string& network_id) override; + // Opens cast channel. // |ip_endpoint|: cast channel's target IP endpoint. // |cast_sink|: Cast sink created from mDNS service description or DIAL sink. @@ -85,7 +90,7 @@ // Set of mDNS service IP endpoints from current round of discovery. std::set<net::IPEndPoint> current_service_ip_endpoints_; - using MediaSinkInternalMap = std::map<net::IPEndPoint, MediaSinkInternal>; + using MediaSinkInternalMap = std::map<net::IPAddress, MediaSinkInternal>; // Map of sinks from current round of mDNS discovery keyed by IP address. MediaSinkInternalMap current_sinks_by_mdns_; @@ -97,6 +102,15 @@ // removing Cast channels. cast_channel::CastSocketService* const cast_socket_service_; + // Raw pointer to DiscoveryNetworkMonitor, which is a global leaky singleton + // and manages network change notifications. + DiscoveryNetworkMonitor* network_monitor_; + + std::string current_network_id_ = DiscoveryNetworkMonitor::kNetworkIdUnknown; + + // Cache of known sinks by network ID. + std::map<std::string, std::vector<MediaSinkInternal>> sink_cache_; + CastDeviceCountMetrics metrics_; SEQUENCE_CHECKER(sequence_checker_);
diff --git a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl_unittest.cc b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl_unittest.cc index bb28759..7d5c8ae6 100644 --- a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl_unittest.cc +++ b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl_unittest.cc
@@ -12,14 +12,15 @@ #include "components/cast_channel/cast_socket_service.h" #include "components/cast_channel/cast_test_util.h" #include "content/public/test/test_browser_thread_bundle.h" +#include "content/public/test/test_utils.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -using ::testing::_; using ::testing::Invoke; using ::testing::Return; using ::testing::SaveArg; using ::testing::WithArgs; +using ::testing::_; using cast_channel::ChannelError; namespace { @@ -71,9 +72,11 @@ : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP), mock_cast_socket_service_(new cast_channel::MockCastSocketService()), media_sink_service_impl_(mock_sink_discovered_cb_.Get(), - mock_cast_socket_service_.get()) {} + mock_cast_socket_service_.get(), + discovery_network_monitor_.get()) {} void SetUp() override { + fake_network_info_.clear(); auto mock_timer = base::MakeUnique<base::MockTimer>( true /*retain_user_task*/, false /*is_repeating*/); mock_timer_ = mock_timer.get(); @@ -81,7 +84,43 @@ } protected: + void ExpectOpenSocketInternal(cast_channel::CastSocket* socket) { + EXPECT_CALL(*mock_cast_socket_service_, + OpenSocketInternal(socket->ip_endpoint(), _, _, _)) + .WillOnce(Invoke([socket](const auto& ip_endpoint, auto* net_log, + auto open_cb, auto* observer) { + std::move(open_cb).Run(socket); + return socket->id(); + })); + } + + cast_channel::CastSocket::Observer& observer() { + return static_cast<cast_channel::CastSocket::Observer&>( + media_sink_service_impl_); + } + + static std::vector<DiscoveryNetworkInfo> FakeGetNetworkInfo() { + return fake_network_info_; + } + + static std::vector<DiscoveryNetworkInfo> fake_network_info_; + + std::vector<DiscoveryNetworkInfo> fake_ethernet_info_ = { + DiscoveryNetworkInfo{std::string("enp0s2"), std::string("ethernet1")}}; + std::vector<DiscoveryNetworkInfo> fake_wifi_info_ = { + DiscoveryNetworkInfo{std::string("wlp3s0"), std::string("wifi1")}, + DiscoveryNetworkInfo{std::string("wlp3s1"), std::string("wifi2")}}; + std::vector<DiscoveryNetworkInfo> fake_unknown_info_ = { + DiscoveryNetworkInfo{std::string("enp0s2"), std::string()}}; + + std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier_ = + base::WrapUnique(net::NetworkChangeNotifier::CreateMock()); + const content::TestBrowserThreadBundle thread_bundle_; + + std::unique_ptr<DiscoveryNetworkMonitor> discovery_network_monitor_ = + DiscoveryNetworkMonitor::CreateInstanceForTest(&FakeGetNetworkInfo); + base::MockCallback<MediaSinkService::OnSinksDiscoveredCallback> mock_sink_discovered_cb_; std::unique_ptr<cast_channel::MockCastSocketService> @@ -92,6 +131,10 @@ DISALLOW_COPY_AND_ASSIGN(CastMediaSinkServiceImplTest); }; +// static +std::vector<DiscoveryNetworkInfo> + CastMediaSinkServiceImplTest::fake_network_info_; + TEST_F(CastMediaSinkServiceImplTest, TestOnChannelOpened) { auto cast_sink = CreateCastSink(1); net::IPEndPoint ip_endpoint1 = CreateIPEndPoint(1); @@ -281,15 +324,15 @@ net::IPEndPoint ip_endpoint3 = CreateIPEndPoint(3); // Cast sink 1, 2 from mDNS discovery - media_sink_service_impl_.current_sinks_by_mdns_[ip_endpoint1] = cast_sink1; - media_sink_service_impl_.current_sinks_by_mdns_[ip_endpoint2] = cast_sink2; + media_sink_service_impl_.current_sinks_by_mdns_[ip_endpoint1.address()] = + cast_sink1; + media_sink_service_impl_.current_sinks_by_mdns_[ip_endpoint2.address()] = + cast_sink2; // Cast sink 2, 3 from dial discovery - auto extra_data = cast_sink2.cast_data(); - extra_data.discovered_by_dial = true; - extra_data.model_name += " dial"; - - media_sink_service_impl_.current_sinks_by_dial_[ip_endpoint2] = cast_sink2; - media_sink_service_impl_.current_sinks_by_dial_[ip_endpoint3] = cast_sink3; + media_sink_service_impl_.current_sinks_by_dial_[ip_endpoint2.address()] = + cast_sink2; + media_sink_service_impl_.current_sinks_by_dial_[ip_endpoint3.address()] = + cast_sink3; // Callback returns Cast sink 1, 2, 3 media_sink_service_impl_.OnFetchCompleted(); @@ -300,4 +343,474 @@ EXPECT_TRUE(base::ContainsValue(sinks, cast_sink3)); } +TEST_F(CastMediaSinkServiceImplTest, CacheSinksForKnownNetwork) { + fake_network_info_ = fake_ethernet_info_; + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_ETHERNET); + content::RunAllBlockingPoolTasksUntilIdle(); + + MediaSinkInternal sink1 = CreateCastSink(1); + MediaSinkInternal sink2 = CreateCastSink(2); + net::IPEndPoint ip_endpoint1 = CreateIPEndPoint(1); + net::IPEndPoint ip_endpoint2 = CreateIPEndPoint(2); + std::vector<MediaSinkInternal> sink_list1{sink1, sink2}; + + // Resolution will succeed for both sinks. + cast_channel::MockCastSocket socket1; + cast_channel::MockCastSocket socket2; + socket1.SetIPEndpoint(ip_endpoint1); + socket1.set_id(1); + socket2.SetIPEndpoint(ip_endpoint2); + socket2.set_id(2); + ExpectOpenSocketInternal(&socket1); + ExpectOpenSocketInternal(&socket2); + media_sink_service_impl_.OpenChannels(sink_list1); + + // Connect to a new network with different sinks. + fake_network_info_.clear(); + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_NONE); + content::RunAllBlockingPoolTasksUntilIdle(); + + fake_network_info_ = fake_wifi_info_; + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_WIFI); + content::RunAllBlockingPoolTasksUntilIdle(); + observer().OnError(socket1, cast_channel::ChannelError::CAST_SOCKET_ERROR); + observer().OnError(socket2, cast_channel::ChannelError::CAST_SOCKET_ERROR); + + MediaSinkInternal sink3 = CreateCastSink(3); + net::IPEndPoint ip_endpoint3 = CreateIPEndPoint(3); + std::vector<MediaSinkInternal> sink_list2{sink3}; + + cast_channel::MockCastSocket socket3; + socket3.SetIPEndpoint(ip_endpoint3); + socket3.set_id(3); + ExpectOpenSocketInternal(&socket3); + media_sink_service_impl_.OpenChannels(sink_list2); + + // Reconnecting to the previous ethernet network should restore the same sinks + // from the cache and attempt to resolve them. + fake_network_info_.clear(); + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_NONE); + content::RunAllBlockingPoolTasksUntilIdle(); + + EXPECT_CALL(*mock_cast_socket_service_, + OpenSocketInternal(ip_endpoint1, _, _, _)); + EXPECT_CALL(*mock_cast_socket_service_, + OpenSocketInternal(ip_endpoint2, _, _, _)); + fake_network_info_ = fake_ethernet_info_; + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_ETHERNET); + content::RunAllBlockingPoolTasksUntilIdle(); +} + +TEST_F(CastMediaSinkServiceImplTest, CacheContainsOnlyResolvedSinks) { + fake_network_info_ = fake_ethernet_info_; + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_ETHERNET); + content::RunAllBlockingPoolTasksUntilIdle(); + + MediaSinkInternal sink1 = CreateCastSink(1); + MediaSinkInternal sink2 = CreateCastSink(2); + net::IPEndPoint ip_endpoint1 = CreateIPEndPoint(1); + net::IPEndPoint ip_endpoint2 = CreateIPEndPoint(2); + std::vector<MediaSinkInternal> sink_list1{sink1, sink2}; + + // Resolution will fail for |sink2|. + cast_channel::MockCastSocket socket1; + cast_channel::MockCastSocket socket2; + socket1.SetIPEndpoint(ip_endpoint1); + socket1.set_id(1); + socket2.SetErrorState(cast_channel::ChannelError::CONNECT_ERROR); + socket2.SetIPEndpoint(ip_endpoint2); + socket2.set_id(2); + ExpectOpenSocketInternal(&socket1); + ExpectOpenSocketInternal(&socket2); + media_sink_service_impl_.OpenChannels(sink_list1); + + // Connect to a new network with different sinks. + fake_network_info_.clear(); + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_NONE); + content::RunAllBlockingPoolTasksUntilIdle(); + + fake_network_info_ = fake_wifi_info_; + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_WIFI); + content::RunAllBlockingPoolTasksUntilIdle(); + observer().OnError(socket1, cast_channel::ChannelError::CAST_SOCKET_ERROR); + + MediaSinkInternal sink3 = CreateCastSink(3); + net::IPEndPoint ip_endpoint3 = CreateIPEndPoint(3); + std::vector<MediaSinkInternal> sink_list2{sink3}; + + cast_channel::MockCastSocket socket3; + socket3.SetIPEndpoint(ip_endpoint3); + socket3.set_id(3); + ExpectOpenSocketInternal(&socket3); + media_sink_service_impl_.OpenChannels(sink_list2); + + // Reconnecting to the previous ethernet network should restore only |sink1|, + // since |sink2| failed to resolve. + fake_network_info_.clear(); + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_NONE); + content::RunAllBlockingPoolTasksUntilIdle(); + + EXPECT_CALL(*mock_cast_socket_service_, + OpenSocketInternal(ip_endpoint1, _, _, _)); + EXPECT_CALL(*mock_cast_socket_service_, + OpenSocketInternal(ip_endpoint2, _, _, _)) + .Times(0); + fake_network_info_ = fake_ethernet_info_; + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_ETHERNET); + content::RunAllBlockingPoolTasksUntilIdle(); +} + +TEST_F(CastMediaSinkServiceImplTest, CacheUpdatedOnChannelError) { + fake_network_info_ = fake_ethernet_info_; + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_ETHERNET); + content::RunAllBlockingPoolTasksUntilIdle(); + + MediaSinkInternal sink1 = CreateCastSink(1); + net::IPEndPoint ip_endpoint1 = CreateIPEndPoint(1); + std::vector<MediaSinkInternal> sink_list1{sink1}; + + // Resolve |sink1| but then raise a channel error. This should remove it from + // the cached sinks for the ethernet network. + cast_channel::MockCastSocket socket1; + socket1.SetIPEndpoint(ip_endpoint1); + socket1.set_id(1); + ExpectOpenSocketInternal(&socket1); + media_sink_service_impl_.OpenChannels(sink_list1); + observer().OnError(socket1, cast_channel::ChannelError::CAST_SOCKET_ERROR); + + // Connect to a new network with different sinks. + fake_network_info_.clear(); + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_NONE); + content::RunAllBlockingPoolTasksUntilIdle(); + + fake_network_info_ = fake_wifi_info_; + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_WIFI); + content::RunAllBlockingPoolTasksUntilIdle(); + + MediaSinkInternal sink2 = CreateCastSink(2); + net::IPEndPoint ip_endpoint2 = CreateIPEndPoint(2); + std::vector<MediaSinkInternal> sink_list2{sink2}; + + cast_channel::MockCastSocket socket2; + socket2.SetIPEndpoint(ip_endpoint2); + socket2.set_id(2); + ExpectOpenSocketInternal(&socket2); + media_sink_service_impl_.OpenChannels(sink_list2); + + // Reconnecting to the previous ethernet network should not restore any sinks + // since the only sink to resolve successfully, |sink1|, later had a channel + // error. + fake_network_info_.clear(); + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_NONE); + content::RunAllBlockingPoolTasksUntilIdle(); + + EXPECT_CALL(*mock_cast_socket_service_, OpenSocketInternal(_, _, _, _)) + .Times(0); + fake_network_info_ = fake_ethernet_info_; + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_ETHERNET); + content::RunAllBlockingPoolTasksUntilIdle(); +} + +TEST_F(CastMediaSinkServiceImplTest, UnknownNetworkNoCache) { + // Without any network notification here, network ID will remain __unknown__ + // and the cache shouldn't save any of these sinks. + MediaSinkInternal sink1 = CreateCastSink(1); + MediaSinkInternal sink2 = CreateCastSink(2); + net::IPEndPoint ip_endpoint1 = CreateIPEndPoint(1); + net::IPEndPoint ip_endpoint2 = CreateIPEndPoint(2); + std::vector<MediaSinkInternal> sink_list1{sink1, sink2}; + + // Resolution will succeed for both sinks. + cast_channel::MockCastSocket socket1; + cast_channel::MockCastSocket socket2; + socket1.SetIPEndpoint(ip_endpoint1); + socket1.set_id(1); + socket2.SetIPEndpoint(ip_endpoint2); + socket2.set_id(2); + ExpectOpenSocketInternal(&socket1); + ExpectOpenSocketInternal(&socket2); + media_sink_service_impl_.OpenChannels(sink_list1); + + // Network is reported as disconnected but discover a new device. + fake_network_info_.clear(); + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_NONE); + content::RunAllBlockingPoolTasksUntilIdle(); + observer().OnError(socket1, cast_channel::ChannelError::CAST_SOCKET_ERROR); + observer().OnError(socket2, cast_channel::ChannelError::CAST_SOCKET_ERROR); + + MediaSinkInternal sink3 = CreateCastSink(3); + net::IPEndPoint ip_endpoint3 = CreateIPEndPoint(3); + std::vector<MediaSinkInternal> sink_list2{sink3}; + + cast_channel::MockCastSocket socket3; + socket3.SetIPEndpoint(ip_endpoint3); + socket3.set_id(3); + ExpectOpenSocketInternal(&socket3); + media_sink_service_impl_.OpenChannels(sink_list2); + + // Connecting to a network whose ID resolves to __unknown__ shouldn't pull any + // cache items from another unknown network. + EXPECT_CALL(*mock_cast_socket_service_, OpenSocketInternal(_, _, _, _)) + .Times(0); + fake_network_info_ = fake_unknown_info_; + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_WIFI); + content::RunAllBlockingPoolTasksUntilIdle(); + + // Similarly, disconnecting from the network shouldn't pull any cache items. + fake_network_info_.clear(); + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_NONE); + content::RunAllBlockingPoolTasksUntilIdle(); +} + +TEST_F(CastMediaSinkServiceImplTest, CacheUpdatedForKnownNetwork) { + fake_network_info_ = fake_ethernet_info_; + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_ETHERNET); + content::RunAllBlockingPoolTasksUntilIdle(); + + MediaSinkInternal sink1 = CreateCastSink(1); + MediaSinkInternal sink2 = CreateCastSink(2); + net::IPEndPoint ip_endpoint1 = CreateIPEndPoint(1); + net::IPEndPoint ip_endpoint2 = CreateIPEndPoint(2); + std::vector<MediaSinkInternal> sink_list1{sink1, sink2}; + + // Resolution will succeed for both sinks. + cast_channel::MockCastSocket socket1; + cast_channel::MockCastSocket socket2; + socket1.SetIPEndpoint(ip_endpoint1); + socket1.set_id(1); + socket2.SetIPEndpoint(ip_endpoint2); + socket2.set_id(2); + ExpectOpenSocketInternal(&socket1); + ExpectOpenSocketInternal(&socket2); + media_sink_service_impl_.OpenChannels(sink_list1); + + // Connect to a new network with different sinks. + fake_network_info_.clear(); + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_NONE); + content::RunAllBlockingPoolTasksUntilIdle(); + + fake_network_info_ = fake_wifi_info_; + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_WIFI); + content::RunAllBlockingPoolTasksUntilIdle(); + observer().OnError(socket1, cast_channel::ChannelError::CAST_SOCKET_ERROR); + observer().OnError(socket2, cast_channel::ChannelError::CAST_SOCKET_ERROR); + + MediaSinkInternal sink3 = CreateCastSink(3); + net::IPEndPoint ip_endpoint3 = CreateIPEndPoint(3); + std::vector<MediaSinkInternal> sink_list2{sink3}; + + cast_channel::MockCastSocket socket3; + socket3.SetIPEndpoint(ip_endpoint3); + socket3.set_id(3); + ExpectOpenSocketInternal(&socket3); + media_sink_service_impl_.OpenChannels(sink_list2); + + // Reconnecting to the previous ethernet network should restore the same sinks + // from the cache and attempt to resolve them. |sink3| is also lost. + fake_network_info_.clear(); + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_NONE); + content::RunAllBlockingPoolTasksUntilIdle(); + + observer().OnError(socket3, cast_channel::ChannelError::CAST_SOCKET_ERROR); + + // Resolution will fail for cached sinks. + socket1.SetErrorState(cast_channel::ChannelError::CONNECT_ERROR); + socket2.SetErrorState(cast_channel::ChannelError::CONNECT_ERROR); + ExpectOpenSocketInternal(&socket1); + ExpectOpenSocketInternal(&socket2); + fake_network_info_ = fake_ethernet_info_; + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_ETHERNET); + content::RunAllBlockingPoolTasksUntilIdle(); + + // A new sink is found on the ethernet network. + MediaSinkInternal sink4 = CreateCastSink(4); + net::IPEndPoint ip_endpoint4 = CreateIPEndPoint(4); + std::vector<MediaSinkInternal> sink_list3{sink4}; + + cast_channel::MockCastSocket socket4; + socket4.SetIPEndpoint(ip_endpoint4); + socket4.set_id(4); + ExpectOpenSocketInternal(&socket4); + media_sink_service_impl_.OpenChannels(sink_list3); + + // Disconnect from the network and lose sinks. + fake_network_info_.clear(); + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_NONE); + content::RunAllBlockingPoolTasksUntilIdle(); + observer().OnError(socket4, cast_channel::ChannelError::CAST_SOCKET_ERROR); + + // Reconnect and expect only |sink4| to be cached. + EXPECT_CALL(*mock_cast_socket_service_, + OpenSocketInternal(ip_endpoint4, _, _, _)); + fake_network_info_ = fake_ethernet_info_; + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_ETHERNET); + content::RunAllBlockingPoolTasksUntilIdle(); +} + +TEST_F(CastMediaSinkServiceImplTest, CacheDialDiscoveredSinks) { + fake_network_info_ = fake_ethernet_info_; + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_ETHERNET); + content::RunAllBlockingPoolTasksUntilIdle(); + + MediaSinkInternal sink1_cast = CreateCastSink(1); + MediaSinkInternal sink2_dial = CreateDialSink(2); + net::IPEndPoint ip_endpoint1 = CreateIPEndPoint(1); + net::IPEndPoint ip_endpoint2(sink2_dial.dial_data().ip_address, + CastMediaSinkServiceImpl::kCastControlPort); + std::vector<MediaSinkInternal> sink_list1{sink1_cast}; + + // Resolution will succeed for both sinks. + cast_channel::MockCastSocket socket1; + cast_channel::MockCastSocket socket2; + socket1.SetIPEndpoint(ip_endpoint1); + socket1.set_id(1); + socket2.SetIPEndpoint(ip_endpoint2); + socket2.set_id(2); + ExpectOpenSocketInternal(&socket1); + ExpectOpenSocketInternal(&socket2); + media_sink_service_impl_.OpenChannels(sink_list1); + media_sink_service_impl_.OnDialSinkAdded(sink2_dial); + + // Connect to a new network with different sinks. + fake_network_info_.clear(); + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_NONE); + content::RunAllBlockingPoolTasksUntilIdle(); + + fake_network_info_ = fake_wifi_info_; + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_WIFI); + content::RunAllBlockingPoolTasksUntilIdle(); + observer().OnError(socket1, cast_channel::ChannelError::CAST_SOCKET_ERROR); + observer().OnError(socket2, cast_channel::ChannelError::CAST_SOCKET_ERROR); + + MediaSinkInternal sink3_cast = CreateCastSink(3); + MediaSinkInternal sink4_dial = CreateDialSink(4); + net::IPEndPoint ip_endpoint3 = CreateIPEndPoint(3); + net::IPEndPoint ip_endpoint4(sink4_dial.dial_data().ip_address, + CastMediaSinkServiceImpl::kCastControlPort); + std::vector<MediaSinkInternal> sink_list2{sink3_cast}; + + cast_channel::MockCastSocket socket3; + cast_channel::MockCastSocket socket4; + socket3.SetIPEndpoint(ip_endpoint3); + socket3.set_id(3); + socket4.SetIPEndpoint(ip_endpoint4); + socket4.set_id(4); + ExpectOpenSocketInternal(&socket3); + ExpectOpenSocketInternal(&socket4); + media_sink_service_impl_.OpenChannels(sink_list2); + media_sink_service_impl_.OnDialSinkAdded(sink4_dial); + + // Reconnecting to the previous ethernet network should restore the same sinks + // from the cache and attempt to resolve them. + fake_network_info_.clear(); + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_NONE); + content::RunAllBlockingPoolTasksUntilIdle(); + + EXPECT_CALL(*mock_cast_socket_service_, + OpenSocketInternal(ip_endpoint1, _, _, _)); + EXPECT_CALL(*mock_cast_socket_service_, + OpenSocketInternal(ip_endpoint2, _, _, _)); + fake_network_info_ = fake_ethernet_info_; + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_ETHERNET); + content::RunAllBlockingPoolTasksUntilIdle(); +} + +TEST_F(CastMediaSinkServiceImplTest, DualDiscoveryDoesntDuplicateCacheItems) { + fake_network_info_ = fake_ethernet_info_; + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_ETHERNET); + content::RunAllBlockingPoolTasksUntilIdle(); + + // The same sink will be discovered via dial and mdns. + MediaSinkInternal sink1_cast = CreateCastSink(1); + MediaSinkInternal sink1_dial = CreateDialSink(1); + net::IPEndPoint ip_endpoint1_cast = CreateIPEndPoint(1); + net::IPEndPoint ip_endpoint1_dial(sink1_dial.dial_data().ip_address, + CastMediaSinkServiceImpl::kCastControlPort); + std::vector<MediaSinkInternal> sink_list1{sink1_cast}; + + // Dial discovery will succeed first. + cast_channel::MockCastSocket socket1_dial; + socket1_dial.SetIPEndpoint(ip_endpoint1_dial); + socket1_dial.set_id(1); + ExpectOpenSocketInternal(&socket1_dial); + media_sink_service_impl_.OnDialSinkAdded(sink1_dial); + + // The same sink is then discovered via mdns. + cast_channel::MockCastSocket socket1_cast; + socket1_cast.SetIPEndpoint(ip_endpoint1_cast); + socket1_cast.set_id(2); + ExpectOpenSocketInternal(&socket1_cast); + media_sink_service_impl_.OpenChannels(sink_list1); + + // Connect to a new network with different sinks. + fake_network_info_.clear(); + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_NONE); + content::RunAllBlockingPoolTasksUntilIdle(); + + fake_network_info_ = fake_wifi_info_; + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_WIFI); + content::RunAllBlockingPoolTasksUntilIdle(); + observer().OnError(socket1_cast, + cast_channel::ChannelError::CAST_SOCKET_ERROR); + observer().OnError(socket1_dial, + cast_channel::ChannelError::CAST_SOCKET_ERROR); + + MediaSinkInternal sink2_cast = CreateCastSink(2); + net::IPEndPoint ip_endpoint2 = CreateIPEndPoint(2); + std::vector<MediaSinkInternal> sink_list2{sink2_cast}; + + cast_channel::MockCastSocket socket2; + socket2.SetIPEndpoint(ip_endpoint2); + socket2.set_id(3); + ExpectOpenSocketInternal(&socket2); + media_sink_service_impl_.OpenChannels(sink_list2); + + // Reconnecting to the previous ethernet network should restore the same sinks + // from the cache and attempt to resolve them. + fake_network_info_.clear(); + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_NONE); + content::RunAllBlockingPoolTasksUntilIdle(); + + EXPECT_CALL(*mock_cast_socket_service_, + OpenSocketInternal(ip_endpoint1_cast, _, _, _)); + fake_network_info_ = fake_ethernet_info_; + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( + net::NetworkChangeNotifier::CONNECTION_ETHERNET); + content::RunAllBlockingPoolTasksUntilIdle(); +} + } // namespace media_router
diff --git a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_unittest.cc b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_unittest.cc index 67b2336aa9..3726143a 100644 --- a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_unittest.cc +++ b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_unittest.cc
@@ -17,9 +17,9 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -using ::testing::_; using ::testing::Return; using ::testing::SaveArg; +using ::testing::_; namespace { @@ -54,8 +54,11 @@ public: MockCastMediaSinkServiceImpl( const OnSinksDiscoveredCallback& callback, - cast_channel::CastSocketService* cast_socket_service) - : CastMediaSinkServiceImpl(callback, cast_socket_service) {} + cast_channel::CastSocketService* cast_socket_service, + DiscoveryNetworkMonitor* network_monitor) + : CastMediaSinkServiceImpl(callback, + cast_socket_service, + network_monitor) {} ~MockCastMediaSinkServiceImpl() override {} MOCK_METHOD0(Start, void()); @@ -69,7 +72,8 @@ : mock_cast_socket_service_(new cast_channel::MockCastSocketService()), mock_media_sink_service_impl_( new MockCastMediaSinkServiceImpl(mock_sink_discovered_io_cb_.Get(), - mock_cast_socket_service_.get())), + mock_cast_socket_service_.get(), + discovery_network_monitor_)), media_sink_service_(new CastMediaSinkService( mock_sink_discovered_ui_cb_.Get(), std::unique_ptr<CastMediaSinkServiceImpl, @@ -79,6 +83,12 @@ protected: const content::TestBrowserThreadBundle thread_bundle_; + + std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier_ = + base::WrapUnique(net::NetworkChangeNotifier::CreateMock()); + DiscoveryNetworkMonitor* const discovery_network_monitor_ = + DiscoveryNetworkMonitor::GetInstance(); + TestingProfile profile_; base::MockCallback<MediaSinkService::OnSinksDiscoveredCallback>
diff --git a/chrome/browser/net/system_network_context_manager.cc b/chrome/browser/net/system_network_context_manager.cc index 997fd1b8..748615af 100644 --- a/chrome/browser/net/system_network_context_manager.cc +++ b/chrome/browser/net/system_network_context_manager.cc
@@ -70,7 +70,6 @@ content::mojom::NetworkContextParamsPtr* network_context_params, bool* is_quic_allowed) { SystemNetworkContextManager* manager = GetInstance(); - DCHECK(!manager->io_thread_network_context_); *network_context_request = mojo::MakeRequest(&manager->io_thread_network_context_); *network_context_params = CreateNetworkContextParams();
diff --git a/chrome/browser/notifications/notification_platform_bridge_mac.mm b/chrome/browser/notifications/notification_platform_bridge_mac.mm index 7aa66e0..29a979d 100644 --- a/chrome/browser/notifications/notification_platform_bridge_mac.mm +++ b/chrome/browser/notifications/notification_platform_bridge_mac.mm
@@ -251,10 +251,10 @@ std::vector<message_center::ButtonInfo> buttons = notification.buttons(); if (!buttons.empty()) { DCHECK_LE(buttons.size(), blink::kWebNotificationMaxActions); - NSString* buttonOne = SysUTF16ToNSString(buttons[0].title); + NSString* buttonOne = base::SysUTF16ToNSString(buttons[0].title); NSString* buttonTwo = nullptr; if (buttons.size() > 1) - buttonTwo = SysUTF16ToNSString(buttons[1].title); + buttonTwo = base::SysUTF16ToNSString(buttons[1].title); [builder setButtons:buttonOne secondaryButton:buttonTwo]; }
diff --git a/chrome/browser/notifications/platform_notification_service_interactive_uitest.cc b/chrome/browser/notifications/platform_notification_service_interactive_uitest.cc index 267e505..a232dc6 100644 --- a/chrome/browser/notifications/platform_notification_service_interactive_uitest.cc +++ b/chrome/browser/notifications/platform_notification_service_interactive_uitest.cc
@@ -15,14 +15,17 @@ #include "base/strings/utf_string_conversions.h" #include "base/test/scoped_feature_list.h" #include "base/time/time.h" +#include "build/build_config.h" #include "chrome/browser/engagement/site_engagement_score.h" #include "chrome/browser/engagement/site_engagement_service.h" #include "chrome/browser/notifications/desktop_notification_profile_util.h" -#include "chrome/browser/notifications/message_center_display_service.h" #include "chrome/browser/notifications/notification.h" #include "chrome/browser/notifications/notification_common.h" +#include "chrome/browser/notifications/notification_display_service.h" +#include "chrome/browser/notifications/notification_display_service_factory.h" #include "chrome/browser/notifications/notification_test_util.h" #include "chrome/browser/notifications/platform_notification_service_impl.h" +#include "chrome/browser/notifications/stub_notification_display_service.h" #include "chrome/browser/notifications/web_notification_delegate.h" #include "chrome/browser/permissions/permission_manager.h" #include "chrome/browser/permissions/permission_request_manager.h" @@ -49,31 +52,49 @@ #include "chrome/browser/lifetime/keep_alive_types.h" #endif -#if defined(OS_MACOSX) -#include "base/mac/mac_util.h" -#include "ui/base/test/scoped_fake_nswindow_fullscreen.h" -#endif - -// ----------------------------------------------------------------------------- +namespace { // Dimensions of the icon.png resource in the notification test data directory. -const int kIconWidth = 100; -const int kIconHeight = 100; +constexpr int kIconWidth = 100; +constexpr int kIconHeight = 100; -const int kNotificationVibrationPattern[] = { 100, 200, 300 }; -const double kNotificationTimestamp = 621046800000.; +constexpr int kNotificationVibrationPattern[] = {100, 200, 300}; +constexpr double kNotificationTimestamp = 621046800000.; + +const char kTestFileName[] = "notifications/platform_notification_service.html"; + +} // namespace class PlatformNotificationServiceBrowserTest : public InProcessBrowserTest { public: PlatformNotificationServiceBrowserTest(); - ~PlatformNotificationServiceBrowserTest() override {} + ~PlatformNotificationServiceBrowserTest() override = default; // InProcessBrowserTest overrides. - void SetUpDefaultCommandLine(base::CommandLine* command_line) override; + void SetUpDefaultCommandLine(base::CommandLine* command_line) override { + InProcessBrowserTest::SetUpDefaultCommandLine(command_line); - void SetUp() override; - void SetUpOnMainThread() override; - void TearDown() override; + // Needed for the inline reply tests. + command_line->AppendSwitch( + switches::kEnableExperimentalWebPlatformFeatures); + } + + void SetUp() override { + https_server_.reset( + new net::EmbeddedTestServer(net::EmbeddedTestServer::TYPE_HTTPS)); + https_server_->ServeFilesFromSourceDirectory(server_root_); + ASSERT_TRUE(https_server_->Start()); + + InProcessBrowserTest::SetUp(); + } + + void SetUpOnMainThread() override { + NotificationDisplayServiceFactory::GetInstance()->SetTestingFactory( + browser()->profile(), &StubNotificationDisplayService::FactoryForTests); + + SiteEngagementScore::SetParamValuesForTesting(); + NavigateToTestPage(std::string("/") + kTestFileName); + } protected: // Returns the Platform Notification Service these unit tests are for. @@ -81,180 +102,108 @@ return PlatformNotificationServiceImpl::GetInstance(); } + // Returns the stub notification display service. + StubNotificationDisplayService* GetDisplayService() const { + return static_cast<StubNotificationDisplayService*>( + NotificationDisplayServiceFactory::GetForProfile(browser()->profile())); + } + + // Returns a vector with the Notification objects that are being displayed + // by the notification display service. Synchronous. + std::vector<Notification> GetDisplayedNotifications( + bool is_persistent) const { + NotificationCommon::Type type = is_persistent + ? NotificationCommon::PERSISTENT + : NotificationCommon::NON_PERSISTENT; + + return GetDisplayService()->GetDisplayedNotificationsForType(type); + } + // Grants permission to display Web Notifications for origin of the test // page that's being used in this browser test. - void GrantNotificationPermissionForTest() const; + void GrantNotificationPermissionForTest() const { + GURL origin = TestPageUrl().GetOrigin(); - bool RequestAndAcceptPermission(); - bool RequestAndDenyPermission(); + DesktopNotificationProfileUtil::GrantPermission(browser()->profile(), + origin); + ASSERT_EQ(CONTENT_SETTING_ALLOW, + PermissionManager::Get(browser()->profile()) + ->GetPermissionStatus(CONTENT_SETTINGS_TYPE_NOTIFICATIONS, + origin, origin) + .content_setting); + } - void EnableFullscreenNotifications(); - void DisableFullscreenNotifications(); + bool RequestAndAcceptPermission() { + return "granted" == + RequestAndRespondToPermission(PermissionRequestManager::ACCEPT_ALL); + } - double GetEngagementScore(const GURL& origin) const; - GURL GetLastCommittedURL() const; + bool RequestAndDenyPermission() { + return "denied" == + RequestAndRespondToPermission(PermissionRequestManager::DENY_ALL); + } - // Returns the UI Manager on which notifications will be displayed. - StubNotificationUIManager* ui_manager() const { return ui_manager_.get(); } + void EnableFullscreenNotifications() { + feature_list_.InitAndEnableFeature( + features::kAllowFullscreenWebNotificationsFeature); + } - const base::FilePath& server_root() const { return server_root_; } + void DisableFullscreenNotifications() { + feature_list_.InitAndDisableFeature( + features::kAllowFullscreenWebNotificationsFeature); + } + + double GetEngagementScore(const GURL& origin) const { + return SiteEngagementService::Get(browser()->profile())->GetScore(origin); + } + + GURL GetLastCommittedURL() const { + return browser() + ->tab_strip_model() + ->GetActiveWebContents() + ->GetLastCommittedURL(); + } // Navigates the browser to the test page indicated by |path|. - void NavigateToTestPage(const std::string& path) const; + void NavigateToTestPage(const std::string& path) const { + ui_test_utils::NavigateToURL(browser(), https_server_->GetURL(path)); + } // Executes |script| and stores the result as a string in |result|. A boolean // will be returned, indicating whether the script was executed successfully. - bool RunScript(const std::string& script, std::string* result) const; + bool RunScript(const std::string& script, std::string* result) const { + return content::ExecuteScriptAndExtractString( + browser()->tab_strip_model()->GetActiveWebContents()->GetMainFrame(), + script, result); + } - net::HostPortPair ServerHostPort() const; - GURL TestPageUrl() const; + GURL TestPageUrl() const { + return https_server_->GetURL(std::string("/") + kTestFileName); + } - private: std::string RequestAndRespondToPermission( - PermissionRequestManager::AutoResponseType bubble_response); + PermissionRequestManager::AutoResponseType bubble_response) { + std::string result; + content::WebContents* web_contents = GetActiveWebContents(browser()); + PermissionRequestManager::FromWebContents(web_contents) + ->set_auto_response_for_test(bubble_response); + EXPECT_TRUE(RunScript("RequestPermission();", &result)); + return result; + } content::WebContents* GetActiveWebContents(Browser* browser) { return browser->tab_strip_model()->GetActiveWebContents(); } - SiteEngagementService* engagement_service_; const base::FilePath server_root_; - const std::string test_page_url_; - std::unique_ptr<StubNotificationUIManager> ui_manager_; - std::unique_ptr<MessageCenterDisplayService> display_service_; + + private: std::unique_ptr<net::EmbeddedTestServer> https_server_; base::test::ScopedFeatureList feature_list_; }; -// ----------------------------------------------------------------------------- - -namespace { -const char kTestFileName[] = "notifications/platform_notification_service.html"; -} - PlatformNotificationServiceBrowserTest::PlatformNotificationServiceBrowserTest() - : server_root_(FILE_PATH_LITERAL("chrome/test/data")), - // The test server has a base directory that doesn't exist in the - // filesystem. - test_page_url_(std::string("/") + kTestFileName) {} - -void PlatformNotificationServiceBrowserTest::SetUpDefaultCommandLine( - base::CommandLine* command_line) { - InProcessBrowserTest::SetUpDefaultCommandLine(command_line); - - // Needed for the Reply button tests - command_line->AppendSwitch(switches::kEnableExperimentalWebPlatformFeatures); - -#if BUILDFLAG(ENABLE_NATIVE_NOTIFICATIONS) - // TODO(crbug.com/714679): Temporary change while tests are upgraded to deal - // with native notifications. - command_line->AppendSwitchASCII(switches::kDisableFeatures, - features::kNativeNotifications.name); -#endif // BUILDFLAG(ENABLE_NATIVE_NOTIFICATIONS) -} - -void PlatformNotificationServiceBrowserTest::SetUp() { - ui_manager_.reset(new StubNotificationUIManager); - https_server_.reset( - new net::EmbeddedTestServer(net::EmbeddedTestServer::TYPE_HTTPS)); - https_server_->ServeFilesFromSourceDirectory(server_root_); - ASSERT_TRUE(https_server_->Start()); - InProcessBrowserTest::SetUp(); -} - -void PlatformNotificationServiceBrowserTest::SetUpOnMainThread() { - SiteEngagementScore::SetParamValuesForTesting(); - engagement_service_ = SiteEngagementService::Get(browser()->profile()); - NavigateToTestPage(test_page_url_); - display_service_.reset( - new MessageCenterDisplayService(browser()->profile(), ui_manager_.get())); - service()->SetNotificationDisplayServiceForTesting(display_service_.get()); -} - -void PlatformNotificationServiceBrowserTest::TearDown() { - service()->SetNotificationDisplayServiceForTesting(nullptr); -} - -void PlatformNotificationServiceBrowserTest:: - GrantNotificationPermissionForTest() const { - GURL origin = TestPageUrl().GetOrigin(); - - DesktopNotificationProfileUtil::GrantPermission(browser()->profile(), origin); - ASSERT_EQ(CONTENT_SETTING_ALLOW, - PermissionManager::Get(browser()->profile()) - ->GetPermissionStatus(CONTENT_SETTINGS_TYPE_NOTIFICATIONS, - origin, origin) - .content_setting); -} - -void PlatformNotificationServiceBrowserTest::NavigateToTestPage( - const std::string& path) const { - ui_test_utils::NavigateToURL(browser(), https_server_->GetURL(path)); -} - -bool PlatformNotificationServiceBrowserTest::RunScript( - const std::string& script, std::string* result) const { - return content::ExecuteScriptAndExtractString( - browser()->tab_strip_model()->GetActiveWebContents()->GetMainFrame(), - script, - result); -} - -net::HostPortPair PlatformNotificationServiceBrowserTest::ServerHostPort() - const { - return https_server_->host_port_pair(); -} - -GURL PlatformNotificationServiceBrowserTest::TestPageUrl() const { - return https_server_->GetURL(test_page_url_); -} - -std::string -PlatformNotificationServiceBrowserTest::RequestAndRespondToPermission( - PermissionRequestManager::AutoResponseType bubble_response) { - std::string result; - content::WebContents* web_contents = GetActiveWebContents(browser()); - PermissionRequestManager::FromWebContents(web_contents) - ->set_auto_response_for_test(bubble_response); - EXPECT_TRUE(RunScript("RequestPermission();", &result)); - return result; -} - -bool PlatformNotificationServiceBrowserTest::RequestAndAcceptPermission() { - std::string result = - RequestAndRespondToPermission(PermissionRequestManager::ACCEPT_ALL); - return "granted" == result; -} - -bool PlatformNotificationServiceBrowserTest::RequestAndDenyPermission() { - std::string result = - RequestAndRespondToPermission(PermissionRequestManager::DENY_ALL); - return "denied" == result; -} - -void PlatformNotificationServiceBrowserTest::EnableFullscreenNotifications() { - feature_list_.InitAndEnableFeature( - features::kAllowFullscreenWebNotificationsFeature); -} - -void PlatformNotificationServiceBrowserTest::DisableFullscreenNotifications() { - feature_list_.InitAndDisableFeature( - features::kAllowFullscreenWebNotificationsFeature); -} - -double PlatformNotificationServiceBrowserTest::GetEngagementScore( - const GURL& origin) const { - return engagement_service_->GetScore(origin); -} - -GURL PlatformNotificationServiceBrowserTest::GetLastCommittedURL() const { - return browser() - ->tab_strip_model() - ->GetActiveWebContents() - ->GetLastCommittedURL(); -} - -// ----------------------------------------------------------------------------- + : server_root_(FILE_PATH_LITERAL("chrome/test/data")) {} // TODO(peter): Move PlatformNotificationService-related tests over from // notification_browsertest.cc to this file. @@ -269,7 +218,7 @@ "TypeError: No notification permission has been granted for this origin.", script_result); - ASSERT_EQ(0u, ui_manager()->GetNotificationCount()); + ASSERT_EQ(0u, GetDisplayedNotifications(true /* is_persistent */).size()); } IN_PROC_BROWSER_TEST_F(PlatformNotificationServiceBrowserTest, @@ -284,7 +233,9 @@ &script_result)); EXPECT_EQ("ok", script_result); - ASSERT_EQ(1u, ui_manager()->GetNotificationCount()); + std::vector<Notification> notifications = + GetDisplayedNotifications(true /* is_persistent */); + ASSERT_EQ(1u, notifications.size()); #if BUILDFLAG(ENABLE_BACKGROUND) ASSERT_FALSE(KeepAliveRegistry::GetInstance()->IsOriginRegistered( @@ -292,15 +243,20 @@ #endif // We expect +1 engagement for the notification interaction. - const Notification& notification = ui_manager()->GetNotificationAt(0); - notification.delegate()->Click(); + notifications[0].delegate()->Click(); EXPECT_DOUBLE_EQ(6.5, GetEngagementScore(GetLastCommittedURL())); + // Clicking on the notification should not automatically close it. + notifications = GetDisplayedNotifications(true /* is_persistent */); + ASSERT_EQ(1u, notifications.size()); + #if BUILDFLAG(ENABLE_BACKGROUND) ASSERT_TRUE(KeepAliveRegistry::GetInstance()->IsOriginRegistered( KeepAliveOrigin::PENDING_NOTIFICATION_CLICK_EVENT)); #endif + EXPECT_FALSE(notifications[0].delegate()->ShouldDisplayOverFullscreen()); + ASSERT_TRUE(RunScript("GetMessageFromWorker()", &script_result)); EXPECT_EQ("action_none", script_result); @@ -309,7 +265,8 @@ KeepAliveOrigin::PENDING_NOTIFICATION_CLICK_EVENT)); #endif - ASSERT_EQ(1u, ui_manager()->GetNotificationCount()); + notifications = GetDisplayedNotifications(true /* is_persistent */); + ASSERT_EQ(1u, notifications.size()); } IN_PROC_BROWSER_TEST_F(PlatformNotificationServiceBrowserTest, @@ -323,10 +280,12 @@ &script_result)); EXPECT_EQ("ok", script_result); - ASSERT_EQ(1u, ui_manager()->GetNotificationCount()); + std::vector<Notification> notifications = + GetDisplayedNotifications(true /* is_persistent */); + ASSERT_EQ(1u, notifications.size()); // We don't use or check the notification's direction and language. - const Notification& default_notification = ui_manager()->GetNotificationAt(0); + const Notification& default_notification = notifications[0]; EXPECT_EQ("Some title", base::UTF16ToUTF8(default_notification.title())); EXPECT_EQ("", base::UTF16ToUTF8(default_notification.message())); EXPECT_EQ("", default_notification.tag()); @@ -350,11 +309,11 @@ &script_result)); EXPECT_EQ("ok", script_result); - ASSERT_EQ(2u, ui_manager()->GetNotificationCount()); + notifications = GetDisplayedNotifications(true /* is_persistent */); + ASSERT_EQ(2u, notifications.size()); // We don't use or check the notification's direction and language. - const Notification& all_options_notification = - ui_manager()->GetNotificationAt(1); + const Notification& all_options_notification = notifications[1]; EXPECT_EQ("Title", base::UTF16ToUTF8(all_options_notification.title())); EXPECT_EQ("Contents", base::UTF16ToUTF8(all_options_notification.message())); EXPECT_EQ("replace-id", all_options_notification.tag()); @@ -395,15 +354,17 @@ &script_result)); EXPECT_EQ("ok", script_result); - ASSERT_EQ(1u, ui_manager()->GetNotificationCount()); + std::vector<Notification> notifications = + GetDisplayedNotifications(true /* is_persistent */); + ASSERT_EQ(1u, notifications.size()); + EXPECT_EQ(0u, notifications[0].buttons().size()); - const Notification& notification = ui_manager()->GetNotificationAt(0); - const std::vector<message_center::ButtonInfo>& buttons = - notification.buttons(); - EXPECT_EQ(0u, buttons.size()); + notifications[0].delegate()->SettingsClick(); - notification.delegate()->SettingsClick(); - ASSERT_EQ(1u, ui_manager()->GetNotificationCount()); + // Clicking on the settings button should not close the notification. + notifications = GetDisplayedNotifications(true /* is_persistent */); + ASSERT_EQ(1u, notifications.size()); + web_contents = browser()->tab_strip_model()->GetActiveWebContents(); ASSERT_TRUE(content::WaitForLoadStop(web_contents)); @@ -423,9 +384,11 @@ &script_result)); EXPECT_EQ("ok", script_result); - ASSERT_EQ(1u, ui_manager()->GetNotificationCount()); + std::vector<Notification> notifications = + GetDisplayedNotifications(true /* is_persistent */); + ASSERT_EQ(1u, notifications.size()); - const Notification& notification = ui_manager()->GetNotificationAt(0); + const Notification& notification = notifications[0]; EXPECT_EQ("Title", base::UTF16ToUTF8(notification.title())); EXPECT_EQ("Contents", base::UTF16ToUTF8(notification.message())); @@ -445,10 +408,11 @@ &script_result)); EXPECT_EQ("ok", script_result); - ASSERT_EQ(1u, ui_manager()->GetNotificationCount()); + std::vector<Notification> notifications = + GetDisplayedNotifications(true /* is_persistent */); + ASSERT_EQ(1u, notifications.size()); - const Notification& notification = ui_manager()->GetNotificationAt(0); - notification.delegate()->Click(); + notifications[0].delegate()->Click(); // We have interacted with the button, so expect a notification bump. EXPECT_DOUBLE_EQ(6.5, GetEngagementScore(GetLastCommittedURL())); @@ -456,7 +420,8 @@ ASSERT_TRUE(RunScript("GetMessageFromWorker()", &script_result)); EXPECT_EQ("action_close", script_result); - ASSERT_EQ(0u, ui_manager()->GetNotificationCount()); + notifications = GetDisplayedNotifications(true /* is_persistent */); + ASSERT_EQ(0u, notifications.size()); } IN_PROC_BROWSER_TEST_F(PlatformNotificationServiceBrowserTest, @@ -471,9 +436,11 @@ RunScript("DisplayPersistentNotification('close_test')", &script_result)); EXPECT_EQ("ok", script_result); - ASSERT_EQ(1u, ui_manager()->GetNotificationCount()); - const Notification& notification = ui_manager()->GetNotificationAt(0); - notification.delegate()->Close(true /* by_user */); + std::vector<Notification> notifications = + GetDisplayedNotifications(true /* is_persistent */); + ASSERT_EQ(1u, notifications.size()); + + notifications[0].delegate()->Close(true /* by_user */); // The user closed this notification so the score should remain the same. EXPECT_DOUBLE_EQ(5.5, GetEngagementScore(GetLastCommittedURL())); @@ -490,13 +457,14 @@ std::string script_result; ASSERT_TRUE(RunScript("DisplayPersistentNotification()", &script_result)); - net::HostPortPair host_port = ServerHostPort(); + GURL test_origin = TestPageUrl().GetOrigin(); - const Notification& notification = ui_manager()->GetNotificationAt(0); + std::vector<Notification> notifications = + GetDisplayedNotifications(true /* is_persistent */); + ASSERT_EQ(1u, notifications.size()); - EXPECT_TRUE(notification.context_message().empty()); - EXPECT_EQ("https://" + host_port.ToString() + "/", - notification.origin_url().spec()); + EXPECT_TRUE(notifications[0].context_message().empty()); + EXPECT_EQ(test_origin.spec(), notifications[0].origin_url().spec()); } IN_PROC_BROWSER_TEST_F(PlatformNotificationServiceBrowserTest, @@ -507,9 +475,12 @@ std::string script_result; ASSERT_TRUE(RunScript("DisplayPersistentNotification()", &script_result)); - const Notification& notification = ui_manager()->GetNotificationAt(0); + std::vector<Notification> notifications = + GetDisplayedNotifications(true /* is_persistent */); + ASSERT_EQ(1u, notifications.size()); - EXPECT_EQ(TestPageUrl().spec(), notification.service_worker_scope().spec()); + EXPECT_EQ(TestPageUrl().spec(), + notifications[0].service_worker_scope().spec()); } IN_PROC_BROWSER_TEST_F(PlatformNotificationServiceBrowserTest, @@ -537,7 +508,7 @@ base::FilePath dir_source_root; EXPECT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &dir_source_root)); base::FilePath full_file_path = - dir_source_root.Append(server_root()).AppendASCII(kTestFileName); + dir_source_root.Append(server_root_).AppendASCII(kTestFileName); GURL file_url(net::FilePathToFileURL(full_file_path)); ui_test_utils::NavigateToURL(browser(), file_url); @@ -568,9 +539,11 @@ &script_result)); EXPECT_EQ("ok", script_result); - ASSERT_EQ(1u, ui_manager()->GetNotificationCount()); + std::vector<Notification> notifications = + GetDisplayedNotifications(true /* is_persistent */); + ASSERT_EQ(1u, notifications.size()); - const Notification& notification = ui_manager()->GetNotificationAt(0); + const Notification& notification = notifications[0]; EXPECT_FALSE(notification.icon().IsEmpty()); EXPECT_EQ("Data URL Title", base::UTF16ToUTF8(notification.title())); @@ -587,9 +560,11 @@ &script_result)); EXPECT_EQ("ok", script_result); - ASSERT_EQ(1u, ui_manager()->GetNotificationCount()); + std::vector<Notification> notifications = + GetDisplayedNotifications(true /* is_persistent */); + ASSERT_EQ(1u, notifications.size()); - const Notification& notification = ui_manager()->GetNotificationAt(0); + const Notification& notification = notifications[0]; EXPECT_FALSE(notification.icon().IsEmpty()); EXPECT_EQ("Blob Title", base::UTF16ToUTF8(notification.title())); @@ -608,9 +583,12 @@ ASSERT_TRUE(RunScript("DisplayPersistentNotificationWithActionButtons()", &script_result)); EXPECT_EQ("ok", script_result); - ASSERT_EQ(1u, ui_manager()->GetNotificationCount()); - const Notification& notification = ui_manager()->GetNotificationAt(0); + std::vector<Notification> notifications = + GetDisplayedNotifications(true /* is_persistent */); + ASSERT_EQ(1u, notifications.size()); + + const Notification& notification = notifications[0]; ASSERT_EQ(2u, notification.buttons().size()); EXPECT_EQ("actionTitle1", base::UTF16ToUTF8(notification.buttons()[0].title)); EXPECT_EQ("actionTitle2", base::UTF16ToUTF8(notification.buttons()[1].title)); @@ -637,9 +615,12 @@ ASSERT_TRUE(RunScript("DisplayPersistentNotificationWithReplyButton()", &script_result)); EXPECT_EQ("ok", script_result); - ASSERT_EQ(1u, ui_manager()->GetNotificationCount()); - const Notification& notification = ui_manager()->GetNotificationAt(0); + std::vector<Notification> notifications = + GetDisplayedNotifications(true /* is_persistent */); + ASSERT_EQ(1u, notifications.size()); + + const Notification& notification = notifications[0]; ASSERT_EQ(1u, notification.buttons().size()); EXPECT_EQ("actionTitle1", base::UTF16ToUTF8(notification.buttons()[0].title)); @@ -655,6 +636,7 @@ std::string script_result; std::string script_message; + ASSERT_TRUE(RunScript("DisplayNonPersistentNotification('NonPersistent')", &script_result)); EXPECT_EQ("ok", script_result); @@ -671,50 +653,47 @@ ASSERT_TRUE(RunScript("GetMessageFromWorker()", &script_message)); - std::vector<std::string> notifications = base::SplitString( + std::vector<std::string> notification_ids = base::SplitString( script_message, ",", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL); + ASSERT_EQ(2u, notification_ids.size()); + + const std::string first_id = notification_ids[0]; + + std::vector<Notification> notifications = + GetDisplayedNotifications(true /* is_persistent */); ASSERT_EQ(2u, notifications.size()); // Now remove one of the notifications straight from the ui manager // without going through the database. - const Notification& notification = ui_manager()->GetNotificationAt(1); + const Notification& notification = notifications[1]; // p: is the prefix for persistent notifications. See // content/browser/notifications/notification_id_generator.{h,cc} for details ASSERT_TRUE( base::StartsWith(notification.id(), "p:", base::CompareCase::SENSITIVE)); - ASSERT_TRUE(ui_manager()->SilentDismissById( - notification.delegate_id(), - NotificationUIManager::GetProfileID(browser()->profile()))); + + GetDisplayService()->RemoveNotification( + NotificationCommon::PERSISTENT, notification.delegate_id(), + false /* by_user */, true /* silent */); + ASSERT_TRUE(RunScript("GetDisplayedNotifications()", &script_result)); EXPECT_EQ("ok", script_result); ASSERT_TRUE(RunScript("GetMessageFromWorker()", &script_message)); - notifications = base::SplitString(script_message, ",", base::KEEP_WHITESPACE, - base::SPLIT_WANT_ALL); - ASSERT_EQ(1u, notifications.size()); + notification_ids = base::SplitString( + script_message, ",", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL); + + // The list of displayed notification Ids should have been updated. + ASSERT_EQ(1u, notification_ids.size()); + ASSERT_EQ(notification_ids[0], first_id); } -IN_PROC_BROWSER_TEST_F(PlatformNotificationServiceBrowserTest, - TestShouldDisplayNormal) { - ASSERT_NO_FATAL_FAILURE(GrantNotificationPermissionForTest()); - EnableFullscreenNotifications(); - - std::string script_result; - ASSERT_TRUE(RunScript( - "DisplayPersistentNotification('display_normal')", &script_result)); - EXPECT_EQ("ok", script_result); - - ASSERT_EQ(1u, ui_manager()->GetNotificationCount()); - const Notification& notification = ui_manager()->GetNotificationAt(0); - EXPECT_FALSE(notification.delegate()->ShouldDisplayOverFullscreen()); -} +// Mac OS X exclusively uses native notifications, so the decision on whether to +// display notifications whilst fullscreen is deferred to the operating system. +#if !defined(OS_MACOSX) IN_PROC_BROWSER_TEST_F(PlatformNotificationServiceBrowserTest, TestShouldDisplayFullscreen) { -#if defined(OS_MACOSX) - ui::test::ScopedFakeNSWindowFullscreen fake_fullscreen; -#endif ASSERT_NO_FATAL_FAILURE(GrantNotificationPermissionForTest()); EnableFullscreenNotifications(); @@ -738,16 +717,15 @@ ASSERT_TRUE(browser()->window()->IsActive()) << "Browser is active after going fullscreen"; - ASSERT_EQ(1u, ui_manager()->GetNotificationCount()); - const Notification& notification = ui_manager()->GetNotificationAt(0); - EXPECT_TRUE(notification.delegate()->ShouldDisplayOverFullscreen()); + std::vector<Notification> notifications = + GetDisplayedNotifications(true /* is_persistent */); + ASSERT_EQ(1u, notifications.size()); + + EXPECT_TRUE(notifications[0].delegate()->ShouldDisplayOverFullscreen()); } IN_PROC_BROWSER_TEST_F(PlatformNotificationServiceBrowserTest, TestShouldDisplayFullscreenOff) { -#if defined(OS_MACOSX) - ui::test::ScopedFakeNSWindowFullscreen fake_fullscreen; -#endif ASSERT_NO_FATAL_FAILURE(GrantNotificationPermissionForTest()); DisableFullscreenNotifications(); @@ -771,16 +749,15 @@ ASSERT_TRUE(browser()->window()->IsActive()) << "Browser is active after going fullscreen"; - ASSERT_EQ(1u, ui_manager()->GetNotificationCount()); - const Notification& notification = ui_manager()->GetNotificationAt(0); + std::vector<Notification> notifications = + GetDisplayedNotifications(true /* is_persistent */); + ASSERT_EQ(1u, notifications.size()); + // When the experiment flag is off, then ShouldDisplayOverFullscreen should // return false. - EXPECT_FALSE(notification.delegate()->ShouldDisplayOverFullscreen()); + EXPECT_FALSE(notifications[0].delegate()->ShouldDisplayOverFullscreen()); } -// The Fake OSX fullscreen window doesn't like drawing a second fullscreen -// window when another is visible. -#if !defined(OS_MACOSX) IN_PROC_BROWSER_TEST_F(PlatformNotificationServiceBrowserTest, TestShouldDisplayMultiFullscreen) { ASSERT_NO_FATAL_FAILURE(GrantNotificationPermissionForTest()); @@ -817,25 +794,22 @@ ASSERT_FALSE(browser()->window()->IsActive()); ASSERT_TRUE(other_browser->window()->IsActive()); - ASSERT_EQ(1u, ui_manager()->GetNotificationCount()); - const Notification& notification = ui_manager()->GetNotificationAt(0); - EXPECT_FALSE(notification.delegate()->ShouldDisplayOverFullscreen()); + std::vector<Notification> notifications = + GetDisplayedNotifications(true /* is_persistent */); + ASSERT_EQ(1u, notifications.size()); + + EXPECT_FALSE(notifications[0].delegate()->ShouldDisplayOverFullscreen()); } -#endif + +#endif // defined(OS_MACOSX) class PlatformNotificationServiceWithoutContentImageBrowserTest : public PlatformNotificationServiceBrowserTest { public: // InProcessBrowserTest overrides. void SetUpInProcessBrowserTestFixture() override { -#if BUILDFLAG(ENABLE_NATIVE_NOTIFICATIONS) - scoped_feature_list_.InitWithFeatures( - {}, - {features::kNotificationContentImage, features::kNativeNotifications}); -#else scoped_feature_list_.InitWithFeatures( {}, {features::kNotificationContentImage}); -#endif // BUILDFLAG(ENABLE_NATIVE_NOTIFICATIONS) } private: @@ -852,10 +826,11 @@ RunScript("DisplayPersistentAllOptionsNotification()", &script_result)); EXPECT_EQ("ok", script_result); - ASSERT_EQ(1u, ui_manager()->GetNotificationCount()); - const Notification& notification = ui_manager()->GetNotificationAt(0); + std::vector<Notification> notifications = + GetDisplayedNotifications(true /* is_persistent */); + ASSERT_EQ(1u, notifications.size()); // Since the kNotificationContentImage kill switch has disabled images, the // notification should be shown without an image. - EXPECT_TRUE(notification.image().IsEmpty()); + EXPECT_TRUE(notifications[0].image().IsEmpty()); }
diff --git a/chrome/browser/notifications/stub_notification_display_service.cc b/chrome/browser/notifications/stub_notification_display_service.cc index 578c43a..0905950 100644 --- a/chrome/browser/notifications/stub_notification_display_service.cc +++ b/chrome/browser/notifications/stub_notification_display_service.cc
@@ -22,10 +22,25 @@ StubNotificationDisplayService::~StubNotificationDisplayService() = default; +std::vector<Notification> +StubNotificationDisplayService::GetDisplayedNotificationsForType( + NotificationCommon::Type type) const { + std::vector<Notification> notifications; + for (const auto& pair : notifications_) { + if (pair.first != type) + continue; + + notifications.push_back(pair.second); + } + + return notifications; +} + void StubNotificationDisplayService::RemoveNotification( NotificationCommon::Type notification_type, const std::string& notification_id, - bool by_user) { + bool by_user, + bool silent) { auto iter = std::find_if( notifications_.begin(), notifications_.end(), [notification_type, notification_id](const NotificationData& data) { @@ -36,10 +51,14 @@ if (iter == notifications_.end()) return; - NotificationHandler* handler = GetNotificationHandler(notification_type); - DCHECK(handler); - handler->OnClose(profile_, iter->second.origin_url().spec(), notification_id, - by_user); + if (!silent) { + NotificationHandler* handler = GetNotificationHandler(notification_type); + DCHECK(handler); + + handler->OnClose(profile_, iter->second.origin_url().spec(), + notification_id, by_user); + } + notifications_.erase(iter); } @@ -67,6 +86,11 @@ // notification's delegate is not meant to be invoked in this situation. Close(notification_type, notification_id); + NotificationHandler* handler = GetNotificationHandler(notification_type); + DCHECK(handler); + + handler->OnShow(profile_, notification_id); + notifications_.emplace_back(notification_type, notification); }
diff --git a/chrome/browser/notifications/stub_notification_display_service.h b/chrome/browser/notifications/stub_notification_display_service.h index 096baba..699d40af 100644 --- a/chrome/browser/notifications/stub_notification_display_service.h +++ b/chrome/browser/notifications/stub_notification_display_service.h
@@ -29,10 +29,17 @@ explicit StubNotificationDisplayService(Profile* profile); ~StubNotificationDisplayService() override; - // Removes the notification identified by |notification_id|. + // Returns a vector of the displayed Notification objects. + std::vector<Notification> GetDisplayedNotificationsForType( + NotificationCommon::Type type) const; + + // Removes the notification identified by |notification_id|. This can + // optionally be |silent|, which means the delegate events won't be invoked + // to imitate behaviour on operating systems that don't support such events. void RemoveNotification(NotificationCommon::Type notification_type, const std::string& notification_id, - bool by_user); + bool by_user, + bool silent = false); // Removes all notifications shown by this display service. void RemoveAllNotifications(NotificationCommon::Type notification_type,
diff --git a/chrome/browser/ntp_snippets/content_suggestions_service_factory.cc b/chrome/browser/ntp_snippets/content_suggestions_service_factory.cc index dcac047..e359459 100644 --- a/chrome/browser/ntp_snippets/content_suggestions_service_factory.cc +++ b/chrome/browser/ntp_snippets/content_suggestions_service_factory.cc
@@ -42,10 +42,10 @@ #include "components/ntp_snippets/bookmarks/bookmark_suggestions_provider.h" #include "components/ntp_snippets/category_rankers/category_ranker.h" #include "components/ntp_snippets/content_suggestions_service.h" -#include "components/ntp_snippets/contextual_suggestions_source.h" +#include "components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl.h" +#include "components/ntp_snippets/contextual/contextual_suggestions_source.h" #include "components/ntp_snippets/features.h" #include "components/ntp_snippets/ntp_snippets_constants.h" -#include "components/ntp_snippets/remote/contextual_suggestions_fetcher_impl.h" #include "components/ntp_snippets/remote/persistent_scheduler.h" #include "components/ntp_snippets/remote/prefetched_pages_tracker.h" #include "components/ntp_snippets/remote/remote_suggestions_database.h"
diff --git a/chrome/browser/password_manager/password_manager_browsertest.cc b/chrome/browser/password_manager/password_manager_browsertest.cc index 2ee854e..5ae70ff 100644 --- a/chrome/browser/password_manager/password_manager_browsertest.cc +++ b/chrome/browser/password_manager/password_manager_browsertest.cc
@@ -30,6 +30,7 @@ #include "chrome/browser/ui/login/login_handler_test_utils.h" #include "chrome/browser/ui/passwords/manage_passwords_ui_controller.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" +#include "chrome/browser/ui/test/test_browser_dialog.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_switches.h" #include "chrome/test/base/ui_test_utils.h" @@ -57,6 +58,7 @@ #include "net/url_request/test_url_fetcher_factory.h" #include "testing/gmock/include/gmock/gmock.h" #include "third_party/WebKit/public/platform/WebInputEvent.h" +#include "ui/base/ui_base_switches.h" #include "ui/events/keycodes/keyboard_codes.h" #include "ui/gfx/geometry/point.h" @@ -3270,4 +3272,50 @@ histograms.ExpectTotalCount(kHistogram, 0); } +// Harness for showing dialogs as part of the DialogBrowserTest suite. Allows +// the dialogs to be shown interactively when invoked with, e.g., +// browser_tests --gtest_filter=BrowserDialogTest.Invoke --interactive +// --dialog=PasswordManagerDialogBrowserTest.InvokeDialog_normal. +class PasswordManagerDialogBrowserTest + : public SupportsTestDialog<PasswordManagerBrowserTestBase> { + public: + PasswordManagerDialogBrowserTest() = default; + + // content::BrowserTestBase: + void SetUpCommandLine(base::CommandLine* command_line) override { + // BrowserDialogTest only works on Mac with --secondary-ui-md. + command_line->AppendSwitch(switches::kExtendMdToSecondaryUi); + } + + void ShowDialog(const std::string& name) override { + // Note regarding flakiness: LocationBarBubbleDelegateView::ShowForReason() + // uses ShowInactive() unless the bubble is invoked with reason == + // USER_GESTURE. This means that, so long as these dialogs are not triggered + // by gesture, the dialog does not attempt to take focus, and so should + // never _lose_ focus in the test, which could cause flakes when tests are + // run in parallel. LocationBarBubbles also dismiss on other events, but + // only events in the WebContents. E.g. Rogue mouse clicks should not cause + // the dialog to dismiss since they won't be sent via WebContents. + // A user gesture is determined in browser_commands.cc by checking + // ManagePasswordsUIController::IsAutomaticallyOpeningBubble(), but that's + // set and cleared immediately while showing the bubble, so it can't be + // checked here. + NavigateToFile("/password/password_form.html"); + NavigationObserver observer(WebContents()); + std::string fill_and_submit = + "document.getElementById('username_field').value = 'temp';" + "document.getElementById('password_field').value = 'random';" + "document.getElementById('input_submit_button').click()"; + ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); + observer.Wait(); + } + + private: + DISALLOW_COPY_AND_ASSIGN(PasswordManagerDialogBrowserTest); +}; + +IN_PROC_BROWSER_TEST_F(PasswordManagerDialogBrowserTest, InvokeDialog_normal) { + RunDialog(); +} + } // namespace password_manager
diff --git a/chrome/browser/payments/android/journey_logger_android.cc b/chrome/browser/payments/android/journey_logger_android.cc index 5d50b9075..644cf50 100644 --- a/chrome/browser/payments/android/journey_logger_android.cc +++ b/chrome/browser/payments/android/journey_logger_android.cc
@@ -111,6 +111,16 @@ requested_phone, requested_name); } +void JourneyLoggerAndroid::SetRequestedPaymentMethodTypes( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& jcaller, + jboolean requested_basic_card, + jboolean requested_method_google, + jboolean requested_method_other) { + journey_logger_.SetRequestedPaymentMethodTypes( + requested_basic_card, requested_method_google, requested_method_other); +} + void JourneyLoggerAndroid::SetCompleted( JNIEnv* env, const base::android::JavaParamRef<jobject>& jcaller) {
diff --git a/chrome/browser/payments/android/journey_logger_android.h b/chrome/browser/payments/android/journey_logger_android.h index 4fbb5496..3d89ee1 100644 --- a/chrome/browser/payments/android/journey_logger_android.h +++ b/chrome/browser/payments/android/journey_logger_android.h
@@ -57,6 +57,12 @@ jboolean requested_email, jboolean requested_phone, jboolean requested_name); + void SetRequestedPaymentMethodTypes( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& jcaller, + jboolean requested_basic_card, + jboolean requested_method_google, + jboolean requested_method_other); void SetCompleted(JNIEnv* env, const base::android::JavaParamRef<jobject>& jcaller); void SetAborted(JNIEnv* env,
diff --git a/chrome/browser/predictors/OWNERS b/chrome/browser/predictors/OWNERS index 538cb20..791f6ad 100644 --- a/chrome/browser/predictors/OWNERS +++ b/chrome/browser/predictors/OWNERS
@@ -1,4 +1,3 @@ alexilin@chromium.org lizeb@chromium.org pasko@chromium.org -zhenw@chromium.org
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc index aed9e942..082ad59 100644 --- a/chrome/browser/prefs/browser_prefs.cc +++ b/chrome/browser/prefs/browser_prefs.cc
@@ -263,9 +263,8 @@ #endif #if !defined(OS_ANDROID) && !defined(OS_CHROMEOS) && !defined(OS_MACOSX) -#include "chrome/browser/feature_engagement/new_tab/new_tab_tracker.h" +#include "chrome/browser/feature_engagement/session_duration_updater.h" #endif - #if !defined(OS_ANDROID) && !defined(OS_CHROMEOS) #include "chrome/browser/ui/startup/default_browser_prompt.h" #endif @@ -587,7 +586,7 @@ #endif #if !defined(OS_ANDROID) && !defined(OS_CHROMEOS) && !defined(OS_MACOSX) - feature_engagement::NewTabTracker::RegisterProfilePrefs(registry); + feature_engagement::SessionDurationUpdater::RegisterProfilePrefs(registry); #endif #if defined(OS_CHROMEOS)
diff --git a/chrome/browser/profiles/profile_manager.cc b/chrome/browser/profiles/profile_manager.cc index 157df68..0ff4e1c 100644 --- a/chrome/browser/profiles/profile_manager.cc +++ b/chrome/browser/profiles/profile_manager.cc
@@ -993,6 +993,9 @@ g_browser_process->platform_part() ->profile_helper() ->GetSigninProfileDir() != profile->GetPath() && + g_browser_process->platform_part() + ->profile_helper() + ->GetLockScreenAppProfilePath() != profile->GetPath() && #endif command_line->HasSwitch(switches::kSupervisedUserId); if (force_supervised_user_id) {
diff --git a/chrome/browser/profiles/profile_shortcut_manager_win.cc b/chrome/browser/profiles/profile_shortcut_manager_win.cc index b44bf1e..cc90f97 100644 --- a/chrome/browser/profiles/profile_shortcut_manager_win.cc +++ b/chrome/browser/profiles/profile_shortcut_manager_win.cc
@@ -964,8 +964,7 @@ return; bool remove_badging = (storage.GetNumberOfProfiles() == 1u); - params.old_profile_name = - entry->GetShortcutName(); + params.old_profile_name = entry->GetShortcutName(); // Exit early if the mode is to update existing profile shortcuts only and // none were ever created for this profile, per the shortcut name not being
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc index 2e8532b..a1a4cb9 100644 --- a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc +++ b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc
@@ -115,9 +115,9 @@ params.writing_direction_default = 0; params.writing_direction_left_to_right = 0; params.writing_direction_right_to_left = 0; -#endif // OS_MACOSX - std::unique_ptr<TestRenderViewContextMenu> menu( - new TestRenderViewContextMenu(web_contents->GetMainFrame(), params)); +#endif + auto menu = base::MakeUnique<TestRenderViewContextMenu>( + web_contents->GetMainFrame(), params); menu->Init(); return menu; } @@ -135,7 +135,8 @@ class PdfPluginContextMenuBrowserTest : public InProcessBrowserTest { public: - PdfPluginContextMenuBrowserTest() {} + PdfPluginContextMenuBrowserTest() = default; + ~PdfPluginContextMenuBrowserTest() override = default; void SetUpOnMainThread() override { guest_view::GuestViewManager::set_factory_for_testing(&factory_); @@ -648,8 +649,8 @@ void AttemptImageSearch() { // |menu_observer_| will cause the search-by-image menu item to be clicked. - menu_observer_.reset(new ContextMenuNotificationObserver( - IDC_CONTENT_CONTEXT_SEARCHWEBFORIMAGE)); + menu_observer_ = base::MakeUnique<ContextMenuNotificationObserver>( + IDC_CONTENT_CONTEXT_SEARCHWEBFORIMAGE); RightClickImage(); } @@ -818,7 +819,7 @@ return; requests_to_wait_for_ = requests_to_wait_for; - run_loop_.reset(new base::RunLoop()); + run_loop_ = base::MakeUnique<base::RunLoop>(); run_loop_->Run(); run_loop_.reset(); requests_to_wait_for_ = -1; @@ -882,8 +883,8 @@ void AttemptLoadImage() { // Right-click where the image should be. // |menu_observer_| will cause the "Load image" menu item to be clicked. - menu_observer_.reset(new ContextMenuNotificationObserver( - IDC_CONTENT_CONTEXT_LOAD_ORIGINAL_IMAGE)); + menu_observer_ = base::MakeUnique<ContextMenuNotificationObserver>( + IDC_CONTENT_CONTEXT_LOAD_ORIGINAL_IMAGE); content::WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); content::SimulateMouseClickAt(tab, 0, blink::WebMouseEvent::Button::kRight,
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_test_util.cc b/chrome/browser/renderer_context_menu/render_view_context_menu_test_util.cc index 7b3cfc60..dea0eac 100644 --- a/chrome/browser/renderer_context_menu/render_view_context_menu_test_util.cc +++ b/chrome/browser/renderer_context_menu/render_view_context_menu_test_util.cc
@@ -20,7 +20,7 @@ TestRenderViewContextMenu::~TestRenderViewContextMenu() {} // static -TestRenderViewContextMenu* TestRenderViewContextMenu::Create( +std::unique_ptr<TestRenderViewContextMenu> TestRenderViewContextMenu::Create( content::WebContents* web_contents, const GURL& page_url, const GURL& link_url, @@ -29,18 +29,19 @@ params.page_url = page_url; params.link_url = link_url; params.frame_url = frame_url; - TestRenderViewContextMenu* menu = - new TestRenderViewContextMenu(web_contents->GetMainFrame(), params); + auto menu = base::MakeUnique<TestRenderViewContextMenu>( + web_contents->GetMainFrame(), params); menu->Init(); return menu; } -bool TestRenderViewContextMenu::IsItemPresent(int command_id) { +bool TestRenderViewContextMenu::IsItemPresent(int command_id) const { return menu_model_.GetIndexOfCommandId(command_id) != -1; } -bool TestRenderViewContextMenu::IsItemInRangePresent(int command_id_first, - int command_id_last) { +bool TestRenderViewContextMenu::IsItemInRangePresent( + int command_id_first, + int command_id_last) const { DCHECK_LE(command_id_first, command_id_last); for (int command_id = command_id_first; command_id <= command_id_last; ++command_id) { @@ -65,7 +66,8 @@ *found_model = model; *found_index = i; return true; - } else if (model->GetTypeAt(i) == MenuModel::TYPE_SUBMENU) { + } + if (model->GetTypeAt(i) == MenuModel::TYPE_SUBMENU) { models_to_search.push_back(model->GetSubmenuModelAt(i)); } } @@ -75,11 +77,12 @@ } int TestRenderViewContextMenu::GetCommandIDByProfilePath( - const base::FilePath& path) { + const base::FilePath& path) const { size_t count = profile_link_paths_.size(); - for (size_t i = 0; i < count; ++i) + for (size_t i = 0; i < count; ++i) { if (profile_link_paths_[i] == path) return IDC_OPEN_LINK_IN_PROFILE_FIRST + static_cast<int>(i); + } return -1; }
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_test_util.h b/chrome/browser/renderer_context_menu/render_view_context_menu_test_util.h index 7dd050c7..ea9f5b87 100644 --- a/chrome/browser/renderer_context_menu/render_view_context_menu_test_util.h +++ b/chrome/browser/renderer_context_menu/render_view_context_menu_test_util.h
@@ -7,6 +7,8 @@ #include <stddef.h> +#include <memory> + #include "base/files/file_path.h" #include "base/macros.h" #include "chrome/browser/renderer_context_menu/render_view_context_menu.h" @@ -34,20 +36,21 @@ // This is a lightweight method to create a test RenderViewContextMenu // instance. // Use the constructor if you want to create menu with fine-grained params. - static TestRenderViewContextMenu* Create(content::WebContents* web_contents, - const GURL& page_url, - const GURL& link_url, - const GURL& frame_url); + static std::unique_ptr<TestRenderViewContextMenu> Create( + content::WebContents* web_contents, + const GURL& page_url, + const GURL& link_url, + const GURL& frame_url); // Returns true if the command specified by |command_id| is present // in the menu. // A list of command ids can be found in chrome/app/chrome_command_ids.h. - bool IsItemPresent(int command_id); + bool IsItemPresent(int command_id) const; // Returns true if a command specified by any command id between // |command_id_first| and |command_id_last| (inclusive) is present in the // menu. - bool IsItemInRangePresent(int command_id_first, int command_id_last); + bool IsItemInRangePresent(int command_id_first, int command_id_last) const; // Searches for an menu item with |command_id|. If it's found, the return // value is true and the model and index where it appears in that model are @@ -57,7 +60,7 @@ int* found_index); // Returns the command id of the menu item with the specified |path|. - int GetCommandIDByProfilePath(const base::FilePath& path); + int GetCommandIDByProfilePath(const base::FilePath& path) const; #if BUILDFLAG(ENABLE_EXTENSIONS) extensions::ContextMenuMatcher& extension_items() { return extension_items_; }
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc b/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc index 5f9fdf29..f6b4d1bc 100644 --- a/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc +++ b/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc
@@ -89,8 +89,8 @@ ProtocolHandlerRegistry* registry) { content::ContextMenuParams params = CreateParams(MenuItem::LINK); params.unfiltered_link_url = params.link_url; - std::unique_ptr<TestRenderViewContextMenu> menu( - new TestRenderViewContextMenu(web_contents->GetMainFrame(), params)); + auto menu = base::MakeUnique<TestRenderViewContextMenu>( + web_contents->GetMainFrame(), params); menu->set_protocol_handler_registry(registry); menu->Init(); return menu; @@ -317,7 +317,7 @@ void SetUp() override { RenderViewContextMenuTest::SetUp(); // TestingProfile does not provide a protocol registry. - registry_.reset(new ProtocolHandlerRegistry(profile(), nullptr)); + registry_ = base::MakeUnique<ProtocolHandlerRegistry>(profile(), nullptr); } void TearDown() override { @@ -376,7 +376,7 @@ void SetUp() override { ChromeRenderViewHostTestHarness::SetUp(); - registry_.reset(new ProtocolHandlerRegistry(profile(), nullptr)); + registry_ = base::MakeUnique<ProtocolHandlerRegistry>(profile(), nullptr); } void TearDown() override { @@ -393,8 +393,8 @@ std::unique_ptr<TestRenderViewContextMenu> CreateContextMenuOnChromeLink() { content::ContextMenuParams params = CreateParams(MenuItem::LINK); params.unfiltered_link_url = params.link_url = GURL("chrome://settings"); - std::unique_ptr<TestRenderViewContextMenu> menu( - new TestRenderViewContextMenu(web_contents()->GetMainFrame(), params)); + auto menu = base::MakeUnique<TestRenderViewContextMenu>( + web_contents()->GetMainFrame(), params); menu->set_protocol_handler_registry(registry_.get()); menu->Init(); return menu; @@ -501,9 +501,8 @@ content::ContextMenuParams params = CreateParams(MenuItem::IMAGE); params.unfiltered_link_url = params.link_url; - content::WebContents* wc = web_contents(); - std::unique_ptr<TestRenderViewContextMenu> menu( - new TestRenderViewContextMenu(wc->GetMainFrame(), params)); + auto menu = base::MakeUnique<TestRenderViewContextMenu>( + web_contents()->GetMainFrame(), params); menu->ExecuteCommand(IDC_CONTENT_CONTEXT_SAVEIMAGEAS, 0); @@ -523,9 +522,8 @@ content::ContextMenuParams params = CreateParams(MenuItem::IMAGE); params.unfiltered_link_url = params.link_url; - content::WebContents* wc = web_contents(); - std::unique_ptr<TestRenderViewContextMenu> menu( - new TestRenderViewContextMenu(wc->GetMainFrame(), params)); + auto menu = base::MakeUnique<TestRenderViewContextMenu>( + web_contents()->GetMainFrame(), params); menu->ExecuteCommand(IDC_CONTENT_CONTEXT_SAVEIMAGEAS, 0); @@ -547,9 +545,8 @@ data_reduction_proxy::chrome_proxy_content_transform_header()] = data_reduction_proxy::empty_image_directive(); params.unfiltered_link_url = params.link_url; - content::WebContents* wc = web_contents(); - std::unique_ptr<TestRenderViewContextMenu> menu( - new TestRenderViewContextMenu(wc->GetMainFrame(), params)); + auto menu = base::MakeUnique<TestRenderViewContextMenu>( + web_contents()->GetMainFrame(), params); AppendImageItems(menu.get()); ASSERT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_LOAD_ORIGINAL_IMAGE));
diff --git a/chrome/browser/renderer_host/site_per_process_text_input_browsertest.cc b/chrome/browser/renderer_host/site_per_process_text_input_browsertest.cc index 736216a..ff5c0806 100644 --- a/chrome/browser/renderer_host/site_per_process_text_input_browsertest.cc +++ b/chrome/browser/renderer_host/site_per_process_text_input_browsertest.cc
@@ -26,7 +26,7 @@ #include "content/public/test/text_input_test_utils.h" #include "net/dns/mock_host_resolver.h" #include "net/test/embedded_test_server/embedded_test_server.h" -#include "ui/base/ime/composition_underline.h" +#include "ui/base/ime/ime_text_span.h" #include "ui/base/ime/text_edit_commands.h" #include "ui/base/ime/text_input_client.h" #include "ui/base/ime/text_input_mode.h" @@ -820,8 +820,8 @@ // Commit some text for this frame. content::SendImeCommitTextToWidget( frames[index]->GetView()->GetRenderWidgetHost(), - base::UTF8ToUTF16(sample_text[index]), - std::vector<ui::CompositionUnderline>(), gfx::Range(), 0); + base::UTF8ToUTF16(sample_text[index]), std::vector<ui::ImeTextSpan>(), + gfx::Range(), 0); // Verify that the text we committed is now selected by listening to a // selection update from a RenderWidgetHostView which has the expected
diff --git a/chrome/browser/resource_coordinator/tab_manager.cc b/chrome/browser/resource_coordinator/tab_manager.cc index cac302a..bec1740 100644 --- a/chrome/browser/resource_coordinator/tab_manager.cc +++ b/chrome/browser/resource_coordinator/tab_manager.cc
@@ -602,6 +602,25 @@ return GetWebContentsData(web_contents)->is_restored_in_foreground(); } +bool TabManager::IsLoadingBackgroundTabs() const { + if (IsSessionRestoreLoadingTabs()) + return false; + + if (!pending_navigations_.empty()) + return true; + + // Excluding session restore above leaves only background opening tabs in + // |loading_contents_|. As long as they still remain in background, we are + // still loading background tabs, even after we emptied our pending navigation + // list. + for (const content::WebContents* tab : loading_contents_) { + if (!tab->IsVisible()) + return true; + } + + return false; +} + /////////////////////////////////////////////////////////////////////////////// // TabManager, private: @@ -1132,7 +1151,9 @@ content::NavigationThrottle::ThrottleCheckResult TabManager::MaybeThrottleNavigation(BackgroundTabNavigationThrottle* throttle) { content::NavigationHandle* navigation_handle = throttle->navigation_handle(); - if (CanLoadNextTab()) { + if (!base::FeatureList::IsEnabled( + features::kStaggeredBackgroundTabOpenExperiment) || + CanLoadNextTab()) { loading_contents_.insert(navigation_handle->GetWebContents()); return content::NavigationThrottle::PROCEED; }
diff --git a/chrome/browser/resource_coordinator/tab_manager.h b/chrome/browser/resource_coordinator/tab_manager.h index 5a74ffc1..f2531898 100644 --- a/chrome/browser/resource_coordinator/tab_manager.h +++ b/chrome/browser/resource_coordinator/tab_manager.h
@@ -226,6 +226,11 @@ // foreground. bool IsTabRestoredInForeground(content::WebContents* web_contents) const; + // Returns whether the tab manager is currently loading background tabs. This + // always returns false during an ongoing session restore, even if background + // tabs are being loaded, in order to separate the two activities. + bool IsLoadingBackgroundTabs() const; + private: FRIEND_TEST_ALL_PREFIXES(TabManagerTest, PurgeBackgroundRenderer); FRIEND_TEST_ALL_PREFIXES(TabManagerTest, ActivateTabResetPurgeState); @@ -257,6 +262,9 @@ FRIEND_TEST_ALL_PREFIXES(TabManagerTest, BackgroundTabLoadingMode); FRIEND_TEST_ALL_PREFIXES(TabManagerTest, BackgroundTabLoadingSlots); FRIEND_TEST_ALL_PREFIXES(TabManagerTest, BackgroundTabsLoadingOrdering); + FRIEND_TEST_ALL_PREFIXES(TabManagerTest, IsLoadingBackgroundTabs); + FRIEND_TEST_ALL_PREFIXES(TabManagerWithExperimentDisabledTest, + IsLoadingBackgroundTabs); FRIEND_TEST_ALL_PREFIXES(TabManagerStatsCollectorTest, HistogramsSessionRestoreSwitchToTab); FRIEND_TEST_ALL_PREFIXES(TabManagerTest,
diff --git a/chrome/browser/resource_coordinator/tab_manager_unittest.cc b/chrome/browser/resource_coordinator/tab_manager_unittest.cc index 2a0d49f8..cce45cc2 100644 --- a/chrome/browser/resource_coordinator/tab_manager_unittest.cc +++ b/chrome/browser/resource_coordinator/tab_manager_unittest.cc
@@ -15,6 +15,7 @@ #include "base/metrics/field_trial.h" #include "base/strings/string16.h" #include "base/test/mock_entropy_provider.h" +#include "base/test/scoped_feature_list.h" #include "base/test/simple_test_tick_clock.h" #include "base/time/time.h" #include "build/build_config.h" @@ -152,6 +153,10 @@ contents2_ = nav_handle2_->GetWebContents(); contents3_ = nav_handle3_->GetWebContents(); + contents1_->WasShown(); + contents2_->WasHidden(); + contents3_->WasHidden(); + throttle1_ = base::MakeUnique<NonResumingBackgroundTabNavigationThrottle>( nav_handle1_.get()); throttle2_ = base::MakeUnique<NonResumingBackgroundTabNavigationThrottle>( @@ -166,6 +171,14 @@ NavigationThrottle::ThrottleCheckResult result3 = tab_manager->MaybeThrottleNavigation(throttle3_.get()); + CheckThrottleResults(result1, result2, result3, loading_slots); + } + + virtual void CheckThrottleResults( + NavigationThrottle::ThrottleCheckResult result1, + NavigationThrottle::ThrottleCheckResult result2, + NavigationThrottle::ThrottleCheckResult result3, + size_t loading_slots) { // First tab starts navigation right away because there is no tab loading. EXPECT_EQ(content::NavigationThrottle::PROCEED, result1); switch (loading_slots) { @@ -198,6 +211,27 @@ WebContents* contents3_; }; +class TabManagerWithExperimentDisabledTest : public TabManagerTest { + public: + void SetUp() override { + scoped_feature_list_.InitAndDisableFeature( + features::kStaggeredBackgroundTabOpenExperiment); + ChromeRenderViewHostTestHarness::SetUp(); + } + + void CheckThrottleResults(NavigationThrottle::ThrottleCheckResult result1, + NavigationThrottle::ThrottleCheckResult result2, + NavigationThrottle::ThrottleCheckResult result3, + size_t loading_slots) override { + EXPECT_EQ(content::NavigationThrottle::PROCEED, result1); + EXPECT_EQ(content::NavigationThrottle::PROCEED, result2); + EXPECT_EQ(content::NavigationThrottle::PROCEED, result3); + } + + private: + base::test::ScopedFeatureList scoped_feature_list_; +}; + // TODO(georgesak): Add tests for protection to tabs with form input and // playing audio; @@ -976,6 +1010,81 @@ EXPECT_FALSE(tab_manager->IsNavigationDelayedForTest(nav_handle3_.get())); } +TEST_F(TabManagerTest, IsLoadingBackgroundTabs) { + TabManager* tab_manager = g_browser_process->GetTabManager(); + tab_manager->ResetMemoryPressureListenerForTest(); + EXPECT_FALSE(tab_manager->IsLoadingBackgroundTabs()); + + MaybeThrottleNavigations(tab_manager); + tab_manager->GetWebContentsData(contents1_) + ->DidStartNavigation(nav_handle1_.get()); + EXPECT_TRUE(tab_manager->IsLoadingBackgroundTabs()); + + tab_manager->GetWebContentsData(contents1_)->DidStopLoading(); + EXPECT_TRUE(tab_manager->IsLoadingBackgroundTabs()); + + tab_manager->GetWebContentsData(contents2_)->DidStopLoading(); + EXPECT_TRUE(tab_manager->IsLoadingBackgroundTabs()); + + contents3_->WasShown(); + EXPECT_FALSE(tab_manager->IsLoadingBackgroundTabs()); + + contents3_->WasHidden(); + EXPECT_TRUE(tab_manager->IsLoadingBackgroundTabs()); + + tab_manager->GetWebContentsData(contents3_)->DidStopLoading(); + EXPECT_FALSE(tab_manager->IsLoadingBackgroundTabs()); +} + +TEST_F(TabManagerWithExperimentDisabledTest, IsLoadingBackgroundTabs) { + EXPECT_FALSE(base::FeatureList::IsEnabled( + features::kStaggeredBackgroundTabOpenExperiment)); + + TabManager* tab_manager = g_browser_process->GetTabManager(); + tab_manager->ResetMemoryPressureListenerForTest(); + EXPECT_FALSE(tab_manager->IsLoadingBackgroundTabs()); + + MaybeThrottleNavigations(tab_manager); + tab_manager->GetWebContentsData(contents1_) + ->DidStartNavigation(nav_handle1_.get()); + tab_manager->GetWebContentsData(contents2_) + ->DidStartNavigation(nav_handle1_.get()); + tab_manager->GetWebContentsData(contents3_) + ->DidStartNavigation(nav_handle1_.get()); + + EXPECT_TRUE(tab_manager->IsTabLoadingForTest(contents1_)); + EXPECT_TRUE(tab_manager->IsTabLoadingForTest(contents2_)); + EXPECT_TRUE(tab_manager->IsTabLoadingForTest(contents3_)); + EXPECT_FALSE(tab_manager->IsNavigationDelayedForTest(nav_handle1_.get())); + EXPECT_FALSE(tab_manager->IsNavigationDelayedForTest(nav_handle2_.get())); + EXPECT_FALSE(tab_manager->IsNavigationDelayedForTest(nav_handle3_.get())); + EXPECT_TRUE(tab_manager->IsLoadingBackgroundTabs()); + + tab_manager->GetWebContentsData(contents1_)->DidStopLoading(); + EXPECT_FALSE(tab_manager->IsTabLoadingForTest(contents1_)); + EXPECT_TRUE(tab_manager->IsTabLoadingForTest(contents2_)); + EXPECT_TRUE(tab_manager->IsTabLoadingForTest(contents3_)); + EXPECT_TRUE(tab_manager->IsLoadingBackgroundTabs()); + + tab_manager->GetWebContentsData(contents2_)->DidStopLoading(); + EXPECT_FALSE(tab_manager->IsTabLoadingForTest(contents1_)); + EXPECT_FALSE(tab_manager->IsTabLoadingForTest(contents2_)); + EXPECT_TRUE(tab_manager->IsTabLoadingForTest(contents3_)); + EXPECT_TRUE(tab_manager->IsLoadingBackgroundTabs()); + + contents3_->WasShown(); + EXPECT_FALSE(tab_manager->IsLoadingBackgroundTabs()); + + contents3_->WasHidden(); + EXPECT_TRUE(tab_manager->IsLoadingBackgroundTabs()); + + tab_manager->GetWebContentsData(contents3_)->DidStopLoading(); + EXPECT_FALSE(tab_manager->IsTabLoadingForTest(contents1_)); + EXPECT_FALSE(tab_manager->IsTabLoadingForTest(contents2_)); + EXPECT_FALSE(tab_manager->IsTabLoadingForTest(contents3_)); + EXPECT_FALSE(tab_manager->IsLoadingBackgroundTabs()); +} + TEST_F(TabManagerTest, IsTabRestoredInForeground) { TabManager* tab_manager = g_browser_process->GetTabManager();
diff --git a/chrome/browser/resources/chromeos/login/images/1x/updating_1x.png b/chrome/browser/resources/chromeos/login/images/1x/updating_1x.png new file mode 100644 index 0000000..758e0e35 --- /dev/null +++ b/chrome/browser/resources/chromeos/login/images/1x/updating_1x.png Binary files differ
diff --git a/chrome/browser/resources/chromeos/login/images/2x/updating_2x.png b/chrome/browser/resources/chromeos/login/images/2x/updating_2x.png new file mode 100644 index 0000000..da1f440 --- /dev/null +++ b/chrome/browser/resources/chromeos/login/images/2x/updating_2x.png Binary files differ
diff --git a/chrome/browser/resources/chromeos/login/md_header_bar.js b/chrome/browser/resources/chromeos/login/md_header_bar.js index 927d568..67ba4cca 100644 --- a/chrome/browser/resources/chromeos/login/md_header_bar.js +++ b/chrome/browser/resources/chromeos/login/md_header_bar.js
@@ -8,6 +8,16 @@ cr.define('login', function() { /** + * Enum for user actions taken from lock screen header while a lock screen + * app is in background. + * @enum {string} + */ + var LOCK_SCREEN_APPS_UNLOCK_ACTION = { + SIGN_OUT: 'LOCK_SCREEN_APPS_UNLOCK_ACTION.SIGN_OUT', + SHUTDOWN: 'LOCK_SCREEN_APPS_UNLOCK_ACTION.SHUTDOWN' + }; + + /** * Creates a header bar element. * * @constructor @@ -50,11 +60,13 @@ decorate: function() { document.addEventListener('click', this.handleClick_.bind(this)); $('shutdown-header-bar-item') - .addEventListener('click', this.handleShutdownClick_); - $('shutdown-button').addEventListener('click', this.handleShutdownClick_); + .addEventListener('click', this.handleShutdownClick_.bind(this)); + $('shutdown-button') + .addEventListener('click', this.handleShutdownClick_.bind(this)); $('restart-header-bar-item') - .addEventListener('click', this.handleShutdownClick_); - $('restart-button').addEventListener('click', this.handleShutdownClick_); + .addEventListener('click', this.handleShutdownClick_.bind(this)); + $('restart-button') + .addEventListener('click', this.handleShutdownClick_.bind(this)); $('add-user-button').addEventListener('click', this.handleAddUserClick_); $('more-settings-button') .addEventListener('click', this.handleMoreSettingsClick_.bind(this)); @@ -62,7 +74,7 @@ .addEventListener('click', this.handleGuestClick_); $('guest-user-button').addEventListener('click', this.handleGuestClick_); $('sign-out-user-button') - .addEventListener('click', this.handleSignoutClick_); + .addEventListener('click', this.handleSignoutClick_.bind(this)); $('cancel-multiple-sign-in-button') .addEventListener('click', this.handleCancelMultipleSignInClick_); $('unlock-user-button') @@ -184,6 +196,12 @@ */ handleSignoutClick_: function(e) { this.disabled = true; + if (this.lockScreenAppsState_ == LOCK_SCREEN_APPS_STATE.BACKGROUND) { + chrome.send( + 'recordLockScreenAppUnlockAction', + [LOCK_SCREEN_APPS_UNLOCK_ACTION.SIGN_OUT]); + } + chrome.send('signOutUser'); e.stopPropagation(); }, @@ -194,6 +212,11 @@ * @private */ handleShutdownClick_: function(e) { + if (this.lockScreenAppsState_ == LOCK_SCREEN_APPS_STATE.BACKGROUND) { + chrome.send( + 'recordLockScreenAppUnlockAction', + [LOCK_SCREEN_APPS_UNLOCK_ACTION.SHUTDOWN]); + } chrome.send('shutdownSystem'); e.stopPropagation(); },
diff --git a/chrome/browser/resources/chromeos/login/md_top_header_bar.html b/chrome/browser/resources/chromeos/login/md_top_header_bar.html index 0fc2608..056bc034 100644 --- a/chrome/browser/resources/chromeos/login/md_top_header_bar.html +++ b/chrome/browser/resources/chromeos/login/md_top_header_bar.html
@@ -3,7 +3,7 @@ <defs> <g id="action-icon" fill="none" fill-rule="evenodd"> <path d="M0 0h16v16H0"></path> - <path fill="#FFF" fill-rule="nonzero" d="M9.333 1.333H4c-.737 0-1.327.597-1.327 1.334l-.006 10.666c0 .737.59 1.334 1.326 1.334H12c.737 0 1.333-.597 1.333-1.334v-8l-4-4zm1.334 9.334h-2v2H7.333v-2h-2V9.333h2v-2h1.334v2h2v1.334zM8.667 6V2.333L12.333 6H8.667z"></path> + <path fill="#FFF" fill-rule="nonzero" d="M8.993 1.007h-4.67c-.734 0-1.327.6-1.327 1.333L2.99 13.69c0 .734.592 1.31 1.326 1.31h7.362c.733 0 1.333-.576 1.333-1.31V4.984L8.994 1.007zM9 6V2.535L12.542 6H9z"></path> </g> </defs> </svg>
diff --git a/chrome/browser/resources/chromeos/login/md_top_header_bar.js b/chrome/browser/resources/chromeos/login/md_top_header_bar.js index 7108c2e..3a11efa1 100644 --- a/chrome/browser/resources/chromeos/login/md_top_header_bar.js +++ b/chrome/browser/resources/chromeos/login/md_top_header_bar.js
@@ -11,6 +11,15 @@ */ cr.define('login', function() { + /** + * The new note request type. + * @enum {string} + */ + var NEW_NOTE_REQUEST = { + TAP: 'NEW_NOTE_REQUEST.TAP', + SWIPE: 'NEW_NOTE_REQUEST.SWIPE', + KEYBOARD: 'NEW_NOTE_REQUEST.KEYBOARD' + }; /** * Calculates diagonal length of a rectangle with the provided sides. @@ -349,7 +358,7 @@ /** override */ decorate: function() { $('new-note-action') - .addEventListener('click', this.activateNoteAction_.bind(this)); + .addEventListener('click', this.handleNewNoteActionClick_.bind(this)); $('new-note-action') .addEventListener( 'keydown', this.handleNewNoteActionKeyDown_.bind(this)); @@ -416,6 +425,14 @@ }, /** + * Handler for clicks on note action element. + * @private + */ + handleNewNoteActionClick_: function() { + this.activateNoteAction_(NEW_NOTE_REQUEST.TAP); + }, + + /** * Handler for key down event. * @param {!KeyboardEvent} evt The key down event. * @private @@ -423,7 +440,7 @@ handleNewNoteActionKeyDown_: function(evt) { if (evt.code != 'Enter') return; - this.activateNoteAction_(); + this.activateNoteAction_(NEW_NOTE_REQUEST.KEYBOARD); }, /** @@ -442,13 +459,15 @@ if (diag(velocity.x, velocity.y) < MIN_SWIPE_VELOCITY) return; - this.activateNoteAction_(); + this.activateNoteAction_(NEW_NOTE_REQUEST.SWIPE); }, /** + * @param {!NEW_NOTE_REQUEST} requestType The type of request that triggered + * new note action. * @private */ - activateNoteAction_: function() { + activateNoteAction_: function(requestType) { $('new-note-action').classList.toggle('disabled', true); $('new-note-action-icon').hidden = true; $('top-header-bar').classList.toggle('version-labels-unset', true); @@ -457,9 +476,7 @@ (function() { if (this.lockScreenAppsState_ != LOCK_SCREEN_APPS_STATE.AVAILABLE) return; - chrome.send( - 'setLockScreenAppsState', - [LOCK_SCREEN_APPS_STATE.LAUNCH_REQUESTED]); + chrome.send('requestNewLockScreenNote', [requestType]); }).bind(this)); var container = $('new-note-action-container');
diff --git a/chrome/browser/resources/chromeos/login/oobe_change_picture.html b/chrome/browser/resources/chromeos/login/oobe_change_picture.html index 89ff91b0..c2fc0ad0 100644 --- a/chrome/browser/resources/chromeos/login/oobe_change_picture.html +++ b/chrome/browser/resources/chromeos/login/oobe_change_picture.html
@@ -26,7 +26,8 @@ --cr-picture-image-size: 192px; -webkit-margin-end: 28px; flex-shrink: 0; - margin-top: 48px; + height: 288px; + position: relative; width: 288px; }
diff --git a/chrome/browser/resources/chromeos/login/oobe_update.css b/chrome/browser/resources/chromeos/login/oobe_update.css index d85623c8..f90d743 100644 --- a/chrome/browser/resources/chromeos/login/oobe_update.css +++ b/chrome/browser/resources/chromeos/login/oobe_update.css
@@ -20,6 +20,10 @@ padding: 0; } +.update-illustration { + padding-bottom: 10px; +} + paper-progress { --paper-progress-active-color: var(--google-blue-500); --paper-progress-secondary-color: var(--google-blue-100);
diff --git a/chrome/browser/resources/chromeos/login/oobe_update.html b/chrome/browser/resources/chromeos/login/oobe_update.html index c0909abe..ee2328e 100644 --- a/chrome/browser/resources/chromeos/login/oobe_update.html +++ b/chrome/browser/resources/chromeos/login/oobe_update.html
@@ -38,6 +38,10 @@ </div> <div class="footer flex layout vertical"> <paper-progress id="checking-progress" indeterminate></paper-progress> + <div class="flex"></div> + <img class="update-illustration" + srcset="images/1x/updating_1x.png 1x, + images/2x/updating_2x.png 2x"> </div> </oobe-dialog> <oobe-dialog hidden="[[checkingForUpdate]]" tabindex="0" @@ -58,6 +62,10 @@ hidden="[[!estimatedTimeLeftShown]]">[[estimatedTimeLeft]]</div> <div id="progress-message" class="progress-message" hidden="[[!progressMessageShown]]">[[progressMessage]]</div> + <div class="flex"></div> + <img class="update-illustration" + srcset="images/1x/updating_1x.png 1x, + images/2x/updating_2x.png 2x"> </div> </oobe-dialog> </template>
diff --git a/chrome/browser/resources/chromeos/login/screen_error_message.css b/chrome/browser/resources/chromeos/login/screen_error_message.css index b85da668..8b6db95 100644 --- a/chrome/browser/resources/chromeos/login/screen_error_message.css +++ b/chrome/browser/resources/chromeos/login/screen_error_message.css
@@ -42,10 +42,6 @@ display: block; } -#oobe.error-message #step-logo { - z-index: 1; -} - .error-header { background-clip: padding-box; background-color: white;
diff --git a/chrome/browser/resources/chromeos/login/screen_error_message.html b/chrome/browser/resources/chromeos/login/screen_error_message.html index ec7fd9c..43047ec 100644 --- a/chrome/browser/resources/chromeos/login/screen_error_message.html +++ b/chrome/browser/resources/chromeos/login/screen_error_message.html
@@ -1,6 +1,6 @@ <link rel="import" href="chrome://oobe/custom_elements.html"> -<div id="error-message" class="step hidden show-offline-error" hidden> +<div id="error-message" class="step hidden show-offline-error no-logo" hidden> <div class="step-contents"> <div class="error-header" aria-live="assertive"> <img alt class="error-icon" src="chrome://theme/IDR_ERROR_NETWORK_OFFLINE">
diff --git a/chrome/browser/resources/chromeos/login/screen_gaia_signin.js b/chrome/browser/resources/chromeos/login/screen_gaia_signin.js index 4040aca7..fd94782 100644 --- a/chrome/browser/resources/chromeos/login/screen_gaia_signin.js +++ b/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
@@ -664,7 +664,8 @@ (this.screenMode_ == ScreenMode.SAML_INTERSTITIAL); params.menuGuestMode = data.guestSignin; params.menuKeyboardOptions = false; - params.menuEnterpriseEnrollment = true; + params.menuEnterpriseEnrollment = + !(data.enterpriseManagedDevice || data.hasDeviceOwner); this.gaiaAuthParams_ = params;
diff --git a/chrome/browser/resources/md_bookmarks/BUILD.gn b/chrome/browser/resources/md_bookmarks/BUILD.gn index e0b81a21e..16e7498 100644 --- a/chrome/browser/resources/md_bookmarks/BUILD.gn +++ b/chrome/browser/resources/md_bookmarks/BUILD.gn
@@ -1,22 +1,12 @@ import("../vulcanize.gni") -vulcanized_unbuilt = "vulcanized.unbuilt.html" - -vulcanize("vulcanize") { +vulcanize("build") { host = "bookmarks" html_in_files = [ "bookmarks.html" ] - html_out_files = [ vulcanized_unbuilt ] + html_out_files = [ "vulcanized.html" ] input = rebase_path(".", root_build_dir) js_out_files = [ "crisper.js" ] deps = [] } - -polymer_css_build("build") { - input_files = [ vulcanized_unbuilt ] - output_files = [ "vulcanized.html" ] - deps = [ - ":vulcanize", - ] -}
diff --git a/chrome/browser/resources/md_downloads/BUILD.gn b/chrome/browser/resources/md_downloads/BUILD.gn index 923b8e8..1b340e3 100644 --- a/chrome/browser/resources/md_downloads/BUILD.gn +++ b/chrome/browser/resources/md_downloads/BUILD.gn
@@ -1,21 +1,11 @@ import("../vulcanize.gni") -vulcanized_unbuilt = "vulcanized.unbuilt.html" - -vulcanize("vulcanize") { +vulcanize("build") { deps = [] host = "downloads" html_in_files = [ "downloads.html" ] - html_out_files = [ vulcanized_unbuilt ] + html_out_files = [ "vulcanized.html" ] input = rebase_path(".", root_build_dir) insert_in_head = "<base href=chrome://downloads>" js_out_files = [ "crisper.js" ] } - -polymer_css_build("build") { - input_files = [ vulcanized_unbuilt ] - output_files = [ "vulcanized.html" ] - deps = [ - ":vulcanize", - ] -}
diff --git a/chrome/browser/resources/md_history/BUILD.gn b/chrome/browser/resources/md_history/BUILD.gn index f6ab0e0..2625f11 100644 --- a/chrome/browser/resources/md_history/BUILD.gn +++ b/chrome/browser/resources/md_history/BUILD.gn
@@ -1,17 +1,14 @@ import("../vulcanize.gni") -app_unbuilt = "app.vulcanized.unbuilt.html" -lazy_load_unbuilt = "lazy_load.vulcanized.unbuilt.html" - -vulcanize("vulcanize_app") { +vulcanize("build") { host = "history" html_in_files = [ "app.html", "lazy_load.html", ] html_out_files = [ - app_unbuilt, - lazy_load_unbuilt, + "app.vulcanized.html", + "lazy_load.vulcanized.html", ] input = rebase_path(".", root_build_dir) @@ -27,17 +24,3 @@ deps = [] } - -polymer_css_build("build") { - input_files = [ - app_unbuilt, - lazy_load_unbuilt, - ] - output_files = [ - "app.vulcanized.html", - "lazy_load.vulcanized.html", - ] - deps = [ - ":vulcanize_app", - ] -}
diff --git a/chrome/browser/resources/media_router/elements/route_controls/route_controls.html b/chrome/browser/resources/media_router/elements/route_controls/route_controls.html index 3f0ae9c4..0885042 100644 --- a/chrome/browser/resources/media_router/elements/route_controls/route_controls.html +++ b/chrome/browser/resources/media_router/elements/route_controls/route_controls.html
@@ -17,6 +17,7 @@ <div> <div id="route-time-controls" hidden="[[!routeStatus.canSeek]]"> <paper-slider + aria-valuetext$="[[getTimeSliderValueText_(displayedCurrentTime_)]]" dir="ltr" id="route-time-slider" on-change="onSeekComplete_" @@ -25,10 +26,12 @@ title="[[i18n('seekTitle')]]" value="[[displayedCurrentTime_]]"></paper-slider> <div id="timeline"> - <span id="current-time"> + <span id="current-time" + aria-label$="[[getCurrentTimeLabel_(displayedCurrentTime_)]]"> [[getFormattedTime_(displayedCurrentTime_)]] </span> - <span id="duration"> + <span id="duration" + aria-label$="[[getDurationLabel_(routeStatus.duration)]]"> [[getFormattedTime_(routeStatus.duration)]] </span> </div>
diff --git a/chrome/browser/resources/media_router/elements/route_controls/route_controls.js b/chrome/browser/resources/media_router/elements/route_controls/route_controls.js index 7dde729..510ac91d 100644 --- a/chrome/browser/resources/media_router/elements/route_controls/route_controls.js +++ b/chrome/browser/resources/media_router/elements/route_controls/route_controls.js
@@ -134,6 +134,30 @@ }, /** + * Creates an accessibility label for the element showing the media's current + * time. + * @param {number} displayedCurrentTime + * @return {string} + * @private + */ + getCurrentTimeLabel_: function(displayedCurrentTime) { + return `${ + this.i18n('currentTimeLabel') + } ${this.getFormattedTime_(displayedCurrentTime)}`; + }, + + /** + * Creates an accessibility label for the element showing the media's + * duration. + * @param {number} duration + * @return {string} + * @private + */ + getDurationLabel_: function(duration) { + return `${this.i18n('durationLabel')} ${this.getFormattedTime_(duration)}`; + }, + + /** * Converts a number representing an interval of seconds to a string with * HH:MM:SS format. * @param {number} timeInSec Must be non-negative. Intervals longer than 100 @@ -148,8 +172,9 @@ var hours = Math.floor(timeInSec / 3600); var minutes = Math.floor(timeInSec / 60) % 60; var seconds = Math.floor(timeInSec) % 60; - return ('0' + hours).substr(-2) + ':' + ('0' + minutes).substr(-2) + ':' + - ('0' + seconds).substr(-2); + // Show the hours only if it is nonzero. + return (hours ? ('0' + hours).substr(-2) + ':' : '') + + ('0' + minutes).substr(-2) + ':' + ('0' + seconds).substr(-2); }, /** @@ -194,6 +219,15 @@ this.i18n('pauseTitle'); }, + getTimeSliderValueText_: function(displayedCurrentTime) { + if (!this.routeStatus) { + return ''; + } + return `${ + this.getFormattedTime_(displayedCurrentTime) + } / ${this.getFormattedTime_(this.routeStatus.duration)}`; + }, + /** * Checks whether the media is still playing, and if so, sends a media status * update incrementing the current time and schedules another call for a
diff --git a/chrome/browser/resources/polymer_css_build_gn.py b/chrome/browser/resources/polymer_css_build_gn.py deleted file mode 100755 index 14fe7c5..0000000 --- a/chrome/browser/resources/polymer_css_build_gn.py +++ /dev/null
@@ -1,41 +0,0 @@ -#!/usr/bin/env python -# 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. - -import argparse -import os -import sys - -_HERE_PATH = os.path.dirname(__file__) -_SRC_PATH = os.path.normpath(os.path.join(_HERE_PATH, '..', '..', '..')) -_CWD = os.getcwd() - -sys.path.append(os.path.join(_SRC_PATH, 'third_party', 'node')) -import node -import node_modules - -def _css_build(out_folder, input_files, output_files): - out_path = os.path.join(_CWD, out_folder) - in_paths = map(lambda f: os.path.join(out_path, f), input_files) - out_paths = map(lambda f: os.path.join(out_path, f), output_files) - - args = ['--no-inline-includes', '-f'] + in_paths + ['-o'] + out_paths - node.RunNode([node_modules.PathToPolymerCssBuild()] + args) - - -def main(): - parser = argparse.ArgumentParser() - parser.add_argument('--out_folder') - parser.add_argument('--input_files', nargs='+') - parser.add_argument('--output_files', nargs='+') - args = parser.parse_args() - - _css_build( - args.out_folder, - input_files=args.input_files, - output_files=args.output_files) - - -if __name__ == '__main__': - main()
diff --git a/chrome/browser/resources/print_preview/settings/scaling_settings.js b/chrome/browser/resources/print_preview/settings/scaling_settings.js index 99d752c..2db68ad 100644 --- a/chrome/browser/resources/print_preview/settings/scaling_settings.js +++ b/chrome/browser/resources/print_preview/settings/scaling_settings.js
@@ -121,11 +121,13 @@ /** * Display the fit to page scaling in the scaling field if there is a valid - * fit to page scaling value. If not, make the field blank. + * fit to page scaling value. If not, make the field blank. The fit to page + * value is always considered valid, so remove the hint if it is displayed. * @private */ displayFitToPageScaling: function() { this.inputField_.value = this.fitToPageScaling_ || ''; + this.removeHint_(); }, /** @@ -151,17 +153,24 @@ }, /** + * Removes the error message and red background from the input. + * @private + */ + removeHint_: function() { + this.inputField_.classList.remove('invalid'); + fadeOutElement(this.getChildElement('.hint')); + }, + + /** * Updates the state of the scaling settings UI controls. * @private */ updateState_: function() { if (this.isAvailable()) { - var displayedValue = this.getInputAsNumber(); // If fit to page is selected and the display matches, mark valid // and return. if (this.isFitToPageSelected() && this.displayMatchesFitToPage()) { - this.inputField_.classList.remove('invalid'); - fadeOutElement(this.getChildElement('.hint')); + this.removeHint_(); this.updateUiStateInternal(); return; } @@ -174,8 +183,7 @@ } this.inputField_.value = this.scalingTicketItem_.getValue(); - this.inputField_.classList.remove('invalid'); - fadeOutElement(this.getChildElement('.hint')); + this.removeHint_(); } this.updateUiStateInternal(); }, @@ -191,9 +199,11 @@ this.displayFitToPageScaling(); } else if ( this.fitToPageTicketItem_.isCapabilityAvailable() && - this.displayMatchesFitToPage()) { + (this.displayMatchesFitToPage() || + !this.inputField_.validity.valid)) { // Fit to page unchecked. Return to last scaling. this.inputField_.value = this.scalingTicketItem_.getValue(); + this.removeHint_(); } }, @@ -207,7 +217,8 @@ this.updateState_(); return; } - if (this.isFitToPageSelected() && !this.displayMatchesFitToPage()) { + if (this.isFitToPageSelected() && !this.displayMatchesFitToPage() && + this.inputField_.value != '') { // User modified value away from fit to page. this.fitToPageTicketItem_.updateValue(false); } @@ -262,12 +273,12 @@ if (this.inputField_.value == '' && this.inputField_.validity.valid) { if (this.isFitToPageSelected()) { this.displayFitToPageScaling(); + } else if (this.scalingTicketItem_.getValue() == '100') { + // No need to update the ticket, but change the display to match. + this.inputField_.value = '100'; + this.removeHint_(); } else { - if (this.scalingTicketItem_.getValue() == '100') - // No need to update the ticket, but change the display to match. - this.inputField_.value = '100'; - else - this.scalingTicketItem_.updateValue('100'); + this.scalingTicketItem_.updateValue('100'); } } },
diff --git a/chrome/browser/resources/settings/BUILD.gn b/chrome/browser/resources/settings/BUILD.gn index 4b7895a..af4bf1d 100644 --- a/chrome/browser/resources/settings/BUILD.gn +++ b/chrome/browser/resources/settings/BUILD.gn
@@ -2,20 +2,18 @@ import("//tools/grit/grit_rule.gni") import("//chrome/common/features.gni") -app_unbuilt = "vulcanized.unbuilt.html" -lazy_load_unbuilt = "lazy_load.vulcanized.unbuilt.html" settings_pak_file = "settings_resources.pak" unpak_folder = "settings_resources.unpak" -vulcanize("vulcanize_app") { +vulcanize("build") { host = "settings" html_in_files = [ "settings.html", "lazy_load.html", ] html_out_files = [ - app_unbuilt, - lazy_load_unbuilt, + "vulcanized.html", + "lazy_load.vulcanized.html", ] insert_in_head = "<base href=\"chrome://\$i18n{hostname}\">" input = rebase_path("$target_gen_dir/$unpak_folder", root_build_dir) @@ -38,20 +36,6 @@ ] } -polymer_css_build("build") { - input_files = [ - app_unbuilt, - lazy_load_unbuilt, - ] - output_files = [ - "vulcanized.html", - "lazy_load.vulcanized.html", - ] - deps = [ - ":vulcanize_app", - ] -} - grit("flattened_resources") { source = "settings_resources.grd"
diff --git a/chrome/browser/resources/settings/people_page/change_picture.html b/chrome/browser/resources/settings/people_page/change_picture.html index 8d0c573..c8e093f38 100644 --- a/chrome/browser/resources/settings/people_page/change_picture.html +++ b/chrome/browser/resources/settings/people_page/change_picture.html
@@ -30,7 +30,8 @@ --cr-picture-image-size: 192px; -webkit-margin-end: 24px; flex-shrink: 0; - margin-top: 48px; + height: 288px; + position: relative; width: 288px; }
diff --git a/chrome/browser/resources/vulcanize_gn.py b/chrome/browser/resources/vulcanize_gn.py index 5b1d517b..78e37ad 100755 --- a/chrome/browser/resources/vulcanize_gn.py +++ b/chrome/browser/resources/vulcanize_gn.py
@@ -180,26 +180,33 @@ f.close() try: + crisper_html_out_paths = [] for index, html_in_file in enumerate(args.html_in_files): - html_out_file = args.html_out_files[index] + crisper_html_out_paths.append( + os.path.join(tmp_out_dir, args.html_out_files[index])) js_out_file = args.js_out_files[index] # Run crisper to separate the JS from the HTML file. node.RunNode([node_modules.PathToCrisper(), '--source', os.path.join(tmp_out_dir, html_in_file), '--script-in-head', 'false', - '--html', os.path.join(tmp_out_dir, html_out_file), + '--html', crisper_html_out_paths[index], '--js', os.path.join(tmp_out_dir, js_out_file)]) - # Move the HTML file to its final destination. - shutil.copy(os.path.join(tmp_out_dir, html_out_file), out_path) - # Pass the JS file through Uglify and write the output to its final # destination. node.RunNode([node_modules.PathToUglify(), os.path.join(tmp_out_dir, js_out_file), '--comments', '"/Copyright|license|LICENSE|\<\/?if/"', '--output', os.path.join(out_path, js_out_file)]) + + # Run polymer-css-build and write the output HTML files to their final + # destination. + pcb_html_out_paths = [ + os.path.join(out_path, f) for f in args.html_out_files] + node.RunNode([node_modules.PathToPolymerCssBuild()] + + ['--no-inline-includes', '-f'] + + crisper_html_out_paths + ['-o'] + pcb_html_out_paths) finally: shutil.rmtree(tmp_out_dir) return manifest_out_path
diff --git a/chrome/browser/safe_browsing/browser_feature_extractor.cc b/chrome/browser/safe_browsing/browser_feature_extractor.cc index bbabc07..d627b039 100644 --- a/chrome/browser/safe_browsing/browser_feature_extractor.cc +++ b/chrome/browser/safe_browsing/browser_feature_extractor.cc
@@ -24,7 +24,7 @@ #include "chrome/browser/safe_browsing/client_side_detection_host.h" #include "components/history/core/browser/history_service.h" #include "components/history/core/browser/history_types.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "components/safe_browsing_db/database_manager.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/navigation_controller.h"
diff --git a/chrome/browser/safe_browsing/browser_feature_extractor_unittest.cc b/chrome/browser/safe_browsing/browser_feature_extractor_unittest.cc index 83958d97..76253cc 100644 --- a/chrome/browser/safe_browsing/browser_feature_extractor_unittest.cc +++ b/chrome/browser/safe_browsing/browser_feature_extractor_unittest.cc
@@ -24,7 +24,7 @@ #include "chrome/test/base/testing_profile.h" #include "components/history/core/browser/history_backend.h" #include "components/history/core/browser/history_service.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "components/safe_browsing_db/database_manager.h" #include "components/safe_browsing_db/test_database_manager.h" #include "content/public/browser/navigation_controller.h"
diff --git a/chrome/browser/safe_browsing/client_side_detection_host.cc b/chrome/browser/safe_browsing/client_side_detection_host.cc index b5ba16f..15d9191 100644 --- a/chrome/browser/safe_browsing/client_side_detection_host.cc +++ b/chrome/browser/safe_browsing/client_side_detection_host.cc
@@ -23,7 +23,7 @@ #include "components/prefs/pref_service.h" #include "components/safe_browsing/common/safe_browsing_prefs.h" #include "components/safe_browsing/common/safebrowsing_messages.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "components/safe_browsing_db/database_manager.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/navigation_controller.h"
diff --git a/chrome/browser/safe_browsing/client_side_detection_host_unittest.cc b/chrome/browser/safe_browsing/client_side_detection_host_unittest.cc index 7559c392..4ee5678 100644 --- a/chrome/browser/safe_browsing/client_side_detection_host_unittest.cc +++ b/chrome/browser/safe_browsing/client_side_detection_host_unittest.cc
@@ -23,7 +23,7 @@ #include "chrome/test/base/chrome_render_view_host_test_harness.h" #include "chrome/test/base/testing_profile.h" #include "components/safe_browsing/common/safebrowsing_messages.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "components/safe_browsing_db/database_manager.h" #include "components/safe_browsing_db/test_database_manager.h" #include "content/public/browser/navigation_entry.h"
diff --git a/chrome/browser/safe_browsing/client_side_detection_service.cc b/chrome/browser/safe_browsing/client_side_detection_service.cc index 30743b7..4d97ebf9 100644 --- a/chrome/browser/safe_browsing/client_side_detection_service.cc +++ b/chrome/browser/safe_browsing/client_side_detection_service.cc
@@ -25,7 +25,7 @@ #include "components/prefs/pref_service.h" #include "components/safe_browsing/common/safe_browsing_prefs.h" #include "components/safe_browsing/common/safebrowsing_messages.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/notification_service.h" #include "content/public/browser/notification_types.h"
diff --git a/chrome/browser/safe_browsing/client_side_detection_service_unittest.cc b/chrome/browser/safe_browsing/client_side_detection_service_unittest.cc index 62a43d3..ecea7d38 100644 --- a/chrome/browser/safe_browsing/client_side_detection_service_unittest.cc +++ b/chrome/browser/safe_browsing/client_side_detection_service_unittest.cc
@@ -22,7 +22,7 @@ #include "base/strings/string_number_conversions.h" #include "base/time/time.h" #include "chrome/common/safe_browsing/client_model.pb.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "components/variations/variations_associated_data.h" #include "content/public/test/test_browser_thread_bundle.h" #include "crypto/sha2.h"
diff --git a/chrome/browser/safe_browsing/client_side_model_loader.cc b/chrome/browser/safe_browsing/client_side_model_loader.cc index b598044..c1da018 100644 --- a/chrome/browser/safe_browsing/client_side_model_loader.cc +++ b/chrome/browser/safe_browsing/client_side_model_loader.cc
@@ -19,7 +19,7 @@ #include "components/data_use_measurement/core/data_use_user_data.h" #include "components/safe_browsing/common/safebrowsing_messages.h" #include "components/safe_browsing/common/safebrowsing_switches.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "components/variations/variations_associated_data.h" #include "net/base/load_flags.h" #include "net/http/http_response_headers.h"
diff --git a/chrome/browser/safe_browsing/client_side_model_loader_unittest.cc b/chrome/browser/safe_browsing/client_side_model_loader_unittest.cc index f30d5590..237b83ad 100644 --- a/chrome/browser/safe_browsing/client_side_model_loader_unittest.cc +++ b/chrome/browser/safe_browsing/client_side_model_loader_unittest.cc
@@ -17,7 +17,7 @@ #include "base/strings/string_number_conversions.h" #include "base/time/time.h" #include "chrome/common/safe_browsing/client_model.pb.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "components/variations/variations_associated_data.h" #include "content/public/test/test_browser_thread_bundle.h" #include "net/http/http_status_code.h"
diff --git a/chrome/browser/safe_browsing/download_feedback.cc b/chrome/browser/safe_browsing/download_feedback.cc index b0be578..08e1563a 100644 --- a/chrome/browser/safe_browsing/download_feedback.cc +++ b/chrome/browser/safe_browsing/download_feedback.cc
@@ -10,7 +10,7 @@ #include "base/memory/ptr_util.h" #include "base/metrics/histogram_macros.h" #include "base/task_runner.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "content/public/browser/browser_thread.h" #include "net/base/net_errors.h"
diff --git a/chrome/browser/safe_browsing/download_feedback_unittest.cc b/chrome/browser/safe_browsing/download_feedback_unittest.cc index 8bd291f..301f49b 100644 --- a/chrome/browser/safe_browsing/download_feedback_unittest.cc +++ b/chrome/browser/safe_browsing/download_feedback_unittest.cc
@@ -12,7 +12,7 @@ #include "base/single_thread_task_runner.h" #include "base/task_scheduler/post_task.h" #include "chrome/browser/safe_browsing/two_phase_uploader.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "content/public/browser/browser_thread.h" #include "content/public/test/test_browser_thread_bundle.h" #include "content/public/test/test_utils.h"
diff --git a/chrome/browser/safe_browsing/download_protection_service.cc b/chrome/browser/safe_browsing/download_protection_service.cc index 82fd1dd..18ecd68 100644 --- a/chrome/browser/safe_browsing/download_protection_service.cc +++ b/chrome/browser/safe_browsing/download_protection_service.cc
@@ -58,7 +58,7 @@ #include "components/safe_browsing/common/safe_browsing_prefs.h" #include "components/safe_browsing/common/safebrowsing_switches.h" #include "components/safe_browsing/common/utils.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/download_item.h" #include "content/public/browser/page_navigator.h"
diff --git a/chrome/browser/safe_browsing/download_protection_service_unittest.cc b/chrome/browser/safe_browsing/download_protection_service_unittest.cc index 39a7ccd..9f88de2 100644 --- a/chrome/browser/safe_browsing/download_protection_service_unittest.cc +++ b/chrome/browser/safe_browsing/download_protection_service_unittest.cc
@@ -41,7 +41,7 @@ #include "components/prefs/pref_service.h" #include "components/safe_browsing/common/safe_browsing_prefs.h" #include "components/safe_browsing/common/safebrowsing_switches.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "components/safe_browsing_db/database_manager.h" #include "components/safe_browsing_db/test_database_manager.h" #include "components/safe_browsing_db/v4_protocol_manager_util.h"
diff --git a/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer.cc b/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer.cc index bf35ec2..c78d52f9 100644 --- a/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer.cc +++ b/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer.cc
@@ -20,7 +20,7 @@ #include "chrome/browser/safe_browsing/incident_reporting/binary_integrity_incident.h" #include "chrome/browser/safe_browsing/incident_reporting/incident_receiver.h" #include "chrome/browser/safe_browsing/safe_browsing_service.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" namespace safe_browsing {
diff --git a/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer_mac.cc b/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer_mac.cc index 0d619b9e..7f4331e 100644 --- a/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer_mac.cc +++ b/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer_mac.cc
@@ -14,7 +14,7 @@ #include "chrome/browser/safe_browsing/incident_reporting/binary_integrity_incident.h" #include "chrome/browser/safe_browsing/incident_reporting/incident_receiver.h" #include "chrome/browser/safe_browsing/signature_evaluator_mac.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" namespace safe_browsing {
diff --git a/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer_mac_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer_mac_unittest.cc index a6f371b..01b9e0d5 100644 --- a/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer_mac_unittest.cc +++ b/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer_mac_unittest.cc
@@ -16,7 +16,7 @@ #include "chrome/browser/safe_browsing/incident_reporting/incident.h" #include "chrome/browser/safe_browsing/incident_reporting/mock_incident_receiver.h" #include "chrome/common/chrome_paths.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer_win.cc b/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer_win.cc index 3b6e7ca..e05eb2b 100644 --- a/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer_win.cc +++ b/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer_win.cc
@@ -18,7 +18,7 @@ #include "chrome/browser/safe_browsing/incident_reporting/incident_receiver.h" #include "chrome/common/chrome_version.h" #include "chrome/common/safe_browsing/binary_feature_extractor.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" namespace safe_browsing {
diff --git a/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer_win_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer_win_unittest.cc index 2c17aa4..5c9f26116 100644 --- a/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer_win_unittest.cc +++ b/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer_win_unittest.cc
@@ -16,7 +16,7 @@ #include "chrome/browser/safe_browsing/incident_reporting/mock_incident_receiver.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_version.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/browser/safe_browsing/incident_reporting/binary_integrity_incident.cc b/chrome/browser/safe_browsing/incident_reporting/binary_integrity_incident.cc index a914bfba..a20a8e4f 100644 --- a/chrome/browser/safe_browsing/incident_reporting/binary_integrity_incident.cc +++ b/chrome/browser/safe_browsing/incident_reporting/binary_integrity_incident.cc
@@ -6,7 +6,7 @@ #include "base/logging.h" #include "chrome/browser/safe_browsing/incident_reporting/incident_handler_util.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" namespace safe_browsing {
diff --git a/chrome/browser/safe_browsing/incident_reporting/binary_integrity_incident_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/binary_integrity_incident_unittest.cc index bb86600..061d7e7 100644 --- a/chrome/browser/safe_browsing/incident_reporting/binary_integrity_incident_unittest.cc +++ b/chrome/browser/safe_browsing/incident_reporting/binary_integrity_incident_unittest.cc
@@ -11,7 +11,7 @@ #include "base/macros.h" #include "base/memory/ptr_util.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "testing/gtest/include/gtest/gtest.h" namespace safe_browsing {
diff --git a/chrome/browser/safe_browsing/incident_reporting/blacklist_load_analyzer_win.cc b/chrome/browser/safe_browsing/incident_reporting/blacklist_load_analyzer_win.cc index 4349fc84..52be87a0 100644 --- a/chrome/browser/safe_browsing/incident_reporting/blacklist_load_analyzer_win.cc +++ b/chrome/browser/safe_browsing/incident_reporting/blacklist_load_analyzer_win.cc
@@ -22,7 +22,7 @@ #include "chrome/browser/safe_browsing/safe_browsing_service.h" #include "chrome/common/safe_browsing/binary_feature_extractor.h" #include "chrome_elf/blacklist/blacklist.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" namespace safe_browsing {
diff --git a/chrome/browser/safe_browsing/incident_reporting/blacklist_load_incident.cc b/chrome/browser/safe_browsing/incident_reporting/blacklist_load_incident.cc index c62e2b6f..b757e746 100644 --- a/chrome/browser/safe_browsing/incident_reporting/blacklist_load_incident.cc +++ b/chrome/browser/safe_browsing/incident_reporting/blacklist_load_incident.cc
@@ -6,7 +6,7 @@ #include "base/logging.h" #include "chrome/browser/safe_browsing/incident_reporting/incident_handler_util.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" namespace safe_browsing {
diff --git a/chrome/browser/safe_browsing/incident_reporting/blacklist_load_incident_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/blacklist_load_incident_unittest.cc index cd88c8c..9f92cf4 100644 --- a/chrome/browser/safe_browsing/incident_reporting/blacklist_load_incident_unittest.cc +++ b/chrome/browser/safe_browsing/incident_reporting/blacklist_load_incident_unittest.cc
@@ -8,7 +8,7 @@ #include <utility> #include "base/memory/ptr_util.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "testing/gtest/include/gtest/gtest.h" namespace safe_browsing {
diff --git a/chrome/browser/safe_browsing/incident_reporting/download_metadata_manager.cc b/chrome/browser/safe_browsing/incident_reporting/download_metadata_manager.cc index 53b518d..6c5cd38e 100644 --- a/chrome/browser/safe_browsing/incident_reporting/download_metadata_manager.cc +++ b/chrome/browser/safe_browsing/incident_reporting/download_metadata_manager.cc
@@ -22,7 +22,7 @@ #include "base/sequenced_task_runner.h" #include "base/task_scheduler/post_task.h" #include "base/task_scheduler/task_traits.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/download_item.h"
diff --git a/chrome/browser/safe_browsing/incident_reporting/download_metadata_manager_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/download_metadata_manager_unittest.cc index 23b85b6..ede70704 100644 --- a/chrome/browser/safe_browsing/incident_reporting/download_metadata_manager_unittest.cc +++ b/chrome/browser/safe_browsing/incident_reporting/download_metadata_manager_unittest.cc
@@ -16,7 +16,7 @@ #include "base/run_loop.h" #include "base/sequenced_task_runner.h" #include "chrome/test/base/testing_profile.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/download_manager.h" #include "content/public/test/mock_download_item.h"
diff --git a/chrome/browser/safe_browsing/incident_reporting/environment_data_collection.cc b/chrome/browser/safe_browsing/incident_reporting/environment_data_collection.cc index 06e02ec4..2001009 100644 --- a/chrome/browser/safe_browsing/incident_reporting/environment_data_collection.cc +++ b/chrome/browser/safe_browsing/incident_reporting/environment_data_collection.cc
@@ -11,7 +11,7 @@ #include "base/threading/thread_restrictions.h" #include "build/build_config.h" #include "chrome/common/channel_info.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "components/version_info/version_info.h" namespace safe_browsing {
diff --git a/chrome/browser/safe_browsing/incident_reporting/environment_data_collection_win.cc b/chrome/browser/safe_browsing/incident_reporting/environment_data_collection_win.cc index ccbd5df..9a7dd8e 100644 --- a/chrome/browser/safe_browsing/incident_reporting/environment_data_collection_win.cc +++ b/chrome/browser/safe_browsing/incident_reporting/environment_data_collection_win.cc
@@ -26,7 +26,7 @@ #include "chrome/browser/safe_browsing/path_sanitizer.h" #include "chrome/common/safe_browsing/binary_feature_extractor.h" #include "chrome_elf/chrome_elf_constants.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "components/variations/variations_associated_data.h" namespace safe_browsing {
diff --git a/chrome/browser/safe_browsing/incident_reporting/environment_data_collection_win_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/environment_data_collection_win_unittest.cc index 2013471..69deb08 100644 --- a/chrome/browser/safe_browsing/incident_reporting/environment_data_collection_win_unittest.cc +++ b/chrome/browser/safe_browsing/incident_reporting/environment_data_collection_win_unittest.cc
@@ -21,7 +21,7 @@ #include "chrome/browser/safe_browsing/incident_reporting/module_integrity_verifier_win.h" #include "chrome/browser/safe_browsing/path_sanitizer.h" #include "chrome_elf/chrome_elf_constants.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "net/base/winsock_init.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/browser/safe_browsing/incident_reporting/extension_data_collection.cc b/chrome/browser/safe_browsing/incident_reporting/extension_data_collection.cc index d60f976..6471ded 100644 --- a/chrome/browser/safe_browsing/incident_reporting/extension_data_collection.cc +++ b/chrome/browser/safe_browsing/incident_reporting/extension_data_collection.cc
@@ -12,7 +12,7 @@ #include "chrome/browser/extensions/install_signer.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/safe_browsing/incident_reporting/incident_reporting_service.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "extensions/browser/extension_prefs.h" #include "extensions/browser/extension_prefs_factory.h" #include "extensions/browser/extension_registry.h"
diff --git a/chrome/browser/safe_browsing/incident_reporting/extension_data_collection_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/extension_data_collection_unittest.cc index 8378b6c..cfd373e 100644 --- a/chrome/browser/safe_browsing/incident_reporting/extension_data_collection_unittest.cc +++ b/chrome/browser/safe_browsing/incident_reporting/extension_data_collection_unittest.cc
@@ -21,7 +21,7 @@ #include "chrome/test/base/testing_profile.h" #include "chrome/test/base/testing_profile_manager.h" #include "components/safe_browsing/common/safe_browsing_prefs.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "components/sync_preferences/testing_pref_service_syncable.h" #include "content/public/test/test_browser_thread_bundle.h" #include "content/public/test/test_utils.h"
diff --git a/chrome/browser/safe_browsing/incident_reporting/incident.cc b/chrome/browser/safe_browsing/incident_reporting/incident.cc index 21d0b1b8..6c9bfc1 100644 --- a/chrome/browser/safe_browsing/incident_reporting/incident.cc +++ b/chrome/browser/safe_browsing/incident_reporting/incident.cc
@@ -8,7 +8,7 @@ #include "base/logging.h" #include "base/time/time.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" namespace safe_browsing {
diff --git a/chrome/browser/safe_browsing/incident_reporting/incident_report_uploader_impl.cc b/chrome/browser/safe_browsing/incident_reporting/incident_report_uploader_impl.cc index 358e0f32..5b344d2 100644 --- a/chrome/browser/safe_browsing/incident_reporting/incident_report_uploader_impl.cc +++ b/chrome/browser/safe_browsing/incident_reporting/incident_report_uploader_impl.cc
@@ -8,7 +8,7 @@ #include "base/metrics/histogram_macros.h" #include "components/data_use_measurement/core/data_use_user_data.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "google_apis/google_api_keys.h" #include "net/base/escape.h" #include "net/base/load_flags.h"
diff --git a/chrome/browser/safe_browsing/incident_reporting/incident_report_uploader_impl_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/incident_report_uploader_impl_unittest.cc index f50fdc44..6639f0d 100644 --- a/chrome/browser/safe_browsing/incident_reporting/incident_report_uploader_impl_unittest.cc +++ b/chrome/browser/safe_browsing/incident_reporting/incident_report_uploader_impl_unittest.cc
@@ -8,7 +8,7 @@ #include <utility> #include "base/test/test_simple_task_runner.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "net/base/load_flags.h" #include "net/http/http_status_code.h" #include "net/url_request/test_url_fetcher_factory.h"
diff --git a/chrome/browser/safe_browsing/incident_reporting/incident_reporting_service.cc b/chrome/browser/safe_browsing/incident_reporting/incident_reporting_service.cc index e95b976..b794818 100644 --- a/chrome/browser/safe_browsing/incident_reporting/incident_reporting_service.cc +++ b/chrome/browser/safe_browsing/incident_reporting/incident_reporting_service.cc
@@ -37,7 +37,7 @@ #include "chrome/common/pref_names.h" #include "components/prefs/pref_service.h" #include "components/safe_browsing/common/safe_browsing_prefs.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "components/safe_browsing_db/database_manager.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/notification_service.h"
diff --git a/chrome/browser/safe_browsing/incident_reporting/incident_reporting_service_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/incident_reporting_service_unittest.cc index 9d4d540..4f0c73fb 100644 --- a/chrome/browser/safe_browsing/incident_reporting/incident_reporting_service_unittest.cc +++ b/chrome/browser/safe_browsing/incident_reporting/incident_reporting_service_unittest.cc
@@ -35,7 +35,7 @@ #include "chrome/test/base/testing_profile.h" #include "chrome/test/base/testing_profile_manager.h" #include "components/safe_browsing/common/safe_browsing_prefs.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "components/sync_preferences/testing_pref_service_syncable.h" #include "content/public/test/test_browser_thread_bundle.h" #include "extensions/browser/quota_service.h"
diff --git a/chrome/browser/safe_browsing/incident_reporting/last_download_finder.cc b/chrome/browser/safe_browsing/incident_reporting/last_download_finder.cc index 96d6612a..5d36b8b 100644 --- a/chrome/browser/safe_browsing/incident_reporting/last_download_finder.cc +++ b/chrome/browser/safe_browsing/incident_reporting/last_download_finder.cc
@@ -28,7 +28,7 @@ #include "components/history/core/browser/download_constants.h" #include "components/history/core/browser/history_service.h" #include "components/prefs/pref_service.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "content/public/browser/notification_details.h" #include "content/public/browser/notification_service.h" #include "content/public/browser/notification_source.h"
diff --git a/chrome/browser/safe_browsing/incident_reporting/last_download_finder_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/last_download_finder_unittest.cc index d3cf2fd1e..8b031fbe 100644 --- a/chrome/browser/safe_browsing/incident_reporting/last_download_finder_unittest.cc +++ b/chrome/browser/safe_browsing/incident_reporting/last_download_finder_unittest.cc
@@ -44,7 +44,7 @@ #include "components/history/core/browser/history_database_params.h" #include "components/history/core/browser/history_service.h" #include "components/safe_browsing/common/safe_browsing_prefs.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "components/sync_preferences/testing_pref_service_syncable.h" #include "content/public/test/test_browser_thread_bundle.h" #include "content/public/test/test_utils.h"
diff --git a/chrome/browser/safe_browsing/incident_reporting/module_integrity_verifier_win.cc b/chrome/browser/safe_browsing/incident_reporting/module_integrity_verifier_win.cc index c1d99e93..7e24fcc 100644 --- a/chrome/browser/safe_browsing/incident_reporting/module_integrity_verifier_win.cc +++ b/chrome/browser/safe_browsing/incident_reporting/module_integrity_verifier_win.cc
@@ -17,7 +17,7 @@ #include "base/scoped_native_library.h" #include "base/strings/utf_string_conversions.h" #include "base/win/pe_image.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" namespace safe_browsing {
diff --git a/chrome/browser/safe_browsing/incident_reporting/module_integrity_verifier_win_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/module_integrity_verifier_win_unittest.cc index 9d91af9a..452c520 100644 --- a/chrome/browser/safe_browsing/incident_reporting/module_integrity_verifier_win_unittest.cc +++ b/chrome/browser/safe_browsing/incident_reporting/module_integrity_verifier_win_unittest.cc
@@ -21,7 +21,7 @@ #include "base/strings/utf_string_conversions.h" #include "base/win/pe_image.h" #include "chrome/browser/safe_browsing/incident_reporting/module_integrity_unittest_util_win.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "testing/gtest/include/gtest/gtest.h" namespace safe_browsing {
diff --git a/chrome/browser/safe_browsing/incident_reporting/module_load_analyzer_win.cc b/chrome/browser/safe_browsing/incident_reporting/module_load_analyzer_win.cc index eea5a41..de02bf8 100644 --- a/chrome/browser/safe_browsing/incident_reporting/module_load_analyzer_win.cc +++ b/chrome/browser/safe_browsing/incident_reporting/module_load_analyzer_win.cc
@@ -22,7 +22,7 @@ #include "chrome/browser/safe_browsing/incident_reporting/suspicious_module_incident.h" #include "chrome/browser/safe_browsing/path_sanitizer.h" #include "chrome/common/safe_browsing/binary_feature_extractor.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "content/public/browser/browser_thread.h" #if defined(SAFE_BROWSING_DB_LOCAL)
diff --git a/chrome/browser/safe_browsing/incident_reporting/module_load_analyzer_win_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/module_load_analyzer_win_unittest.cc index 344194f2..56998c2 100644 --- a/chrome/browser/safe_browsing/incident_reporting/module_load_analyzer_win_unittest.cc +++ b/chrome/browser/safe_browsing/incident_reporting/module_load_analyzer_win_unittest.cc
@@ -15,7 +15,7 @@ #include "chrome/browser/safe_browsing/incident_reporting/incident.h" #include "chrome/browser/safe_browsing/incident_reporting/incident_receiver.h" #include "chrome/browser/safe_browsing/incident_reporting/mock_incident_receiver.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "components/safe_browsing_db/database_manager.h" #include "components/safe_browsing_db/test_database_manager.h" #include "content/public/test/test_browser_thread_bundle.h"
diff --git a/chrome/browser/safe_browsing/incident_reporting/preference_validation_delegate.cc b/chrome/browser/safe_browsing/incident_reporting/preference_validation_delegate.cc index d871351..6bd74eb8 100644 --- a/chrome/browser/safe_browsing/incident_reporting/preference_validation_delegate.cc +++ b/chrome/browser/safe_browsing/incident_reporting/preference_validation_delegate.cc
@@ -12,7 +12,7 @@ #include "base/memory/ptr_util.h" #include "chrome/browser/safe_browsing/incident_reporting/incident_receiver.h" #include "chrome/browser/safe_browsing/incident_reporting/tracked_preference_incident.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "services/preferences/public/interfaces/tracked_preference_validation_delegate.mojom.h" namespace safe_browsing {
diff --git a/chrome/browser/safe_browsing/incident_reporting/preference_validation_delegate_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/preference_validation_delegate_unittest.cc index 0aa2d823..0ea185a6 100644 --- a/chrome/browser/safe_browsing/incident_reporting/preference_validation_delegate_unittest.cc +++ b/chrome/browser/safe_browsing/incident_reporting/preference_validation_delegate_unittest.cc
@@ -17,7 +17,7 @@ #include "base/values.h" #include "chrome/browser/safe_browsing/incident_reporting/incident.h" #include "chrome/browser/safe_browsing/incident_reporting/mock_incident_receiver.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/browser/safe_browsing/incident_reporting/resource_request_detector.cc b/chrome/browser/safe_browsing/incident_reporting/resource_request_detector.cc index 30fed1f..9885c5f 100644 --- a/chrome/browser/safe_browsing/incident_reporting/resource_request_detector.cc +++ b/chrome/browser/safe_browsing/incident_reporting/resource_request_detector.cc
@@ -10,7 +10,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/safe_browsing/incident_reporting/incident_receiver.h" #include "chrome/browser/safe_browsing/incident_reporting/resource_request_incident.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_process_host.h"
diff --git a/chrome/browser/safe_browsing/incident_reporting/resource_request_detector_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/resource_request_detector_unittest.cc index e52c8132..83431bf 100644 --- a/chrome/browser/safe_browsing/incident_reporting/resource_request_detector_unittest.cc +++ b/chrome/browser/safe_browsing/incident_reporting/resource_request_detector_unittest.cc
@@ -12,7 +12,7 @@ #include "chrome/browser/safe_browsing/incident_reporting/incident.h" #include "chrome/browser/safe_browsing/incident_reporting/incident_receiver.h" #include "chrome/browser/safe_browsing/incident_reporting/mock_incident_receiver.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "components/safe_browsing_db/test_database_manager.h" #include "content/public/browser/resource_request_info.h" #include "content/public/common/previews_state.h"
diff --git a/chrome/browser/safe_browsing/incident_reporting/resource_request_incident.cc b/chrome/browser/safe_browsing/incident_reporting/resource_request_incident.cc index 109b499..a08df8f 100644 --- a/chrome/browser/safe_browsing/incident_reporting/resource_request_incident.cc +++ b/chrome/browser/safe_browsing/incident_reporting/resource_request_incident.cc
@@ -6,7 +6,7 @@ #include "base/logging.h" #include "chrome/browser/safe_browsing/incident_reporting/incident_handler_util.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" namespace safe_browsing {
diff --git a/chrome/browser/safe_browsing/incident_reporting/suspicious_module_incident.cc b/chrome/browser/safe_browsing/incident_reporting/suspicious_module_incident.cc index 2f5589e..78fcd0a7 100644 --- a/chrome/browser/safe_browsing/incident_reporting/suspicious_module_incident.cc +++ b/chrome/browser/safe_browsing/incident_reporting/suspicious_module_incident.cc
@@ -6,7 +6,7 @@ #include "base/logging.h" #include "chrome/browser/safe_browsing/incident_reporting/incident_handler_util.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" namespace safe_browsing {
diff --git a/chrome/browser/safe_browsing/incident_reporting/suspicious_module_incident_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/suspicious_module_incident_unittest.cc index 27450a5f..04b050b 100644 --- a/chrome/browser/safe_browsing/incident_reporting/suspicious_module_incident_unittest.cc +++ b/chrome/browser/safe_browsing/incident_reporting/suspicious_module_incident_unittest.cc
@@ -8,7 +8,7 @@ #include <utility> #include "base/memory/ptr_util.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "testing/gtest/include/gtest/gtest.h" namespace safe_browsing {
diff --git a/chrome/browser/safe_browsing/incident_reporting/tracked_preference_incident.cc b/chrome/browser/safe_browsing/incident_reporting/tracked_preference_incident.cc index bc999fe..63ad14c 100644 --- a/chrome/browser/safe_browsing/incident_reporting/tracked_preference_incident.cc +++ b/chrome/browser/safe_browsing/incident_reporting/tracked_preference_incident.cc
@@ -6,7 +6,7 @@ #include "base/logging.h" #include "chrome/browser/safe_browsing/incident_reporting/incident_handler_util.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" namespace safe_browsing {
diff --git a/chrome/browser/safe_browsing/incident_reporting/tracked_preference_incident_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/tracked_preference_incident_unittest.cc index c5a9e335b..1ad07e0b 100644 --- a/chrome/browser/safe_browsing/incident_reporting/tracked_preference_incident_unittest.cc +++ b/chrome/browser/safe_browsing/incident_reporting/tracked_preference_incident_unittest.cc
@@ -8,7 +8,7 @@ #include <utility> #include "base/memory/ptr_util.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "testing/gtest/include/gtest/gtest.h" namespace safe_browsing {
diff --git a/chrome/browser/safe_browsing/incident_reporting/variations_seed_signature_analyzer.cc b/chrome/browser/safe_browsing/incident_reporting/variations_seed_signature_analyzer.cc index c35c1af..842d0d5 100644 --- a/chrome/browser/safe_browsing/incident_reporting/variations_seed_signature_analyzer.cc +++ b/chrome/browser/safe_browsing/incident_reporting/variations_seed_signature_analyzer.cc
@@ -14,7 +14,7 @@ #include "chrome/browser/safe_browsing/incident_reporting/incident_receiver.h" #include "chrome/browser/safe_browsing/incident_reporting/variations_seed_signature_incident.h" #include "chrome/browser/safe_browsing/safe_browsing_service.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "components/variations/service/variations_service.h" #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/safe_browsing/incident_reporting/variations_seed_signature_incident.cc b/chrome/browser/safe_browsing/incident_reporting/variations_seed_signature_incident.cc index abd66c1..f358d0f 100644 --- a/chrome/browser/safe_browsing/incident_reporting/variations_seed_signature_incident.cc +++ b/chrome/browser/safe_browsing/incident_reporting/variations_seed_signature_incident.cc
@@ -6,7 +6,7 @@ #include "base/logging.h" #include "chrome/browser/safe_browsing/incident_reporting/incident_handler_util.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" namespace safe_browsing {
diff --git a/chrome/browser/safe_browsing/incident_reporting/variations_seed_signature_incident_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/variations_seed_signature_incident_unittest.cc index 07b0261..46a3f6a 100644 --- a/chrome/browser/safe_browsing/incident_reporting/variations_seed_signature_incident_unittest.cc +++ b/chrome/browser/safe_browsing/incident_reporting/variations_seed_signature_incident_unittest.cc
@@ -8,7 +8,7 @@ #include <utility> #include "base/memory/ptr_util.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "testing/gtest/include/gtest/gtest.h" namespace safe_browsing {
diff --git a/chrome/browser/safe_browsing/notification_image_reporter.cc b/chrome/browser/safe_browsing/notification_image_reporter.cc index ae292b09..dcca406 100644 --- a/chrome/browser/safe_browsing/notification_image_reporter.cc +++ b/chrome/browser/safe_browsing/notification_image_reporter.cc
@@ -19,7 +19,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/safe_browsing/safe_browsing_service.h" #include "components/safe_browsing/common/safe_browsing_prefs.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "components/safe_browsing_db/database_manager.h" #include "components/variations/variations_associated_data.h" #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/safe_browsing/notification_image_reporter_unittest.cc b/chrome/browser/safe_browsing/notification_image_reporter_unittest.cc index 5a3774af..5cdb126 100644 --- a/chrome/browser/safe_browsing/notification_image_reporter_unittest.cc +++ b/chrome/browser/safe_browsing/notification_image_reporter_unittest.cc
@@ -14,7 +14,7 @@ #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" #include "components/safe_browsing/common/safe_browsing_prefs.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "components/safe_browsing_db/test_database_manager.h" #include "content/public/browser/browser_thread.h" #include "content/public/test/test_browser_thread_bundle.h"
diff --git a/chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager.h b/chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager.h index 473cb52..9767f57 100644 --- a/chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager.h +++ b/chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager.h
@@ -8,7 +8,7 @@ #include <deque> #include "base/feature_list.h" #include "base/supports_user_data.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "content/public/browser/web_contents_observer.h" #include "third_party/protobuf/src/google/protobuf/repeated_field.h" #include "url/gurl.h"
diff --git a/chrome/browser/safe_browsing/signature_evaluator_mac.mm b/chrome/browser/safe_browsing/signature_evaluator_mac.mm index 9ffcb66..a3d3968 100644 --- a/chrome/browser/safe_browsing/signature_evaluator_mac.mm +++ b/chrome/browser/safe_browsing/signature_evaluator_mac.mm
@@ -19,7 +19,7 @@ #include "base/strings/sys_string_conversions.h" #include "chrome/common/safe_browsing/binary_feature_extractor.h" #include "chrome/common/safe_browsing/mach_o_image_reader_mac.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" namespace safe_browsing {
diff --git a/chrome/browser/safe_browsing/signature_evaluator_mac_unittest.cc b/chrome/browser/safe_browsing/signature_evaluator_mac_unittest.cc index 3041104..aa3f72d 100644 --- a/chrome/browser/safe_browsing/signature_evaluator_mac_unittest.cc +++ b/chrome/browser/safe_browsing/signature_evaluator_mac_unittest.cc
@@ -22,7 +22,7 @@ #include "chrome/browser/safe_browsing/incident_reporting/incident.h" #include "chrome/browser/safe_browsing/incident_reporting/mock_incident_receiver.h" #include "chrome/common/chrome_paths.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "testing/gmock/include/gmock/gmock-matchers.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/browser/safe_browsing/threat_details_unittest.cc b/chrome/browser/safe_browsing/threat_details_unittest.cc index d7da5a4..8788a47a 100644 --- a/chrome/browser/safe_browsing/threat_details_unittest.cc +++ b/chrome/browser/safe_browsing/threat_details_unittest.cc
@@ -23,7 +23,7 @@ #include "components/safe_browsing/browser/threat_details.h" #include "components/safe_browsing/browser/threat_details_history.h" #include "components/safe_browsing/common/safebrowsing_messages.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "content/public/browser/render_process_host.h" #include "content/public/browser/web_contents.h" #include "content/public/test/test_renderer_host.h"
diff --git a/chrome/browser/safe_browsing/ui_manager_unittest.cc b/chrome/browser/safe_browsing/ui_manager_unittest.cc index fea272b3..27631886 100644 --- a/chrome/browser/safe_browsing/ui_manager_unittest.cc +++ b/chrome/browser/safe_browsing/ui_manager_unittest.cc
@@ -153,20 +153,39 @@ scoped_refptr<SafeBrowsingUIManager> ui_manager_; }; -TEST_F(SafeBrowsingUIManagerTest, Whitelist) { +// Leaks memory. https://crbug.com/755118 +#if defined(LEAK_SANITIZER) +#define MAYBE_Whitelist DISABLED_Whitelist +#else +#define MAYBE_Whitelist Whitelist +#endif +TEST_F(SafeBrowsingUIManagerTest, MAYBE_Whitelist) { security_interstitials::UnsafeResource resource = MakeUnsafeResourceAndStartNavigation(kBadURL); AddToWhitelist(resource); EXPECT_TRUE(IsWhitelisted(resource)); } -TEST_F(SafeBrowsingUIManagerTest, WhitelistIgnoresSitesNotAdded) { +// Leaks memory. https://crbug.com/755118 +#if defined(LEAK_SANITIZER) +#define MAYBE_WhitelistIgnoresSitesNotAdded \ + DISABLED_WhitelistIgnoresSitesNotAdded +#else +#define MAYBE_WhitelistIgnoresSitesNotAdded WhitelistIgnoresSitesNotAdded +#endif +TEST_F(SafeBrowsingUIManagerTest, MAYBE_WhitelistIgnoresSitesNotAdded) { security_interstitials::UnsafeResource resource = MakeUnsafeResourceAndStartNavigation(kGoodURL); EXPECT_FALSE(IsWhitelisted(resource)); } -TEST_F(SafeBrowsingUIManagerTest, WhitelistRemembersThreatType) { +// Leaks memory. https://crbug.com/755118 +#if defined(LEAK_SANITIZER) +#define MAYBE_WhitelistRemembersThreatType DISABLED_WhitelistRemembersThreatType +#else +#define MAYBE_WhitelistRemembersThreatType WhitelistRemembersThreatType +#endif +TEST_F(SafeBrowsingUIManagerTest, MAYBE_WhitelistRemembersThreatType) { security_interstitials::UnsafeResource resource = MakeUnsafeResourceAndStartNavigation(kBadURL); AddToWhitelist(resource); @@ -181,7 +200,13 @@ EXPECT_EQ(resource.threat_type, threat_type); } -TEST_F(SafeBrowsingUIManagerTest, WhitelistIgnoresPath) { +// Leaks memory. https://crbug.com/755118 +#if defined(LEAK_SANITIZER) +#define MAYBE_WhitelistIgnoresPath DISABLED_WhitelistIgnoresPath +#else +#define MAYBE_WhitelistIgnoresPath WhitelistIgnoresPath +#endif +TEST_F(SafeBrowsingUIManagerTest, MAYBE_WhitelistIgnoresPath) { security_interstitials::UnsafeResource resource = MakeUnsafeResourceAndStartNavigation(kBadURL); AddToWhitelist(resource); @@ -194,7 +219,13 @@ EXPECT_TRUE(IsWhitelisted(resource_path)); } -TEST_F(SafeBrowsingUIManagerTest, WhitelistIgnoresThreatType) { +// Leaks memory. https://crbug.com/755118 +#if defined(LEAK_SANITIZER) +#define MAYBE_WhitelistIgnoresThreatType DISABLED_WhitelistIgnoresThreatType +#else +#define MAYBE_WhitelistIgnoresThreatType WhitelistIgnoresThreatType +#endif +TEST_F(SafeBrowsingUIManagerTest, MAYBE_WhitelistIgnoresThreatType) { security_interstitials::UnsafeResource resource = MakeUnsafeResourceAndStartNavigation(kBadURL); AddToWhitelist(resource); @@ -206,7 +237,15 @@ EXPECT_TRUE(IsWhitelisted(resource_phishing)); } -TEST_F(SafeBrowsingUIManagerTest, WhitelistWithUnrelatedPendingLoad) { +// Leaks memory. https://crbug.com/755118 +#if defined(LEAK_SANITIZER) +#define MAYBE_WhitelistWithUnrelatedPendingLoad \ + DISABLED_WhitelistWithUnrelatedPendingLoad +#else +#define MAYBE_WhitelistWithUnrelatedPendingLoad \ + WhitelistWithUnrelatedPendingLoad +#endif +TEST_F(SafeBrowsingUIManagerTest, MAYBE_WhitelistWithUnrelatedPendingLoad) { // Commit load of landing page. NavigateAndCommit(GURL(kLandingURL)); {
diff --git a/chrome/browser/ssl/security_state_tab_helper_browser_tests.cc b/chrome/browser/ssl/security_state_tab_helper_browser_tests.cc index c3588664..29f1274 100644 --- a/chrome/browser/ssl/security_state_tab_helper_browser_tests.cc +++ b/chrome/browser/ssl/security_state_tab_helper_browser_tests.cc
@@ -160,7 +160,7 @@ ->GetSSL() .certificate.get(); EXPECT_TRUE(cert->Equals(expected_cert)); - EXPECT_TRUE(expired_explanation.insecure_explanations[0].has_certificate); + EXPECT_TRUE(!!expired_explanation.insecure_explanations[0].certificate); } // Checks that the given |explanation| contains an appropriate @@ -184,7 +184,7 @@ ->GetSSL() .certificate.get(); EXPECT_TRUE(cert->Equals(expected_cert)); - EXPECT_TRUE(explanation.has_certificate); + EXPECT_TRUE(!!explanation.certificate); } // Checks that the given |explanation| contains an appropriate
diff --git a/chrome/browser/supervised_user/supervised_user_service.cc b/chrome/browser/supervised_user/supervised_user_service.cc index 3ee6154..d1fc034 100644 --- a/chrome/browser/supervised_user/supervised_user_service.cc +++ b/chrome/browser/supervised_user/supervised_user_service.cc
@@ -885,8 +885,9 @@ #if defined(OS_CHROMEOS) // The active user can be NULL in unit tests. if (user_manager::UserManager::Get()->GetActiveUser()) { - return UTF16ToUTF8(user_manager::UserManager::Get()->GetUserDisplayName( - user_manager::UserManager::Get()->GetActiveUser()->GetAccountId())); + return base::UTF16ToUTF8( + user_manager::UserManager::Get()->GetUserDisplayName( + user_manager::UserManager::Get()->GetActiveUser()->GetAccountId())); } return std::string(); #else
diff --git a/chrome/browser/sync/DEPS b/chrome/browser/sync/DEPS index a2eaea2..88800dc5 100644 --- a/chrome/browser/sync/DEPS +++ b/chrome/browser/sync/DEPS
@@ -5,14 +5,3 @@ "+components/sync_wifi", "+google/cacheinvalidation", ] -specific_include_rules = { - "sync_error_notifier_ash\.cc": [ - "+ash/system/system_notifier.h", - ], - "sync_error_notifier_factory_ash\.cc": [ - "+ash/shell.h", - ], - ".*_unittest\.cc": [ - "+ash/test/ash_test_base.h", - ] -}
diff --git a/chrome/browser/sync/sync_error_notifier_ash.cc b/chrome/browser/sync/sync_error_notifier_ash.cc index 5ca2dce0b..e6c2929 100644 --- a/chrome/browser/sync/sync_error_notifier_ash.cc +++ b/chrome/browser/sync/sync_error_notifier_ash.cc
@@ -4,10 +4,11 @@ #include "chrome/browser/sync/sync_error_notifier_ash.h" -#include "ash/system/system_notifier.h" #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/chromeos/login/user_flow.h" +#include "chrome/browser/chromeos/login/users/chrome_user_manager.h" #include "chrome/browser/notifications/notification.h" #include "chrome/browser/notifications/notification_ui_manager.h" #include "chrome/browser/profiles/profile.h" @@ -20,17 +21,12 @@ #include "chrome/grit/generated_resources.h" #include "chrome/grit/theme_resources.h" #include "components/signin/core/account_id/account_id.h" +#include "components/user_manager/user_manager.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/resource/resource_bundle.h" #include "ui/message_center/notification.h" #include "ui/message_center/notification_delegate.h" -#if defined(OS_CHROMEOS) -#include "chrome/browser/chromeos/login/user_flow.h" -#include "chrome/browser/chromeos/login/users/chrome_user_manager.h" -#include "components/user_manager/user_manager.h" -#endif - namespace { const char kProfileSyncNotificationId[] = "chrome://settings/sync/"; @@ -137,7 +133,6 @@ return; } -#if defined(OS_CHROMEOS) if (user_manager::UserManager::IsInitialized()) { chromeos::UserFlow* user_flow = chromeos::ChromeUserManager::Get()->GetCurrentUserFlow(); @@ -148,7 +143,6 @@ if (!user_flow->ShouldLaunchBrowser()) return; } -#endif // Error state just got triggered. There shouldn't be previous notification. // Let's display one.
diff --git a/chrome/browser/sync/sync_error_notifier_ash_unittest.cc b/chrome/browser/sync/sync_error_notifier_ash_unittest.cc index 41d7a43..4b34e58 100644 --- a/chrome/browser/sync/sync_error_notifier_ash_unittest.cc +++ b/chrome/browser/sync/sync_error_notifier_ash_unittest.cc
@@ -8,7 +8,6 @@ #include <memory> -#include "ash/test/ash_test_base.h" #include "base/memory/ptr_util.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/chromeos/login/users/mock_user_manager.h" @@ -19,6 +18,7 @@ #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/webui/signin/login_ui_service.h" #include "chrome/browser/ui/webui/signin/login_ui_service_factory.h" +#include "chrome/test/base/browser_with_test_window_test.h" #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" #include "chrome/test/base/testing_profile_manager.h" @@ -32,8 +32,6 @@ using ::testing::ReturnRef; using ::testing::_; -namespace ash { - namespace { const char kTestAccountId[] = "testuser@test.com"; @@ -67,7 +65,7 @@ return base::MakeUnique<FakeLoginUIService>(); } -class SyncErrorNotifierTest : public AshTestBase { +class SyncErrorNotifierTest : public BrowserWithTestWindowTest { public: SyncErrorNotifierTest() {} ~SyncErrorNotifierTest() override {} @@ -75,7 +73,7 @@ void SetUp() override { DCHECK(TestingBrowserProcess::GetGlobal()); - AshTestBase::SetUp(); + BrowserWithTestWindowTest::SetUp(); profile_manager_ = base::MakeUnique<TestingProfileManager>( TestingBrowserProcess::GetGlobal()); @@ -104,7 +102,7 @@ service_.reset(); profile_manager_.reset(); - AshTestBase::TearDown(); + BrowserWithTestWindowTest::TearDown(); } protected: @@ -148,8 +146,6 @@ DISALLOW_COPY_AND_ASSIGN(SyncErrorNotifierTest); }; -} // namespace - // Test that SyncErrorNotifier shows an notification if a passphrase is // required. TEST_F(SyncErrorNotifierTest, PassphraseNotification) { @@ -209,4 +205,4 @@ } } -} // namespace ash +} // namespace
diff --git a/chrome/browser/sync/sync_error_notifier_factory_ash.cc b/chrome/browser/sync/sync_error_notifier_factory_ash.cc index 2af253c..2ab74180 100644 --- a/chrome/browser/sync/sync_error_notifier_factory_ash.cc +++ b/chrome/browser/sync/sync_error_notifier_factory_ash.cc
@@ -4,7 +4,6 @@ #include "chrome/browser/sync/sync_error_notifier_factory_ash.h" -#include "ash/shell.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/sync/profile_sync_service_factory.h" @@ -35,9 +34,6 @@ KeyedService* SyncErrorNotifierFactory::BuildServiceInstanceFor( content::BrowserContext* context) const { - if (!ash::Shell::HasInstance()) - return nullptr; - Profile* profile = static_cast<Profile*>(context); browser_sync::ProfileSyncService* profile_sync_service = ProfileSyncServiceFactory::GetForProfile(profile);
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 996ebba..2c7ae1f4 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -3056,6 +3056,8 @@ "cocoa/restart_browser.mm", "cocoa/screen_capture_notification_ui_cocoa.h", "cocoa/screen_capture_notification_ui_cocoa.mm", + "cocoa/separate_fullscreen_window.h", + "cocoa/separate_fullscreen_window.mm", "cocoa/session_crashed_bubble.mm", "cocoa/simple_message_box_bridge_views.mm", "cocoa/simple_message_box_cocoa.h",
diff --git a/chrome/browser/ui/app_list/search/arc/arc_playstore_search_provider.cc b/chrome/browser/ui/app_list/search/arc/arc_playstore_search_provider.cc index fc95abb4..66c004825 100644 --- a/chrome/browser/ui/app_list/search/arc/arc_playstore_search_provider.cc +++ b/chrome/browser/ui/app_list/search/arc/arc_playstore_search_provider.cc
@@ -65,7 +65,7 @@ return; app_instance->GetRecentAndSuggestedAppsFromPlayStore( - UTF16ToUTF8(query), max_results_, + base::UTF16ToUTF8(query), max_results_, base::Bind(&ArcPlayStoreSearchProvider::OnResults, weak_ptr_factory_.GetWeakPtr(), base::TimeTicks::Now())); }
diff --git a/chrome/browser/ui/app_list/search/search_controller_factory.cc b/chrome/browser/ui/app_list/search/search_controller_factory.cc index 8bd8e2c..e1792c0 100644 --- a/chrome/browser/ui/app_list/search/search_controller_factory.cc +++ b/chrome/browser/ui/app_list/search/search_controller_factory.cc
@@ -78,17 +78,18 @@ model->search_box(), model->results(), HistoryFactory::GetForBrowserContext(profile)); - // Add mixer groups. There are three main groups: apps, webstore and - // omnibox. Each group has a "soft" maximum number of results. However, if + // Add mixer groups. There are four main groups: answer card, apps, webstore + // and omnibox. Each group has a "soft" maximum number of results. However, if // a query turns up very few results, the mixer may take more than this // maximum from a particular group. - // Multiplier 100 is used because the answer card is designed to be the most - // relevant result and must be on the top of the result list. - size_t answer_card_group_id = controller->AddGroup(1, 100.0); - size_t apps_group_id = controller->AddGroup(kMaxAppsGroupResults, 1.0); - size_t omnibox_group_id = controller->AddGroup(kMaxOmniboxResults, 1.0); - size_t webstore_group_id = controller->AddGroup(kMaxWebstoreResults, 0.4); + size_t answer_card_group_id = controller->AddGroup(1, 1.0, 10.0); + size_t apps_group_id = + controller->AddGroup(kMaxAppsGroupResults, 1.0, + features::IsFullscreenAppListEnabled() ? 5.0 : 0.0); + size_t omnibox_group_id = controller->AddGroup(kMaxOmniboxResults, 1.0, 0.0); + size_t webstore_group_id = + controller->AddGroup(kMaxWebstoreResults, 0.4, 0.0); // Add search providers. controller->AddProvider( @@ -112,7 +113,7 @@ } if (IsSuggestionsSearchProviderEnabled()) { size_t suggestions_group_id = - controller->AddGroup(kMaxSuggestionsResults, 1.0); + controller->AddGroup(kMaxSuggestionsResults, 1.0, 0.0); controller->AddProvider( suggestions_group_id, base::MakeUnique<SuggestionsSearchProvider>(profile, list_controller)); @@ -123,7 +124,7 @@ if (app_list::switches::IsDriveSearchInChromeLauncherEnabled() && !profile->IsGuestSession()) { size_t search_api_group_id = - controller->AddGroup(kMaxLauncherSearchResults, 1.0); + controller->AddGroup(kMaxLauncherSearchResults, 1.0, 0.0); controller->AddProvider(search_api_group_id, base::MakeUnique<LauncherSearchProvider>(profile)); } @@ -131,7 +132,7 @@ #if defined(OS_CHROMEOS) if (features::IsPlayStoreAppSearchEnabled()) { size_t playstore_api_group_id = - controller->AddGroup(kMaxPlayStoreResults, 1.0); + controller->AddGroup(kMaxPlayStoreResults, 1.0, 0.0); controller->AddProvider( playstore_api_group_id, base::MakeUnique<ArcPlayStoreSearchProvider>(kMaxPlayStoreResults,
diff --git a/chrome/browser/ui/ash/app_list/app_list_presenter_service.cc b/chrome/browser/ui/ash/app_list/app_list_presenter_service.cc index a5ba98b..c08458dc 100644 --- a/chrome/browser/ui/ash/app_list/app_list_presenter_service.cc +++ b/chrome/browser/ui/ash/app_list/app_list_presenter_service.cc
@@ -9,13 +9,20 @@ #include "ash/public/interfaces/constants.mojom.h" #include "chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_framework_service.h" #include "chrome/browser/ui/ash/app_list/app_list_service_ash.h" +#include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h" #include "content/public/common/service_manager_connection.h" #include "services/service_manager/public/cpp/connector.h" #include "ui/app_list/presenter/app_list_presenter_impl.h" #include "ui/gfx/geometry/rect.h" -AppListPresenterService::AppListPresenterService(Profile* profile) - : profile_(profile), binding_(this) { +AppListPresenterService::AppListPresenterService() : binding_(this) {} + +AppListPresenterService::~AppListPresenterService() {} + +void AppListPresenterService::Init() { + if (binding_.is_bound()) + return; + content::ServiceManagerConnection* connection = content::ServiceManagerConnection::GetForProcess(); if (connection && connection->GetConnector()) { @@ -32,8 +39,6 @@ } } -AppListPresenterService::~AppListPresenterService() {} - void AppListPresenterService::Show(int64_t display_id) { GetPresenter()->Show(display_id); } @@ -48,7 +53,8 @@ void AppListPresenterService::StartVoiceInteractionSession() { auto* service = - arc::ArcVoiceInteractionFrameworkService::GetForBrowserContext(profile_); + arc::ArcVoiceInteractionFrameworkService::GetForBrowserContext( + ChromeLauncherController::instance()->profile()); if (service) service->StartSessionFromUserInteraction(gfx::Rect()); }
diff --git a/chrome/browser/ui/ash/app_list/app_list_presenter_service.h b/chrome/browser/ui/ash/app_list/app_list_presenter_service.h index 759db7d..2151a32 100644 --- a/chrome/browser/ui/ash/app_list/app_list_presenter_service.h +++ b/chrome/browser/ui/ash/app_list/app_list_presenter_service.h
@@ -9,8 +9,6 @@ #include "mojo/public/cpp/bindings/binding.h" #include "ui/app_list/presenter/app_list_presenter.mojom.h" -class Profile; - namespace app_list { class AppListPresenterImpl; } @@ -18,9 +16,12 @@ // A service providing the Mojo interface to manipulate the App List. class AppListPresenterService : public app_list::mojom::AppListPresenter { public: - explicit AppListPresenterService(Profile* profile); + AppListPresenterService(); ~AppListPresenterService() override; + // Initialize service and mojo bindings. + void Init(); + // app_list::mojom::AppListPresenter: void Show(int64_t display_id) override; void Dismiss() override; @@ -33,7 +34,6 @@ private: app_list::AppListPresenterImpl* GetPresenter(); - Profile* const profile_; // Owned by ProfileManager. mojo::Binding<app_list::mojom::AppListPresenter> binding_; DISALLOW_COPY_AND_ASSIGN(AppListPresenterService);
diff --git a/chrome/browser/ui/ash/app_list/app_list_service_ash.cc b/chrome/browser/ui/ash/app_list/app_list_service_ash.cc index 2eaaee6..365f09f 100644 --- a/chrome/browser/ui/ash/app_list/app_list_service_ash.cc +++ b/chrome/browser/ui/ash/app_list/app_list_service_ash.cc
@@ -100,6 +100,7 @@ base::MakeUnique<app_list::AppListPresenterImpl>(std::move(factory)); controller_delegate_ = base::MakeUnique<AppListControllerDelegateAsh>(app_list_presenter_.get()); + app_list_presenter_service_ = base::MakeUnique<AppListPresenterService>(); } AppListServiceAsh::~AppListServiceAsh() {} @@ -109,11 +110,7 @@ } void AppListServiceAsh::Init(Profile* initial_profile) { - // The AppListPresenterService ctor calls AppListServiceAsh::GetInstance(), - // which isn't available in the AppListServiceAsh constructor, so init here. - // This establishes the mojo connections between the app list and presenter. - app_list_presenter_service_ = - base::MakeUnique<AppListPresenterService>(initial_profile); + app_list_presenter_service_->Init(); // Ensure the StartPageService is created here. This early initialization is // necessary to allow the WebContents to load before the app list is shown.
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc index f84a6a1..ba9d08f 100644 --- a/chrome/browser/ui/browser.cc +++ b/chrome/browser/ui/browser.cc
@@ -1337,15 +1337,6 @@ security_style_explanations); } -void Browser::ShowCertificateViewerInDevTools( - content::WebContents* web_contents, - scoped_refptr<net::X509Certificate> certificate) { - DevToolsWindow* devtools_window = - DevToolsWindow::GetInstanceForInspectedWebContents(web_contents); - if (devtools_window) - devtools_window->ShowCertificateViewer(certificate); -} - std::unique_ptr<content::BluetoothChooser> Browser::RunBluetoothChooser( content::RenderFrameHost* frame, const content::BluetoothChooser::EventHandler& event_handler) {
diff --git a/chrome/browser/ui/browser.h b/chrome/browser/ui/browser.h index 9825121..df8a86b 100644 --- a/chrome/browser/ui/browser.h +++ b/chrome/browser/ui/browser.h
@@ -491,9 +491,6 @@ blink::WebSecurityStyle GetSecurityStyle( content::WebContents* web_contents, content::SecurityStyleExplanations* security_style_explanations) override; - void ShowCertificateViewerInDevTools( - content::WebContents* web_contents, - scoped_refptr<net::X509Certificate> certificate) override; std::unique_ptr<content::BluetoothChooser> RunBluetoothChooser( content::RenderFrameHost* frame, const content::BluetoothChooser::EventHandler& event_handler) override;
diff --git a/chrome/browser/ui/browser_command_controller_interactive_browsertest.cc b/chrome/browser/ui/browser_command_controller_interactive_browsertest.cc index 9bec796..86fef1ff 100644 --- a/chrome/browser/ui/browser_command_controller_interactive_browsertest.cc +++ b/chrome/browser/ui/browser_command_controller_interactive_browsertest.cc
@@ -14,10 +14,10 @@ #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_commands.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" -#include "chrome/browser/ui/tabs/tab_strip_model_observer.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/interactive_test_utils.h" #include "content/public/browser/notification_service.h" +#include "content/public/common/browser_side_navigation_policy.h" #include "content/public/test/browser_test_utils.h" #include "content/public/test/test_utils.h" #include "ui/events/keycodes/dom/keycode_converter.h" @@ -31,6 +31,7 @@ #endif namespace { + // The html file to receive key events, prevent defaults and export all the // events with "getKeyEventReport()" function. It has two magic keys: pressing // "S" to enter fullscreen mode; pressing "X" to indicate the end of all the @@ -53,8 +54,8 @@ ~BrowserCommandControllerInteractiveTest() override = default; protected: - // Starts the test page and waits for it to be loaded. - void StartTestPage(); + // Starts |kFullscreenKeyboardLockHTML| in a new tab and waits for load. + void StartFullscreenLockPage(); // Sends a control or command + |key| shortcut to the focused window. Shift // modifier will be added if |shift| is true. @@ -78,13 +79,91 @@ // for the operation to take effect. void SendEscapeAndWaitForExitingFullscreen(); - // Sends a set of preventable shortcuts to the web page. - void SendShortcutsInFullscreen(); + // Sends a set of preventable shortcuts to the web page and expects them to be + // prevented. + void SendShortcutsAndExpectPrevented(); + + // Sends a set of preventable shortcuts to the web page and expects them to + // not be prevented. If |js_fullscreen| is true, the test will use + // SendJsFullscreenShortcutAndWait() to trigger the fullscreen mode. Otherwise + // SendFullscreenShortcutAndWait() will be used. + void SendShortcutsAndExpectNotPrevented(bool js_fullscreen); // Sends a magic KeyX to the focused window to stop the test case, receives // the result and verifies if it is equal to |expected_result_|. void FinishTestAndVerifyResult(); + // Returns whether the active tab is in html fullscreen mode. + bool IsActiveTabFullscreen() const { + auto* contents = GetActiveWebContents(); + return contents->GetDelegate()->IsFullscreenForTabOrPending(contents); + } + + // Returns whether the GetActiveBrowser() is in browser fullscreen mode. + bool IsInBrowserFullscreen() const { + return GetActiveBrowser() + ->exclusive_access_manager() + ->fullscreen_controller() + ->IsFullscreenForBrowser(); + } + + content::WebContents* GetActiveWebContents() const { + return GetActiveBrowser()->tab_strip_model()->GetActiveWebContents(); + } + + // Gets the current active tab index. + int GetActiveTabIndex() const { + return GetActiveBrowser()->tab_strip_model()->active_index(); + } + + // Gets the count of tabs in current browser. + int GetTabCount() const { + return GetActiveBrowser()->tab_strip_model()->count(); + } + + // Gets the count of browser instances. + size_t GetBrowserCount() const { + return BrowserList::GetInstance()->size(); + } + + // Gets the last active Browser instance. + Browser* GetActiveBrowser() const { + return BrowserList::GetInstance()->GetLastActive(); + } + + // Ensures GetActiveBrowser() is focused. + void FocusOnLastActiveBrowser() { + ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront( + GetActiveBrowser())); + } + + // Waits until the count of Browser instances becomes |expected|. + void WaitForBrowserCount(size_t expected) { + while (GetBrowserCount() != expected) + content::RunAllPendingInMessageLoop(); + } + + // Waits until the count of the tabs in active Browser instance becomes + // |expected|. + void WaitForTabCount(int expected) { + while (GetTabCount() != expected) + content::RunAllPendingInMessageLoop(); + } + + // Waits until the index of active tab in active Browser instance becomes + // |expected|. + void WaitForActiveTabIndex(int expected) { + while (GetActiveTabIndex() != expected) + content::RunAllPendingInMessageLoop(); + } + + // Waits until the index of active tab in active Browser instance is not + // |expected|. + void WaitForInactiveTabIndex(int expected) { + while (GetActiveTabIndex() == expected) + content::RunAllPendingInMessageLoop(); + } + private: void SetUpOnMainThread() override; @@ -95,19 +174,21 @@ DISALLOW_COPY_AND_ASSIGN(BrowserCommandControllerInteractiveTest); }; -void BrowserCommandControllerInteractiveTest::StartTestPage() { - ASSERT_TRUE(embedded_test_server()->Start()); +void BrowserCommandControllerInteractiveTest::StartFullscreenLockPage() { // Ensures the initial states. - ASSERT_EQ(1, browser()->tab_strip_model()->count()); - ASSERT_EQ(0, browser()->tab_strip_model()->active_index()); - ASSERT_EQ(1U, BrowserList::GetInstance()->size()); + ASSERT_EQ(1, GetTabCount()); + ASSERT_EQ(0, GetActiveTabIndex()); + ASSERT_EQ(1U, GetBrowserCount()); // Add a second tab for counting and focus purposes. AddTabAtIndex(1, GURL(url::kAboutBlankURL), ui::PAGE_TRANSITION_LINK); - ASSERT_EQ(2, browser()->tab_strip_model()->count()); - ASSERT_EQ(1U, BrowserList::GetInstance()->size()); + ASSERT_EQ(2, GetTabCount()); + ASSERT_EQ(1U, GetBrowserCount()); + if (!embedded_test_server()->Started()) + ASSERT_TRUE(embedded_test_server()->Start()); ui_test_utils::NavigateToURLWithDisposition( - browser(), embedded_test_server()->GetURL(kFullscreenKeyboardLockHTML), + GetActiveBrowser(), + embedded_test_server()->GetURL(kFullscreenKeyboardLockHTML), WindowOpenDisposition::CURRENT_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); } @@ -122,8 +203,9 @@ const bool control_modifier = true; const bool command_modifier = false; #endif - ASSERT_TRUE(ui_test_utils::SendKeyPressSync(browser(), key, control_modifier, - shift, false, command_modifier)); + ASSERT_TRUE(ui_test_utils::SendKeyPressSync( + GetActiveBrowser(), key, control_modifier, shift, false, + command_modifier)); expected_result_ += ui::KeycodeConverter::DomCodeToCodeString( ui::UsLayoutKeyboardCodeToDomCode(key)); @@ -151,15 +233,15 @@ // Enter fullscreen. #if defined(OS_MACOSX) // On MACOSX, Command + Control + F is used. - ASSERT_TRUE(ui_test_utils::SendKeyPressSync(browser(), ui::VKEY_F, true, - false, false, true)); + ASSERT_TRUE(ui_test_utils::SendKeyPressSync( + GetActiveBrowser(), ui::VKEY_F, true, false, false, true)); #elif defined(OS_CHROMEOS) // A dedicated fullscreen key is used on Chrome OS, so send a fullscreen // command directly instead, to avoid constructing the key press. - ASSERT_TRUE(chrome::ExecuteCommand(browser(), IDC_FULLSCREEN)); + ASSERT_TRUE(chrome::ExecuteCommand(GetActiveBrowser(), IDC_FULLSCREEN)); #else - ASSERT_TRUE(ui_test_utils::SendKeyPressSync(browser(), ui::VKEY_F11, false, - false, false, false)); + ASSERT_TRUE(ui_test_utils::SendKeyPressSync( + GetActiveBrowser(), ui::VKEY_F11, false, false, false, false)); #endif observer.Wait(); @@ -170,15 +252,16 @@ content::WindowedNotificationObserver observer( chrome::NOTIFICATION_FULLSCREEN_CHANGED, content::NotificationService::AllSources()); - ASSERT_TRUE(ui_test_utils::SendKeyPressSync(browser(), ui::VKEY_S, false, - false, false, false)); + ASSERT_TRUE(ui_test_utils::SendKeyPressSync( + GetActiveBrowser(), ui::VKEY_S, false, false, false, false)); expected_result_ += "KeyS ctrl:false shift:false alt:false meta:false\n"; observer.Wait(); + ASSERT_TRUE(IsActiveTabFullscreen()); } void BrowserCommandControllerInteractiveTest::SendEscape() { - ASSERT_TRUE(ui_test_utils::SendKeyPressSync(browser(), ui::VKEY_ESCAPE, false, - false, false, false)); + ASSERT_TRUE(ui_test_utils::SendKeyPressSync( + GetActiveBrowser(), ui::VKEY_ESCAPE, false, false, false, false)); expected_result_ += "Escape ctrl:false shift:false alt:false meta:false\n"; } @@ -187,43 +270,143 @@ content::WindowedNotificationObserver observer( chrome::NOTIFICATION_FULLSCREEN_CHANGED, content::NotificationService::AllSources()); - ASSERT_TRUE(ui_test_utils::SendKeyPressSync(browser(), ui::VKEY_ESCAPE, false, - false, false, false)); + ASSERT_TRUE(ui_test_utils::SendKeyPressSync( + GetActiveBrowser(), ui::VKEY_ESCAPE, false, false, false, false)); observer.Wait(); + ASSERT_FALSE(IsActiveTabFullscreen()); } -void BrowserCommandControllerInteractiveTest::SendShortcutsInFullscreen() { - const int initial_active_index = browser()->tab_strip_model()->active_index(); - const int initial_tab_count = browser()->tab_strip_model()->count(); - const size_t initial_browser_count = BrowserList::GetInstance()->size(); +void BrowserCommandControllerInteractiveTest:: + SendShortcutsAndExpectPrevented() { + const int initial_active_index = GetActiveTabIndex(); + const int initial_tab_count = GetTabCount(); + const size_t initial_browser_count = GetBrowserCount(); // The tab should not be closed. ASSERT_NO_FATAL_FAILURE(SendShortcut(ui::VKEY_W)); - ASSERT_EQ(initial_tab_count, browser()->tab_strip_model()->count()); + ASSERT_EQ(initial_tab_count, GetTabCount()); // The window should not be closed. ASSERT_NO_FATAL_FAILURE(SendShiftShortcut(ui::VKEY_W)); - ASSERT_EQ(initial_browser_count, BrowserList::GetInstance()->size()); + ASSERT_EQ(initial_browser_count, GetBrowserCount()); // TODO(zijiehe): ChromeOS incorrectly handles these; // see http://crbug.com/737307. #if !defined(OS_CHROMEOS) // A new tab should not be created. ASSERT_NO_FATAL_FAILURE(SendShortcut(ui::VKEY_T)); - ASSERT_EQ(initial_tab_count, browser()->tab_strip_model()->count()); + ASSERT_EQ(initial_tab_count, GetTabCount()); // A new window should not be created. ASSERT_NO_FATAL_FAILURE(SendShortcut(ui::VKEY_N)); - ASSERT_EQ(initial_browser_count, BrowserList::GetInstance()->size()); + ASSERT_EQ(initial_browser_count, GetBrowserCount()); // A new incognito window should not be created. ASSERT_NO_FATAL_FAILURE(SendShiftShortcut(ui::VKEY_N)); - ASSERT_EQ(initial_browser_count, BrowserList::GetInstance()->size()); + ASSERT_EQ(initial_browser_count, GetBrowserCount()); // Last closed tab should not be restored. ASSERT_NO_FATAL_FAILURE(SendShiftShortcut(ui::VKEY_T)); - ASSERT_EQ(initial_tab_count, browser()->tab_strip_model()->count()); + ASSERT_EQ(initial_tab_count, GetTabCount()); #endif // Browser should not switch to the next tab. ASSERT_NO_FATAL_FAILURE(SendShortcut(ui::VKEY_TAB)); - ASSERT_EQ(initial_active_index, browser()->tab_strip_model()->active_index()); + ASSERT_EQ(initial_active_index, GetActiveTabIndex()); // Browser should not switch to the previous tab. ASSERT_NO_FATAL_FAILURE(SendShiftShortcut(ui::VKEY_TAB)); - ASSERT_EQ(initial_active_index, browser()->tab_strip_model()->active_index()); + ASSERT_EQ(initial_active_index, GetActiveTabIndex()); +} + +void BrowserCommandControllerInteractiveTest:: + SendShortcutsAndExpectNotPrevented(bool js_fullscreen) { + const int initial_active_index = GetActiveTabIndex(); + const int initial_tab_count = GetTabCount(); + const size_t initial_browser_count = GetBrowserCount(); + const auto enter_fullscreen = [this, js_fullscreen]() { + ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront( + this->GetActiveBrowser())); + if (js_fullscreen) { + if (!this->IsActiveTabFullscreen()) { + const std::string page = + "<html><head><script>" + "document.addEventListener('keydown', " + " () => { document.body.webkitRequestFullscreen(); });" + "</script></head><body></body></html>"; + ui_test_utils::NavigateToURLWithDisposition( + this->GetActiveBrowser(), + GURL("data:text/html," + page), + WindowOpenDisposition::CURRENT_TAB, + ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); + content::WindowedNotificationObserver observer( + chrome::NOTIFICATION_FULLSCREEN_CHANGED, + content::NotificationService::AllSources()); + ASSERT_NO_FATAL_FAILURE(this->SendJsFullscreenShortcutAndWait()); + observer.Wait(); + ASSERT_TRUE(this->IsActiveTabFullscreen()); + } + } else { + if (!this->IsInBrowserFullscreen()) { + ASSERT_NO_FATAL_FAILURE(this->SendFullscreenShortcutAndWait()); + } + ASSERT_TRUE(this->IsInBrowserFullscreen()); + } + }; + + ASSERT_NO_FATAL_FAILURE(enter_fullscreen()); + + // A new tab should be created and focused. + ASSERT_NO_FATAL_FAILURE(SendShortcut(ui::VKEY_T)); + WaitForTabCount(initial_tab_count + 1); + ASSERT_NE(initial_active_index, GetActiveTabIndex()); + + ASSERT_NO_FATAL_FAILURE(enter_fullscreen()); + + // The newly created tab should be closed. + ASSERT_NO_FATAL_FAILURE(SendShortcut(ui::VKEY_W)); + WaitForTabCount(initial_tab_count); + ASSERT_EQ(initial_active_index, GetActiveTabIndex()); + + ASSERT_NO_FATAL_FAILURE(enter_fullscreen()); + + // A new tab should be created and focused. + ASSERT_NO_FATAL_FAILURE(SendShortcut(ui::VKEY_T)); + WaitForTabCount(initial_tab_count + 1); + ASSERT_NE(initial_active_index, GetActiveTabIndex()); + + ASSERT_NO_FATAL_FAILURE(enter_fullscreen()); + + // The previous tab should be focused. + ASSERT_TRUE(ui_test_utils::SendKeyPressSync( + GetActiveBrowser(), ui::VKEY_TAB, true, true, false, false)); + WaitForActiveTabIndex(initial_active_index); + ASSERT_EQ(initial_active_index, GetActiveTabIndex()); + + ASSERT_NO_FATAL_FAILURE(enter_fullscreen()); + + // The newly created tab should be focused. + ASSERT_TRUE(ui_test_utils::SendKeyPressSync( + GetActiveBrowser(), ui::VKEY_TAB, true, false, false, false)); + WaitForInactiveTabIndex(initial_active_index); + ASSERT_NE(initial_active_index, GetActiveTabIndex()); + + ASSERT_NO_FATAL_FAILURE(enter_fullscreen()); + + // The newly created tab should be closed. + ASSERT_NO_FATAL_FAILURE(SendShortcut(ui::VKEY_W)); + WaitForTabCount(initial_tab_count); + ASSERT_EQ(initial_active_index, GetActiveTabIndex()); + + ASSERT_NO_FATAL_FAILURE(enter_fullscreen()); + + // A new window should be created and focused. + ASSERT_NO_FATAL_FAILURE(SendShortcut(ui::VKEY_N)); + WaitForBrowserCount(initial_browser_count + 1); + ASSERT_EQ(initial_browser_count + 1, GetBrowserCount()); + + ASSERT_NO_FATAL_FAILURE(enter_fullscreen()); + + // The newly created window should be closed. + ASSERT_NO_FATAL_FAILURE(SendShiftShortcut(ui::VKEY_W)); + WaitForBrowserCount(initial_browser_count); + + ASSERT_EQ(initial_browser_count, GetBrowserCount()); + ASSERT_EQ(initial_active_index, GetActiveTabIndex()); + + ASSERT_NO_FATAL_FAILURE(enter_fullscreen()); } void BrowserCommandControllerInteractiveTest::FinishTestAndVerifyResult() { @@ -232,12 +415,12 @@ // sent. So we sent a KeyX to the webpage to indicate the end of the test // case. After processing this key event, web page is safe to send the record // back through window.domAutomationController. - EXPECT_TRUE(ui_test_utils::SendKeyPressSync(browser(), ui::VKEY_X, false, - false, false, false)); + EXPECT_TRUE(ui_test_utils::SendKeyPressSync( + GetActiveBrowser(), ui::VKEY_X, false, false, false, false)); expected_result_ += "KeyX ctrl:false shift:false alt:false meta:false"; std::string result; EXPECT_TRUE(content::ExecuteScriptAndExtractString( - browser()->tab_strip_model()->GetActiveWebContents()->GetRenderViewHost(), + GetActiveWebContents()->GetRenderViewHost(), "getKeyEventReport();", &result)); NormalizeMetaKeyForMacOS(&result); NormalizeMetaKeyForMacOS(&expected_result_); @@ -246,30 +429,28 @@ } void BrowserCommandControllerInteractiveTest::SetUpOnMainThread() { - ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); + ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(GetActiveBrowser())); } IN_PROC_BROWSER_TEST_F(BrowserCommandControllerInteractiveTest, ShortcutsShouldTakeEffectInWindowMode) { - ASSERT_EQ(1, browser()->tab_strip_model()->count()); + ASSERT_EQ(1, GetTabCount()); ASSERT_NO_FATAL_FAILURE(SendShortcut(ui::VKEY_T)); - ASSERT_EQ(2, browser()->tab_strip_model()->count()); + ASSERT_EQ(2, GetTabCount()); ASSERT_NO_FATAL_FAILURE(SendShortcut(ui::VKEY_T)); - ASSERT_EQ(3, browser()->tab_strip_model()->count()); + ASSERT_EQ(3, GetTabCount()); ASSERT_NO_FATAL_FAILURE(SendShortcut(ui::VKEY_W)); - ASSERT_EQ(2, browser()->tab_strip_model()->count()); + ASSERT_EQ(2, GetTabCount()); ASSERT_NO_FATAL_FAILURE(SendShortcut(ui::VKEY_W)); - ASSERT_EQ(1, browser()->tab_strip_model()->count()); + ASSERT_EQ(1, GetTabCount()); ASSERT_NO_FATAL_FAILURE(SendFullscreenShortcutAndWait()); - ASSERT_TRUE(browser() - ->exclusive_access_manager() - ->fullscreen_controller() - ->IsFullscreenForBrowser()); + ASSERT_TRUE(IsInBrowserFullscreen()); + ASSERT_FALSE(IsActiveTabFullscreen()); } IN_PROC_BROWSER_TEST_F(BrowserCommandControllerInteractiveTest, UnpreservedShortcutsShouldBePreventable) { - ASSERT_NO_FATAL_FAILURE(StartTestPage()); + ASSERT_NO_FATAL_FAILURE(StartFullscreenLockPage()); // The browser print function should be blocked by the web page. ASSERT_NO_FATAL_FAILURE(SendShortcut(ui::VKEY_P)); @@ -290,23 +471,29 @@ IN_PROC_BROWSER_TEST_F( BrowserCommandControllerInteractiveTest, MAYBE_KeyEventsShouldBeConsumedByWebPageInBrowserFullscreen) { - ASSERT_NO_FATAL_FAILURE(StartTestPage()); + ASSERT_NO_FATAL_FAILURE(StartFullscreenLockPage()); ASSERT_NO_FATAL_FAILURE(SendFullscreenShortcutAndWait()); - ASSERT_NO_FATAL_FAILURE(SendShortcutsInFullscreen()); + ASSERT_FALSE(IsActiveTabFullscreen()); + ASSERT_TRUE(IsInBrowserFullscreen()); + ASSERT_NO_FATAL_FAILURE(SendShortcutsAndExpectPrevented()); // Current page should not exit browser fullscreen mode. ASSERT_NO_FATAL_FAILURE(SendEscape()); ASSERT_NO_FATAL_FAILURE(FinishTestAndVerifyResult()); + + ASSERT_NO_FATAL_FAILURE(SendFullscreenShortcutAndWait()); + ASSERT_FALSE(IsActiveTabFullscreen()); + ASSERT_FALSE(IsInBrowserFullscreen()); } IN_PROC_BROWSER_TEST_F( BrowserCommandControllerInteractiveTest, KeyEventsShouldBeConsumedByWebPageInJsFullscreenExceptForEsc) { - ASSERT_NO_FATAL_FAILURE(StartTestPage()); + ASSERT_NO_FATAL_FAILURE(StartFullscreenLockPage()); ASSERT_NO_FATAL_FAILURE(SendJsFullscreenShortcutAndWait()); - ASSERT_NO_FATAL_FAILURE(SendShortcutsInFullscreen()); + ASSERT_NO_FATAL_FAILURE(SendShortcutsAndExpectPrevented()); // Current page should exit HTML fullscreen mode. ASSERT_NO_FATAL_FAILURE(SendEscapeAndWaitForExitingFullscreen()); @@ -316,21 +503,70 @@ IN_PROC_BROWSER_TEST_F( BrowserCommandControllerInteractiveTest, KeyEventsShouldBeConsumedByWebPageInJsFullscreenExceptForF11) { - ASSERT_NO_FATAL_FAILURE(StartTestPage()); + ASSERT_NO_FATAL_FAILURE(StartFullscreenLockPage()); ASSERT_NO_FATAL_FAILURE(SendJsFullscreenShortcutAndWait()); - ASSERT_NO_FATAL_FAILURE(SendShortcutsInFullscreen()); + ASSERT_NO_FATAL_FAILURE(SendShortcutsAndExpectPrevented()); #if defined(OS_MACOSX) // On 10.9 or earlier, sending the exit fullscreen shortcut will crash the // binary. See http://crbug.com/740250. if (base::mac::IsAtLeastOS10_10()) { // Current page should exit browser fullscreen mode. ASSERT_NO_FATAL_FAILURE(SendFullscreenShortcutAndWait()); + ASSERT_FALSE(IsActiveTabFullscreen()); + ASSERT_FALSE(IsInBrowserFullscreen()); } #else // Current page should exit browser fullscreen mode. ASSERT_NO_FATAL_FAILURE(SendFullscreenShortcutAndWait()); + ASSERT_FALSE(IsActiveTabFullscreen()); + ASSERT_FALSE(IsInBrowserFullscreen()); #endif ASSERT_NO_FATAL_FAILURE(FinishTestAndVerifyResult()); } + +#if defined(OS_MACOSX) +// TODO(zijiehe): Figure out why this test crashes on Mac OSX. The suspicious +// command is "SendFullscreenShortcutAndWait()". See, http://crbug.com/738949. +#define MAYBE_ShortcutsShouldTakeEffectInBrowserFullscreen \ + DISABLED_ShortcutsShouldTakeEffectInBrowserFullscreen +#else +#define MAYBE_ShortcutsShouldTakeEffectInBrowserFullscreen \ + ShortcutsShouldTakeEffectInBrowserFullscreen +#endif +IN_PROC_BROWSER_TEST_F(BrowserCommandControllerInteractiveTest, + MAYBE_ShortcutsShouldTakeEffectInBrowserFullscreen) { +#if defined(OS_MACOSX) + // On 10.9 or earlier, sending the exit fullscreen shortcut will crash the + // binary. See http://crbug.com/740250. + if (base::mac::IsAtMostOS10_9()) + return; +#endif + ASSERT_NO_FATAL_FAILURE(SendShortcutsAndExpectNotPrevented(false)); +} + +#if !defined(OS_MACOSX) +// HTML fullscreen is automatically exited after some commands are executed, +// such as Ctrl + T (new tab). But some commands won't have this effect, such as +// Ctrl + N (new window). +// On Mac OSX, AppKit implementation is used for HTML fullscreen mode. Entering +// and exiting AppKit fullscreen mode triggers an animation. A +// FullscreenChangeObserver is needed to ensure the animation is finished. But +// the FullscreenChangeObserver won't finish if the command actually won't cause +// the page to exit fullscreen mode. So we need to maintain a list of exiting / +// non-exiting commands, which is not the goal of this test. + +#if defined(OS_CHROMEOS) +// This test is flaky on ChromeOS, see bug http://crbug.com/754878. +#define MAYBE_ShortcutsShouldTakeEffectInJsFullscreen \ + DISABLED_ShortcutsShouldTakeEffectInJsFullscreen +#else +#define MAYBE_ShortcutsShouldTakeEffectInJsFullscreen \ + ShortcutsShouldTakeEffectInJsFullscreen +#endif +IN_PROC_BROWSER_TEST_F(BrowserCommandControllerInteractiveTest, + MAYBE_ShortcutsShouldTakeEffectInJsFullscreen) { + ASSERT_NO_FATAL_FAILURE(SendShortcutsAndExpectNotPrevented(true)); +} +#endif
diff --git a/chrome/browser/ui/chrome_pages.cc b/chrome/browser/ui/chrome_pages.cc index 22789838..f8ca4ec 100644 --- a/chrome/browser/ui/chrome_pages.cc +++ b/chrome/browser/ui/chrome_pages.cc
@@ -245,12 +245,6 @@ return GURL(std::string(kChromeUISettingsURL) + sub_page); } -bool IsSettingsSubPage(const GURL& url, const std::string& sub_page) { - return (url.SchemeIs(content::kChromeUIScheme) && - (url.host_piece() == chrome::kChromeUISettingsHost) && - url.path_piece() == "/" + sub_page); -} - bool IsTrustedPopupWindowWithScheme(const Browser* browser, const std::string& scheme) { if (!browser->is_type_popup() || !browser->is_trusted_source())
diff --git a/chrome/browser/ui/chrome_pages.h b/chrome/browser/ui/chrome_pages.h index 9c0031f..92a4fde 100644 --- a/chrome/browser/ui/chrome_pages.h +++ b/chrome/browser/ui/chrome_pages.h
@@ -78,9 +78,6 @@ // Constructs a settings GURL for the specified |sub_page|. GURL GetSettingsUrl(const std::string& sub_page); -// Returns true if |url| is the URL for the settings subpage |sub_page|. -bool IsSettingsSubPage(const GURL& url, const std::string& sub_page); - // Returns true if |browser| is a trusted popup window containing a page with // matching |scheme| (or any trusted popup if |scheme| is empty). bool IsTrustedPopupWindowWithScheme(const Browser* browser,
diff --git a/chrome/browser/ui/cocoa/accessibility_browsertest.mm b/chrome/browser/ui/cocoa/accessibility_browsertest.mm new file mode 100644 index 0000000..1511017 --- /dev/null +++ b/chrome/browser/ui/cocoa/accessibility_browsertest.mm
@@ -0,0 +1,112 @@ +// 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 <Cocoa/Cocoa.h> + +#include "base/mac/foundation_util.h" +#include "base/mac/mac_util.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/browser_window.h" +#include "chrome/browser/ui/cocoa/view_id_util.h" +#include "chrome/test/base/in_process_browser_test.h" +#include "testing/gtest_mac.h" + +class AccessibilityTest : public InProcessBrowserTest { + public: + AccessibilityTest() {} + + protected: + NSView* ContentView() { + return [browser()->window()->GetNativeWindow() contentView]; + } + + NSView* ViewWithID(ViewID id) { + return view_id_util::GetView(browser()->window()->GetNativeWindow(), id); + } + + // For NSView subclasses with cells, the cell contains the accessibility + // properties, not the view. NSButton is one such subclass; there are probably + // others as well. + id RealAXObjectFor(id object) { + if ([object isKindOfClass:[NSButton class]]) + return [static_cast<NSButton*>(object) cell]; + return object; + } + + id AXAttribute(id obj, NSString* attribute) { + return [RealAXObjectFor(obj) accessibilityAttributeValue:attribute]; + } + + bool AXIsIgnored(id obj) { + return [RealAXObjectFor(obj) accessibilityIsIgnored]; + } + + NSString* AXRole(id obj) { + return base::mac::ObjCCast<NSString>( + AXAttribute(obj, NSAccessibilityRoleAttribute)); + } + + NSArray* AXChildren(id obj) { + return base::mac::ObjCCast<NSArray>( + AXAttribute(obj, NSAccessibilityChildrenAttribute)); + } + + NSString* AXTitle(id obj) { + return base::mac::ObjCCast<NSString>( + AXAttribute(obj, NSAccessibilityTitleAttribute)); + } + + NSString* AXDescription(id obj) { + return base::mac::ObjCCast<NSString>( + AXAttribute(obj, NSAccessibilityDescriptionAttribute)); + } + + // Returns an array containing every non-ignored accessibility node that is a + // descendant of |root|. + NSArray* CollectAXTree(id root) { + NSMutableArray* result = [[[NSMutableArray alloc] init] autorelease]; + CollectAXTreeHelper(root, result); + return result; + } + + private: + void CollectAXTreeHelper(id root, NSMutableArray* result) { + if (!AXIsIgnored(root)) + [result addObject:root]; + for (id child : AXChildren(root)) + CollectAXTreeHelper(child, result); + } +}; + +IN_PROC_BROWSER_TEST_F(AccessibilityTest, EveryElementHasRole) { + // These a11y APIs are not present in 10.9, so these tests don't run there. + if (!base::mac::IsAtLeastOS10_10()) + return; + NSArray* elements = CollectAXTree(ContentView()); + for (id elem : elements) { + EXPECT_NSNE(AXRole(elem), NSAccessibilityUnknownRole); + } +} + +// Every element must have at least one of a title or a description. +IN_PROC_BROWSER_TEST_F(AccessibilityTest, EveryElementHasText) { + if (!base::mac::IsAtLeastOS10_10()) + return; + NSArray* elements = CollectAXTree(ContentView()); + for (id elem : elements) { + NSString* text = + [AXTitle(elem) length] > 0 ? AXTitle(elem) : AXDescription(elem); + EXPECT_NSNE(text, @""); + } +} + +IN_PROC_BROWSER_TEST_F(AccessibilityTest, ControlRoles) { + if (!base::mac::IsAtLeastOS10_10()) + return; + // TODO(ellyjones): figure out a more principled way to ensure each control + // has the expected role. For now, this is just a regression test for + // https://crbug.com/754223 + EXPECT_NSEQ(AXRole(ViewWithID(VIEW_ID_APP_MENU)), + NSAccessibilityPopUpButtonRole); +}
diff --git a/chrome/browser/ui/cocoa/app_menu/app_menu_controller.mm b/chrome/browser/ui/cocoa/app_menu/app_menu_controller.mm index e5f135a..deaffe0 100644 --- a/chrome/browser/ui/cocoa/app_menu/app_menu_controller.mm +++ b/chrome/browser/ui/cocoa/app_menu/app_menu_controller.mm
@@ -110,7 +110,7 @@ appMenuModel->UpdateZoomControls(); const base::string16 level = appMenuModel->GetLabelForCommandId(IDC_ZOOM_PERCENT_DISPLAY); - [[controller_ zoomDisplay] setTitle:SysUTF16ToNSString(level)]; + [[controller_ zoomDisplay] setTitle:base::SysUTF16ToNSString(level)]; } std::unique_ptr<content::HostZoomMap::Subscription> subscription_;
diff --git a/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.h b/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.h index 594a3f7b..a3a729aa 100644 --- a/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.h +++ b/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.h
@@ -129,7 +129,7 @@ bool IsFullscreenOrPending() const override; void UpdateWindowIcon() override; void UpdateWindowTitle() override; - void UpdateShape(std::unique_ptr<SkRegion> region) override; + void UpdateShape(std::unique_ptr<ShapeRects> rects) override; void UpdateDraggableRegions( const std::vector<extensions::DraggableRegion>& regions) override; SkRegion* GetDraggableRegion() override;
diff --git a/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.mm b/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.mm index 595af1d..ae8dece3 100644 --- a/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.mm +++ b/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.mm
@@ -540,7 +540,7 @@ [window() setTitle:base::SysUTF16ToNSString(title)]; } -void NativeAppWindowCocoa::UpdateShape(std::unique_ptr<SkRegion> region) { +void NativeAppWindowCocoa::UpdateShape(std::unique_ptr<ShapeRects> rects) { NOTIMPLEMENTED(); }
diff --git a/chrome/browser/ui/cocoa/autofill/autofill_popup_view_cocoa.mm b/chrome/browser/ui/cocoa/autofill/autofill_popup_view_cocoa.mm index 21c960f..0fa1525 100644 --- a/chrome/browser/ui/cocoa/autofill/autofill_popup_view_cocoa.mm +++ b/chrome/browser/ui/cocoa/autofill/autofill_popup_view_cocoa.mm
@@ -38,6 +38,7 @@ using autofill::AutofillPopupView; using autofill::AutofillPopupLayoutModel; +using base::SysUTF16ToNSString; namespace {
diff --git a/chrome/browser/ui/cocoa/autofill/card_unmask_prompt_view_bridge.mm b/chrome/browser/ui/cocoa/autofill/card_unmask_prompt_view_bridge.mm index 172bb41c..95aac44 100644 --- a/chrome/browser/ui/cocoa/autofill/card_unmask_prompt_view_bridge.mm +++ b/chrome/browser/ui/cocoa/autofill/card_unmask_prompt_view_bridge.mm
@@ -34,6 +34,8 @@ #include "ui/gfx/paint_vector_icon.h" #include "ui/native_theme/native_theme.h" +using base::SysUTF16ToNSString; + namespace { const CGFloat kButtonGap = 6.0f;
diff --git a/chrome/browser/ui/cocoa/autofill/save_card_bubble_view_bridge.mm b/chrome/browser/ui/cocoa/autofill/save_card_bubble_view_bridge.mm index 380e0ca..745ce89 100644 --- a/chrome/browser/ui/cocoa/autofill/save_card_bubble_view_bridge.mm +++ b/chrome/browser/ui/cocoa/autofill/save_card_bubble_view_bridge.mm
@@ -20,6 +20,8 @@ #include "ui/base/l10n/l10n_util.h" #include "ui/base/resource/resource_bundle.h" +using base::SysUTF16ToNSString; + namespace { const CGFloat kDesiredBubbleWidth = 370;
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_menu_bridge.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_menu_bridge.mm index 6fbfc70..cb2d766e 100644 --- a/chrome/browser/ui/cocoa/bookmarks/bookmark_menu_bridge.mm +++ b/chrome/browser/ui/cocoa/bookmarks/bookmark_menu_bridge.mm
@@ -241,7 +241,7 @@ const BookmarkNode* node, NSImage* image, bool add_extra_items) { - NSString* title = SysUTF16ToNSString(node->GetTitle()); + NSString* title = base::SysUTF16ToNSString(node->GetTitle()); NSMenuItem* items = [[[NSMenuItem alloc] initWithTitle:title action:nil
diff --git a/chrome/browser/ui/cocoa/browser_window_controller.mm b/chrome/browser/ui/cocoa/browser_window_controller.mm index 198b67cc..7c3565a 100644 --- a/chrome/browser/ui/cocoa/browser_window_controller.mm +++ b/chrome/browser/ui/cocoa/browser_window_controller.mm
@@ -2003,34 +2003,6 @@ display::Screen* screen = display::Screen::GetScreen(); BOOL hasMultipleMonitors = screen && screen->GetNumDisplays() > 1; - if (base::FeatureList::IsEnabled(features::kContentFullscreen)) { - // Getting the current's window view and its boundaries. - NSWindow* window = [self window]; - WebContents* contents = browser_->tab_strip_model()->GetActiveWebContents(); - NSView* view = contents->GetNativeView(); - NSRect windowFrame = window.frame; - NSRect viewFrame = [view convertRect:view.bounds toView:nil]; - - // Moving the origin from the lower-left corner to the upper-left corner of - // the view and cropping out the scrollbar - viewFrame.origin.y = NSHeight(windowFrame) - NSMaxY(viewFrame); - viewFrame.size.width -= gfx::scrollbar_size(); - - // Taking a screenshot of the view and creating the custom view to display - CGImageRef windowScreenshot = (CGImageRef)[(id)CGWindowListCreateImage( - CGRectZero, kCGWindowListOptionIncludingWindow, [window windowNumber], - kCGWindowImageBoundsIgnoreFraming) autorelease]; - CGImageRef viewScreenshot = (CGImageRef)[(id)CGImageCreateWithImageInRect( - windowScreenshot, [window convertRectToBacking:viewFrame]) autorelease]; - FullscreenPlaceholderView* screenshotView = - [[[FullscreenPlaceholderView alloc] - initWithFrame:[[self tabContentArea] bounds] - image:viewScreenshot] autorelease]; - screenshotView.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable; - - [[self tabContentArea] addSubview:screenshotView]; - } - if (base::mac::IsAtLeastOS10_10() && !(hasMultipleMonitors && ![NSScreen screensHaveSeparateSpaces])) { [self enterAppKitFullscreen];
diff --git a/chrome/browser/ui/cocoa/bubble_sync_promo_controller.mm b/chrome/browser/ui/cocoa/bubble_sync_promo_controller.mm index ca662f7..51ad04e 100644 --- a/chrome/browser/ui/cocoa/bubble_sync_promo_controller.mm +++ b/chrome/browser/ui/cocoa/bubble_sync_promo_controller.mm
@@ -86,8 +86,8 @@ const base::string16 linkText = l10n_util::GetStringUTF16(linkStringId_); const base::string16 promoText = l10n_util::GetStringFUTF16(promoStringId_, linkText, &offset); - NSString* nsPromoText = SysUTF16ToNSString(promoText); - NSString* nsLinkText = SysUTF16ToNSString(linkText); + NSString* nsPromoText = base::SysUTF16ToNSString(promoText); + NSString* nsLinkText = base::SysUTF16ToNSString(linkText); NSFont* font = [NSFont labelFontOfSize:kFontSize]; NSColor* linkColor = skia::SkColorToCalibratedNSColor( chrome_style::GetLinkColor());
diff --git a/chrome/browser/ui/cocoa/content_settings/content_setting_bubble_cocoa.mm b/chrome/browser/ui/cocoa/content_settings/content_setting_bubble_cocoa.mm index 218ac2c..388da01 100644 --- a/chrome/browser/ui/cocoa/content_settings/content_setting_bubble_cocoa.mm +++ b/chrome/browser/ui/cocoa/content_settings/content_setting_bubble_cocoa.mm
@@ -147,7 +147,7 @@ [button addItemWithTitle:itemTitle]; [[button lastItem] setTag:i]; - if (UTF16ToUTF8(model->GetLabelAt(i)) == title) + if (base::UTF16ToUTF8(model->GetLabelAt(i)) == title) [button selectItemWithTag:i]; // Determine the largest possible size for this button.
diff --git a/chrome/browser/ui/cocoa/extensions/extension_install_view_controller.mm b/chrome/browser/ui/cocoa/extensions/extension_install_view_controller.mm index fe1a09d..8bb132b 100644 --- a/chrome/browser/ui/cocoa/extensions/extension_install_view_controller.mm +++ b/chrome/browser/ui/cocoa/extensions/extension_install_view_controller.mm
@@ -31,6 +31,7 @@ #include "ui/base/l10n/l10n_util_mac.h" #include "ui/gfx/image/image_skia_util_mac.h" +using base::SysUTF16ToNSString; using content::OpenURLParams; using content::Referrer;
diff --git a/chrome/browser/ui/cocoa/global_error_bubble_controller.mm b/chrome/browser/ui/cocoa/global_error_bubble_controller.mm index 73f4d2c..c62742a 100644 --- a/chrome/browser/ui/cocoa/global_error_bubble_controller.mm +++ b/chrome/browser/ui/cocoa/global_error_bubble_controller.mm
@@ -27,6 +27,8 @@ #include "ui/base/material_design/material_design_controller.h" #include "ui/gfx/image/image.h" +using base::SysUTF16ToNSString; + namespace { const CGFloat kParagraphSpacing = 6;
diff --git a/chrome/browser/ui/cocoa/page_info/page_info_bubble_controller.mm b/chrome/browser/ui/cocoa/page_info/page_info_bubble_controller.mm index 3010a560..6d223c1 100644 --- a/chrome/browser/ui/cocoa/page_info/page_info_bubble_controller.mm +++ b/chrome/browser/ui/cocoa/page_info/page_info_bubble_controller.mm
@@ -830,10 +830,10 @@ std::unique_ptr<PageInfoUI::SecurityDescription> security_description = identityInfo.GetSecurityDescription(); [securitySummaryField_ - setStringValue:SysUTF16ToNSString(security_description->summary)]; + setStringValue:base::SysUTF16ToNSString(security_description->summary)]; [securityDetailsField_ - setStringValue:SysUTF16ToNSString(security_description->details)]; + setStringValue:base::SysUTF16ToNSString(security_description->details)]; certificate_ = identityInfo.certificate;
diff --git a/chrome/browser/ui/cocoa/profiles/profile_signin_confirmation_view_controller.mm b/chrome/browser/ui/cocoa/profiles/profile_signin_confirmation_view_controller.mm index 28f0873..dcb2070 100644 --- a/chrome/browser/ui/cocoa/profiles/profile_signin_confirmation_view_controller.mm +++ b/chrome/browser/ui/cocoa/profiles/profile_signin_confirmation_view_controller.mm
@@ -118,12 +118,11 @@ const base::string16& message, const ui::ResourceBundle::FontStyle& font_style) { NSTextField* textField = constrained_window::CreateLabel(); - [textField setAttributedStringValue: - constrained_window::GetAttributedLabelString( - SysUTF16ToNSString(message), - font_style, - NSNaturalTextAlignment, - NSLineBreakByWordWrapping)]; + [textField + setAttributedStringValue:constrained_window::GetAttributedLabelString( + base::SysUTF16ToNSString(message), + font_style, NSNaturalTextAlignment, + NSLineBreakByWordWrapping)]; [parent addSubview:textField]; return textField; }
diff --git a/chrome/browser/ui/cocoa/separate_fullscreen_window.h b/chrome/browser/ui/cocoa/separate_fullscreen_window.h new file mode 100644 index 0000000..d6b211a --- /dev/null +++ b/chrome/browser/ui/cocoa/separate_fullscreen_window.h
@@ -0,0 +1,20 @@ +// Copyright (c) 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 CHROME_BROWSER_UI_COCOA_SEPARATE_FULLSCREEN_WINDOW_H_ +#define CHROME_BROWSER_UI_COCOA_SEPARATE_FULLSCREEN_WINDOW_H_ + +#import <Cocoa/Cocoa.h> + +#include "ui/base/cocoa/touch_bar_forward_declarations.h" + +@interface SeparateFullscreenWindow : NSWindow +// This window class is instantiated to display a WebContentsViewCocoa as its +// subview in fullscreen mode as part of ContentFullscreen to enable users to +// interact with the main browser window and its tab when they're displaying +// content in this separate window. Related types include +// FullscreenLowPowerWindow. +@end + +#endif // CHROME_BROWSER_UI_COCOA_SEPARATE_FULLSCREEN_WINDOW_H_
diff --git a/chrome/browser/ui/cocoa/separate_fullscreen_window.mm b/chrome/browser/ui/cocoa/separate_fullscreen_window.mm new file mode 100644 index 0000000..89f07cf5 --- /dev/null +++ b/chrome/browser/ui/cocoa/separate_fullscreen_window.mm
@@ -0,0 +1,17 @@ +// Copyright (c) 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. + +#import "chrome/browser/ui/cocoa/separate_fullscreen_window.h" + +@implementation SeparateFullscreenWindow + +- (BOOL)canBecomeKeyWindow { + return YES; +} + +- (BOOL)canBecomeMainWindow { + return YES; +} + +@end
diff --git a/chrome/browser/ui/cocoa/tab_contents/tab_contents_controller.h b/chrome/browser/ui/cocoa/tab_contents/tab_contents_controller.h index f04b529..7fe6d64 100644 --- a/chrome/browser/ui/cocoa/tab_contents/tab_contents_controller.h +++ b/chrome/browser/ui/cocoa/tab_contents/tab_contents_controller.h
@@ -47,6 +47,13 @@ // Set to true if the window is a popup. BOOL isPopup_; + // Reference to the FullscreenPlaceholderView displayed in the main window + // for the tab when our WebContentsView is in the SeparateFullscreenWindow. + NSView* fullscreenPlaceholderView_; + // Reference to the fullscreen window created to display the WebContents + // view separately. + NSWindow* separateFullscreenWindow_; + base::scoped_nsobject<WebTextfieldTouchBarController> touchBarController_; } @property(readonly, nonatomic) content::WebContents* webContents;
diff --git a/chrome/browser/ui/cocoa/tab_contents/tab_contents_controller.mm b/chrome/browser/ui/cocoa/tab_contents/tab_contents_controller.mm index 359e1a97..5ba9768 100644 --- a/chrome/browser/ui/cocoa/tab_contents/tab_contents_controller.mm +++ b/chrome/browser/ui/cocoa/tab_contents/tab_contents_controller.mm
@@ -8,15 +8,20 @@ #include <utility> +#include "base/feature_list.h" #include "base/mac/scoped_cftyperef.h" #include "base/mac/scoped_nsobject.h" #include "base/macros.h" #include "chrome/browser/devtools/devtools_window.h" #import "chrome/browser/themes/theme_properties.h" #import "chrome/browser/themes/theme_service.h" +#include "chrome/browser/ui/cocoa/fullscreen_placeholder_view.h" +#include "chrome/browser/ui/cocoa/separate_fullscreen_window.h" #import "chrome/browser/ui/cocoa/themed_window.h" #import "chrome/browser/ui/cocoa/web_textfield_touch_bar_controller.h" +#include "chrome/browser/ui/exclusive_access/fullscreen_within_tab_helper.h" #include "chrome/browser/ui/view_ids.h" +#include "chrome/common/chrome_features.h" #include "chrome/grit/theme_resources.h" #include "content/public/browser/render_view_host.h" #include "content/public/browser/render_widget_host.h" @@ -27,6 +32,7 @@ #include "ui/base/cocoa/animation_utils.h" #import "ui/base/cocoa/touch_bar_forward_declarations.h" #include "ui/gfx/geometry/rect.h" +#include "ui/gfx/scrollbar_size.h" using content::WebContents; using content::WebContentsObserver; @@ -62,7 +68,7 @@ void DidToggleFullscreenModeForTab(bool entered_fullscreen, bool will_cause_resize) override { - [controller_ toggleFullscreenWidget:YES]; + [controller_ toggleFullscreenWidget:entered_fullscreen]; } private: @@ -204,6 +210,15 @@ @end // @implementation TabContentsContainerView +@interface TabContentsController ( + SeparateFullscreenWindowDelegate)<NSWindowDelegate> + +- (NSView*)createScreenshotView; + +- (NSWindow*)createSeparateWindowForTab:(content::WebContents*)separatedTab; + +@end + @implementation TabContentsController @synthesize webContents = contents_; @synthesize blockFullscreenResize = blockFullscreenResize_; @@ -249,7 +264,9 @@ content::RenderWidgetHostView* const fullscreenView = isEmbeddingFullscreenWidget_ ? contents_->GetFullscreenRenderWidgetHostView() : NULL; - if (fullscreenView) { + if (fullscreenPlaceholderView_) { + contentsNativeView = fullscreenPlaceholderView_; + } else if (fullscreenView) { contentsNativeView = fullscreenView->GetNativeView(); } else { isEmbeddingFullscreenWidget_ = NO; @@ -344,6 +361,17 @@ - (void)toggleFullscreenWidget:(BOOL)enterFullscreen { isEmbeddingFullscreenWidget_ = enterFullscreen && contents_ && contents_->GetFullscreenRenderWidgetHostView(); + if (base::FeatureList::IsEnabled(features::kContentFullscreen)) { + if (enterFullscreen) { + fullscreenPlaceholderView_ = [self createScreenshotView]; + separateFullscreenWindow_ = [self createSeparateWindowForTab:contents_]; + + [separateFullscreenWindow_ makeKeyAndOrderFront:nil]; + [separateFullscreenWindow_ toggleFullScreen:nil]; + } else { + [separateFullscreenWindow_ close]; + } + } [self ensureContentsVisibleInSuperview:[[self view] superview]]; } @@ -411,3 +439,85 @@ } @end + +@implementation TabContentsController (SeparateFullscreenWindowDelegate) + +- (void)windowDidEnterFullScreen:(NSNotification*)notification { + // Make the RenderWidgetHostViewCocoa the firstResponder for the + // SeparateFullscreenWindow. + contents_->Focus(); +} + +- (void)windowWillExitFullScreen:(NSNotification*)notification { + // Remove the screenshot view so that the WebContentsViewCocoa is + // retrieved and displayed again in the original window. + fullscreenPlaceholderView_ = nil; + [self ensureContentsVisibleInSuperview:[[self view] superview]]; + + // When exiting through the title bar Exit Fullscreen Window button, the + // WebContents must be notified of the change in fullscreen (like in + // FullscreenController::HandleUserPressedEscape). + contents_->ExitFullscreen(true); +} + +- (void)windowDidExitFullScreen:(NSNotification*)notification { + // When exiting through the title bar Exit Fullscreen Window button, the + // SeparateFullscreenWindow doesn't close, so make sure it's closed. + [separateFullscreenWindow_ close]; + separateFullscreenWindow_ = nil; +} + +- (NSView*)createScreenshotView { + // Getting the current's window view and its boundaries. + NSWindow* window = [contents_->GetNativeView() window]; + NSView* view = contents_->GetNativeView(); + NSRect windowFrame = window.frame; + NSRect viewFrame = [view convertRect:view.bounds toView:nil]; + + // Moving the origin from the lower-left corner to the upper-left corner of + // the view and cropping out the scrollbar + viewFrame.origin.y = NSHeight(windowFrame) - NSMaxY(viewFrame); + viewFrame.size.width -= gfx::scrollbar_size(); + + // Taking a screenshot of the view and creating the custom view to display + CGImageRef windowScreenshot = (CGImageRef)[(id)CGWindowListCreateImage( + CGRectZero, kCGWindowListOptionIncludingWindow, [window windowNumber], + kCGWindowImageBoundsIgnoreFraming) autorelease]; + CGImageRef viewScreenshot = (CGImageRef)[(id)CGImageCreateWithImageInRect( + windowScreenshot, [window convertRectToBacking:viewFrame]) autorelease]; + FullscreenPlaceholderView* screenshotView = + [[[FullscreenPlaceholderView alloc] initWithFrame:[[self view] bounds] + image:viewScreenshot] + autorelease]; + screenshotView.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable; + + return screenshotView; +} + +// Creates a new window with the tab without detaching it from its source +// window. +- (NSWindow*)createSeparateWindowForTab:(WebContents*)separatedTab { + DCHECK(separatedTab->GetNativeView()); + + NSView* separatedTabView = separatedTab->GetNativeView(); + NSWindow* sourceWindow = [separatedTabView window]; + NSRect windowRect = + [separatedTabView convertRect:[separatedTabView bounds] toView:nil]; + SeparateFullscreenWindow* separateWindow = [[SeparateFullscreenWindow alloc] + initWithContentRect:[sourceWindow convertRectToScreen:windowRect] + styleMask:NSResizableWindowMask + backing:NSBackingStoreBuffered + defer:NO]; + + [separateWindow setDelegate:self]; + [[separateWindow contentView] addSubview:separatedTabView]; + [separateWindow + setCollectionBehavior:NSWindowCollectionBehaviorFullScreenPrimary]; + + // Make TabContentsContainerView the first responder now as + // WebContentsViewCocoa is now in a separate window. + [sourceWindow makeFirstResponder:[self view]]; + + return separateWindow; +} +@end
diff --git a/chrome/browser/ui/cocoa/toolbar/app_toolbar_button.mm b/chrome/browser/ui/cocoa/toolbar/app_toolbar_button.mm index ddc0eb5..99ff818c 100644 --- a/chrome/browser/ui/cocoa/toolbar/app_toolbar_button.mm +++ b/chrome/browser/ui/cocoa/toolbar/app_toolbar_button.mm
@@ -4,7 +4,6 @@ #import "chrome/browser/ui/cocoa/toolbar/app_toolbar_button.h" -#include "base/command_line.h" #include "base/macros.h" #include "chrome/app/vector_icons/vector_icons.h" #import "chrome/browser/themes/theme_properties.h" @@ -12,7 +11,7 @@ #include "chrome/browser/ui/cocoa/animated_icon.h" #import "chrome/browser/ui/cocoa/themed_window.h" #import "chrome/browser/ui/cocoa/view_id_util.h" -#include "chrome/common/chrome_switches.h" +#include "chrome/common/chrome_features.h" #include "chrome/grit/chromium_strings.h" #include "ui/base/l10n/l10n_util_mac.h" #include "ui/base/material_design/material_design_controller.h" @@ -33,8 +32,7 @@ if ((self = [super initWithFrame:frame])) { [self commonInit]; - base::CommandLine* commandLine = base::CommandLine::ForCurrentProcess(); - if (commandLine->HasSwitch(switches::kEnableNewAppMenuIcon)) { + if (base::FeatureList::IsEnabled(features::kAnimatedAppMenuIcon)) { animatedIcon_.reset(new AnimatedIcon(kBrowserToolsAnimatedIcon, self)); [self updateAnimatedIconColor];
diff --git a/chrome/browser/ui/exclusive_access/fullscreen_controller.cc b/chrome/browser/ui/exclusive_access/fullscreen_controller.cc index dace90e..fab299d 100644 --- a/chrome/browser/ui/exclusive_access/fullscreen_controller.cc +++ b/chrome/browser/ui/exclusive_access/fullscreen_controller.cc
@@ -32,7 +32,10 @@ #include "content/public/browser/web_contents.h" #include "extensions/common/extension.h" -#if !defined(OS_MACOSX) +#if defined(OS_MACOSX) +#include "base/feature_list.h" +#include "chrome/common/chrome_features.h" +#else #include "chrome/common/pref_names.h" #include "components/prefs/pref_service.h" #endif @@ -96,7 +99,7 @@ bool FullscreenController::IsFullscreenForTabOrPending( const WebContents* web_contents) const { - if (IsFullscreenForCapturedTab(web_contents)) + if (IsFullscreenWithinTab(web_contents)) return true; if (web_contents == exclusive_access_tab()) { DCHECK(web_contents == @@ -114,7 +117,7 @@ const GURL& origin) { DCHECK(web_contents); - if (MaybeToggleFullscreenForCapturedTab(web_contents, true)) { + if (MaybeToggleFullscreenWithinTab(web_contents, true)) { // During tab capture of fullscreen-within-tab views, the browser window // fullscreen state is unchanged, so return now. return; @@ -158,7 +161,7 @@ } void FullscreenController::ExitFullscreenModeForTab(WebContents* web_contents) { - if (MaybeToggleFullscreenForCapturedTab(web_contents, false)) { + if (MaybeToggleFullscreenWithinTab(web_contents, false)) { // During tab capture of fullscreen-within-tab views, the browser window // fullscreen state is unchanged, so return now. return; @@ -199,7 +202,7 @@ } void FullscreenController::OnTabDetachedFromView(WebContents* old_contents) { - if (!IsFullscreenForCapturedTab(old_contents)) + if (!IsFullscreenWithinTab(old_contents)) return; // A fullscreen-within-tab view undergoing screen capture has been detached @@ -231,7 +234,7 @@ } void FullscreenController::OnTabClosing(WebContents* web_contents) { - if (IsFullscreenForCapturedTab(web_contents)) + if (IsFullscreenWithinTab(web_contents)) web_contents->ExitFullscreen( /* will_cause_resize */ IsFullscreenCausedByTab()); else @@ -264,7 +267,7 @@ bool FullscreenController::HandleUserPressedEscape() { WebContents* const active_web_contents = exclusive_access_manager()->context()->GetActiveWebContents(); - if (IsFullscreenForCapturedTab(active_web_contents)) { + if (IsFullscreenWithinTab(active_web_contents)) { active_web_contents->ExitFullscreen( /* will_cause_resize */ IsFullscreenCausedByTab()); return true; @@ -415,17 +418,22 @@ is_privileged_fullscreen_for_testing_ = is_privileged; } -bool FullscreenController::MaybeToggleFullscreenForCapturedTab( - WebContents* web_contents, bool enter_fullscreen) { +bool FullscreenController::MaybeToggleFullscreenWithinTab( + WebContents* web_contents, + bool enter_fullscreen) { if (enter_fullscreen) { - if (web_contents->GetCapturerCount() > 0) { + if (web_contents->GetCapturerCount() > 0 +#if defined(OS_MACOSX) + || base::FeatureList::IsEnabled(features::kContentFullscreen) +#endif + ) { FullscreenWithinTabHelper::CreateForWebContents(web_contents); - FullscreenWithinTabHelper::FromWebContents(web_contents)-> - SetIsFullscreenForCapturedTab(true); + FullscreenWithinTabHelper::FromWebContents(web_contents) + ->SetIsFullscreenWithinTab(true); return true; } } else { - if (IsFullscreenForCapturedTab(web_contents)) { + if (IsFullscreenWithinTab(web_contents)) { FullscreenWithinTabHelper::RemoveForWebContents(web_contents); return true; } @@ -434,7 +442,7 @@ return false; } -bool FullscreenController::IsFullscreenForCapturedTab( +bool FullscreenController::IsFullscreenWithinTab( const WebContents* web_contents) const { // Note: On Mac, some of the OnTabXXX() methods get called with a nullptr // value @@ -442,7 +450,7 @@ const FullscreenWithinTabHelper* const helper = web_contents ? FullscreenWithinTabHelper::FromWebContents(web_contents) : nullptr; - if (helper && helper->is_fullscreen_for_captured_tab()) { + if (helper && helper->is_fullscreen_within_tab()) { DCHECK_NE(exclusive_access_tab(), web_contents); return true; }
diff --git a/chrome/browser/ui/exclusive_access/fullscreen_controller.h b/chrome/browser/ui/exclusive_access/fullscreen_controller.h index 1edfeac..2449dec4 100644 --- a/chrome/browser/ui/exclusive_access/fullscreen_controller.h +++ b/chrome/browser/ui/exclusive_access/fullscreen_controller.h
@@ -37,15 +37,25 @@ // FullscreenWithinTab Note: // All fullscreen widgets are displayed within the tab contents area, and // FullscreenController will expand the browser window so that the tab contents -// area fills the entire screen. However, special behavior applies when a tab is -// being screen-captured. First, the browser window will not be -// fullscreened. This allows the user to retain control of their desktop to work -// in other browser tabs or applications while the fullscreen view is displayed -// on a remote screen. Second, FullscreenController will auto-resize fullscreen -// widgets to that of the capture video resolution when they are hidden (e.g., -// when a user has switched to another tab). This is both a performance and -// quality improvement since scaling and letterboxing steps can be skipped in -// the capture pipeline. +// area fills the entire screen. +// However, special behavior applies when a tab is screen-captured or the +// content fullscreen feature is active. +// +// Screen-captured: +// First, the browser window will not be fullscreened. This allows the user to +// retain control of their desktop to work in other browser tabs or applications +// while the fullscreen view is displayed on a remote screen. Second, +// FullscreenController will auto-resize fullscreen widgets to that of the +// capture video resolution when they are hidden (e.g., when a user has +// switched to another tab). This is both a performance and quality improvement +// since scaling and letterboxing steps can be skipped in the capture pipeline. +// +// Content-fullscreen (for macOS only): +// First, the browser window will not be fullscreened. Second, the WebContents's +// view will not be displayed in the browser window but rather in a +// separate window, SeparateFullscreenWindow, which will be fullscreened and +// moved to a new space. This enables the user to have both the browser window +// and the fullscreen content displayed separately at the same time. // This class implements fullscreen behaviour. class FullscreenController : public ExclusiveAccessControllerBase { @@ -155,13 +165,13 @@ void SetPrivilegedFullscreenForTesting(bool is_privileged); // Returns true if |web_contents| was toggled into/out of fullscreen mode as a - // screen-captured tab. See 'FullscreenWithinTab Note'. - bool MaybeToggleFullscreenForCapturedTab(content::WebContents* web_contents, - bool enter_fullscreen); + // screen-captured tab or as a content-fullscreen tab. + // See 'FullscreenWithinTab Note'. + bool MaybeToggleFullscreenWithinTab(content::WebContents* web_contents, + bool enter_fullscreen); // Returns true if |web_contents| is in fullscreen mode as a screen-captured // tab. See 'FullscreenWithinTab Note'. - bool IsFullscreenForCapturedTab(const content::WebContents* web_contents) - const; + bool IsFullscreenWithinTab(const content::WebContents* web_contents) const; // Helper methods that should be used in a TAB context. GURL GetRequestingOrigin() const;
diff --git a/chrome/browser/ui/exclusive_access/fullscreen_within_tab_helper.cc b/chrome/browser/ui/exclusive_access/fullscreen_within_tab_helper.cc index 374318a..2101c35 100644 --- a/chrome/browser/ui/exclusive_access/fullscreen_within_tab_helper.cc +++ b/chrome/browser/ui/exclusive_access/fullscreen_within_tab_helper.cc
@@ -8,7 +8,7 @@ FullscreenWithinTabHelper::FullscreenWithinTabHelper( content::WebContents* ignored) - : is_fullscreen_for_captured_tab_(false) {} + : is_fullscreen_within_tab_(false) {} FullscreenWithinTabHelper::~FullscreenWithinTabHelper() {}
diff --git a/chrome/browser/ui/exclusive_access/fullscreen_within_tab_helper.h b/chrome/browser/ui/exclusive_access/fullscreen_within_tab_helper.h index e201bb79..37e91b4 100644 --- a/chrome/browser/ui/exclusive_access/fullscreen_within_tab_helper.h +++ b/chrome/browser/ui/exclusive_access/fullscreen_within_tab_helper.h
@@ -24,12 +24,10 @@ public: ~FullscreenWithinTabHelper() override; - bool is_fullscreen_for_captured_tab() const { - return is_fullscreen_for_captured_tab_; - } + bool is_fullscreen_within_tab() const { return is_fullscreen_within_tab_; } - void SetIsFullscreenForCapturedTab(bool is_fullscreen) { - is_fullscreen_for_captured_tab_ = is_fullscreen; + void SetIsFullscreenWithinTab(bool is_fullscreen) { + is_fullscreen_within_tab_ = is_fullscreen; } // Immediately remove and destroy the FullscreenWithinTabHelper instance @@ -40,7 +38,7 @@ friend class content::WebContentsUserData<FullscreenWithinTabHelper>; explicit FullscreenWithinTabHelper(content::WebContents* ignored); - bool is_fullscreen_for_captured_tab_; + bool is_fullscreen_within_tab_; DISALLOW_COPY_AND_ASSIGN(FullscreenWithinTabHelper); };
diff --git a/chrome/browser/ui/input_method/input_method_engine.cc b/chrome/browser/ui/input_method/input_method_engine.cc index 8ebbd4b..9bb8ca7 100644 --- a/chrome/browser/ui/input_method/input_method_engine.cc +++ b/chrome/browser/ui/input_method/input_method_engine.cc
@@ -138,10 +138,10 @@ composition_.CopyFrom(composition_text); // Use a black thin underline by default. - if (composition_.underlines.empty()) { - composition_.underlines.push_back( - ui::CompositionUnderline(0, composition_.text.length(), SK_ColorBLACK, - false /* thick */, SK_ColorTRANSPARENT)); + if (composition_.ime_text_spans.empty()) { + composition_.ime_text_spans.push_back( + ui::ImeTextSpan(0, composition_.text.length(), SK_ColorBLACK, + false /* thick */, SK_ColorTRANSPARENT)); } ui::IMEInputContextHandlerInterface* input_context =
diff --git a/chrome/browser/ui/input_method/input_method_engine_base.cc b/chrome/browser/ui/input_method/input_method_engine_base.cc index b030117..120c0440 100644 --- a/chrome/browser/ui/input_method/input_method_engine_base.cc +++ b/chrome/browser/ui/input_method/input_method_engine_base.cc
@@ -210,26 +210,26 @@ // TODO: Add support for displaying selected text in the composition string. for (std::vector<SegmentInfo>::const_iterator segment = segments.begin(); segment != segments.end(); ++segment) { - ui::CompositionUnderline underline; + ui::ImeTextSpan ime_text_span; switch (segment->style) { case SEGMENT_STYLE_UNDERLINE: - underline.color = SK_ColorBLACK; + ime_text_span.color = SK_ColorBLACK; break; case SEGMENT_STYLE_DOUBLE_UNDERLINE: - underline.color = SK_ColorBLACK; - underline.thick = true; + ime_text_span.color = SK_ColorBLACK; + ime_text_span.thick = true; break; case SEGMENT_STYLE_NO_UNDERLINE: - underline.color = SK_ColorTRANSPARENT; + ime_text_span.color = SK_ColorTRANSPARENT; break; default: continue; } - underline.start_offset = segment->start; - underline.end_offset = segment->end; - composition_text_->underlines.push_back(underline); + ime_text_span.start_offset = segment->start; + ime_text_span.end_offset = segment->end; + composition_text_->ime_text_spans.push_back(ime_text_span); } // TODO(nona): Makes focus out mode configuable, if necessary.
diff --git a/chrome/browser/ui/views/accessibility/invert_bubble_view.cc b/chrome/browser/ui/views/accessibility/invert_bubble_view.cc index 5e58c77..441bbec 100644 --- a/chrome/browser/ui/views/accessibility/invert_bubble_view.cc +++ b/chrome/browser/ui/views/accessibility/invert_bubble_view.cc
@@ -33,7 +33,7 @@ const char kHighContrastExtensionUrl[] = "https://chrome.google.com/webstore/detail/djcfdncoelnlbldjfhinnjlhdjlikmph"; const char kDarkThemeSearchUrl[] = - "https://chrome.google.com/webstore/search-themes/dark"; + "https://chrome.google.com/webstore/category/collection/dark_themes"; const char kLearnMoreUrl[] = "https://groups.google.com/a/googleproductforums.com/d/topic/chrome/Xrco2HsXS-8/discussion";
diff --git a/chrome/browser/ui/views/apps/chrome_native_app_window_views.cc b/chrome/browser/ui/views/apps/chrome_native_app_window_views.cc index af8347b..92bf067b 100644 --- a/chrome/browser/ui/views/apps/chrome_native_app_window_views.cc +++ b/chrome/browser/ui/views/apps/chrome_native_app_window_views.cc
@@ -23,6 +23,7 @@ #include "components/zoom/zoom_controller.h" #include "extensions/browser/app_window/app_delegate.h" #include "ui/gfx/image/image_skia_operations.h" +#include "ui/gfx/skia_util.h" #include "ui/views/controls/webview/webview.h" #include "ui/views/widget/widget.h" @@ -357,7 +358,17 @@ return widget()->IsFullscreen(); } -void ChromeNativeAppWindowViews::UpdateShape(std::unique_ptr<SkRegion> region) { +void ChromeNativeAppWindowViews::UpdateShape( + std::unique_ptr<ShapeRects> rects) { + shape_rects_ = std::move(rects); + + // Build a region from the list of rects when it is supplied. + std::unique_ptr<SkRegion> region; + if (shape_rects_) { + region = base::MakeUnique<SkRegion>(); + for (const gfx::Rect& input_rect : *shape_rects_.get()) + region->op(gfx::RectToSkIRect(input_rect), SkRegion::kUnion_Op); + } shape_ = std::move(region); widget()->SetShape(shape() ? base::MakeUnique<SkRegion>(*shape()) : nullptr); widget()->OnSizeConstraintsChanged();
diff --git a/chrome/browser/ui/views/apps/chrome_native_app_window_views.h b/chrome/browser/ui/views/apps/chrome_native_app_window_views.h index 3234213..4e0679c 100644 --- a/chrome/browser/ui/views/apps/chrome_native_app_window_views.h +++ b/chrome/browser/ui/views/apps/chrome_native_app_window_views.h
@@ -21,6 +21,7 @@ ~ChromeNativeAppWindowViews() override; SkRegion* shape() { return shape_.get(); } + ShapeRects* shape_rects() { return shape_rects_.get(); } protected: // Called before views::Widget::Init() in InitializeDefaultWindow() to allow @@ -60,7 +61,7 @@ // NativeAppWindow implementation. void SetFullscreen(int fullscreen_types) override; bool IsFullscreenOrPending() const override; - void UpdateShape(std::unique_ptr<SkRegion> region) override; + void UpdateShape(std::unique_ptr<ShapeRects> rects) override; bool HasFrameColor() const override; SkColor ActiveFrameColor() const override; SkColor InactiveFrameColor() const override; @@ -81,6 +82,8 @@ // default shape, usually rectangular. std::unique_ptr<SkRegion> shape_; + std::unique_ptr<ShapeRects> shape_rects_; + bool has_frame_color_; SkColor active_frame_color_; SkColor inactive_frame_color_;
diff --git a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.cc b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.cc index 8efa79e..09a14e5 100644 --- a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.cc +++ b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.cc
@@ -110,10 +110,10 @@ } void ChromeNativeAppWindowViewsAura::UpdateShape( - std::unique_ptr<SkRegion> region) { + std::unique_ptr<ShapeRects> rects) { bool had_shape = !!shape(); - ChromeNativeAppWindowViews::UpdateShape(std::move(region)); + ChromeNativeAppWindowViews::UpdateShape(std::move(rects)); aura::Window* native_window = widget()->GetNativeWindow(); if (shape() && !had_shape) {
diff --git a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.h b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.h index 9c84e8f..229eeb1 100644 --- a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.h +++ b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.h
@@ -36,7 +36,7 @@ bool IsAlwaysOnTop() const override; // NativeAppWindow implementation. - void UpdateShape(std::unique_ptr<SkRegion> region) override; + void UpdateShape(std::unique_ptr<ShapeRects> rects) override; private: FRIEND_TEST_ALL_PREFIXES(ShapedAppWindowTargeterTest,
diff --git a/chrome/browser/ui/views/apps/shaped_app_window_targeter.cc b/chrome/browser/ui/views/apps/shaped_app_window_targeter.cc index 6f0e7cd..ec273d2 100644 --- a/chrome/browser/ui/views/apps/shaped_app_window_targeter.cc +++ b/chrome/browser/ui/views/apps/shaped_app_window_targeter.cc
@@ -21,6 +21,9 @@ if (!shape) return false; + // TODO(varkha): Use app_window_->shape_rects() to obtain a list of hit-test + // rectangles. Use the rectangles directly rather than a mask which should + // allow this class to inherit directly from WindowTargeter. shape->getBoundaryPath(mask); return true; }
diff --git a/chrome/browser/ui/views/apps/shaped_app_window_targeter_unittest.cc b/chrome/browser/ui/views/apps/shaped_app_window_targeter_unittest.cc index 416cd077a..8eb38820 100644 --- a/chrome/browser/ui/views/apps/shaped_app_window_targeter_unittest.cc +++ b/chrome/browser/ui/views/apps/shaped_app_window_targeter_unittest.cc
@@ -20,6 +20,8 @@ #include "ui/wm/core/default_activation_client.h" #include "ui/wm/core/easy_resize_window_targeter.h" +using extensions::AppWindow; + class ShapedAppWindowTargeterTest : public aura::test::AuraTestBase { public: ShapedAppWindowTargeterTest() @@ -85,9 +87,9 @@ EXPECT_EQ(window, move.target()); } - std::unique_ptr<SkRegion> region(new SkRegion); - region->op(SkIRect::MakeXYWH(0, 0, 0, 0), SkRegion::kUnion_Op); - app_window()->UpdateShape(std::move(region)); + auto rects = base::MakeUnique<AppWindow::ShapeRects>(); + rects->emplace_back(); + app_window()->UpdateShape(std::move(rects)); { // With an empty custom shape, all events within the window should fall // through to the root window. @@ -108,10 +110,10 @@ // 90 +--------+ +---------+ // | | // 130 +-----+ - region.reset(new SkRegion); - region->op(SkIRect::MakeXYWH(40, 0, 20, 100), SkRegion::kUnion_Op); - region->op(SkIRect::MakeXYWH(0, 40, 100, 20), SkRegion::kUnion_Op); - app_window()->UpdateShape(std::move(region)); + rects = base::MakeUnique<AppWindow::ShapeRects>(); + rects->emplace_back(40, 0, 20, 100); + rects->emplace_back(0, 40, 100, 20); + app_window()->UpdateShape(std::move(rects)); { // With the custom shape, the events that don't fall within the custom shape // will go through to the root window. @@ -178,10 +180,10 @@ EXPECT_EQ(window, move.target()); } - std::unique_ptr<SkRegion> region(new SkRegion); - region->op(SkIRect::MakeXYWH(40, 0, 20, 100), SkRegion::kUnion_Op); - region->op(SkIRect::MakeXYWH(0, 40, 100, 20), SkRegion::kUnion_Op); - app_window()->UpdateShape(std::move(region)); + auto rects = base::MakeUnique<AppWindow::ShapeRects>(); + rects->emplace_back(40, 0, 20, 100); + rects->emplace_back(0, 40, 100, 20); + app_window()->UpdateShape(std::move(rects)); { // With the custom shape, the events that don't fall within the custom shape // will go through to the root window. @@ -193,7 +195,7 @@ // Remove the custom shape. This should restore the behaviour of targeting the // app window for events just outside its bounds (for a resizable window). - app_window()->UpdateShape(std::unique_ptr<SkRegion>()); + app_window()->UpdateShape(std::unique_ptr<AppWindow::ShapeRects>()); SetWindowResizable(true); { ui::MouseEvent move(move_outside);
diff --git a/chrome/browser/ui/views/autofill/save_card_bubble_views.cc b/chrome/browser/ui/views/autofill/save_card_bubble_views.cc index 172c67a..18b14d3 100644 --- a/chrome/browser/ui/views/autofill/save_card_bubble_views.cc +++ b/chrome/browser/ui/views/autofill/save_card_bubble_views.cc
@@ -161,13 +161,6 @@ base::string16 SaveCardBubbleViews::GetDialogButtonLabel( ui::DialogButton button) const { - if (!IsAutofillUpstreamShowNewUiExperimentEnabled()) { - // New UI experiment disabled: - return l10n_util::GetStringUTF16(button == ui::DIALOG_BUTTON_OK - ? IDS_AUTOFILL_SAVE_CARD_PROMPT_ACCEPT - : IDS_NO_THANKS); - } - // New UI experiment enabled: switch (GetCurrentFlowStep()) { // Local save has two buttons: case LOCAL_SAVE_ONLY_STEP: @@ -176,14 +169,17 @@ : IDS_NO_THANKS); // Upload save has one button but it can say three different things: case UPLOAD_SAVE_ONLY_STEP: - DCHECK(button == ui::DIALOG_BUTTON_OK); - return l10n_util::GetStringUTF16(IDS_AUTOFILL_SAVE_CARD_PROMPT_ACCEPT); + return l10n_util::GetStringUTF16( + button == ui::DIALOG_BUTTON_OK ? IDS_AUTOFILL_SAVE_CARD_PROMPT_ACCEPT + : IDS_NO_THANKS); case UPLOAD_SAVE_CVC_FIX_FLOW_STEP_1_OFFER_UPLOAD: - DCHECK(button == ui::DIALOG_BUTTON_OK); - return l10n_util::GetStringUTF16(IDS_AUTOFILL_SAVE_CARD_PROMPT_NEXT); + return l10n_util::GetStringUTF16(button == ui::DIALOG_BUTTON_OK + ? IDS_AUTOFILL_SAVE_CARD_PROMPT_NEXT + : IDS_NO_THANKS); case UPLOAD_SAVE_CVC_FIX_FLOW_STEP_2_REQUEST_CVC: - DCHECK(button == ui::DIALOG_BUTTON_OK); - return l10n_util::GetStringUTF16(IDS_AUTOFILL_SAVE_CARD_PROMPT_CONFIRM); + return l10n_util::GetStringUTF16( + button == ui::DIALOG_BUTTON_OK ? IDS_AUTOFILL_SAVE_CARD_PROMPT_CONFIRM + : IDS_NO_THANKS); default: NOTREACHED(); return base::string16(); @@ -315,17 +311,17 @@ views::CreateSolidBorder(1, SkColorSetA(SK_ColorBLACK, 10))); description_view->AddChildView(card_type_icon); - // Old UI shows last four digits and expiration. New UI shows network and - // last four digits, but no expiration. + // Old UI shows last four digits and expiration. New UI shows network, last + // four digits, and expiration. if (IsAutofillUpstreamShowNewUiExperimentEnabled()) { description_view->AddChildView( new views::Label(card.NetworkAndLastFourDigits())); } else { description_view->AddChildView(new views::Label( base::string16(kMidlineEllipsis) + card.LastFourDigits())); - description_view->AddChildView( - new views::Label(card.AbbreviatedExpirationDateForDisplay())); } + description_view->AddChildView( + new views::Label(card.AbbreviatedExpirationDateForDisplay())); // If applicable, add the upload explanation label. Appears below the card // info when new UI experiment is disabled.
diff --git a/chrome/browser/ui/views/first_run_bubble_browsertest.cc b/chrome/browser/ui/views/first_run_bubble_browsertest.cc new file mode 100644 index 0000000..997cb49a --- /dev/null +++ b/chrome/browser/ui/views/first_run_bubble_browsertest.cc
@@ -0,0 +1,29 @@ +// 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 "chrome/browser/ui/views/first_run_bubble.h" + +#include <string> + +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/test/test_browser_dialog.h" + +class FirstRunBubbleBrowserTest : public DialogBrowserTest { + public: + FirstRunBubbleBrowserTest() {} + + // DialogBrowserTest: + void ShowDialog(const std::string& name) override { + FirstRunBubble::Show(browser()); + } + + private: + DISALLOW_COPY_AND_ASSIGN(FirstRunBubbleBrowserTest); +}; + +// Invokes a dialog that tells the user they can type into the omnibox to search +// with Google. See test_browser_dialog.h. +IN_PROC_BROWSER_TEST_F(FirstRunBubbleBrowserTest, InvokeDialog_default) { + RunDialog(); +}
diff --git a/chrome/browser/ui/views/ime/input_ime_apitest_nonchromeos.cc b/chrome/browser/ui/views/ime/input_ime_apitest_nonchromeos.cc index 43d7fefa..4ff7555e 100644 --- a/chrome/browser/ui/views/ime/input_ime_apitest_nonchromeos.cc +++ b/chrome/browser/ui/views/ime/input_ime_apitest_nonchromeos.cc
@@ -90,9 +90,9 @@ // Test the input.ime.setComposition API. ui::CompositionText composition; composition.text = base::UTF8ToUTF16("test_set_composition"); - composition.underlines.push_back( - ui::CompositionUnderline(0, composition.text.length(), SK_ColorBLACK, - false /* thick */, SK_ColorTRANSPARENT)); + composition.ime_text_spans.push_back( + ui::ImeTextSpan(0, composition.text.length(), SK_ColorBLACK, + false /* thick */, SK_ColorTRANSPARENT)); composition.selection = gfx::Range(2, 2); const std::vector<ui::CompositionText>& composition_history = client->composition_history();
diff --git a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc index 5bb4f0a..e97fa6d 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc +++ b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc
@@ -478,7 +478,9 @@ g_bottom_shadow.Get().height()); ui::ClipRecorder clip_recorder(paint_info.context()); - clip_recorder.ClipRect(contents_bounds); + clip_recorder.ClipRect(gfx::ScaleToRoundedRect( + contents_bounds, paint_info.paint_recording_scale_x(), + paint_info.paint_recording_scale_y())); { ui::PaintRecorder recorder(paint_info.context(), size()); SkColor background_color = result_view_at(0)->GetColor(
diff --git a/chrome/browser/ui/views/payments/payment_request_journey_logger_browsertest.cc b/chrome/browser/ui/views/payments/payment_request_journey_logger_browsertest.cc index fa54754..527dab5 100644 --- a/chrome/browser/ui/views/payments/payment_request_journey_logger_browsertest.cc +++ b/chrome/browser/ui/views/payments/payment_request_journey_logger_browsertest.cc
@@ -71,6 +71,9 @@ EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER); } class PaymentRequestJourneyLoggerNoSupportedPaymentMethodTest @@ -99,8 +102,31 @@ "PaymentRequest.CheckoutFunnel.NoShow", JourneyLogger::NOT_SHOWN_REASON_NO_SUPPORTED_PAYMENT_METHOD, 1); - // Make sure that no events were logged. - histogram_tester.ExpectTotalCount("PaymentRequest.Events", 0); + // Make sure the correct events were logged. + std::vector<base::Bucket> buckets = + histogram_tester.GetAllSamples("PaymentRequest.Events"); + ASSERT_EQ(1U, buckets.size()); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_SHOWN); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_PAY_CLICKED); + EXPECT_FALSE(buckets[0].min & + JourneyLogger::EVENT_RECEIVED_INSTRUMENT_DETAILS); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_SKIPPED_SHOW); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_COMPLETED); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_USER_ABORTED); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_OTHER_ABORTED); + EXPECT_FALSE(buckets[0].min & + JourneyLogger::EVENT_HAD_INITIAL_FORM_OF_PAYMENT); + EXPECT_FALSE(buckets[0].min & + JourneyLogger::EVENT_HAD_NECESSARY_COMPLETE_SUGGESTIONS); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_SHIPPING); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER); } class PaymentRequestJourneyLoggerMultipleShowTest @@ -165,6 +191,9 @@ EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER); } IN_PROC_BROWSER_TEST_F(PaymentRequestJourneyLoggerMultipleShowTest, @@ -205,7 +234,7 @@ // Make sure the correct events were logged. std::vector<base::Bucket> buckets = histogram_tester.GetAllSamples("PaymentRequest.Events"); - ASSERT_EQ(1U, buckets.size()); + ASSERT_EQ(2U, buckets.size()); EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_SHOWN); EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_PAY_CLICKED); EXPECT_TRUE(buckets[0].min & @@ -224,6 +253,31 @@ EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER); + // We log the exact same events again. + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_SHOWN); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_PAY_CLICKED); + EXPECT_TRUE(buckets[0].min & + JourneyLogger::EVENT_RECEIVED_INSTRUMENT_DETAILS); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_SKIPPED_SHOW); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_COMPLETED); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_USER_ABORTED); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_OTHER_ABORTED); + EXPECT_TRUE(buckets[0].min & + JourneyLogger::EVENT_HAD_INITIAL_FORM_OF_PAYMENT); + EXPECT_TRUE(buckets[0].min & + JourneyLogger::EVENT_HAD_NECESSARY_COMPLETE_SUGGESTIONS); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_SHIPPING); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER); } class PaymentRequestJourneyLoggerAllSectionStatsTest @@ -289,6 +343,9 @@ EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER); } // Tests that the correct number of suggestions shown for each section is logged @@ -343,6 +400,9 @@ EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER); } class PaymentRequestJourneyLoggerNoShippingSectionStatsTest @@ -410,6 +470,9 @@ EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER); } // Tests that the correct number of suggestions shown for each section is logged @@ -465,6 +528,9 @@ EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER); } class PaymentRequestJourneyLoggerNoContactDetailSectionStatsTest @@ -534,6 +600,9 @@ EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER); } // Tests that the correct number of suggestions shown for each section is logged @@ -593,6 +662,9 @@ EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER); } class PaymentRequestNotShownTest : public PaymentRequestBrowserTestBase { @@ -623,7 +695,9 @@ ASSERT_EQ(1U, buckets.size()); // Only USER_ABORTED and CAN_MAKE_PAYMENT_FALSE should be logged. EXPECT_EQ(JourneyLogger::EVENT_USER_ABORTED | - JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE, + JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE | + JourneyLogger::EVENT_REQUEST_METHOD_OTHER | + JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD, buckets[0].min); // Make sure that the metrics that required the Payment Request to be shown @@ -686,6 +760,9 @@ EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER); } IN_PROC_BROWSER_TEST_F(PaymentRequestCompleteSuggestionsForEverythingTest, @@ -723,6 +800,9 @@ EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER); } IN_PROC_BROWSER_TEST_F( @@ -766,6 +846,9 @@ EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER); } } // namespace payments
diff --git a/chrome/browser/ui/views/toolbar/app_menu_button.cc b/chrome/browser/ui/views/toolbar/app_menu_button.cc index 025e164..75eb9aa 100644 --- a/chrome/browser/ui/views/toolbar/app_menu_button.cc +++ b/chrome/browser/ui/views/toolbar/app_menu_button.cc
@@ -4,7 +4,6 @@ #include "chrome/browser/ui/views/toolbar/app_menu_button.h" -#include "base/command_line.h" #include "base/location.h" #include "base/memory/ptr_util.h" #include "base/metrics/histogram_macros.h" @@ -26,7 +25,7 @@ #include "chrome/browser/ui/views/toolbar/app_menu.h" #include "chrome/browser/ui/views/toolbar/toolbar_button.h" #include "chrome/browser/ui/views/toolbar/toolbar_view.h" -#include "chrome/common/chrome_switches.h" +#include "chrome/common/chrome_features.h" #include "ui/base/resource/resource_bundle.h" #include "ui/base/theme_provider.h" #include "ui/gfx/canvas.h" @@ -53,8 +52,7 @@ SetInkDropMode(InkDropMode::ON); SetFocusPainter(nullptr); - base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); - if (command_line->HasSwitch(switches::kEnableNewAppMenuIcon)) { + if (base::FeatureList::IsEnabled(features::kAnimatedAppMenuIcon)) { toolbar_view_->browser()->tab_strip_model()->AddObserver(this); should_use_new_icon_ = true; }
diff --git a/chrome/browser/ui/webui/chromeos/login/DEPS b/chrome/browser/ui/webui/chromeos/login/DEPS new file mode 100644 index 0000000..d7ca3f3 --- /dev/null +++ b/chrome/browser/ui/webui/chromeos/login/DEPS
@@ -0,0 +1,6 @@ +specific_include_rules = { + # TODO(mash): Remove. http://crbug.com/720917. + "oobe_display_chooser\.*": [ + "+ui/events/devices/device_data_manager.h", + ] +}
diff --git a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc index 810cc0b..4359367 100644 --- a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
@@ -331,6 +331,13 @@ params.SetString("enterpriseEnrollmentDomain", enterprise_enrollment_domain); } + params.SetBoolean("enterpriseManagedDevice", + g_browser_process->platform_part() + ->browser_policy_connector_chromeos() + ->IsEnterpriseManaged()); + params.SetBoolean( + "hasDeviceOwner", + user_manager::UserManager::Get()->GetOwnerAccountId().is_valid()); params.SetString("chromeType", GetChromeType()); params.SetString("clientId",
diff --git a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc index 89c8f21..10588b0 100644 --- a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
@@ -132,8 +132,18 @@ const char kBackgroundLockScreenApps[] = "LOCK_SCREEN_APPS_STATE.BACKGROUND"; const char kForegroundLockScreenApps[] = "LOCK_SCREEN_APPS_STATE.FOREGROUND"; const char kAvailableLockScreenApps[] = "LOCK_SCREEN_APPS_STATE.AVAILABLE"; -const char kLaunchRequestedLockScreenApps[] = - "LOCK_SCREEN_APPS_STATE.LAUNCH_REQUESTED"; + +// Constants for new lock screen note request type. +const char kNewNoteRequestTap[] = "NEW_NOTE_REQUEST.TAP"; +const char kNewNoteRequestSwipe[] = "NEW_NOTE_REQUEST.SWIPE"; +const char kNewNoteRequestKeyboard[] = "NEW_NOTE_REQUEST.KEYBOARD"; + +// Constants for reporting action taken on lock screen UI when lock screen app +// window was in background. +const char kRequestShutdownFromLockScreenAppUnlockUi[] = + "LOCK_SCREEN_APPS_UNLOCK_ACTION.SHUTDOWN"; +const char kRequestSignoutFromLockScreenAppUnlockUi[] = + "LOCK_SCREEN_APPS_UNLOCK_ACTION.SIGN_OUT"; ash::WallpaperController* GetWallpaperController() { if (!ash::Shell::HasInstance()) @@ -546,6 +556,10 @@ &SigninScreenHandler::HandleLaunchArcKioskApp); AddCallback("setLockScreenAppsState", &SigninScreenHandler::HandleSetLockScreenAppsState); + AddCallback("recordLockScreenAppUnlockAction", + &SigninScreenHandler::HandleRecordLockScreenAppUnlockUIAction); + AddCallback("requestNewLockScreenNote", + &SigninScreenHandler::HandleRequestNewNoteAction); } void SigninScreenHandler::Show(const LoginScreenContext& context) { @@ -1519,6 +1533,44 @@ weak_factory_.GetWeakPtr())); } +void SigninScreenHandler::HandleRequestNewNoteAction( + const std::string& request_type) { + lock_screen_apps::StateController* state_controller = + lock_screen_apps::StateController::Get(); + + if (request_type == kNewNoteRequestTap) { + state_controller->HandleNewNoteRequestFromLockScreen( + lock_screen_apps::StateController::NewNoteRequestType:: + kLockScreenUiTap); + } else if (request_type == kNewNoteRequestSwipe) { + state_controller->HandleNewNoteRequestFromLockScreen( + lock_screen_apps::StateController::NewNoteRequestType:: + kLockScreenUiSwipe); + } else if (request_type == kNewNoteRequestKeyboard) { + state_controller->HandleNewNoteRequestFromLockScreen( + lock_screen_apps::StateController::NewNoteRequestType:: + kLockScreenUiKeyboard); + } else { + NOTREACHED() << "Unknown request type " << request_type; + } +} + +void SigninScreenHandler::HandleRecordLockScreenAppUnlockUIAction( + const std::string& action) { + lock_screen_apps::StateController* state_controller = + lock_screen_apps::StateController::Get(); + + if (action == kRequestShutdownFromLockScreenAppUnlockUi) { + state_controller->RecordLockScreenAppUnlockAction( + lock_screen_apps::StateController::LockScreenUnlockAction::kShutdown); + } else if (action == kRequestSignoutFromLockScreenAppUnlockUi) { + state_controller->RecordLockScreenAppUnlockAction( + lock_screen_apps::StateController::LockScreenUnlockAction::kSignOut); + } else { + NOTREACHED() << "Unknown action " << action; + } +} + void SigninScreenHandler::HandleSetLockScreenAppsState( const std::string& state) { lock_screen_apps::StateController* state_controller = @@ -1528,8 +1580,6 @@ state_controller->MoveToBackground(); } else if (state == kForegroundLockScreenApps) { state_controller->MoveToForeground(); - } else if (state == kLaunchRequestedLockScreenApps) { - state_controller->RequestNewLockScreenNote(); } }
diff --git a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h index 6c2cad97..1a1a349 100644 --- a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h +++ b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h
@@ -426,6 +426,8 @@ void HandleFirstIncorrectPasswordAttempt(const AccountId& account_id); void HandleMaxIncorrectPasswordAttempts(const AccountId& account_id); void HandleSendFeedbackAndResyncUserData(); + void HandleRequestNewNoteAction(const std::string& request_type); + void HandleRecordLockScreenAppUnlockUIAction(const std::string& action); void HandleSetLockScreenAppsState(const std::string& state); // Sends the list of |keyboard_layouts| available for the |locale| that is
diff --git a/chrome/browser/ui/webui/help/version_updater_chromeos_unittest.cc b/chrome/browser/ui/webui/help/version_updater_chromeos_unittest.cc index 3db6e62..a327c58 100644 --- a/chrome/browser/ui/webui/help/version_updater_chromeos_unittest.cc +++ b/chrome/browser/ui/webui/help/version_updater_chromeos_unittest.cc
@@ -63,8 +63,13 @@ CrosSettings::Initialize(); NetworkHandler::Initialize(); + base::RunLoop().RunUntilIdle(); + } + + void SetEthernetService() { ShillServiceClient::TestInterface* service_test = DBusThreadManager::Get()->GetShillServiceClient()->GetTestInterface(); + service_test->ClearServices(); service_test->AddService("/service/eth", "eth" /* guid */, "eth", @@ -73,6 +78,16 @@ base::RunLoop().RunUntilIdle(); } + void SetCellularService() { + ShillServiceClient::TestInterface* service_test = + DBusThreadManager::Get()->GetShillServiceClient()->GetTestInterface(); + service_test->ClearServices(); + service_test->AddService("/service/cell", "cell" /* guid */, "cell", + shill::kTypeCellular, shill::kStateOnline, + true /* visible */); + base::RunLoop().RunUntilIdle(); + } + void TearDown() override { NetworkHandler::Shutdown(); @@ -101,6 +116,7 @@ // 4. When update engine becomes idle downloading of the stable channel is // initiated. TEST_F(VersionUpdaterCrosTest, TwoOverlappingSetChannelRequests) { + SetEthernetService(); version_updater_->SetChannel("beta-channel", true); { @@ -152,4 +168,27 @@ EXPECT_EQ(2, fake_update_engine_client_->request_update_check_call_count()); } +// Test that when interactively checking for update, cellular connection is +// allowed in Chrome by default, so that the request will be sent to Update +// Engine. +TEST_F(VersionUpdaterCrosTest, InteractiveCellularUpdateAllowed) { + SetCellularService(); + EXPECT_EQ(0, fake_update_engine_client_->request_update_check_call_count()); + version_updater_->CheckForUpdate(base::Bind(&CheckNotification), + VersionUpdater::PromoteCallback()); + EXPECT_EQ(1, fake_update_engine_client_->request_update_check_call_count()); +} + +// Test that after update over cellular one time permission is set successfully, +// an update check will be triggered. +TEST_F(VersionUpdaterCrosTest, CellularUpdateOneTimePermission) { + SetCellularService(); + EXPECT_EQ(0, fake_update_engine_client_->request_update_check_call_count()); + const std::string& update_version = "9999.0.0"; + const int64_t update_size = 99999; + version_updater_->SetUpdateOverCellularOneTimePermission( + base::Bind(&CheckNotification), update_version, update_size); + EXPECT_EQ(1, fake_update_engine_client_->request_update_check_call_count()); +} + } // namespace chromeos
diff --git a/chrome/browser/ui/webui/media_router/media_router_localized_strings_provider.cc b/chrome/browser/ui/webui/media_router/media_router_localized_strings_provider.cc index 17af03a..416111a 100644 --- a/chrome/browser/ui/webui/media_router/media_router_localized_strings_provider.cc +++ b/chrome/browser/ui/webui/media_router/media_router_localized_strings_provider.cc
@@ -49,6 +49,10 @@ IDS_MEDIA_ROUTER_ROUTE_DETAILS_SEEK_TITLE); html_source->AddLocalizedString("volumeTitle", IDS_MEDIA_ROUTER_ROUTE_DETAILS_VOLUME_TITLE); + html_source->AddLocalizedString( + "currentTimeLabel", IDS_MEDIA_ROUTER_ROUTE_DETAILS_CURRENT_TIME_LABEL); + html_source->AddLocalizedString( + "durationLabel", IDS_MEDIA_ROUTER_ROUTE_DETAILS_DURATION_LABEL); } void AddIssuesStrings(content::WebUIDataSource* html_source) {
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc index 7e3fbe8..d0325e68 100644 --- a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc +++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
@@ -617,6 +617,11 @@ "grantExtensionPrinterAccess", base::Bind(&PrintPreviewHandler::HandleGrantExtensionPrinterAccess, base::Unretained(this))); +} + +void PrintPreviewHandler::OnJavascriptAllowed() { + // Now that the UI is initialized, any future account changes will require + // a printer list refresh. RegisterForGaiaCookieChanges(); } @@ -624,6 +629,7 @@ // Normally the handler and print preview will be destroyed together, but // this is necessary for refresh or navigation from the chrome://print page. weak_factory_.InvalidateWeakPtrs(); + UnregisterForGaiaCookieChanges(); } WebContents* PrintPreviewHandler::preview_web_contents() const { @@ -1439,7 +1445,7 @@ } void PrintPreviewHandler::OnPrintPreviewReady(int preview_uid, int request_id) { - if (request_id < 0 || preview_callbacks_.empty()) { + if (request_id < 0 || preview_callbacks_.empty() || !IsJavascriptAllowed()) { // invalid ID or extra message BadMessageReceived(); return; @@ -1451,7 +1457,7 @@ } void PrintPreviewHandler::OnPrintPreviewFailed() { - if (preview_callbacks_.empty()) { + if (preview_callbacks_.empty() || !IsJavascriptAllowed()) { BadMessageReceived(); return; } @@ -1466,7 +1472,7 @@ } void PrintPreviewHandler::OnInvalidPrinterSettings() { - if (preview_callbacks_.empty()) { + if (preview_callbacks_.empty() || !IsJavascriptAllowed()) { BadMessageReceived(); return; } @@ -1479,6 +1485,11 @@ void PrintPreviewHandler::SendPrintPresetOptions(bool disable_scaling, int copies, int duplex) { + if (preview_callbacks_.empty() || !IsJavascriptAllowed()) { + BadMessageReceived(); + return; + } + FireWebUIListener("print-preset-options", base::Value(disable_scaling), base::Value(copies), base::Value(duplex)); } @@ -1486,6 +1497,11 @@ void PrintPreviewHandler::SendPageCountReady(int page_count, int request_id, int fit_to_page_scaling) { + if (preview_callbacks_.empty() || !IsJavascriptAllowed()) { + BadMessageReceived(); + return; + } + FireWebUIListener("page-count-ready", base::Value(page_count), base::Value(request_id), base::Value(fit_to_page_scaling)); } @@ -1493,6 +1509,11 @@ void PrintPreviewHandler::SendPageLayoutReady( const base::DictionaryValue& layout, bool has_custom_page_size_style) { + if (preview_callbacks_.empty() || !IsJavascriptAllowed()) { + BadMessageReceived(); + return; + } + FireWebUIListener("page-layout-ready", layout, base::Value(has_custom_page_size_style)); } @@ -1500,12 +1521,17 @@ void PrintPreviewHandler::SendPagePreviewReady(int page_index, int preview_uid, int preview_response_id) { + if (!IsJavascriptAllowed()) { + BadMessageReceived(); + return; + } + FireWebUIListener("page-preview-ready", base::Value(page_index), base::Value(preview_uid), base::Value(preview_response_id)); } void PrintPreviewHandler::OnPrintPreviewCancelled() { - if (preview_callbacks_.empty()) { + if (preview_callbacks_.empty() || !IsJavascriptAllowed()) { BadMessageReceived(); return; }
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler.h b/chrome/browser/ui/webui/print_preview/print_preview_handler.h index 72654d9a..9cf1bd3e 100644 --- a/chrome/browser/ui/webui/print_preview/print_preview_handler.h +++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.h
@@ -54,7 +54,7 @@ // WebUIMessageHandler implementation. void RegisterMessages() override; - + void OnJavascriptAllowed() override; void OnJavascriptDisallowed() override; // SelectFileDialog::Listener implementation.
diff --git a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc index e6f86a8..f482fab 100644 --- a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc +++ b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
@@ -1497,7 +1497,6 @@ {"cupsPrintersLearnMoreLabel", IDS_SETTINGS_PRINTING_CUPS_PRINTERS_LEARN_MORE_LABEL}, {"addCupsPrinter", IDS_SETTINGS_PRINTING_CUPS_PRINTERS_ADD_PRINTER}, - {"cupsPrinterDetails", IDS_SETTINGS_PRINTING_CUPS_PRINTERS_DETAILS}, {"editPrinter", IDS_SETTINGS_PRINTING_CUPS_PRINTERS_EDIT}, {"removePrinter", IDS_SETTINGS_PRINTING_CUPS_PRINTERS_REMOVE}, {"searchLabel", IDS_SETTINGS_PRINTING_CUPS_SEARCH_LABEL},
diff --git a/chrome/browser/ui/webui/snippets_internals_message_handler.cc b/chrome/browser/ui/webui/snippets_internals_message_handler.cc index 96b03881..f79159d 100644 --- a/chrome/browser/ui/webui/snippets_internals_message_handler.cc +++ b/chrome/browser/ui/webui/snippets_internals_message_handler.cc
@@ -33,7 +33,7 @@ #include "components/ntp_snippets/category.h" #include "components/ntp_snippets/category_info.h" #include "components/ntp_snippets/category_rankers/category_ranker.h" -#include "components/ntp_snippets/contextual_suggestions_source.h" +#include "components/ntp_snippets/contextual/contextual_suggestions_source.h" #include "components/ntp_snippets/features.h" #include "components/ntp_snippets/pref_names.h" #include "components/ntp_snippets/remote/remote_suggestions_fetcher.h"
diff --git a/chrome/common/DEPS b/chrome/common/DEPS index f50eedd..a715de2c 100644 --- a/chrome/common/DEPS +++ b/chrome/common/DEPS
@@ -24,7 +24,7 @@ "+components/password_manager/core/common", "+components/policy/core/common", "+components/printing/common", - "+components/safe_browsing/csd.pb.h", + "+components/safe_browsing/proto/csd.pb.h", "+components/safe_browsing/web_ui/constants.h", "+components/signin/core/common", "+components/translate/core/common",
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc index e113fad..2dd561d5 100644 --- a/chrome/common/chrome_features.cc +++ b/chrome/common/chrome_features.cc
@@ -35,6 +35,8 @@ #endif // defined(OS_MACOSX) #if !defined(OS_ANDROID) +const base::Feature kAnimatedAppMenuIcon{"AnimatedAppMenuIcon", + base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kAppBanners { "AppBanners", #if defined(OS_CHROMEOS) @@ -382,6 +384,12 @@ // foreground tab's user experience. const base::Feature kStaggeredBackgroundTabOpen{ "StaggeredBackgroundTabOpen", base::FEATURE_DISABLED_BY_DEFAULT}; + +// This controls whether we are running experiment with staggered background +// tab open. For control group, this should be disabled. This depends on +// |kStaggeredBackgroundTabOpen| above. +const base::Feature kStaggeredBackgroundTabOpenExperiment{ + "StaggeredBackgroundTabOpenExperiment", base::FEATURE_ENABLED_BY_DEFAULT}; #endif // Enables or disables the creation of (legacy) supervised users. Does not
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h index 0405db64..64a25d55 100644 --- a/chrome/common/chrome_features.h +++ b/chrome/common/chrome_features.h
@@ -30,6 +30,7 @@ #endif // defined(OS_MACOSX) #if !defined(OS_ANDROID) +extern const base::Feature kAnimatedAppMenuIcon; extern const base::Feature kAppBanners; #endif // !defined(OS_ANDROID) @@ -197,6 +198,7 @@ #if !defined(OS_ANDROID) extern const base::Feature kStaggeredBackgroundTabOpen; +extern const base::Feature kStaggeredBackgroundTabOpenExperiment; #endif extern const base::Feature kSupervisedUserCreation;
diff --git a/chrome/common/extensions/api/common_extension_api_unittest.cc b/chrome/common/extensions/api/common_extension_api_unittest.cc index 94b67b94c..711e1fb 100644 --- a/chrome/common/extensions/api/common_extension_api_unittest.cc +++ b/chrome/common/extensions/api/common_extension_api_unittest.cc
@@ -252,7 +252,8 @@ .Set("manifest_version", 2) .Build()) .Build(); - Feature* test_feature = api_feature_provider.GetFeature("alias_api_source"); + const Feature* test_feature = + api_feature_provider.GetFeature("alias_api_source"); ASSERT_TRUE(test_feature); ASSERT_FALSE(api.IsAnyFeatureAvailableToContext( *test_feature, extension.get(), Feature::UNBLESSED_EXTENSION_CONTEXT, @@ -327,7 +328,7 @@ api.add_fake_schema(key); ExtensionAPI::OverrideSharedInstanceForTest scope(&api); - Feature* test_feature = + const Feature* test_feature = api_feature_provider.GetFeature(test_data[i].api_full_name); ASSERT_TRUE(test_feature); EXPECT_EQ(test_data[i].expect_is_available, @@ -753,18 +754,19 @@ std::unique_ptr<ExtensionAPI> api( ExtensionAPI::CreateWithDefaultConfiguration()); - SimpleFeature* browser_action = static_cast<SimpleFeature*>( + const SimpleFeature* browser_action = static_cast<const SimpleFeature*>( api->GetFeatureDependency("api:browserAction")); - SimpleFeature* browser_action_set_title = static_cast<SimpleFeature*>( - api->GetFeatureDependency("api:browserAction.setTitle")); + const SimpleFeature* browser_action_set_title = + static_cast<const SimpleFeature*>( + api->GetFeatureDependency("api:browserAction.setTitle")); struct { - SimpleFeature* feature; + const SimpleFeature* feature; // TODO(aa): More stuff to test over time. } test_data[] = {{browser_action}, {browser_action_set_title}}; for (size_t i = 0; i < arraysize(test_data); ++i) { - SimpleFeature* feature = test_data[i].feature; + const SimpleFeature* feature = test_data[i].feature; ASSERT_TRUE(feature) << i; EXPECT_TRUE(feature->whitelist().empty());
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc index 3b455db41..62df9387 100644 --- a/chrome/common/pref_names.cc +++ b/chrome/common/pref_names.cc
@@ -144,8 +144,9 @@ // shutdown. Used to determine the exit type the last time the profile was open. const char kSessionExitType[] = "profile.exit_type"; -// Stores the total amount of active session time for the user. -const char kSessionTimeTotal[] = "profile.total_time"; +// Stores the total amount of observed active session time for the user. +// Observed time is active session time. +const char kObservedSessionTime[] = "profile.observed_time"; // The last time that the site engagement service recorded an engagement event // for this profile for any URL. Recorded only during shutdown. Used to prevent
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h index f4928d6..da46f99f 100644 --- a/chrome/common/pref_names.h +++ b/chrome/common/pref_names.h
@@ -56,7 +56,7 @@ extern const char kRestoreOnStartup[]; extern const char kSessionExitedCleanly[]; extern const char kSessionExitType[]; -extern const char kSessionTimeTotal[]; +extern const char kObservedSessionTime[]; extern const char kSiteEngagementLastUpdateTime[]; extern const char kSupervisedUserApprovedExtensions[]; extern const char kSupervisedUserCustodianEmail[];
diff --git a/chrome/common/safe_browsing/archive_analyzer_results.h b/chrome/common/safe_browsing/archive_analyzer_results.h index a9635aa..b0c6e110 100644 --- a/chrome/common/safe_browsing/archive_analyzer_results.h +++ b/chrome/common/safe_browsing/archive_analyzer_results.h
@@ -12,7 +12,7 @@ #include "base/files/file_path.h" #include "build/build_config.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" namespace safe_browsing { @@ -33,4 +33,4 @@ } // namespace safe_browsing -#endif // CHROME_COMMON_SAFE_BROWSING_ARCHIVE_ANALYZER_RESULTS_H_ \ No newline at end of file +#endif // CHROME_COMMON_SAFE_BROWSING_ARCHIVE_ANALYZER_RESULTS_H_
diff --git a/chrome/common/safe_browsing/binary_feature_extractor.cc b/chrome/common/safe_browsing/binary_feature_extractor.cc index 538a81e..896768a6 100644 --- a/chrome/common/safe_browsing/binary_feature_extractor.cc +++ b/chrome/common/safe_browsing/binary_feature_extractor.cc
@@ -10,7 +10,7 @@ #include "base/files/file.h" #include "base/files/file_path.h" #include "base/files/memory_mapped_file.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "crypto/secure_hash.h" #include "crypto/sha2.h"
diff --git a/chrome/common/safe_browsing/binary_feature_extractor_mac.cc b/chrome/common/safe_browsing/binary_feature_extractor_mac.cc index 7d64fae..9edb648 100644 --- a/chrome/common/safe_browsing/binary_feature_extractor_mac.cc +++ b/chrome/common/safe_browsing/binary_feature_extractor_mac.cc
@@ -8,7 +8,7 @@ #include <stdint.h> #include "chrome/common/safe_browsing/mach_o_image_reader_mac.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" namespace safe_browsing {
diff --git a/chrome/common/safe_browsing/binary_feature_extractor_mac_unittest.cc b/chrome/common/safe_browsing/binary_feature_extractor_mac_unittest.cc index ec29387..f4fa75f 100644 --- a/chrome/common/safe_browsing/binary_feature_extractor_mac_unittest.cc +++ b/chrome/common/safe_browsing/binary_feature_extractor_mac_unittest.cc
@@ -7,7 +7,7 @@ #include "base/files/file_path.h" #include "base/path_service.h" #include "chrome/common/chrome_paths.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "testing/gtest/include/gtest/gtest.h" namespace safe_browsing {
diff --git a/chrome/common/safe_browsing/binary_feature_extractor_unittest.cc b/chrome/common/safe_browsing/binary_feature_extractor_unittest.cc index 48b1847..8cc9823 100644 --- a/chrome/common/safe_browsing/binary_feature_extractor_unittest.cc +++ b/chrome/common/safe_browsing/binary_feature_extractor_unittest.cc
@@ -13,7 +13,7 @@ #include "base/files/file.h" #include "base/files/scoped_temp_dir.h" #include "base/path_service.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "crypto/sha2.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/common/safe_browsing/binary_feature_extractor_win.cc b/chrome/common/safe_browsing/binary_feature_extractor_win.cc index ffdb9186..52a11373 100644 --- a/chrome/common/safe_browsing/binary_feature_extractor_win.cc +++ b/chrome/common/safe_browsing/binary_feature_extractor_win.cc
@@ -13,7 +13,7 @@ #include "base/files/file_path.h" #include "base/logging.h" #include "chrome/common/safe_browsing/pe_image_reader_win.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" namespace safe_browsing {
diff --git a/chrome/common/safe_browsing/binary_feature_extractor_win_unittest.cc b/chrome/common/safe_browsing/binary_feature_extractor_win_unittest.cc index 63974925..e72c7382 100644 --- a/chrome/common/safe_browsing/binary_feature_extractor_win_unittest.cc +++ b/chrome/common/safe_browsing/binary_feature_extractor_win_unittest.cc
@@ -12,7 +12,7 @@ #include "base/memory/ref_counted.h" #include "base/path_service.h" #include "chrome/common/chrome_paths.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "net/cert/x509_cert_types.h" #include "net/cert/x509_certificate.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/common/safe_browsing/download_protection_util.h b/chrome/common/safe_browsing/download_protection_util.h index dedc2865..d2e4579 100644 --- a/chrome/common/safe_browsing/download_protection_util.h +++ b/chrome/common/safe_browsing/download_protection_util.h
@@ -6,7 +6,7 @@ #define CHROME_COMMON_SAFE_BROWSING_DOWNLOAD_PROTECTION_UTIL_H_ #include "base/files/file_path.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" namespace safe_browsing { namespace download_protection_util {
diff --git a/chrome/common/safe_browsing/zip_analyzer.cc b/chrome/common/safe_browsing/zip_analyzer.cc index 0d31d080..29f625b 100644 --- a/chrome/common/safe_browsing/zip_analyzer.cc +++ b/chrome/common/safe_browsing/zip_analyzer.cc
@@ -19,7 +19,7 @@ #include "chrome/common/safe_browsing/binary_feature_extractor.h" #include "chrome/common/safe_browsing/download_protection_util.h" #include "chrome/common/safe_browsing/file_type_policies.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "crypto/secure_hash.h" #include "crypto/sha2.h" #include "third_party/zlib/google/zip_reader.h"
diff --git a/chrome/common/safe_browsing/zip_analyzer.h b/chrome/common/safe_browsing/zip_analyzer.h index 5b3c009..2e2a965ad 100644 --- a/chrome/common/safe_browsing/zip_analyzer.h +++ b/chrome/common/safe_browsing/zip_analyzer.h
@@ -9,7 +9,7 @@ #define CHROME_COMMON_SAFE_BROWSING_ZIP_ANALYZER_H_ #include "base/files/file.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" namespace safe_browsing {
diff --git a/chrome/installer/zucchini/BUILD.gn b/chrome/installer/zucchini/BUILD.gn index 805ae5f..9e406904 100644 --- a/chrome/installer/zucchini/BUILD.gn +++ b/chrome/installer/zucchini/BUILD.gn
@@ -3,6 +3,7 @@ # found in the LICENSE file. import("//chrome/process_version_rc_template.gni") +import("//testing/libfuzzer/fuzzer_test.gni") import("//testing/test.gni") static_library("zucchini_lib") { @@ -19,6 +20,8 @@ "disassembler.h", "disassembler_no_op.cc", "disassembler_no_op.h", + "element_detection.cc", + "element_detection.h", "encoded_view.cc", "encoded_view.h", "equivalence_map.cc", @@ -79,12 +82,23 @@ } } +fuzzer_test("zucchini_patch_fuzzer") { + sources = [ + "patch_fuzzer.cc", + ] + deps = [ + ":zucchini_lib", + "//base", + ] +} + test("zucchini_unittests") { sources = [ "buffer_sink_unittest.cc", "buffer_source_unittest.cc", "buffer_view_unittest.cc", "crc32_unittest.cc", + "element_detection_unittest.cc", "encoded_view_unittest.cc", "equivalence_map_unittest.cc", "image_index_unittest.cc",
diff --git a/chrome/installer/zucchini/element_detection.cc b/chrome/installer/zucchini/element_detection.cc new file mode 100644 index 0000000..4debf36 --- /dev/null +++ b/chrome/installer/zucchini/element_detection.cc
@@ -0,0 +1,65 @@ +// 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 "chrome/installer/zucchini/element_detection.h" + +#include <utility> + +#include "base/logging.h" +#include "chrome/installer/zucchini/disassembler.h" +#include "chrome/installer/zucchini/disassembler_no_op.h" + +namespace zucchini { + +/******** Utility Functions ********/ + +std::unique_ptr<Disassembler> MakeDisassemblerWithoutFallback( + ConstBufferView image) { + // TODO(etiennep): Add disassembler implementations. + return nullptr; +} + +std::unique_ptr<Disassembler> MakeDisassemblerOfType(ConstBufferView image, + ExecutableType exe_type) { + switch (exe_type) { + case kExeTypeNoOp: + return DisassemblerNoOp::Make(image); + default: + return nullptr; + } +} + +std::unique_ptr<Disassembler> MakeNoOpDisassembler(ConstBufferView image) { + return DisassemblerNoOp::Make(image); +} + +base::Optional<Element> DetectElementFromDisassembler(ConstBufferView image) { + std::unique_ptr<Disassembler> disasm = MakeDisassemblerWithoutFallback(image); + if (disasm) + return Element(disasm->GetExeType(), {0, disasm->size()}); + return base::nullopt; +} + +/******** ProgramScanner ********/ + +ElementFinder::ElementFinder(ConstBufferView image, ElementDetector&& detector) + : image_(image), detector_(std::move(detector)) {} + +ElementFinder::~ElementFinder() = default; + +base::Optional<Element> ElementFinder::GetNext() { + for (; pos_ < image_.size(); ++pos_) { + ConstBufferView test_image = + ConstBufferView::FromRange(image_.begin() + pos_, image_.end()); + base::Optional<Element> element = detector_.Run(test_image); + if (element) { + element->offset += pos_; + pos_ = element->EndOffset(); + return element; + } + } + return base::nullopt; +} + +} // namespace zucchini
diff --git a/chrome/installer/zucchini/element_detection.h b/chrome/installer/zucchini/element_detection.h new file mode 100644 index 0000000..c0f52d1 --- /dev/null +++ b/chrome/installer/zucchini/element_detection.h
@@ -0,0 +1,63 @@ +// 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 CHROME_INSTALLER_ZUCCHINI_ELEMENT_DETECTION_H_ +#define CHROME_INSTALLER_ZUCCHINI_ELEMENT_DETECTION_H_ + +#include <stddef.h> + +#include <memory> + +#include "base/callback.h" +#include "base/macros.h" +#include "base/optional.h" +#include "chrome/installer/zucchini/buffer_view.h" +#include "chrome/installer/zucchini/image_utils.h" + +namespace zucchini { + +class Disassembler; + +// Attempts to detect an executable located at start of |image|. If found, +// returns the corresponding disassembler. Otherwise returns null. +std::unique_ptr<Disassembler> MakeDisassemblerWithoutFallback( + ConstBufferView image); + +// Attempts to create a disassembler corresponding to |exe_type| and initialize +// it with |image|, On failure, returns null. +std::unique_ptr<Disassembler> MakeDisassemblerOfType(ConstBufferView image, + ExecutableType exe_type); + +// Returns a new instance of DisassemblerNoOp. +std::unique_ptr<Disassembler> MakeNoOpDisassembler(ConstBufferView image); + +// Attempts to detect an element associated with |image| and returns it, or +// returns nullopt if no element is detected. +using ElementDetector = + base::RepeatingCallback<base::Optional<Element>(ConstBufferView image)>; + +// Implementation of ElementDetector using disassemblers. +base::Optional<Element> DetectElementFromDisassembler(ConstBufferView image); + +// A class to scan through an image and iteratively detect elements. +class ElementFinder { + public: + ElementFinder(ConstBufferView image, ElementDetector&& detector); + ~ElementFinder(); + + // Scans for the next executable using |detector|. Returns the next element + // found, or nullopt if no more element can be found. + base::Optional<Element> GetNext(); + + private: + ConstBufferView image_; + ElementDetector detector_; + offset_t pos_ = 0; + + DISALLOW_COPY_AND_ASSIGN(ElementFinder); +}; + +} // namespace zucchini + +#endif // CHROME_INSTALLER_ZUCCHINI_ELEMENT_DETECTION_H_
diff --git a/chrome/installer/zucchini/element_detection_unittest.cc b/chrome/installer/zucchini/element_detection_unittest.cc new file mode 100644 index 0000000..79f8a88 --- /dev/null +++ b/chrome/installer/zucchini/element_detection_unittest.cc
@@ -0,0 +1,75 @@ +// 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 "chrome/installer/zucchini/element_detection.h" + +#include <vector> + +#include "base/bind.h" +#include "chrome/installer/zucchini/buffer_view.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace zucchini { + +namespace { + +using ElementVector = std::vector<Element>; + +} // namespace + +TEST(ElementDetectionTest, ElementFinderEmpty) { + std::vector<uint8_t> buffer(10, 0); + ElementFinder finder( + ConstBufferView(buffer.data(), buffer.size()), + base::BindRepeating([](ConstBufferView image) -> base::Optional<Element> { + return base::nullopt; + })); + EXPECT_EQ(base::nullopt, finder.GetNext()); +} + +ElementVector TestElementFinder(std::vector<uint8_t> buffer) { + ConstBufferView image(buffer.data(), buffer.size()); + + ElementFinder finder( + image, + base::BindRepeating( + [](ConstBufferView image, + ConstBufferView region) -> base::Optional<Element> { + EXPECT_GE(region.begin(), image.begin()); + EXPECT_LE(region.end(), image.end()); + EXPECT_GE(region.size(), 0U); + + if (region[0] != 0) { + offset_t length = 1; + while (length < region.size() && region[length] == region[0]) + ++length; + return Element{static_cast<ExecutableType>(region[0]), 0U, + length}; + } + return base::nullopt; + }, + image)); + std::vector<Element> elements; + for (auto element = finder.GetNext(); element; element = finder.GetNext()) { + elements.push_back(*element); + } + return elements; +} + +TEST(ElementDetectionTest, ElementFinder) { + EXPECT_EQ(ElementVector(), TestElementFinder({})); + EXPECT_EQ(ElementVector(), TestElementFinder({0, 0})); + EXPECT_EQ(ElementVector({{kExeTypeWin32X86, 0, 2}}), + TestElementFinder({1, 1})); + EXPECT_EQ(ElementVector({{kExeTypeWin32X86, 0, 2}, {kExeTypeWin32X64, 2, 2}}), + TestElementFinder({1, 1, 2, 2})); + EXPECT_EQ(ElementVector({{kExeTypeWin32X86, 1, 2}}), + TestElementFinder({0, 1, 1, 0})); + EXPECT_EQ(ElementVector({{kExeTypeWin32X86, 1, 2}, {kExeTypeWin32X64, 3, 3}}), + TestElementFinder({0, 1, 1, 2, 2, 2})); + EXPECT_EQ(ElementVector({{kExeTypeWin32X86, 1, 2}, {kExeTypeWin32X64, 4, 3}}), + TestElementFinder({0, 1, 1, 0, 2, 2, 2})); +} + +} // namespace zucchini
diff --git a/chrome/installer/zucchini/image_utils.h b/chrome/installer/zucchini/image_utils.h index 6af8db7..77d1e07 100644 --- a/chrome/installer/zucchini/image_utils.h +++ b/chrome/installer/zucchini/image_utils.h
@@ -147,15 +147,12 @@ Element() = default; constexpr Element(ExecutableType exe_type, offset_t offset, offset_t length) : exe_type(exe_type), offset(offset), length(length) {} - constexpr explicit Element(BufferRegion region) - : exe_type(kExeTypeNoOp), + constexpr explicit Element(ExecutableType exe_type, BufferRegion region) + : exe_type(exe_type), offset(base::checked_cast<offset_t>(region.offset)), length(base::checked_cast<offset_t>(region.size)) {} - - ExecutableType exe_type; - offset_t offset; - offset_t length; - // TODO(huangs): Use BufferRegion. + constexpr explicit Element(BufferRegion region) + : Element(kExeTypeNoOp, region) {} // Returns the end offset of this element. offset_t EndOffset() const { return offset + length; } @@ -167,14 +164,24 @@ } BufferRegion region() const { return {offset, length}; } + + friend bool operator==(const Element& a, const Element& b) { + return a.exe_type == b.exe_type && a.offset == b.offset && + a.length == b.length; + } + + ExecutableType exe_type; + offset_t offset; + offset_t length; + // TODO(huangs): Use BufferRegion. }; // A matched pair of Elements. struct ElementMatch { + bool IsValid() const { return old_element.exe_type == new_element.exe_type; } + Element old_element; Element new_element; - - bool IsValid() const { return old_element.exe_type == new_element.exe_type; } }; } // namespace zucchini
diff --git a/chrome/installer/zucchini/patch_fuzzer.cc b/chrome/installer/zucchini/patch_fuzzer.cc new file mode 100644 index 0000000..e4d61c1 --- /dev/null +++ b/chrome/installer/zucchini/patch_fuzzer.cc
@@ -0,0 +1,19 @@ +// 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 <stddef.h> +#include <stdint.h> + +#include "base/optional.h" +#include "chrome/installer/zucchini/buffer_view.h" +#include "chrome/installer/zucchini/patch_reader.h" + +// Entry point for LibFuzzer. +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { + logging::SetMinLogLevel(3); // Disable console spamming. + zucchini::ConstBufferView patch(data, size); + base::Optional<zucchini::EnsemblePatchReader> patch_reader = + zucchini::EnsemblePatchReader::Create(patch); + return 0; +}
diff --git a/chrome/profiling/BUILD.gn b/chrome/profiling/BUILD.gn index 01b0589c..d6b1f49 100644 --- a/chrome/profiling/BUILD.gn +++ b/chrome/profiling/BUILD.gn
@@ -40,7 +40,9 @@ deps = [ "//base", "//chrome/common", + "//content/public/child", "//mojo/edk/system", + "//services/resource_coordinator/public/cpp:resource_coordinator_cpp", ] }
diff --git a/chrome/profiling/DEPS b/chrome/profiling/DEPS index 08bf5f3..a79c379 100644 --- a/chrome/profiling/DEPS +++ b/chrome/profiling/DEPS
@@ -1,5 +1,6 @@ -include_rules = [ - "+content/public/child", - "+mojo/edk/embedder", - "+services/service_manager/public/cpp", -] +include_rules = [ + "+content/public/child", + "+mojo/edk/embedder", + "+services/resource_coordinator/public", + "+services/service_manager/public/cpp", +]
diff --git a/chrome/profiling/json_exporter.cc b/chrome/profiling/json_exporter.cc index 9e0bf06..e490fa6fb 100644 --- a/chrome/profiling/json_exporter.cc +++ b/chrome/profiling/json_exporter.cc
@@ -7,6 +7,8 @@ #include <map> #include "base/strings/string_number_conversions.h" +#include "base/trace_event/trace_event_argument.h" +#include "services/resource_coordinator/public/cpp/memory_instrumentation/tracing_observer.h" namespace profiling { @@ -54,21 +56,38 @@ << "\"args\":{\"name\":\"Browser process\"}}"; } -// Writes the dictionary keys to preceed a "heaps_v2" trace argument. This is -// "v2" heap dump format. -void WriteHeapsV2Header(int pid, std::ostream& out) { +// Writes the dictionary keys to preceed a "dumps" trace argument. +void WriteDumpsHeader(int pid, std::ostream& out) { out << "{ \"pid\":" << pid << ","; out << "\"ph\":\"v\","; out << "\"name\":\"periodic_interval\","; out << "\"args\":{"; - out << "\"dumps\":{"; - out << "\"level_of_detail\":\"detailed\","; + out << "\"dumps\":{\n"; +} + +void WriteDumpsFooter(std::ostream& out) { + out << "}}}"; // dumps, args, event +} + +// Writes the dictionary keys to preceed a "heaps_v2" trace argument inside a +// "dumps". This is "v2" heap dump format. +void WriteHeapsV2Header(std::ostream& out) { + out << "\"level_of_detail\":\"detailed\",\n"; out << "\"heaps_v2\": {\n"; } // Closes the dictionaries from the WriteHeapsV2Header function above. void WriteHeapsV2Footer(std::ostream& out) { - out << "}}}}"; // heaps_v2, dumps, args, event + out << "}"; // heaps_v2 +} + +void WriteMemoryMaps( + const std::vector<memory_instrumentation::mojom::VmRegionPtr>& maps, + std::ostream& out) { + base::trace_event::TracedValue traced_value; + memory_instrumentation::TracingObserver::MemoryMapsAsValueInto(maps, + &traced_value); + out << "\"process_mmaps\":" << traced_value.ToString(); } // Inserts or retrieves the ID for a string in the string table. @@ -200,13 +219,20 @@ } // namespace -void ExportAllocationEventSetToJSON(int pid, - const AllocationEventSet& event_set, - std::ostream& out) { +void ExportAllocationEventSetToJSON( + int pid, + const AllocationEventSet& event_set, + const std::vector<memory_instrumentation::mojom::VmRegionPtr>& maps, + std::ostream& out) { out << "{ \"traceEvents\": ["; WriteProcessName(pid, out); out << ",\n"; - WriteHeapsV2Header(pid, out); + WriteDumpsHeader(pid, out); + + WriteMemoryMaps(maps, out); + out << ",\n"; + + WriteHeapsV2Header(out); StringTable string_table; @@ -261,6 +287,7 @@ out << "}}\n"; // End of allocators section. WriteHeapsV2Footer(out); + WriteDumpsFooter(out); out << "]}\n"; }
diff --git a/chrome/profiling/json_exporter.h b/chrome/profiling/json_exporter.h index 6f7ac767..fc5791c 100644 --- a/chrome/profiling/json_exporter.h +++ b/chrome/profiling/json_exporter.h
@@ -6,14 +6,18 @@ #define CHROME_PROFILING_JSON_EXPORTER_H_ #include <iosfwd> +#include <vector> #include "chrome/profiling/allocation_event.h" +#include "services/resource_coordinator/public/interfaces/memory_instrumentation/memory_instrumentation.mojom.h" namespace profiling { -void ExportAllocationEventSetToJSON(int pid, - const AllocationEventSet& set, - std::ostream& out); +void ExportAllocationEventSetToJSON( + int pid, + const AllocationEventSet& set, + const std::vector<memory_instrumentation::mojom::VmRegionPtr>& maps, + std::ostream& out); } // namespace profiling
diff --git a/chrome/profiling/json_exporter_unittest.cc b/chrome/profiling/json_exporter_unittest.cc index 2f469ee..ffd1367 100644 --- a/chrome/profiling/json_exporter_unittest.cc +++ b/chrome/profiling/json_exporter_unittest.cc
@@ -6,15 +6,20 @@ #include <sstream> +#include "base/gtest_prod_util.h" #include "base/json/json_reader.h" +#include "base/process/process.h" #include "base/values.h" #include "chrome/profiling/backtrace_storage.h" +#include "services/resource_coordinator/public/cpp/memory_instrumentation/os_metrics.h" #include "testing/gtest/include/gtest/gtest.h" namespace profiling { namespace { +using MemoryMap = std::vector<memory_instrumentation::mojom::VmRegionPtr>; + // Finds the first period_interval trace event in the given JSON trace. // Returns null on failure. const base::Value* FindFirstPeriodicInterval(const base::Value& root) { @@ -33,6 +38,37 @@ return nullptr; } +// Finds the first vm region in the given periodic interval. Returns null on +// failure. +const base::Value* FindFirstRegionWithAnyName( + const base::Value* periodic_interval) { + auto found_args = + periodic_interval->FindKeyOfType("args", base::Value::Type::DICTIONARY); + if (found_args == periodic_interval->DictEnd()) + return nullptr; + auto found_dumps = + found_args->second.FindKeyOfType("dumps", base::Value::Type::DICTIONARY); + if (found_dumps == found_args->second.DictEnd()) + return nullptr; + auto found_mmaps = found_dumps->second.FindKeyOfType( + "process_mmaps", base::Value::Type::DICTIONARY); + if (found_mmaps == found_dumps->second.DictEnd()) + return nullptr; + auto found_regions = + found_mmaps->second.FindKeyOfType("vm_regions", base::Value::Type::LIST); + if (found_regions == found_mmaps->second.DictEnd()) + return nullptr; + + for (const base::Value& cur : found_regions->second.GetList()) { + auto found_name = cur.FindKeyOfType("mf", base::Value::Type::STRING); + if (found_name == cur.DictEnd()) + return nullptr; + if (found_name->second.GetString() != "") + return &cur; + } + return nullptr; +} + } // namespace TEST(ProfilingJsonExporter, Simple) { @@ -53,7 +89,7 @@ events.insert(AllocationEvent(Address(0x3), 16, bt1)); std::ostringstream stream; - ExportAllocationEventSetToJSON(1234, events, stream); + ExportAllocationEventSetToJSON(1234, events, MemoryMap(), stream); std::string json = stream.str(); // JSON should parse. @@ -84,4 +120,38 @@ counts->GetList()[1].GetInt() == 1)); } +TEST(ProfilingJsonExporterTest, MemoryMaps) { + AllocationEventSet events; + std::vector<memory_instrumentation::mojom::VmRegionPtr> memory_maps = + memory_instrumentation::OSMetrics::GetProcessMemoryMaps( + base::Process::Current().Pid()); + ASSERT_GT(memory_maps.size(), 2u); + + std::ostringstream stream; + ExportAllocationEventSetToJSON(1234, events, memory_maps, stream); + std::string json = stream.str(); + + // JSON should parse. + base::JSONReader reader(base::JSON_PARSE_RFC); + std::unique_ptr<base::Value> root = reader.ReadToValue(stream.str()); + ASSERT_EQ(base::JSONReader::JSON_NO_ERROR, reader.error_code()) + << reader.GetErrorMessage(); + ASSERT_TRUE(root.get()); + + const base::Value* periodic_interval = FindFirstPeriodicInterval(*root); + ASSERT_TRUE(periodic_interval) << "Array contains no periodic_interval"; + const base::Value* region = FindFirstRegionWithAnyName(periodic_interval); + ASSERT_TRUE(region) << "Array contains no named vm regions"; + + auto start_address = region->FindKeyOfType("sa", base::Value::Type::STRING); + ASSERT_NE(start_address, region->DictEnd()); + EXPECT_NE(start_address->second.GetString(), ""); + EXPECT_NE(start_address->second.GetString(), "0"); + + auto size = region->FindKeyOfType("sz", base::Value::Type::STRING); + ASSERT_NE(size, region->DictEnd()); + EXPECT_NE(size->second.GetString(), ""); + EXPECT_NE(size->second.GetString(), "0"); +} + } // namespace profiling
diff --git a/chrome/profiling/memlog_connection_manager.cc b/chrome/profiling/memlog_connection_manager.cc index f1e5d70..ce3f9ba 100644 --- a/chrome/profiling/memlog_connection_manager.cc +++ b/chrome/profiling/memlog_connection_manager.cc
@@ -91,8 +91,10 @@ base::Unretained(this), pid)); } -void MemlogConnectionManager::DumpProcess(base::ProcessId pid, - base::File output_file) { +void MemlogConnectionManager::DumpProcess( + base::ProcessId pid, + const std::vector<memory_instrumentation::mojom::VmRegionPtr>& maps, + base::File output_file) { base::AutoLock l(connections_lock_); // Lock all connections to prevent deallocations of atoms from @@ -114,7 +116,8 @@ Connection* connection = it->second.get(); std::ostringstream oss; - ExportAllocationEventSetToJSON(pid, connection->tracker.live_allocs(), oss); + ExportAllocationEventSetToJSON(pid, connection->tracker.live_allocs(), maps, + oss); std::string reply = oss.str(); output_file.WriteAtCurrentPos(reply.c_str(), reply.size()); }
diff --git a/chrome/profiling/memlog_connection_manager.h b/chrome/profiling/memlog_connection_manager.h index 4339d0f..26e4635b 100644 --- a/chrome/profiling/memlog_connection_manager.h +++ b/chrome/profiling/memlog_connection_manager.h
@@ -6,6 +6,7 @@ #define CHROME_PROFILING_MEMLOG_CONNECTION_MANAGER_H_ #include <string> +#include <vector> #include "base/containers/flat_map.h" #include "base/files/file.h" @@ -15,11 +16,14 @@ #include "base/synchronization/lock.h" #include "build/build_config.h" #include "chrome/profiling/backtrace_storage.h" +#include "services/resource_coordinator/public/interfaces/memory_instrumentation/memory_instrumentation.mojom.h" namespace base { + class SequencedTaskRunner; class SingleThreadTaskRunner; -} + +} // namespace base namespace profiling { @@ -36,8 +40,13 @@ BacktraceStorage* backtrace_storage); ~MemlogConnectionManager(); - // Dumps the memory log for the given process into |output_file|. - void DumpProcess(base::ProcessId pid, base::File output_file); + // Dumps the memory log for the given process into |output_file|. This must + // be provided the memory map for the given process since that is not tracked + // as part of the normal allocation process. + void DumpProcess( + base::ProcessId pid, + const std::vector<memory_instrumentation::mojom::VmRegionPtr>& maps, + base::File output_file); void OnNewConnection(base::ScopedPlatformFile file, base::ProcessId pid);
diff --git a/chrome/profiling/memlog_impl.cc b/chrome/profiling/memlog_impl.cc index 8b61c672..cc772e8 100644 --- a/chrome/profiling/memlog_impl.cc +++ b/chrome/profiling/memlog_impl.cc
@@ -4,9 +4,12 @@ #include "chrome/profiling/memlog_impl.h" +#include "base/trace_event/memory_dump_request_args.h" #include "chrome/profiling/memlog_receiver_pipe.h" #include "content/public/child/child_thread.h" +#include "content/public/common/service_names.mojom.h" #include "mojo/public/cpp/system/platform_handle.h" +#include "services/resource_coordinator/public/cpp/memory_instrumentation/memory_instrumentation.h" namespace profiling { @@ -14,7 +17,8 @@ : io_runner_(content::ChildThread::Get()->GetIOTaskRunner()), connection_manager_( new MemlogConnectionManager(io_runner_, &backtrace_storage_), - DeleteOnRunner(FROM_HERE, io_runner_.get())) {} + DeleteOnRunner(FROM_HERE, io_runner_.get())), + weak_factory_(this) {} MemlogImpl::~MemlogImpl() {} @@ -42,10 +46,48 @@ return; } base::File file(platform_file); + + // Need a memory map to make sense of the dump. The dump will be triggered + // in the memory map global dump callback. + // TODO(brettw) this should be a OnceCallback to avoid base::Passed. + memory_instrumentation::MemoryInstrumentation::GetInstance() + ->GetVmRegionsForHeapProfiler(base::Bind( + &MemlogImpl::OnGetVmRegionsComplete, weak_factory_.GetWeakPtr(), pid, + base::Passed(std::move(file)))); +} + +void MemlogImpl::OnGetVmRegionsComplete( + base::ProcessId pid, + base::File file, + bool success, + memory_instrumentation::mojom::GlobalMemoryDumpPtr dump) { + if (!success) { + LOG(ERROR) << "Global dump failed"; + return; + } + + // Find the process's memory dump we want. + // TODO(bug 752621) we should be asking and getting the memory map of only + // the process we want rather than querying all processes and filtering. + memory_instrumentation::mojom::ProcessMemoryDump* process_dump = nullptr; + for (const auto& proc : dump->process_dumps) { + if (proc->pid == pid) { + process_dump = &*proc; + break; + } + } + if (!process_dump) { + LOG(ERROR) << "Don't have a memory dump for PID " << pid; + return; + } + io_runner_->PostTask( - FROM_HERE, base::BindOnce(&MemlogConnectionManager::DumpProcess, - base::Unretained(connection_manager_.get()), - pid, std::move(file))); + FROM_HERE, + base::BindOnce( + &MemlogConnectionManager::DumpProcess, + base::Unretained(connection_manager_.get()), pid, + std::move(process_dump->os_dump->memory_maps_for_heap_profiler), + std::move(file))); } } // namespace profiling
diff --git a/chrome/profiling/memlog_impl.h b/chrome/profiling/memlog_impl.h index 50cafa7..4a8d8919 100644 --- a/chrome/profiling/memlog_impl.h +++ b/chrome/profiling/memlog_impl.h
@@ -5,12 +5,15 @@ #ifndef CHROME_PROFILING_MEMLOG_IMPL_H_ #define CHROME_PROFILING_MEMLOG_IMPL_H_ +#include "base/files/file.h" #include "base/files/platform_file.h" #include "base/macros.h" +#include "base/memory/weak_ptr.h" #include "chrome/common/profiling/memlog.mojom.h" #include "chrome/profiling/backtrace_storage.h" #include "chrome/profiling/memlog_connection_manager.h" #include "mojo/public/cpp/bindings/binding.h" +#include "services/resource_coordinator/public/interfaces/memory_instrumentation/memory_instrumentation.mojom.h" #include "services/service_manager/public/cpp/service_context_ref.h" namespace profiling { @@ -46,10 +49,19 @@ base::SequencedTaskRunner* runner; }; + void OnGetVmRegionsComplete( + base::ProcessId pid, + base::File file, + bool success, + memory_instrumentation::mojom::GlobalMemoryDumpPtr dump); + scoped_refptr<base::SequencedTaskRunner> io_runner_; BacktraceStorage backtrace_storage_; std::unique_ptr<MemlogConnectionManager, DeleteOnRunner> connection_manager_; + // Must be last. + base::WeakPtrFactory<MemlogImpl> weak_factory_; + DISALLOW_COPY_AND_ASSIGN(MemlogImpl); };
diff --git a/chrome/profiling/profiling_service.h b/chrome/profiling/profiling_service.h index 9724fbb..fabc75e 100644 --- a/chrome/profiling/profiling_service.h +++ b/chrome/profiling/profiling_service.h
@@ -21,7 +21,7 @@ // ServiceManager) to set manage the global state as well as the bound // interface. // -// Currently the servcie only manages a memlog interface, but there could be +// Currently the service only manages a memlog interface, but there could be // more in the future. // // The expectation is each memlog sender will bind a connection to this service
diff --git a/chrome/renderer/safe_browsing/DEPS b/chrome/renderer/safe_browsing/DEPS index 4db2367..5f5942167 100644 --- a/chrome/renderer/safe_browsing/DEPS +++ b/chrome/renderer/safe_browsing/DEPS
@@ -1,6 +1,6 @@ include_rules = [ "+components/safe_browsing/common", - "+components/safe_browsing/csd.pb.h", + "+components/safe_browsing/proto/csd.pb.h", "+components/safe_browsing/renderer", "+components/safe_browsing/features.h", "+third_party/smhasher",
diff --git a/chrome/renderer/safe_browsing/phishing_classifier.cc b/chrome/renderer/safe_browsing/phishing_classifier.cc index 9c793c16..b4c21b47 100644 --- a/chrome/renderer/safe_browsing/phishing_classifier.cc +++ b/chrome/renderer/safe_browsing/phishing_classifier.cc
@@ -22,7 +22,7 @@ #include "chrome/renderer/safe_browsing/phishing_term_feature_extractor.h" #include "chrome/renderer/safe_browsing/phishing_url_feature_extractor.h" #include "chrome/renderer/safe_browsing/scorer.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "content/public/renderer/render_frame.h" #include "crypto/sha2.h" #include "third_party/WebKit/public/platform/WebURL.h"
diff --git a/chrome/renderer/safe_browsing/phishing_classifier_browsertest.cc b/chrome/renderer/safe_browsing/phishing_classifier_browsertest.cc index 148fcec..3bac8333 100644 --- a/chrome/renderer/safe_browsing/phishing_classifier_browsertest.cc +++ b/chrome/renderer/safe_browsing/phishing_classifier_browsertest.cc
@@ -18,7 +18,7 @@ #include "chrome/renderer/safe_browsing/murmurhash3_util.h" #include "chrome/renderer/safe_browsing/scorer.h" #include "chrome/test/base/chrome_render_view_test.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "content/public/renderer/render_frame.h" #include "content/public/renderer/render_view.h" #include "crypto/sha2.h"
diff --git a/chrome/renderer/safe_browsing/phishing_classifier_delegate.cc b/chrome/renderer/safe_browsing/phishing_classifier_delegate.cc index 4149a7e..61406c8 100644 --- a/chrome/renderer/safe_browsing/phishing_classifier_delegate.cc +++ b/chrome/renderer/safe_browsing/phishing_classifier_delegate.cc
@@ -16,7 +16,7 @@ #include "chrome/renderer/safe_browsing/phishing_classifier.h" #include "chrome/renderer/safe_browsing/scorer.h" #include "components/safe_browsing/common/safebrowsing_messages.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "content/public/renderer/document_state.h" #include "content/public/renderer/navigation_state.h" #include "content/public/renderer/render_frame.h"
diff --git a/chrome/renderer/safe_browsing/phishing_classifier_delegate_browsertest.cc b/chrome/renderer/safe_browsing/phishing_classifier_delegate_browsertest.cc index 03783b5a..552a4a1 100644 --- a/chrome/renderer/safe_browsing/phishing_classifier_delegate_browsertest.cc +++ b/chrome/renderer/safe_browsing/phishing_classifier_delegate_browsertest.cc
@@ -13,7 +13,7 @@ #include "chrome/test/base/chrome_render_view_test.h" #include "chrome/test/base/chrome_unit_test_suite.h" #include "components/safe_browsing/common/safebrowsing_messages.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "content/public/renderer/render_frame.h" #include "content/public/renderer/render_view.h" #include "testing/gmock/include/gmock/gmock.h"
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index efc312a35..5f13785 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -2071,6 +2071,7 @@ "../browser/ui/views/bookmarks/bookmark_editor_view_browsertest.cc", "../browser/ui/views/extensions/extension_message_bubble_view_browsertest.cc", "../browser/ui/views/external_protocol_dialog_browsertest.cc", + "../browser/ui/views/first_run_bubble_browsertest.cc", "../browser/ui/views/frame/browser_non_client_frame_view_browsertest_win.cc", "../browser/ui/views/frame/browser_window_property_manager_browsertest_win.cc", "../browser/ui/views/importer/import_lock_dialog_view_browsertest.cc", @@ -2352,6 +2353,7 @@ "//services/preferences/public/interfaces", "//services/service_manager/public/cpp", "//ui/login:resources", + "//url", ] if (use_dbus) { @@ -2489,6 +2491,7 @@ if (!mac_views_browser) { sources += [ "../browser/ui/cocoa/accelerators_cocoa_browsertest.mm", + "../browser/ui/cocoa/accessibility_browsertest.mm", "../browser/ui/cocoa/apps/app_shim_menu_controller_mac_browsertest.mm", "../browser/ui/cocoa/apps/native_app_window_cocoa_browsertest.mm", "../browser/ui/cocoa/browser_window_controller_browsertest.mm", @@ -2936,6 +2939,7 @@ "//testing/scripts/common.py", "//testing/xvfb.py", "//testing/scripts/run_telemetry_as_googletest.py", + # For smoke testing run_telemetry_benchmark_as_googletest "//testing/scripts/run_telemetry_benchmark_as_googletest.py", ] @@ -3873,8 +3877,11 @@ } if ((is_linux && !is_chromeos) || is_win) { - sources += - [ "../browser/feature_engagement/new_tab/new_tab_tracker_unittest.cc" ] + sources += [ + "../browser/feature_engagement/feature_tracker_unittest.cc", + "../browser/feature_engagement/new_tab/new_tab_tracker_unittest.cc", + "../browser/feature_engagement/session_duration_updater_unittest.cc", + ] deps += [ "//components/feature_engagement/test:test_support" ] }
diff --git a/chrome/test/chromedriver/test/run_py_tests.py b/chrome/test/chromedriver/test/run_py_tests.py index a99fb82..ae18082 100755 --- a/chrome/test/chromedriver/test/run_py_tests.py +++ b/chrome/test/chromedriver/test/run_py_tests.py
@@ -106,7 +106,10 @@ # Xvfb doesn't support maximization. 'ChromeDriverTest.testWindowMaximize', ] -_OS_SPECIFIC_FILTER['mac'] = [] +_OS_SPECIFIC_FILTER['mac'] = [ + # https://bugs.chromium.org/p/chromedriver/issues/detail?id=1927 + 'MobileEmulationCapabilityTest.testTapElement', +] _DESKTOP_NEGATIVE_FILTER = [ # Desktop doesn't support touch (without --touch-events).
diff --git a/chrome/test/data/android/webvr_instrumentation/html/test_webvr_disabled_without_flag_set.html b/chrome/test/data/android/webvr_instrumentation/html/test_webvr_disabled_without_flag_set.html new file mode 100644 index 0000000..598cded --- /dev/null +++ b/chrome/test/data/android/webvr_instrumentation/html/test_webvr_disabled_without_flag_set.html
@@ -0,0 +1,23 @@ +<!doctype html> +<!-- +Tests that the WebVR API is not present if the flag to enable it is not set. +--> +<html> + <head> + <link rel="stylesheet" type="text/css" href="../resources/webvr_e2e.css"> + </head> + <body> + <canvas id="webgl-canvas"></canvas> + <script src="../../../../../../third_party/WebKit/LayoutTests/resources/testharness.js"></script> + <script src="../resources/webvr_e2e.js"></script> + </body> + <script> + var t = async_test("WebVR API is not visible"); + if (navigator.getVRDisplays) { + t.step( () => { + assert_unreached("API is visible"); + }); + } + t.done(); + </script> +</html>
diff --git a/chrome/test/data/webui/BUILD.gn b/chrome/test/data/webui/BUILD.gn index 39bca75..20e8069 100644 --- a/chrome/test/data/webui/BUILD.gn +++ b/chrome/test/data/webui/BUILD.gn
@@ -77,6 +77,7 @@ "ntp4.js", "polymer_browser_test_base.js", "sandboxstatus_browsertest.js", + "settings/about_a11y_test.js", "settings/accessibility_audit_rules.js", "settings/accessibility_browsertest.js", "settings/accessibility_test.js",
diff --git a/chrome/test/data/webui/settings/about_a11y_test.js b/chrome/test/data/webui/settings/about_a11y_test.js new file mode 100644 index 0000000..33b42a7 --- /dev/null +++ b/chrome/test/data/webui/settings/about_a11y_test.js
@@ -0,0 +1,48 @@ +// 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. + +/** + * @fileoverview Define accessibility tests for the ABOUT route. + */ + +/** @const {string} Path to root from chrome/test/data/webui/settings/. */ +var ROOT_PATH = '../../../../../'; + +// SettingsAccessibilityTest fixture. +GEN_INCLUDE([ + ROOT_PATH + 'chrome/test/data/webui/settings/accessibility_browsertest.js', +]); + +AccessibilityTest.define('SettingsAccessibilityTest', { + /** @override */ + name: 'ABOUT', + /** @override */ + axeOptions: { + 'rules': { + // TODO(hcarmona): enable 'region' after addressing violation. + 'region': {enabled: false}, + } + }, + /** @override */ + setup: function() { + settings.router.navigateTo(settings.routes.ABOUT); + Polymer.dom.flush(); + }, + /** @override */ + tests: { + 'Accessible with No Changes': function() {} + }, + /** @override */ + violationFilter: { + // TODO(quacht): remove this exception once the color contrast issue is + // solved. + // http://crbug.com/748608 + 'color-contrast': function(nodeResult) { + return nodeResult.element.id === 'prompt'; + }, + 'aria-valid-attr': function(nodeResult) { + return nodeResult.element.hasAttribute('aria-active-attribute'); + }, + } +}); \ No newline at end of file
diff --git a/chrome/test/data/webui/settings/accessibility_test.js b/chrome/test/data/webui/settings/accessibility_test.js index cb6865dc..cd87ea6 100644 --- a/chrome/test/data/webui/settings/accessibility_test.js +++ b/chrome/test/data/webui/settings/accessibility_test.js
@@ -121,8 +121,10 @@ axeOptions.runOnly.values : AccessibilityTest.ruleIds; rules.forEach((ruleId) => { // Skip rules disabled in axeOptions. - if (ruleId in axeOptions.rules && !axeOptions.rules[ruleId].enabled) + if (axeOptions.rules && ruleId in axeOptions.rules && + !axeOptions.rules[ruleId].enabled) { return; + } let newTestDef = Object.assign({}, testDef); newTestDef.name += '_' + ruleId;
diff --git a/chrome/tools/safe_browsing/DEPS b/chrome/tools/safe_browsing/DEPS index 322a686..5574d3b4 100644 --- a/chrome/tools/safe_browsing/DEPS +++ b/chrome/tools/safe_browsing/DEPS
@@ -1,3 +1,3 @@ include_rules = [ - "+components/safe_browsing/csd.pb.h", + "+components/safe_browsing/proto/csd.pb.h", ]
diff --git a/chrome/tools/safe_browsing/sb_sigutil.cc b/chrome/tools/safe_browsing/sb_sigutil.cc index c33ffa7..81973a4 100644 --- a/chrome/tools/safe_browsing/sb_sigutil.cc +++ b/chrome/tools/safe_browsing/sb_sigutil.cc
@@ -16,7 +16,7 @@ #include "base/logging.h" #include "base/memory/ref_counted.h" #include "chrome/common/safe_browsing/binary_feature_extractor.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" // Command-line switch for the executable to extract a signature from. static const char kExecutable[] = "executable";
diff --git a/chrome/utility/safe_browsing/mac/DEPS b/chrome/utility/safe_browsing/mac/DEPS index 322a686..5574d3b4 100644 --- a/chrome/utility/safe_browsing/mac/DEPS +++ b/chrome/utility/safe_browsing/mac/DEPS
@@ -1,3 +1,3 @@ include_rules = [ - "+components/safe_browsing/csd.pb.h", + "+components/safe_browsing/proto/csd.pb.h", ]
diff --git a/chrome/utility/safe_browsing/mac/dmg_analyzer.cc b/chrome/utility/safe_browsing/mac/dmg_analyzer.cc index 6ba4e583..00d8ad6 100644 --- a/chrome/utility/safe_browsing/mac/dmg_analyzer.cc +++ b/chrome/utility/safe_browsing/mac/dmg_analyzer.cc
@@ -16,7 +16,7 @@ #include "chrome/common/safe_browsing/mach_o_image_reader_mac.h" #include "chrome/utility/safe_browsing/mac/dmg_iterator.h" #include "chrome/utility/safe_browsing/mac/read_stream.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "crypto/secure_hash.h" #include "crypto/sha2.h"
diff --git a/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsActivity.java b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsActivity.java index 2903ad2..d911508 100644 --- a/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsActivity.java +++ b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsActivity.java
@@ -258,8 +258,11 @@ if (DEBUG) Log.d(TAG, "onWindowFocusChanged(%b)", hasFocus); super.onWindowFocusChanged(hasFocus); if (hasFocus) { + // switch to fullscreen (immersive) mode getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE - | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN); + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); } }
diff --git a/chromecast/media/audio/cast_audio_output_stream_unittest.cc b/chromecast/media/audio/cast_audio_output_stream_unittest.cc index 1a66c0293..e62e493a 100644 --- a/chromecast/media/audio/cast_audio_output_stream_unittest.cc +++ b/chromecast/media/audio/cast_audio_output_stream_unittest.cc
@@ -518,6 +518,7 @@ EXPECT_TRUE(audio_device); EXPECT_EQ(FakeMediaPipelineBackend::kStateRunning, GetBackend()->state()); + stream->Stop(); stream->Close(); }
diff --git a/chromecast/media/cma/backend/BUILD.gn b/chromecast/media/cma/backend/BUILD.gn index 3d4b52e..f2b0134 100644 --- a/chromecast/media/cma/backend/BUILD.gn +++ b/chromecast/media/cma/backend/BUILD.gn
@@ -8,6 +8,8 @@ source_set("backend") { sources = [ + "audio_decoder_wrapper.cc", + "audio_decoder_wrapper.h", "media_pipeline_backend_factory.h", "media_pipeline_backend_factory_impl.cc", "media_pipeline_backend_factory_impl.h",
diff --git a/chromecast/media/cma/backend/alsa/stream_mixer_alsa_input.h b/chromecast/media/cma/backend/alsa/stream_mixer_alsa_input.h index 2d77008c5..918c4a2 100644 --- a/chromecast/media/cma/backend/alsa/stream_mixer_alsa_input.h +++ b/chromecast/media/cma/backend/alsa/stream_mixer_alsa_input.h
@@ -70,8 +70,10 @@ // will continue to play sound while this input is paused. void SetPaused(bool paused); - // Sets the volume multiplier for this input. If |multiplier| is outside the - // range [0.0, 1.0], it is clamped to that range. + // Sets the volume multiplier for this input. If |multiplier| is less than 0, + // it is clamped to 0. Volume multipliers greater than 1.0 are allowed, but + // the total volume for the stream (including stream type volume) is clamped + // to 1.0. void SetVolumeMultiplier(float multiplier); private:
diff --git a/chromecast/media/cma/backend/alsa/stream_mixer_alsa_input_impl.cc b/chromecast/media/cma/backend/alsa/stream_mixer_alsa_input_impl.cc index 34d95f26..92aa527 100644 --- a/chromecast/media/cma/backend/alsa/stream_mixer_alsa_input_impl.cc +++ b/chromecast/media/cma/backend/alsa/stream_mixer_alsa_input_impl.cc
@@ -561,19 +561,19 @@ void StreamMixerAlsaInputImpl::SetVolumeMultiplier(float multiplier) { RUN_ON_MIXER_THREAD(SetVolumeMultiplier, multiplier); DCHECK(!IsDeleting()); - stream_volume_multiplier_ = std::max(0.0f, std::min(multiplier, 1.0f)); + stream_volume_multiplier_ = std::max(0.0f, multiplier); + float effective_volume = EffectiveVolume(); LOG(INFO) << device_id_ << "(" << this << "): stream volume = " << stream_volume_multiplier_ - << ", effective multiplier = " << EffectiveVolume(); + << ", effective multiplier = " << effective_volume; slew_volume_.SetMaxSlewTimeMs(kDefaultSlewTimeMs); - slew_volume_.SetVolume(EffectiveVolume()); + slew_volume_.SetVolume(effective_volume); } void StreamMixerAlsaInputImpl::SetContentTypeVolume(float volume, int fade_ms) { DCHECK(mixer_task_runner_->BelongsToCurrentThread()); type_volume_multiplier_ = std::max(0.0f, std::min(volume, 1.0f)); - float effective_volume = stream_volume_multiplier_ * type_volume_multiplier_ * - mute_volume_multiplier_; + float effective_volume = EffectiveVolume(); LOG(INFO) << device_id_ << "(" << this << "): type volume = " << type_volume_multiplier_ << ", effective multiplier = " << effective_volume; @@ -589,8 +589,7 @@ void StreamMixerAlsaInputImpl::SetMuted(bool muted) { DCHECK(mixer_task_runner_->BelongsToCurrentThread()); mute_volume_multiplier_ = muted ? 0.0f : 1.0f; - float effective_volume = stream_volume_multiplier_ * type_volume_multiplier_ * - mute_volume_multiplier_; + float effective_volume = EffectiveVolume(); LOG(INFO) << device_id_ << "(" << this << "): mute volume = " << mute_volume_multiplier_ << ", effective multiplier = " << effective_volume; @@ -599,8 +598,9 @@ } float StreamMixerAlsaInputImpl::EffectiveVolume() { - return stream_volume_multiplier_ * type_volume_multiplier_ * - mute_volume_multiplier_; + float volume = stream_volume_multiplier_ * type_volume_multiplier_ * + mute_volume_multiplier_; + return std::max(0.0f, std::min(volume, 1.0f)); } void StreamMixerAlsaInputImpl::VolumeScaleAccumulate(bool repeat_transition,
diff --git a/chromecast/media/cma/backend/alsa/stream_mixer_alsa_input_impl.h b/chromecast/media/cma/backend/alsa/stream_mixer_alsa_input_impl.h index a85b858c..5daf21d 100644 --- a/chromecast/media/cma/backend/alsa/stream_mixer_alsa_input_impl.h +++ b/chromecast/media/cma/backend/alsa/stream_mixer_alsa_input_impl.h
@@ -107,8 +107,7 @@ void SetPaused(bool paused); // Sets the volume multiplier for this stream. If |multiplier| < 0, sets the - // volume multiplier to 0. If |multiplier| > 1, sets the volume multiplier - // to 1. + // volume multiplier to 0. void SetVolumeMultiplier(float multiplier); // Prevents any further calls to the delegate (ie, called when the delegate
diff --git a/chromecast/media/cma/backend/audio_decoder_wrapper.cc b/chromecast/media/cma/backend/audio_decoder_wrapper.cc new file mode 100644 index 0000000..7aea08d --- /dev/null +++ b/chromecast/media/cma/backend/audio_decoder_wrapper.cc
@@ -0,0 +1,65 @@ +// 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 "chromecast/media/cma/backend/audio_decoder_wrapper.h" + +#include "base/logging.h" +#include "chromecast/media/cma/backend/media_pipeline_backend_manager.h" + +namespace chromecast { +namespace media { + +AudioDecoderWrapper::AudioDecoderWrapper( + MediaPipelineBackendManager* backend_manager, + AudioDecoder* decoder, + AudioContentType type) + : backend_manager_(backend_manager), + decoder_(decoder), + content_type_(type), + global_volume_multiplier_(1.0f), + stream_volume_multiplier_(1.0f) { + DCHECK(backend_manager_); + DCHECK(decoder_); + + backend_manager_->AddAudioDecoder(this); +} + +AudioDecoderWrapper::~AudioDecoderWrapper() { + backend_manager_->RemoveAudioDecoder(this); +} + +void AudioDecoderWrapper::SetGlobalVolumeMultiplier(float multiplier) { + global_volume_multiplier_ = multiplier; + decoder_->SetVolume(stream_volume_multiplier_ * global_volume_multiplier_); +} + +void AudioDecoderWrapper::SetDelegate(Delegate* delegate) { + decoder_->SetDelegate(delegate); +} + +MediaPipelineBackend::BufferStatus AudioDecoderWrapper::PushBuffer( + CastDecoderBuffer* buffer) { + return decoder_->PushBuffer(buffer); +} + +bool AudioDecoderWrapper::SetConfig(const AudioConfig& config) { + return decoder_->SetConfig(config); +} + +bool AudioDecoderWrapper::SetVolume(float multiplier) { + stream_volume_multiplier_ = std::max(0.0f, std::min(multiplier, 1.0f)); + return decoder_->SetVolume(stream_volume_multiplier_ * + global_volume_multiplier_); +} + +AudioDecoderWrapper::RenderingDelay AudioDecoderWrapper::GetRenderingDelay() { + return decoder_->GetRenderingDelay(); +} + +void AudioDecoderWrapper::GetStatistics(Statistics* statistics) { + decoder_->GetStatistics(statistics); +} + +} // namespace media +} // namespace chromecast
diff --git a/chromecast/media/cma/backend/audio_decoder_wrapper.h b/chromecast/media/cma/backend/audio_decoder_wrapper.h new file mode 100644 index 0000000..f1929d8 --- /dev/null +++ b/chromecast/media/cma/backend/audio_decoder_wrapper.h
@@ -0,0 +1,50 @@ +// 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 CHROMECAST_MEDIA_CMA_BACKEND_AUDIO_DECODER_WRAPPER_H_ +#define CHROMECAST_MEDIA_CMA_BACKEND_AUDIO_DECODER_WRAPPER_H_ + +#include "base/macros.h" +#include "chromecast/public/media/media_pipeline_backend.h" + +namespace chromecast { +namespace media { + +enum class AudioContentType; +class MediaPipelineBackendManager; + +class AudioDecoderWrapper : public MediaPipelineBackend::AudioDecoder { + public: + AudioDecoderWrapper(MediaPipelineBackendManager* backend_manager, + MediaPipelineBackend::AudioDecoder* decoder, + AudioContentType type); + ~AudioDecoderWrapper() override; + + void SetGlobalVolumeMultiplier(float multiplier); + + AudioContentType content_type() const { return content_type_; } + + private: + // MediaPipelineBackend::AudioDecoder implementation: + void SetDelegate(Delegate* delegate) override; + BufferStatus PushBuffer(CastDecoderBuffer* buffer) override; + bool SetConfig(const AudioConfig& config) override; + bool SetVolume(float multiplier) override; + RenderingDelay GetRenderingDelay() override; + void GetStatistics(Statistics* statistics) override; + + MediaPipelineBackendManager* const backend_manager_; + MediaPipelineBackend::AudioDecoder* const decoder_; + const AudioContentType content_type_; + + float global_volume_multiplier_; + float stream_volume_multiplier_; + + DISALLOW_COPY_AND_ASSIGN(AudioDecoderWrapper); +}; + +} // namespace media +} // namespace chromecast + +#endif // CHROMECAST_MEDIA_CMA_BACKEND_AUDIO_DECODER_WRAPPER_H_
diff --git a/chromecast/media/cma/backend/media_pipeline_backend_manager.cc b/chromecast/media/cma/backend/media_pipeline_backend_manager.cc index f3807ce9..4d6c6b5e 100644 --- a/chromecast/media/cma/backend/media_pipeline_backend_manager.cc +++ b/chromecast/media/cma/backend/media_pipeline_backend_manager.cc
@@ -7,10 +7,13 @@ #include <algorithm> #include <limits> +#include "base/bind.h" #include "base/location.h" #include "base/memory/ptr_util.h" #include "chromecast/chromecast_features.h" +#include "chromecast/media/cma/backend/audio_decoder_wrapper.h" #include "chromecast/media/cma/backend/media_pipeline_backend_wrapper.h" +#include "chromecast/public/volume_control.h" namespace chromecast { namespace media { @@ -27,13 +30,19 @@ : media_task_runner_(std::move(media_task_runner)), playing_noneffects_audio_streams_count_(0), allow_volume_feedback_observers_( - new base::ObserverListThreadSafe<AllowVolumeFeedbackObserver>()) { + new base::ObserverListThreadSafe<AllowVolumeFeedbackObserver>()), + global_volume_multipliers_({{AudioContentType::kMedia, 1.0f}, + {AudioContentType::kAlarm, 1.0f}, + {AudioContentType::kCommunication, 1.0f}}, + base::KEEP_FIRST_OF_DUPES), + weak_factory_(this) { for (int i = 0; i < NUM_DECODER_TYPES; ++i) { decoder_count_[i] = 0; } } MediaPipelineBackendManager::~MediaPipelineBackendManager() { + DCHECK(media_task_runner_->BelongsToCurrentThread()); } std::unique_ptr<MediaPipelineBackend> @@ -103,5 +112,38 @@ wrapper->LogicalResume(); } +void MediaPipelineBackendManager::SetGlobalVolumeMultiplier( + AudioContentType type, + float multiplier) { + if (!media_task_runner_->BelongsToCurrentThread()) { + media_task_runner_->PostTask( + FROM_HERE, + base::Bind(&MediaPipelineBackendManager::SetGlobalVolumeMultiplier, + weak_factory_.GetWeakPtr(), type, multiplier)); + return; + } + + DCHECK_GE(multiplier, 0.0f); + global_volume_multipliers_[type] = multiplier; + for (auto* a : audio_decoders_) { + if (a->content_type() == type) { + a->SetGlobalVolumeMultiplier(multiplier); + } + } +} + +void MediaPipelineBackendManager::AddAudioDecoder( + AudioDecoderWrapper* decoder) { + DCHECK(decoder); + audio_decoders_.insert(decoder); + decoder->SetGlobalVolumeMultiplier( + global_volume_multipliers_[decoder->content_type()]); +} + +void MediaPipelineBackendManager::RemoveAudioDecoder( + AudioDecoderWrapper* decoder) { + audio_decoders_.erase(decoder); +} + } // namespace media } // namespace chromecast
diff --git a/chromecast/media/cma/backend/media_pipeline_backend_manager.h b/chromecast/media/cma/backend/media_pipeline_backend_manager.h index e112b54..f8d1693b 100644 --- a/chromecast/media/cma/backend/media_pipeline_backend_manager.h +++ b/chromecast/media/cma/backend/media_pipeline_backend_manager.h
@@ -9,8 +9,11 @@ #include <memory> #include <vector> +#include "base/containers/flat_map.h" +#include "base/containers/flat_set.h" #include "base/macros.h" #include "base/memory/ref_counted.h" +#include "base/memory/weak_ptr.h" #include "base/observer_list_threadsafe.h" #include "base/single_thread_task_runner.h" #include "chromecast/public/media/media_pipeline_backend.h" @@ -19,6 +22,9 @@ namespace chromecast { namespace media { +enum class AudioContentType; +class AudioDecoderWrapper; + // This class tracks all created media backends, tracking whether or not volume // feedback sounds should be enabled based on the currently active backends. // Volume feedback sounds are only enabled when there are no active audio @@ -53,20 +59,30 @@ return media_task_runner_.get(); } - // Adds/removes an observer for when folume feedback sounds are allowed. + // Adds/removes an observer for when volume feedback sounds are allowed. // An observer must be removed on the same thread that added it. void AddAllowVolumeFeedbackObserver(AllowVolumeFeedbackObserver* observer); void RemoveAllowVolumeFeedbackObserver(AllowVolumeFeedbackObserver* observer); - // Logically pause/resume a backend instance, without actually pausing or + // Logically pauses/resumes a backend instance, without actually pausing or // resuming it. This is used by multiroom output to avoid playback stutter on // resume. |backend| must have been created via a call to this instance's // CreateMediaPipelineBackend(). void LogicalPause(MediaPipelineBackend* backend); void LogicalResume(MediaPipelineBackend* backend); + // Sets a global multiplier for output volume for streams fo the given |type|. + // The multiplier may be any value >= 0; if the resulting volume for an + // individual stream would be > 1.0, that stream's volume is clamped to 1.0. + // The default multiplier is 1.0. May be called on any thread. + void SetGlobalVolumeMultiplier(AudioContentType type, float multiplier); + private: friend class MediaPipelineBackendWrapper; + friend class AudioDecoderWrapper; + + void AddAudioDecoder(AudioDecoderWrapper* decoder); + void RemoveAudioDecoder(AudioDecoderWrapper* decoder); // Backend wrapper instances must use these APIs when allocating and releasing // decoder objects, so we can enforce global limit on #concurrent decoders. @@ -87,6 +103,11 @@ scoped_refptr<base::ObserverListThreadSafe<AllowVolumeFeedbackObserver>> allow_volume_feedback_observers_; + base::flat_set<AudioDecoderWrapper*> audio_decoders_; + base::flat_map<AudioContentType, float> global_volume_multipliers_; + + base::WeakPtrFactory<MediaPipelineBackendManager> weak_factory_; + DISALLOW_COPY_AND_ASSIGN(MediaPipelineBackendManager); };
diff --git a/chromecast/media/cma/backend/media_pipeline_backend_wrapper.cc b/chromecast/media/cma/backend/media_pipeline_backend_wrapper.cc index 7ea3f9a..462ab2d 100644 --- a/chromecast/media/cma/backend/media_pipeline_backend_wrapper.cc +++ b/chromecast/media/cma/backend/media_pipeline_backend_wrapper.cc
@@ -6,6 +6,7 @@ #include "base/logging.h" #include "base/memory/ptr_util.h" +#include "chromecast/media/cma/backend/audio_decoder_wrapper.h" #include "chromecast/media/cma/backend/media_pipeline_backend_manager.h" #include "chromecast/public/cast_media_shlib.h" @@ -20,9 +21,9 @@ : backend_(base::WrapUnique( media::CastMediaShlib::CreateMediaPipelineBackend(params))), backend_manager_(backend_manager), + content_type_(params.content_type), sfx_backend_(params.audio_type == media::MediaPipelineDeviceParams::kAudioStreamSoundEffects), - have_audio_decoder_(false), have_video_decoder_(false), playing_(false) { DCHECK(backend_); @@ -30,7 +31,7 @@ } MediaPipelineBackendWrapper::~MediaPipelineBackendWrapper() { - if (have_audio_decoder_) + if (audio_decoder_) backend_manager_->DecrementDecoderCount( sfx_backend_ ? DecoderType::SFX_DECODER : DecoderType::AUDIO_DECODER); if (have_video_decoder_) @@ -38,7 +39,7 @@ if (playing_) { LOG(WARNING) << "Destroying media backend while still in 'playing' state"; - if (have_audio_decoder_ && !sfx_backend_) { + if (audio_decoder_ && !sfx_backend_) { backend_manager_->UpdatePlayingAudioCount(-1); } } @@ -54,14 +55,19 @@ MediaPipelineBackend::AudioDecoder* MediaPipelineBackendWrapper::CreateAudioDecoder() { - DCHECK(!have_audio_decoder_); + DCHECK(!audio_decoder_); if (!backend_manager_->IncrementDecoderCount( sfx_backend_ ? DecoderType::SFX_DECODER : DecoderType::AUDIO_DECODER)) return nullptr; - have_audio_decoder_ = true; - - return backend_->CreateAudioDecoder(); + MediaPipelineBackend::AudioDecoder* real_decoder = + backend_->CreateAudioDecoder(); + if (!real_decoder) { + return nullptr; + } + audio_decoder_ = base::MakeUnique<AudioDecoderWrapper>( + backend_manager_, real_decoder, content_type_); + return audio_decoder_.get(); } MediaPipelineBackend::VideoDecoder* @@ -121,7 +127,7 @@ return; } playing_ = playing; - if (have_audio_decoder_ && !sfx_backend_) { + if (audio_decoder_ && !sfx_backend_) { backend_manager_->UpdatePlayingAudioCount(playing_ ? 1 : -1); } }
diff --git a/chromecast/media/cma/backend/media_pipeline_backend_wrapper.h b/chromecast/media/cma/backend/media_pipeline_backend_wrapper.h index 848c7ce..879063e 100644 --- a/chromecast/media/cma/backend/media_pipeline_backend_wrapper.h +++ b/chromecast/media/cma/backend/media_pipeline_backend_wrapper.h
@@ -18,6 +18,8 @@ namespace chromecast { namespace media { +enum class AudioContentType; +class AudioDecoderWrapper; class MediaPipelineBackendManager; class MediaPipelineBackendWrapper : public MediaPipelineBackend { @@ -45,9 +47,11 @@ const std::unique_ptr<MediaPipelineBackend> backend_; MediaPipelineBackendManager* const backend_manager_; + const AudioContentType content_type_; + + std::unique_ptr<AudioDecoderWrapper> audio_decoder_; bool sfx_backend_; - bool have_audio_decoder_; bool have_video_decoder_; bool playing_;
diff --git a/chromeos/BUILD.gn b/chromeos/BUILD.gn index 6d58162..4e49ab5 100644 --- a/chromeos/BUILD.gn +++ b/chromeos/BUILD.gn
@@ -130,6 +130,8 @@ "cryptohome/system_salt_getter.h", "dbus/arc_obb_mounter_client.cc", "dbus/arc_obb_mounter_client.h", + "dbus/arc_oemcrypto_client.cc", + "dbus/arc_oemcrypto_client.h", "dbus/audio_node.cc", "dbus/audio_node.h", "dbus/auth_policy_client.cc", @@ -161,6 +163,8 @@ "dbus/easy_unlock_client.h", "dbus/fake_arc_obb_mounter_client.cc", "dbus/fake_arc_obb_mounter_client.h", + "dbus/fake_arc_oemcrypto_client.cc", + "dbus/fake_arc_oemcrypto_client.h", "dbus/fake_auth_policy_client.cc", "dbus/fake_auth_policy_client.h", "dbus/fake_cras_audio_client.cc",
diff --git a/chromeos/dbus/arc_oemcrypto_client.cc b/chromeos/dbus/arc_oemcrypto_client.cc new file mode 100644 index 0000000..a54ba140 --- /dev/null +++ b/chromeos/dbus/arc_oemcrypto_client.cc
@@ -0,0 +1,73 @@ +// 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 "chromeos/dbus/arc_oemcrypto_client.h" + +#include <utility> + +#include "base/bind.h" +#include "base/bind_helpers.h" +#include "base/callback.h" +#include "dbus/bus.h" +#include "dbus/message.h" +#include "dbus/object_proxy.h" +#include "third_party/cros_system_api/dbus/service_constants.h" + +namespace chromeos { + +namespace { + +class ArcOemCryptoClientImpl : public ArcOemCryptoClient { + public: + ArcOemCryptoClientImpl() : weak_ptr_factory_(this) {} + ~ArcOemCryptoClientImpl() override {} + + // ArcOemCryptoClient override: + void BootstrapMojoConnection(base::ScopedFD fd, + VoidDBusMethodCallback callback) override { + dbus::MethodCall method_call(arc_oemcrypto::kArcOemCryptoServiceInterface, + arc_oemcrypto::kBootstrapMojoConnection); + dbus::MessageWriter writer(&method_call); + writer.AppendFileDescriptor(fd.release()); + proxy_->CallMethod(&method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, + base::Bind(&ArcOemCryptoClientImpl::OnVoidDBusMethod, + weak_ptr_factory_.GetWeakPtr(), + base::Passed(std::move(callback)))); + } + + protected: + // DBusClient override. + void Init(dbus::Bus* bus) override { + proxy_ = bus->GetObjectProxy( + arc_oemcrypto::kArcOemCryptoServiceName, + dbus::ObjectPath(arc_oemcrypto::kArcOemCryptoServicePath)); + } + + private: + // Runs the callback with the method call result. + void OnVoidDBusMethod(VoidDBusMethodCallback callback, + dbus::Response* response) { + std::move(callback).Run(response ? DBUS_METHOD_CALL_SUCCESS + : DBUS_METHOD_CALL_FAILURE); + } + + dbus::ObjectProxy* proxy_ = nullptr; + + base::WeakPtrFactory<ArcOemCryptoClientImpl> weak_ptr_factory_; + + DISALLOW_COPY_AND_ASSIGN(ArcOemCryptoClientImpl); +}; + +} // namespace + +ArcOemCryptoClient::ArcOemCryptoClient() {} + +ArcOemCryptoClient::~ArcOemCryptoClient() {} + +// static +ArcOemCryptoClient* ArcOemCryptoClient::Create() { + return new ArcOemCryptoClientImpl(); +} + +} // namespace chromeos
diff --git a/chromeos/dbus/arc_oemcrypto_client.h b/chromeos/dbus/arc_oemcrypto_client.h new file mode 100644 index 0000000..5b6cb60 --- /dev/null +++ b/chromeos/dbus/arc_oemcrypto_client.h
@@ -0,0 +1,42 @@ +// 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 CHROMEOS_DBUS_ARC_OEMCRYPTO_CLIENT_H_ +#define CHROMEOS_DBUS_ARC_OEMCRYPTO_CLIENT_H_ + +#include <stdint.h> + +#include <string> + +#include "base/callback_forward.h" +#include "base/files/scoped_file.h" +#include "base/macros.h" +#include "chromeos/chromeos_export.h" +#include "chromeos/dbus/dbus_client.h" +#include "chromeos/dbus/dbus_method_call_status.h" + +namespace chromeos { + +// ArcOemCryptoClient is used to communicate with the ArcOemCrypto service +// which performs Widevine L1 DRM operations for ARC. The only purpose of +// the D-Bus service is to bootstrap a Mojo IPC connection. +// All methods should be called from the origin thread (UI thread) which +// initializes the DBusThreadManager instance. +class CHROMEOS_EXPORT ArcOemCryptoClient : public DBusClient { + public: + ArcOemCryptoClient(); + ~ArcOemCryptoClient() override; + + // Factory function, creates a new instance and returns ownership. + // For normal usage, access the singleton via DBusThreadManager::Get(). + static ArcOemCryptoClient* Create(); + + // Bootstraps the Mojo IPC connection between Chrome and the service daemon. + // This should pass in the child end of a Mojo pipe. + virtual void BootstrapMojoConnection(base::ScopedFD fd, + VoidDBusMethodCallback callback) = 0; +}; +} // namespace chromeos + +#endif // CHROMEOS_DBUS_ARC_OEMCRYPTO_CLIENT_H_
diff --git a/chromeos/dbus/dbus_clients_browser.cc b/chromeos/dbus/dbus_clients_browser.cc index d5a54861..93353d7 100644 --- a/chromeos/dbus/dbus_clients_browser.cc +++ b/chromeos/dbus/dbus_clients_browser.cc
@@ -6,6 +6,7 @@ #include "base/logging.h" #include "chromeos/dbus/arc_obb_mounter_client.h" +#include "chromeos/dbus/arc_oemcrypto_client.h" #include "chromeos/dbus/auth_policy_client.h" #include "chromeos/dbus/cros_disks_client.h" #include "chromeos/dbus/dbus_client_implementation_type.h" @@ -13,6 +14,7 @@ #include "chromeos/dbus/debug_daemon_client.h" #include "chromeos/dbus/easy_unlock_client.h" #include "chromeos/dbus/fake_arc_obb_mounter_client.h" +#include "chromeos/dbus/fake_arc_oemcrypto_client.h" #include "chromeos/dbus/fake_auth_policy_client.h" #include "chromeos/dbus/fake_debug_daemon_client.h" #include "chromeos/dbus/fake_easy_unlock_client.h" @@ -36,6 +38,11 @@ arc_obb_mounter_client_.reset(new FakeArcObbMounterClient); if (use_real_clients) + arc_oemcrypto_client_.reset(ArcOemCryptoClient::Create()); + else + arc_oemcrypto_client_.reset(new FakeArcOemCryptoClient); + + if (use_real_clients) auth_policy_client_.reset(AuthPolicyClient::Create()); else auth_policy_client_.reset(new FakeAuthPolicyClient); @@ -86,6 +93,7 @@ DCHECK(DBusThreadManager::IsInitialized()); arc_obb_mounter_client_->Init(system_bus); + arc_oemcrypto_client_->Init(system_bus); auth_policy_client_->Init(system_bus); cros_disks_client_->Init(system_bus); debug_daemon_client_->Init(system_bus);
diff --git a/chromeos/dbus/dbus_clients_browser.h b/chromeos/dbus/dbus_clients_browser.h index a484eed..340f65e 100644 --- a/chromeos/dbus/dbus_clients_browser.h +++ b/chromeos/dbus/dbus_clients_browser.h
@@ -17,6 +17,7 @@ namespace chromeos { class ArcObbMounterClient; +class ArcOemCryptoClient; class AuthPolicyClient; class CrosDisksClient; class DebugDaemonClient; @@ -43,6 +44,7 @@ friend class DBusThreadManagerSetter; std::unique_ptr<ArcObbMounterClient> arc_obb_mounter_client_; + std::unique_ptr<ArcOemCryptoClient> arc_oemcrypto_client_; std::unique_ptr<AuthPolicyClient> auth_policy_client_; std::unique_ptr<CrosDisksClient> cros_disks_client_; std::unique_ptr<DebugDaemonClient> debug_daemon_client_;
diff --git a/chromeos/dbus/dbus_thread_manager.cc b/chromeos/dbus/dbus_thread_manager.cc index 88571830..9112f42 100644 --- a/chromeos/dbus/dbus_thread_manager.cc +++ b/chromeos/dbus/dbus_thread_manager.cc
@@ -13,6 +13,7 @@ #include "base/threading/thread.h" #include "chromeos/chromeos_switches.h" #include "chromeos/dbus/arc_obb_mounter_client.h" +#include "chromeos/dbus/arc_oemcrypto_client.h" #include "chromeos/dbus/auth_policy_client.h" #include "chromeos/dbus/biod/biod_client.h" #include "chromeos/dbus/cras_audio_client.h" @@ -115,6 +116,11 @@ : nullptr; } +ArcOemCryptoClient* DBusThreadManager::GetArcOemCryptoClient() { + return clients_browser_ ? clients_browser_->arc_oemcrypto_client_.get() + : nullptr; +} + AuthPolicyClient* DBusThreadManager::GetAuthPolicyClient() { return clients_browser_ ? clients_browser_->auth_policy_client_.get() : nullptr;
diff --git a/chromeos/dbus/dbus_thread_manager.h b/chromeos/dbus/dbus_thread_manager.h index b16c9eeb..33fd70b 100644 --- a/chromeos/dbus/dbus_thread_manager.h +++ b/chromeos/dbus/dbus_thread_manager.h
@@ -25,6 +25,7 @@ // Style Note: Clients are sorted by names. class ArcObbMounterClient; +class ArcOemCryptoClient; class AuthPolicyClient; class BiodClient; class CrasAudioClient; @@ -121,6 +122,7 @@ // TODO(jamescook): Replace this with calls to FooClient::Get(). // http://crbug.com/647367 ArcObbMounterClient* GetArcObbMounterClient(); + ArcOemCryptoClient* GetArcOemCryptoClient(); AuthPolicyClient* GetAuthPolicyClient(); BiodClient* GetBiodClient(); CrasAudioClient* GetCrasAudioClient();
diff --git a/chromeos/dbus/dbus_thread_manager_unittest.cc b/chromeos/dbus/dbus_thread_manager_unittest.cc index ba141028..201de8e6 100644 --- a/chromeos/dbus/dbus_thread_manager_unittest.cc +++ b/chromeos/dbus/dbus_thread_manager_unittest.cc
@@ -21,6 +21,7 @@ // Clients were created. EXPECT_TRUE(manager->GetArcObbMounterClient()); + EXPECT_TRUE(manager->GetArcOemCryptoClient()); EXPECT_TRUE(manager->GetCrasAudioClient()); EXPECT_TRUE(manager->GetCrosDisksClient()); EXPECT_TRUE(manager->GetCryptohomeClient()); @@ -73,6 +74,7 @@ // Clients for the browser were created. EXPECT_TRUE(manager->GetArcObbMounterClient()); + EXPECT_TRUE(manager->GetArcOemCryptoClient()); EXPECT_TRUE(manager->GetCrosDisksClient()); EXPECT_TRUE(manager->GetDebugDaemonClient()); EXPECT_TRUE(manager->GetEasyUnlockClient()); @@ -108,6 +110,7 @@ // Clients for other processes were not created. EXPECT_FALSE(manager->GetArcObbMounterClient()); + EXPECT_FALSE(manager->GetArcOemCryptoClient()); EXPECT_FALSE(manager->GetCrosDisksClient()); EXPECT_FALSE(manager->GetDebugDaemonClient()); EXPECT_FALSE(manager->GetEasyUnlockClient());
diff --git a/chromeos/dbus/fake_arc_oemcrypto_client.cc b/chromeos/dbus/fake_arc_oemcrypto_client.cc new file mode 100644 index 0000000..4716d75 --- /dev/null +++ b/chromeos/dbus/fake_arc_oemcrypto_client.cc
@@ -0,0 +1,28 @@ +// 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 "chromeos/dbus/fake_arc_oemcrypto_client.h" + +#include <utility> + +#include "base/bind.h" +#include "base/callback.h" +#include "base/threading/thread_task_runner_handle.h" + +namespace chromeos { + +FakeArcOemCryptoClient::FakeArcOemCryptoClient() {} + +FakeArcOemCryptoClient::~FakeArcOemCryptoClient() {} + +void FakeArcOemCryptoClient::Init(dbus::Bus* bus) {} + +void FakeArcOemCryptoClient::BootstrapMojoConnection( + base::ScopedFD fd, + VoidDBusMethodCallback callback) { + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(std::move(callback), DBUS_METHOD_CALL_FAILURE)); +} + +} // namespace chromeos
diff --git a/chromeos/dbus/fake_arc_oemcrypto_client.h b/chromeos/dbus/fake_arc_oemcrypto_client.h new file mode 100644 index 0000000..183fa94 --- /dev/null +++ b/chromeos/dbus/fake_arc_oemcrypto_client.h
@@ -0,0 +1,31 @@ +// 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 CHROMEOS_DBUS_FAKE_ARC_OEMCRYPTO_CLIENT_H_ +#define CHROMEOS_DBUS_FAKE_ARC_OEMCRYPTO_CLIENT_H_ + +#include "chromeos/dbus/arc_oemcrypto_client.h" + +namespace chromeos { + +// A fake implementation of ArcOemCryptoClient. +class CHROMEOS_EXPORT FakeArcOemCryptoClient : public ArcOemCryptoClient { + public: + FakeArcOemCryptoClient(); + ~FakeArcOemCryptoClient() override; + + // DBusClient override: + void Init(dbus::Bus* bus) override; + + // ArcOemCryptoClient override: + void BootstrapMojoConnection(base::ScopedFD fd, + VoidDBusMethodCallback callback) override; + + private: + DISALLOW_COPY_AND_ASSIGN(FakeArcOemCryptoClient); +}; + +} // namespace chromeos + +#endif // CHROMEOS_DBUS_FAKE_ARC_OEMCRYPTO_CLIENT_H_
diff --git a/chromeos/dbus/fake_update_engine_client.cc b/chromeos/dbus/fake_update_engine_client.cc index 1ab1ab3e..db0a9c3 100644 --- a/chromeos/dbus/fake_update_engine_client.cc +++ b/chromeos/dbus/fake_update_engine_client.cc
@@ -102,7 +102,9 @@ void FakeUpdateEngineClient::SetUpdateOverCellularOneTimePermission( const std::string& target_version, int64_t target_size, - const UpdateOverCellularOneTimePermissionCallback& callback) {} + const UpdateOverCellularOneTimePermissionCallback& callback) { + callback.Run(true); +} void FakeUpdateEngineClient::set_default_status( const UpdateEngineClient::Status& status) {
diff --git a/components/arc/common/typemaps.gni b/components/arc/common/typemaps.gni index 32ca073c..8902a9b 100644 --- a/components/arc/common/typemaps.gni +++ b/components/arc/common/typemaps.gni
@@ -11,5 +11,6 @@ "//components/arc/common/intent_helper.typemap", "//components/arc/common/video_common.typemap", "//components/arc/common/video_encode_accelerator.typemap", + "//components/arc/common/voice_interaction_framework.typemap", "//components/arc/common/volume_mounter.typemap", ]
diff --git a/components/arc/common/voice_interaction_framework.mojom b/components/arc/common/voice_interaction_framework.mojom index ad26b90..192e543 100644 --- a/components/arc/common/voice_interaction_framework.mojom +++ b/components/arc/common/voice_interaction_framework.mojom
@@ -2,14 +2,21 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // -// Next MinVersion: 8 +// Next MinVersion: 9 module arc.mojom; import "screen_rect.mojom"; +[Extensible] +enum VoiceInteractionState { + NOT_READY = 0, + STOPPED, + RUNNING +}; + // Handles voice interaction queries from Android. -// Next method ID: 5 +// Next method ID: 6 interface VoiceInteractionFrameworkHost { // Returns a screenshot of currently focused window or empty array if // no window is focused. |data| represents the image encoded in JPEG @@ -28,6 +35,9 @@ // Notifies Chrome whether voice interaction session is running. [MinVersion=6]SetVoiceInteractionRunning@4(bool running); + + // Notifies Chrome the state of voice interaction session. + [MinVersion=8]SetVoiceInteractionState@5(VoiceInteractionState state); }; // Indicates voice interaction configuration status. @@ -69,6 +79,6 @@ [MinVersion=5] StartVoiceInteractionSetupWizard@6(); // Queries voice interaction settings status. - [MinVersion=7] GetVoiceInteractionSettings@7() => + [MinVersion=7] GetVoiceInteractionSettings@7() => (VoiceInteractionStatus status); -}; \ No newline at end of file +};
diff --git a/components/arc/common/voice_interaction_framework.typemap b/components/arc/common/voice_interaction_framework.typemap new file mode 100644 index 0000000..8254719 --- /dev/null +++ b/components/arc/common/voice_interaction_framework.typemap
@@ -0,0 +1,13 @@ +# Copyright 2017 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +mojom = "//components/arc/common/voice_interaction_framework.mojom" +public_headers = [ "//ash/public/cpp/voice_interaction_state.h" ] +public_deps = [ + "//ash/public/cpp:ash_public_cpp", +] +traits_headers = + [ "//components/arc/voice_interaction/voice_interaction_struct_traits.h" ] +sources = [] +type_mappings = [ "arc.mojom.VoiceInteractionState=ash::VoiceInteractionState" ]
diff --git a/components/arc/ime/arc_ime_bridge_impl.cc b/components/arc/ime/arc_ime_bridge_impl.cc index c7f17e2..304788b 100644 --- a/components/arc/ime/arc_ime_bridge_impl.cc +++ b/components/arc/ime/arc_ime_bridge_impl.cc
@@ -59,14 +59,14 @@ std::vector<mojom::CompositionSegmentPtr> ConvertSegments( const ui::CompositionText& composition) { std::vector<mojom::CompositionSegmentPtr> segments; - for (const ui::CompositionUnderline& underline : composition.underlines) { + for (const ui::ImeTextSpan& ime_text_span : composition.ime_text_spans) { mojom::CompositionSegmentPtr segment = mojom::CompositionSegment::New(); - segment->start_offset = underline.start_offset; - segment->end_offset = underline.end_offset; + segment->start_offset = ime_text_span.start_offset; + segment->end_offset = ime_text_span.end_offset; segment->emphasized = - (underline.thick || - (composition.selection.start() == underline.start_offset && - composition.selection.end() == underline.end_offset)); + (ime_text_span.thick || + (composition.selection.start() == ime_text_span.start_offset && + composition.selection.end() == ime_text_span.end_offset)); segments.push_back(std::move(segment)); } return segments;
diff --git a/components/arc/voice_interaction/OWNERS b/components/arc/voice_interaction/OWNERS new file mode 100644 index 0000000..bb65116 --- /dev/null +++ b/components/arc/voice_interaction/OWNERS
@@ -0,0 +1,2 @@ +per-file *_struct_traits*.*=set noparent +per-file *_struct_traits*.*=file://ipc/SECURITY_OWNERS
diff --git a/components/arc/voice_interaction/voice_interaction_struct_traits.h b/components/arc/voice_interaction/voice_interaction_struct_traits.h new file mode 100644 index 0000000..c519f96 --- /dev/null +++ b/components/arc/voice_interaction/voice_interaction_struct_traits.h
@@ -0,0 +1,53 @@ +// 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 COMPONENTS_ARC_VOICE_INTERACTION_VOICE_INTERACTION_STRUCT_TRAITS_H_ +#define COMPONENTS_ARC_VOICE_INTERACTION_VOICE_INTERACTION_STRUCT_TRAITS_H_ + +#include "ash/public/cpp/voice_interaction_state.h" +#include "components/arc/common/voice_interaction_framework.mojom.h" + +namespace mojo { + +template <> +struct EnumTraits<arc::mojom::VoiceInteractionState, + ash::VoiceInteractionState> { + static arc::mojom::VoiceInteractionState ToMojom( + ash::VoiceInteractionState state) { + switch (state) { + case ash::VoiceInteractionState::NOT_READY: + return arc::mojom::VoiceInteractionState::NOT_READY; + case ash::VoiceInteractionState::STOPPED: + return arc::mojom::VoiceInteractionState::STOPPED; + case ash::VoiceInteractionState::RUNNING: + return arc::mojom::VoiceInteractionState::RUNNING; + } + + NOTREACHED() << "Invalid state: " << static_cast<int>(state); + return arc::mojom::VoiceInteractionState::NOT_READY; + } + + static bool FromMojom(arc::mojom::VoiceInteractionState mojom_state, + ash::VoiceInteractionState* state) { + switch (mojom_state) { + case arc::mojom::VoiceInteractionState::NOT_READY: + *state = ash::VoiceInteractionState::NOT_READY; + return true; + case arc::mojom::VoiceInteractionState::STOPPED: + *state = ash::VoiceInteractionState::STOPPED; + return true; + case arc::mojom::VoiceInteractionState::RUNNING: + *state = ash::VoiceInteractionState::RUNNING; + return true; + } + + NOTREACHED() << "Invalid state: " << static_cast<int>(mojom_state); + *state = ash::VoiceInteractionState::NOT_READY; + return false; + } +}; + +} // namespace mojo + +#endif // COMPONENTS_ARC_VOICE_INTERACTION_VOICE_INTERACTION_STRUCT_TRAITS_H_
diff --git a/components/autofill/content/renderer/autofill_agent.cc b/components/autofill/content/renderer/autofill_agent.cc index 6d7e12ab..d3ff7bf 100644 --- a/components/autofill/content/renderer/autofill_agent.cc +++ b/components/autofill/content/renderer/autofill_agent.cc
@@ -188,7 +188,6 @@ OnSameDocumentNavigationCompleted(); } else { // Navigation to a new page or a page refresh. - element_.Reset(); form_cache_.Reset(); submitted_forms_.clear(); last_interacted_form_.Reset();
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn index be8c652..dbb5b23 100644 --- a/components/autofill/core/browser/BUILD.gn +++ b/components/autofill/core/browser/BUILD.gn
@@ -17,6 +17,8 @@ "address_rewriter.cc", "address_rewriter.h", "address_rewriter_rules.cc", + "address_validation_util.cc", + "address_validation_util.h", "autocomplete_history_manager.cc", "autocomplete_history_manager.h", "autofill-inl.h", @@ -56,6 +58,8 @@ "autofill_profile.h", "autofill_profile_comparator.cc", "autofill_profile_comparator.h", + "autofill_profile_validator.cc", + "autofill_profile_validator.h", "autofill_provider.cc", "autofill_provider.h", "autofill_scanner.cc", @@ -321,6 +325,7 @@ "address_i18n_unittest.cc", "address_rewriter_unittest.cc", "address_unittest.cc", + "address_validation_util_unittest.cc", "autocomplete_history_manager_unittest.cc", "autofill_country_unittest.cc", "autofill_data_model_unittest.cc", @@ -335,6 +340,7 @@ "autofill_metrics_unittest.cc", "autofill_profile_comparator_unittest.cc", "autofill_profile_unittest.cc", + "autofill_profile_validator_unittest.cc", "autofill_type_unittest.cc", "contact_info_unittest.cc", "country_combobox_model_unittest.cc",
diff --git a/components/autofill/core/browser/address_validation_util.cc b/components/autofill/core/browser/address_validation_util.cc new file mode 100644 index 0000000..76b056dc --- /dev/null +++ b/components/autofill/core/browser/address_validation_util.cc
@@ -0,0 +1,155 @@ +// 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 "components/autofill/core/browser/address_validation_util.h" + +#include <utility> + +#include "base/logging.h" +#include "base/memory/ptr_util.h" +#include "base/stl_util.h" +#include "base/strings/utf_string_conversions.h" +#include "components/autofill/core/browser/address_i18n.h" +#include "components/autofill/core/browser/country_data.h" +#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_data.h" +#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_validator.h" + +namespace autofill { + +namespace { + +using ::i18n::addressinput::COUNTRY; +using ::i18n::addressinput::ADMIN_AREA; +using ::i18n::addressinput::LOCALITY; +using ::i18n::addressinput::DEPENDENT_LOCALITY; +using ::i18n::addressinput::SORTING_CODE; +using ::i18n::addressinput::POSTAL_CODE; +using ::i18n::addressinput::STREET_ADDRESS; +using ::i18n::addressinput::RECIPIENT; + +using ::i18n::addressinput::AddressData; +using ::i18n::addressinput::AddressField; +using ::i18n::addressinput::AddressProblem; +using ::i18n::addressinput::FieldProblemMap; + +using ::i18n::addressinput::INVALID_FORMAT; +using ::i18n::addressinput::MISMATCHING_VALUE; +using ::i18n::addressinput::MISSING_REQUIRED_FIELD; +using ::i18n::addressinput::UNEXPECTED_FIELD; +using ::i18n::addressinput::UNKNOWN_VALUE; + +const AddressField kFields[] = {COUNTRY, ADMIN_AREA, POSTAL_CODE}; +const AddressProblem kProblems[] = {UNEXPECTED_FIELD, MISSING_REQUIRED_FIELD, + UNKNOWN_VALUE, INVALID_FORMAT, + MISMATCHING_VALUE}; + +// If the |address_field| is valid, set the validity state of the +// |address_field| in the |profile| to the |state| and return true. +// Otherwise, return false. +bool SetValidityStateForAddressField(AutofillProfile* profile, + AddressField address_field, + AutofillProfile::ValidityState state) { + ServerFieldType server_field = i18n::TypeForField(address_field, + /*billing=*/false); + if (server_field == UNKNOWN_TYPE) + return false; + DCHECK(profile); + profile->SetValidityState(server_field, state); + return true; +} + +// Set the validity state of all address fields in the |profile| to |state|. +void SetAllValidityStates(AutofillProfile* profile, + AutofillProfile::ValidityState state) { + DCHECK(profile); + for (auto field : kFields) + SetValidityStateForAddressField(profile, field, state); +} + +// Returns all relevant pairs of (field, problem), where field is in +// |kFields|, and problem is in |kProblems|. +FieldProblemMap* CreateFieldProblemMap() { + FieldProblemMap* filter = new FieldProblemMap(); + for (auto field : kFields) { + for (auto problem : kProblems) { + filter->insert(std::make_pair(field, problem)); + } + } + return filter; +} + +// GetFilter() will make sure that the validation only returns problems that +// are relevant. +const FieldProblemMap* GetFilter() { + static const FieldProblemMap* const filter = CreateFieldProblemMap(); + return filter; +} + +// Initializes |address| data from the address info in the |profile|. +void InitializeAddressFromProfile(const AutofillProfile& profile, + AddressData* address) { + address->region_code = + base::UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_COUNTRY)); + address->administrative_area = + base::UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_STATE)); + address->postal_code = + base::UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_ZIP)); +} + +} // namespace + +namespace address_validation_util { + +AutofillProfile::ValidityState ValidateAddress( + AutofillProfile* profile, + AddressValidator* address_validator) { + DCHECK(address_validator); + if (!profile) + return AutofillProfile::UNVALIDATED; + + if (!base::ContainsValue( + CountryDataMap::GetInstance()->country_codes(), + base::UTF16ToUTF8(profile->GetRawInfo(ADDRESS_HOME_COUNTRY)))) { + // If the country code is not in the database, the country code and the + // profile are invalid, and other fields cannot be validated, because it is + // unclear which, if any, rule should apply. + SetAllValidityStates(profile, AutofillProfile::UNVALIDATED); + SetValidityStateForAddressField(profile, COUNTRY, AutofillProfile::INVALID); + return AutofillProfile::INVALID; + } + + AddressData address; + InitializeAddressFromProfile(*profile, &address); + + AutofillProfile::ValidityState profile_validity; + FieldProblemMap problems; + // status denotes if the rule was successfully loaded before validation. + AddressValidator::Status status = + address_validator->ValidateAddress(address, GetFilter(), &problems); + + if (status == AddressValidator::SUCCESS) { + // The rules were found and applied. Initialize all fields to VALID here and + // update the fields with problems below. + profile_validity = AutofillProfile::VALID; + SetAllValidityStates(profile, AutofillProfile::VALID); + } else { + // If the rules are not yet available, ValidateAddress can still check for + // MISSING_REQUIRED_FIELD. In this case, the address fields will be either + // UNVALIDATED or INVALID. + profile_validity = AutofillProfile::UNVALIDATED; + SetAllValidityStates(profile, AutofillProfile::UNVALIDATED); + SetValidityStateForAddressField(profile, COUNTRY, AutofillProfile::VALID); + } + + for (auto problem : problems) { + if (SetValidityStateForAddressField(profile, problem.first, + AutofillProfile::INVALID)) { + profile_validity = AutofillProfile::INVALID; + } + } + return profile_validity; +} + +} // namespace address_validation_util +} // namespace autofill
diff --git a/components/autofill/core/browser/address_validation_util.h b/components/autofill/core/browser/address_validation_util.h new file mode 100644 index 0000000..c58c6959 --- /dev/null +++ b/components/autofill/core/browser/address_validation_util.h
@@ -0,0 +1,23 @@ +// 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 COMPONENTS_AUTOFILL_CORE_BROWSER_ADDRESS_VALIDATION_UTIL_H_ +#define COMPONENTS_AUTOFILL_CORE_BROWSER_ADDRESS_VALIDATION_UTIL_H_ + +#include "components/autofill/core/browser/autofill_profile.h" +#include "third_party/libaddressinput/chromium/chrome_address_validator.h" + +namespace autofill { +namespace address_validation_util { + +// Validates the address fields of the |profile|. +// Returns the ValidityState of the |profile| according to its address fields. +AutofillProfile::ValidityState ValidateAddress( + AutofillProfile* profile, + AddressValidator* address_validator); + +} // namespace address_validation_util +} // namespace autofill + +#endif // COMPONENTS_AUTOFILL_CORE_BROWSER_ADDRESS_VALIDATION_UTIL_H_
diff --git a/components/autofill/core/browser/address_validation_util_unittest.cc b/components/autofill/core/browser/address_validation_util_unittest.cc new file mode 100644 index 0000000..c45f682d --- /dev/null +++ b/components/autofill/core/browser/address_validation_util_unittest.cc
@@ -0,0 +1,235 @@ +// 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 "components/autofill/core/browser/address_validation_util.h" + +#include <memory> +#include <string> + +#include "base/bind.h" +#include "base/guid.h" +#include "base/strings/utf_string_conversions.h" +#include "base/test/scoped_task_environment.h" +#include "components/autofill/core/browser/autofill_test_utils.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/libaddressinput/src/cpp/include/libaddressinput/null_storage.h" +#include "third_party/libaddressinput/src/cpp/test/testdata_source.h" + +namespace autofill { + +using ::i18n::addressinput::Source; +using ::i18n::addressinput::Storage; +using ::i18n::addressinput::NullStorage; +using ::i18n::addressinput::TestdataSource; + +// Used to load region rules for this test. +class ValidationTestDataSource : public TestdataSource { + public: + ValidationTestDataSource() : TestdataSource(true) {} + + ~ValidationTestDataSource() override {} + + void Get(const std::string& key, const Callback& data_ready) const override { + data_ready( + true, key, + new std::string( + "{" + "\"data/CA\": " + "{\"lang\": \"en\", \"upper\": \"ACNOSZ\", " + "\"zipex\": \"H3Z 2Y7,V8X 3X4,T0L 1K0,T0H 1A0\", " + "\"name\": \"CANADA\", " + "\"fmt\": \"%N%n%O%n%A%n%C %S %Z\", \"id\": \"data/CA\", " + "\"languages\": \"en~fr\", \"sub_keys\": \"NB~QC\", \"key\": " + "\"CA\", " + "\"require\": \"ACSZ\", \"sub_names\": \"New Brunswick~Quebec\", " + "\"sub_zips\": \"E~G|H|J\"}, " + "\"data/CA--fr\": " + "{\"lang\": \"fr\", \"upper\": \"ACNOSZ\", " + "\"zipex\": \"H3Z 2Y7,V8X 3X4,T0L 1K0,T0H 1A0\", " + "\"name\": \"CANADA\", " + "\"fmt\": \"%N%n%O%n%A%n%C %S %Z\", \"require\": \"ACSZ\", " + "\"sub_keys\": \"NB~QC\", \"key\": \"CA\", " + "\"id\": \"data/CA--fr\", " + "\"sub_names\":\"Nouveau-Brunswick~Québec\"," + "\"sub_zips\": \"E~G|H|J\"}, " + "\"data/CA/QC\": " + "{\"lang\": \"en\", \"key\": \"QC\", " + "\"id\": \"data/CA/QC\", \"zip\": \"G|H|J\", \"name\": \"Quebec\"}," + "\"data/CA/QC--fr\": " + "{\"lang\": \"fr\", \"key\": \"QC\", \"id\": \"data/CA/QC--fr\", " + "\"zip\": \"G|H|J\", \"name\": \"Québec\"}, " + "\"data/CA/NB\": " + "{\"lang\": \"en\", \"key\": \"NB\", \"id\": \"data/CA/NB\", " + "\"zip\": \"E\", \"name\": \"New Brunswick\"}, " + "\"data/CA/NB--fr\": " + "{\"lang\": \"fr\", \"key\": \"NB\", \"id\": \"data/CA/NB--fr\", " + "\"zip\": \"E\", \"name\": \"Nouveau-Brunswick\"}" + "}")); + } + + private: + DISALLOW_COPY_AND_ASSIGN(ValidationTestDataSource); +}; + +class AutofillAddressValidationTest : public testing::Test, LoadRulesListener { + public: + AutofillAddressValidationTest() + : validator_(std::unique_ptr<Source>(new ValidationTestDataSource()), + std::unique_ptr<Storage>(new NullStorage), + this) { + validator_.LoadRules("CA"); + } + + AutofillProfile::ValidityState ValidateAddressTest(AutofillProfile* profile) { + return address_validation_util::ValidateAddress(profile, &validator_); + } + + ~AutofillAddressValidationTest() override {} + + private: + AddressValidator validator_; + + // LoadRulesListener implementation. + void OnAddressValidationRulesLoaded(const std::string& country_code, + bool success) override {} + + DISALLOW_COPY_AND_ASSIGN(AutofillAddressValidationTest); +}; + +TEST_F(AutofillAddressValidationTest, ValidateNULLProfile) { + EXPECT_EQ(AutofillProfile::UNVALIDATED, ValidateAddressTest(nullptr)); +} + +TEST_F(AutofillAddressValidationTest, ValidateFullValidProfile) { + // This is a valid profile according to the rules in ValidationTestDataSource: + // Address Line 1: "666 Notre-Dame Ouest", + // Address Line 2: "Apt 8", City: "Montreal", Province: "QC", + // Postal Code: "H3B 2T9", Country Code: "CA", + AutofillProfile profile(autofill::test::GetFullValidProfile()); + EXPECT_EQ(AutofillProfile::VALID, ValidateAddressTest(&profile)); + EXPECT_EQ(AutofillProfile::VALID, + profile.GetValidityState(ADDRESS_HOME_COUNTRY)); + EXPECT_EQ(AutofillProfile::VALID, + profile.GetValidityState(ADDRESS_HOME_STATE)); + EXPECT_EQ(AutofillProfile::VALID, profile.GetValidityState(ADDRESS_HOME_ZIP)); +} + +TEST_F(AutofillAddressValidationTest, ValidateFullProfile_CountryCodeNotExist) { + // This is a profile with invalid country code, therefore it cannot be + // validated according to ValidationTestDataSource. + const std::string country_code = "PP"; + AutofillProfile profile(autofill::test::GetFullValidProfile()); + profile.SetRawInfo(ADDRESS_HOME_COUNTRY, base::UTF8ToUTF16(country_code)); + EXPECT_EQ(AutofillProfile::INVALID, ValidateAddressTest(&profile)); + EXPECT_EQ(AutofillProfile::INVALID, + profile.GetValidityState(ADDRESS_HOME_COUNTRY)); + EXPECT_EQ(AutofillProfile::UNVALIDATED, + profile.GetValidityState(ADDRESS_HOME_STATE)); + EXPECT_EQ(AutofillProfile::UNVALIDATED, + profile.GetValidityState(ADDRESS_HOME_ZIP)); +} + +TEST_F(AutofillAddressValidationTest, ValidateFullProfile_RuleNotAvailable) { + // This is a profile with valid country code, but the rule is not available in + // the ValidationTestDataSource. + const std::string country_code = "US"; + AutofillProfile profile(autofill::test::GetFullValidProfile()); + profile.SetRawInfo(ADDRESS_HOME_COUNTRY, base::UTF8ToUTF16(country_code)); + EXPECT_EQ(AutofillProfile::UNVALIDATED, ValidateAddressTest(&profile)); + EXPECT_EQ(AutofillProfile::VALID, + profile.GetValidityState(ADDRESS_HOME_COUNTRY)); + EXPECT_EQ(AutofillProfile::UNVALIDATED, + profile.GetValidityState(ADDRESS_HOME_STATE)); + EXPECT_EQ(AutofillProfile::UNVALIDATED, + profile.GetValidityState(ADDRESS_HOME_ZIP)); +} + +TEST_F(AutofillAddressValidationTest, ValidateAddress_AdminAreaNotExists) { + const std::string admin_area_code = "QQ"; + AutofillProfile profile(autofill::test::GetFullValidProfile()); + profile.SetRawInfo(ADDRESS_HOME_STATE, base::UTF8ToUTF16(admin_area_code)); + + EXPECT_EQ(AutofillProfile::INVALID, ValidateAddressTest(&profile)); + EXPECT_EQ(AutofillProfile::VALID, + profile.GetValidityState(ADDRESS_HOME_COUNTRY)); + EXPECT_EQ(AutofillProfile::INVALID, + profile.GetValidityState(ADDRESS_HOME_STATE)); + EXPECT_EQ(AutofillProfile::VALID, profile.GetValidityState(ADDRESS_HOME_ZIP)); +} + +TEST_F(AutofillAddressValidationTest, ValidateAddress_AdminAreaFullName) { + const std::string admin_area = "Quebec"; + AutofillProfile profile(autofill::test::GetFullValidProfile()); + profile.SetRawInfo(ADDRESS_HOME_STATE, base::UTF8ToUTF16(admin_area)); + + EXPECT_EQ(AutofillProfile::VALID, ValidateAddressTest(&profile)); + EXPECT_EQ(AutofillProfile::VALID, + profile.GetValidityState(ADDRESS_HOME_COUNTRY)); + EXPECT_EQ(AutofillProfile::VALID, + profile.GetValidityState(ADDRESS_HOME_STATE)); + EXPECT_EQ(AutofillProfile::VALID, profile.GetValidityState(ADDRESS_HOME_ZIP)); +} + +TEST_F(AutofillAddressValidationTest, ValidateAddress_AdminAreaSmallCode) { + const std::string admin_area = "qc"; + AutofillProfile profile(autofill::test::GetFullValidProfile()); + profile.SetRawInfo(ADDRESS_HOME_STATE, base::UTF8ToUTF16(admin_area)); + + EXPECT_EQ(AutofillProfile::VALID, ValidateAddressTest(&profile)); + EXPECT_EQ(AutofillProfile::VALID, + profile.GetValidityState(ADDRESS_HOME_COUNTRY)); + EXPECT_EQ(AutofillProfile::VALID, + profile.GetValidityState(ADDRESS_HOME_STATE)); + EXPECT_EQ(AutofillProfile::VALID, profile.GetValidityState(ADDRESS_HOME_ZIP)); +} + +TEST_F(AutofillAddressValidationTest, ValidateAddress_AdminAreaSpecialLetter) { + const std::string admin_area = "Québec"; + AutofillProfile profile(autofill::test::GetFullValidProfile()); + profile.SetRawInfo(ADDRESS_HOME_STATE, base::UTF8ToUTF16(admin_area)); + + EXPECT_EQ(AutofillProfile::VALID, ValidateAddressTest(&profile)); + EXPECT_EQ(AutofillProfile::VALID, + profile.GetValidityState(ADDRESS_HOME_COUNTRY)); + EXPECT_EQ(AutofillProfile::VALID, + profile.GetValidityState(ADDRESS_HOME_STATE)); + EXPECT_EQ(AutofillProfile::VALID, profile.GetValidityState(ADDRESS_HOME_ZIP)); +} + +TEST_F(AutofillAddressValidationTest, ValidateAddress_ValidZipNoSpace) { + // TODO(crbug/752614): postal codes in lower case letters should also be + // considered as valid. Now, they are considered as INVALID. + const std::string postal_code = "H3C6S3"; + AutofillProfile profile(autofill::test::GetFullValidProfile()); + profile.SetRawInfo(ADDRESS_HOME_ZIP, base::UTF8ToUTF16(postal_code)); + + EXPECT_EQ(AutofillProfile::VALID, ValidateAddressTest(&profile)); + EXPECT_EQ(AutofillProfile::VALID, + profile.GetValidityState(ADDRESS_HOME_COUNTRY)); + EXPECT_EQ(AutofillProfile::VALID, + profile.GetValidityState(ADDRESS_HOME_STATE)); + EXPECT_EQ(AutofillProfile::VALID, profile.GetValidityState(ADDRESS_HOME_ZIP)); +} + +TEST_F(AutofillAddressValidationTest, ValidateAddress_InvalidZip) { + const std::string postal_code = "ABC 123"; + AutofillProfile profile(autofill::test::GetFullValidProfile()); + profile.SetRawInfo(ADDRESS_HOME_ZIP, base::UTF8ToUTF16(postal_code)); + + EXPECT_EQ(AutofillProfile::INVALID, ValidateAddressTest(&profile)); + EXPECT_EQ(AutofillProfile::VALID, + profile.GetValidityState(ADDRESS_HOME_COUNTRY)); + EXPECT_EQ(AutofillProfile::VALID, + profile.GetValidityState(ADDRESS_HOME_STATE)); + EXPECT_EQ(AutofillProfile::INVALID, + profile.GetValidityState(ADDRESS_HOME_ZIP)); +} + +// TODO(crbug/754727): add tests for a non-default language. +// Ex: Nouveau-Brunswick for Canada. + +// TODO(crbug/754729): Add tests for a country whose default language is a +// non-Western one, such as China. + +} // namespace autofill
diff --git a/components/autofill/core/browser/autofill_profile_validator.cc b/components/autofill/core/browser/autofill_profile_validator.cc new file mode 100644 index 0000000..5fd3b327 --- /dev/null +++ b/components/autofill/core/browser/autofill_profile_validator.cc
@@ -0,0 +1,129 @@ +// 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 "components/autofill/core/browser/autofill_profile_validator.h" + +#include <utility> + +#include "base/bind.h" +#include "base/bind_helpers.h" +#include "base/cancelable_callback.h" +#include "base/logging.h" +#include "base/memory/ptr_util.h" +#include "base/strings/utf_string_conversions.h" +#include "base/threading/sequenced_task_runner_handle.h" +#include "base/time/time.h" +#include "components/autofill/core/browser/address_validation_util.h" +#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_data.h" +#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_validator.h" + +namespace autofill { +namespace { + +using ::i18n::addressinput::COUNTRY; +using ::i18n::addressinput::ADMIN_AREA; +using ::i18n::addressinput::LOCALITY; +using ::i18n::addressinput::DEPENDENT_LOCALITY; +using ::i18n::addressinput::SORTING_CODE; +using ::i18n::addressinput::POSTAL_CODE; +using ::i18n::addressinput::STREET_ADDRESS; +using ::i18n::addressinput::RECIPIENT; + +const int kRulesLoadingTimeoutSeconds = 5; + +} // namespace + +AutofillProfileValidator::ValidationRequest::ValidationRequest( + AutofillProfile* profile, + autofill::AddressValidator* validator, + AutofillProfileValidatorCallback on_validated) + : profile_(profile), + validator_(validator), + on_validated_(std::move(on_validated)), + has_responded_(false), + on_timeout_(base::Bind(&ValidationRequest::OnRulesLoaded, + base::Unretained(this))) { + DCHECK(profile_); + base::SequencedTaskRunnerHandle::Get()->PostDelayedTask( + FROM_HERE, on_timeout_.callback(), + base::TimeDelta::FromSeconds(kRulesLoadingTimeoutSeconds)); +} + +AutofillProfileValidator::ValidationRequest::~ValidationRequest() { + on_timeout_.Cancel(); +} + +void AutofillProfileValidator::ValidationRequest::OnRulesLoaded() { + on_timeout_.Cancel(); + // Check if the timeout happened before the rules were loaded. + if (has_responded_) + return; + has_responded_ = true; + AutofillProfile::ValidityState profile_validity = + address_validation_util::ValidateAddress(profile_, validator_); + std::move(on_validated_).Run(profile_validity); +} + +AutofillProfileValidator::AutofillProfileValidator( + std::unique_ptr<Source> source, + std::unique_ptr<Storage> storage) + : address_validator_(std::move(source), std::move(storage), this) {} + +AutofillProfileValidator::~AutofillProfileValidator() {} + +void AutofillProfileValidator::ValidateProfile( + AutofillProfile* profile, + AutofillProfileValidatorCallback cb) { + if (!profile) { + // An null profile is an unvalidated profile. + std::move(cb).Run(AutofillProfile::UNVALIDATED); + return; + } + std::unique_ptr<ValidationRequest> request( + base::MakeUnique<ValidationRequest>(profile, &address_validator_, + std::move(cb))); + + // If the |region_code| is not a valid code according to our source, calling + // LoadRules would result in calling OnAddressValidationRulesLoaded with + // success = false. Thus, we can handle illegitimate |region_code|'s as well. + std::string region_code = + base::UTF16ToUTF8(profile->GetRawInfo(ADDRESS_HOME_COUNTRY)); + if (address_validator_.AreRulesLoadedForRegion(region_code)) { + request->OnRulesLoaded(); + } else { + // Setup the variables to start validation when the rules are loaded. + pending_requests_[region_code].push_back(std::move(request)); + + // Start loading the rules for the region. If the rules were already in the + // process of being loaded, this call will do nothing. + address_validator_.LoadRules(region_code); + } +} + +void AutofillProfileValidator::OnAddressValidationRulesLoaded( + const std::string& region_code, + bool success) { + // Even if success = false, we can still validate address partially. We can + // check for missing fields or unexpected fields. + + // Check if there is any request for that region code. + auto it = pending_requests_.find(region_code); + if (it != pending_requests_.end()) { + for (auto& request : it->second) { + request->OnRulesLoaded(); + } + pending_requests_.erase(it); + } +} + +bool AutofillProfileValidator::AreRulesLoadedForRegion( + const std::string& region_code) { + return address_validator_.AreRulesLoadedForRegion(region_code); +} + +void AutofillProfileValidator::LoadRulesForRegion( + const std::string& region_code) { + address_validator_.LoadRules(region_code); +} +} // namespace autofill
diff --git a/components/autofill/core/browser/autofill_profile_validator.h b/components/autofill/core/browser/autofill_profile_validator.h new file mode 100644 index 0000000..e1d4bab --- /dev/null +++ b/components/autofill/core/browser/autofill_profile_validator.h
@@ -0,0 +1,108 @@ +// 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 COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_PROFILE_VALIDATOR_H_ +#define COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_PROFILE_VALIDATOR_H_ + +#include <stddef.h> + +#include <map> +#include <memory> +#include <string> +#include <vector> + +#include "base/cancelable_callback.h" +#include "base/macros.h" +#include "components/autofill/core/browser/address_i18n.h" +#include "components/autofill/core/browser/address_validation_util.h" +#include "components/autofill/core/browser/autofill_profile.h" +#include "third_party/libaddressinput/chromium/chrome_address_validator.h" +#include "third_party/libaddressinput/src/cpp/include/libaddressinput/preload_supplier.h" +#include "third_party/libaddressinput/src/cpp/include/libaddressinput/source.h" +#include "third_party/libaddressinput/src/cpp/include/libaddressinput/storage.h" + +namespace autofill { + +using ::i18n::addressinput::BuildCallback; +using ::i18n::addressinput::PreloadSupplier; +using ::i18n::addressinput::Source; +using ::i18n::addressinput::Storage; + +using AutofillProfileValidatorCallback = + base::OnceCallback<void(AutofillProfile::ValidityState)>; + +// AutofillProfileValidator Loads Rules from the server and validates an +// autofill profile. For a given autofill profile, it will set the ValidityState +// of several fields in the profile such as country, administrative area, etc. +// See implementation for more details. +class AutofillProfileValidator : public autofill::LoadRulesListener { + public: + // Takes ownership of |source| and |storage|. + AutofillProfileValidator( + std::unique_ptr<::i18n::addressinput::Source> source, + std::unique_ptr<::i18n::addressinput::Storage> storage); + + ~AutofillProfileValidator() override; + + // If the rule corresponding to the |profile| is loaded, this validates the + // profile, synchronously. If it is not loaded yet, it sets up a + // task to validate the profile when the rule is loaded (asynchronous). If the + // loading has not yet started, it will also start loading the rules. + void ValidateProfile(AutofillProfile* profile, + AutofillProfileValidatorCallback cb); + + private: + // ValidationRequest loads Rules from the server and validates various fields + // in an autofill profile. + class ValidationRequest { + public: + ValidationRequest(AutofillProfile* profile, + autofill::AddressValidator* validator, + AutofillProfileValidatorCallback on_validated); + + ~ValidationRequest(); + + // Validates various fields of the |profile_|, and calls |on_validated_|. + void OnRulesLoaded(); + + private: + // Not owned. Not Null. Outlives this object. + AutofillProfile* profile_; + // Not owned. Outlives this object. + autofill::AddressValidator* validator_; + + AutofillProfileValidatorCallback on_validated_; + + bool has_responded_ = false; + base::CancelableCallback<void()> on_timeout_; + + DISALLOW_COPY_AND_ASSIGN(ValidationRequest); + }; + + friend class AutofillProfileValidatorTest; + + // Returns whether the rules for the specified |region_code| is loaded. + bool AreRulesLoadedForRegion(const std::string& region_code); + + // Starts loading the rules for the specified |region_code|. + void LoadRulesForRegion(const std::string& region_code); + + // Implementation of the LoadRulesListener interface. Called when the address + // rules for the |region_code| have finished loading. + void OnAddressValidationRulesLoaded(const std::string& region_code, + bool success) override; + + // A map of the region code and the pending requests for that region code. + std::map<std::string, std::vector<std::unique_ptr<ValidationRequest>>> + pending_requests_; + + // The address validator used to load rules. + autofill::AddressValidator address_validator_; + + DISALLOW_COPY_AND_ASSIGN(AutofillProfileValidator); +}; + +} // namespace autofill + +#endif // COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_PROFILE_VALIDATOR_H_
diff --git a/components/autofill/core/browser/autofill_profile_validator_unittest.cc b/components/autofill/core/browser/autofill_profile_validator_unittest.cc new file mode 100644 index 0000000..e17c0196 --- /dev/null +++ b/components/autofill/core/browser/autofill_profile_validator_unittest.cc
@@ -0,0 +1,165 @@ +// 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 "components/autofill/core/browser/autofill_profile_validator.h" + +#include <stddef.h> +#include <set> +#include <string> +#include <utility> +#include <vector> + +#include "base/bind.h" +#include "base/guid.h" +#include "base/strings/utf_string_conversions.h" +#include "base/test/scoped_task_environment.h" +#include "components/autofill/core/browser/autofill_test_utils.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/libaddressinput/src/cpp/include/libaddressinput/null_storage.h" +#include "third_party/libaddressinput/src/cpp/test/testdata_source.h" + +namespace autofill { + +using ::i18n::addressinput::NullStorage; +using ::i18n::addressinput::TestdataSource; + +using ::i18n::addressinput::COUNTRY; +using ::i18n::addressinput::ADMIN_AREA; +using ::i18n::addressinput::LOCALITY; +using ::i18n::addressinput::DEPENDENT_LOCALITY; +using ::i18n::addressinput::SORTING_CODE; +using ::i18n::addressinput::POSTAL_CODE; +using ::i18n::addressinput::STREET_ADDRESS; +using ::i18n::addressinput::RECIPIENT; + +// Used to load region rules for this test. +class ValidationTestDataSource : public TestdataSource { + public: + ValidationTestDataSource() : TestdataSource(true) {} + + ~ValidationTestDataSource() override {} + + void Get(const std::string& key, const Callback& data_ready) const override { + data_ready( + true, key, + new std::string( + "{" + "\"data/CA\": " + "{\"lang\": \"en\", \"upper\": \"ACNOSZ\", " + "\"zipex\": \"H3Z 2Y7,V8X 3X4,T0L 1K0,T0H 1A0\", " + "\"name\": \"CANADA\", " + "\"fmt\": \"%N%n%O%n%A%n%C %S %Z\", \"id\": \"data/CA\", " + "\"languages\": \"en\", \"sub_keys\": \"QC\", \"key\": " + "\"CA\", " + "\"require\": \"ACSZ\", \"sub_names\": \"Quebec\", " + "\"sub_zips\": \"G|H|J\"}, " + "\"data/CA/QC\": " + "{\"lang\": \"en\", \"key\": \"QC\", " + "\"id\": \"data/CA/QC\", \"zip\": \"G|H|J\", \"name\": \"Quebec\"}" + "}")); + } + + private: + DISALLOW_COPY_AND_ASSIGN(ValidationTestDataSource); +}; + +class AutofillProfileValidatorTest : public testing::Test { + public: + AutofillProfileValidatorTest() + : validator_(new AutofillProfileValidator( + std::unique_ptr<Source>(new ValidationTestDataSource()), + std::unique_ptr<Storage>(new NullStorage))), + onvalidated_cb_( + base::BindOnce(&AutofillProfileValidatorTest::OnValidated, + base::Unretained(this))) {} + + protected: + const std::unique_ptr<AutofillProfileValidator> validator_; + + ~AutofillProfileValidatorTest() override {} + + void OnValidated(AutofillProfile::ValidityState profile_valid) { + EXPECT_EQ(expected_validity_state_, profile_valid); + } + + void set_expected_status(AutofillProfile::ValidityState profile_valid) { + expected_validity_state_ = profile_valid; + } + + bool AreRulesLoadedForRegion(std::string region_code) { + return validator_->AreRulesLoadedForRegion(region_code); + } + + void LoadRulesForRegion(std::string region_code) { + validator_->LoadRulesForRegion(region_code); + } + + AutofillProfileValidatorCallback onvalidated_cb_; + + private: + AutofillProfile::ValidityState expected_validity_state_; + + base::test::ScopedTaskEnvironment scoped_task_scheduler; + + DISALLOW_COPY_AND_ASSIGN(AutofillProfileValidatorTest); +}; + +// Validate a Null profile. +TEST_F(AutofillProfileValidatorTest, ValidateNullProfile) { + set_expected_status(AutofillProfile::UNVALIDATED); + validator_->ValidateProfile(nullptr, std::move(onvalidated_cb_)); +} +// Validate a valid profile, for which the rules are not loaded, yet. +TEST_F(AutofillProfileValidatorTest, ValidateFullValidProfile_RulesNotLoaded) { + // This is a valid profile, and the rules are loaded in the constructors + // Province: "QC", Country: "CA" + AutofillProfile profile(autofill::test::GetFullValidProfile()); + set_expected_status(AutofillProfile::VALID); + + std::string country_code = + base::UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_COUNTRY)); + EXPECT_EQ(false, AreRulesLoadedForRegion(country_code)); + + validator_->ValidateProfile(&profile, std::move(onvalidated_cb_)); +} + +// Validate a Full Profile, for which the rules are already loaded. +TEST_F(AutofillProfileValidatorTest, ValidateAddress_RulesLoaded) { + AutofillProfile profile(autofill::test::GetFullValidProfile()); + set_expected_status(AutofillProfile::VALID); + + std::string country_code = + base::UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_COUNTRY)); + LoadRulesForRegion(country_code); + EXPECT_EQ(true, AreRulesLoadedForRegion(country_code)); + + validator_->ValidateProfile(&profile, std::move(onvalidated_cb_)); +} + +// When country code is invalid, the profile is invalid. +TEST_F(AutofillProfileValidatorTest, ValidateAddress_CountryCodeNotExists) { + const std::string country_code = "PP"; + AutofillProfile profile(autofill::test::GetFullValidProfile()); + profile.SetRawInfo(ADDRESS_HOME_COUNTRY, base::UTF8ToUTF16(country_code)); + set_expected_status(AutofillProfile::INVALID); + + EXPECT_EQ(false, AreRulesLoadedForRegion(country_code)); + + validator_->ValidateProfile(&profile, std::move(onvalidated_cb_)); +} + +// When country code is valid, but the rule is not in the source, the profile +// is unvalidated. +TEST_F(AutofillProfileValidatorTest, ValidateAddress_RuleNotExists) { + const std::string country_code = "US"; + AutofillProfile profile(autofill::test::GetFullValidProfile()); + profile.SetRawInfo(ADDRESS_HOME_COUNTRY, base::UTF8ToUTF16(country_code)); + set_expected_status(AutofillProfile::UNVALIDATED); + + EXPECT_EQ(false, AreRulesLoadedForRegion(country_code)); + + validator_->ValidateProfile(&profile, std::move(onvalidated_cb_)); +} + +} // namespace autofill
diff --git a/components/autofill/core/browser/autofill_test_utils.cc b/components/autofill/core/browser/autofill_test_utils.cc index f6a122ef..aa3b5952 100644 --- a/components/autofill/core/browser/autofill_test_utils.cc +++ b/components/autofill/core/browser/autofill_test_utils.cc
@@ -183,6 +183,14 @@ profile->SetRawInfo(type, base::UTF8ToUTF16(value)); } +AutofillProfile GetFullValidProfile() { + AutofillProfile profile(base::GenerateGUID(), "http://www.example.com/"); + SetProfileInfo(&profile, "Alice", "", "Wonderland", "alice@wonderland.ca", + "Fiction", "666 Notre-Dame Ouest", "Apt 8", "Montreal", "QC", + "H3B 2T9", "CA", "15141112233"); + return profile; +} + AutofillProfile GetFullProfile() { AutofillProfile profile(base::GenerateGUID(), "http://www.example.com/"); SetProfileInfo(&profile,
diff --git a/components/autofill/core/browser/autofill_test_utils.h b/components/autofill/core/browser/autofill_test_utils.h index 65817d8..708f3a64 100644 --- a/components/autofill/core/browser/autofill_test_utils.h +++ b/components/autofill/core/browser/autofill_test_utils.h
@@ -65,6 +65,9 @@ void CreateTestAddressFormData(FormData* form, std::vector<ServerFieldTypeSet>* types); +// Returns a full profile with valid info. +AutofillProfile GetFullValidProfile(); + // Returns a profile full of dummy info. AutofillProfile GetFullProfile();
diff --git a/components/autofill/core/browser/validation.cc b/components/autofill/core/browser/validation.cc index 60726b8e..c09ea98 100644 --- a/components/autofill/core/browser/validation.cc +++ b/components/autofill/core/browser/validation.cc
@@ -48,7 +48,7 @@ // Credit card numbers are at most 19 digits in length, 12 digits seems to // be a fairly safe lower-bound [1]. Specific card issuers have more rigidly - // defined sizes. + // defined sizes. // (Last updated: May 29, 2017) // [1] https://en.wikipedia.org/wiki/Payment_card_number. // CardEditor.isCardNumberLengthMaxium() needs to be kept in sync. @@ -176,6 +176,23 @@ } } +base::string16 GetEditDialogTitleForCard(CreditCardCompletionStatus status) { + switch (status) { + case CREDIT_CARD_COMPLETE: + case CREDIT_CARD_EXPIRED: + return l10n_util::GetStringUTF16(IDS_PAYMENTS_EDIT_CARD); + case CREDIT_CARD_NO_CARDHOLDER: + return l10n_util::GetStringUTF16(IDS_PAYMENTS_ADD_NAME_ON_CARD); + case CREDIT_CARD_NO_NUMBER: + return l10n_util::GetStringUTF16(IDS_PAYMENTS_ADD_VALID_CARD_NUMBER); + case CREDIT_CARD_NO_BILLING_ADDRESS: + return l10n_util::GetStringUTF16(IDS_PAYMENTS_ADD_BILLING_ADDRESS); + default: + // Multiple things are missing + return l10n_util::GetStringUTF16(IDS_PAYMENTS_ADD_MORE_INFORMATION); + } +} + bool IsValidEmailAddress(const base::string16& text) { // E-Mail pattern as defined by the WhatWG. (4.10.7.1.5 E-Mail state) const base::string16 kEmailPattern = base::ASCIIToUTF16(
diff --git a/components/autofill/core/browser/validation.h b/components/autofill/core/browser/validation.h index 531cf27..ebcf5db 100644 --- a/components/autofill/core/browser/validation.h +++ b/components/autofill/core/browser/validation.h
@@ -69,6 +69,11 @@ // missing, the message will be a generic "more information required". base::string16 GetCompletionMessageForCard(CreditCardCompletionStatus status); +// Returns the title string for a card edit dialog. The title string will +// mention what needs to be added/fixed to make the card valid if it is not +// valid. Otherwise, it will be "Edit card". +base::string16 GetEditDialogTitleForCard(CreditCardCompletionStatus status); + // Returns true if |text| looks like a valid e-mail address. bool IsValidEmailAddress(const base::string16& text);
diff --git a/components/crash/content/browser/child_process_crash_observer_android.cc b/components/crash/content/browser/child_process_crash_observer_android.cc index b9ae22bb..b59a0dd 100644 --- a/components/crash/content/browser/child_process_crash_observer_android.cc +++ b/components/crash/content/browser/child_process_crash_observer_android.cc
@@ -45,8 +45,8 @@ FROM_HERE, {base::MayBlock(), base::TaskPriority::BACKGROUND}, base::Bind(&CrashDumpManager::ProcessMinidumpFileFromChild, base::Unretained(CrashDumpManager::GetInstance()), - crash_dump_dir_, pid, process_type, termination_status, - app_state)); + crash_dump_dir_, child_process_id, process_type, + termination_status, app_state)); } } // namespace breakpad
diff --git a/components/dom_distiller/content/renderer/distiller_js_render_frame_observer.h b/components/dom_distiller/content/renderer/distiller_js_render_frame_observer.h index e8cbe79..6a67caec 100644 --- a/components/dom_distiller/content/renderer/distiller_js_render_frame_observer.h +++ b/components/dom_distiller/content/renderer/distiller_js_render_frame_observer.h
@@ -12,7 +12,6 @@ #include "content/public/renderer/render_frame.h" #include "content/public/renderer/render_frame_observer.h" #include "services/service_manager/public/cpp/binder_registry.h" -#include "third_party/WebKit/public/web/WebLocalFrame.h" #include "v8/include/v8.h" namespace dom_distiller {
diff --git a/components/dom_distiller/content/renderer/distiller_native_javascript.cc b/components/dom_distiller/content/renderer/distiller_native_javascript.cc index f4293659..ae6959a 100644 --- a/components/dom_distiller/content/renderer/distiller_native_javascript.cc +++ b/components/dom_distiller/content/renderer/distiller_native_javascript.cc
@@ -14,11 +14,8 @@ #include "gin/function_template.h" #include "services/service_manager/public/cpp/interface_provider.h" #include "third_party/WebKit/public/web/WebKit.h" -#include "third_party/WebKit/public/web/WebLocalFrame.h" #include "v8/include/v8.h" -using blink::WebLocalFrame; - namespace dom_distiller { DistillerNativeJavaScript::DistillerNativeJavaScript(
diff --git a/components/feature_engagement/public/event_constants.cc b/components/feature_engagement/public/event_constants.cc index 72ea6bd..b2fb65c 100644 --- a/components/feature_engagement/public/event_constants.cc +++ b/components/feature_engagement/public/event_constants.cc
@@ -10,11 +10,11 @@ #if defined(OS_WIN) || defined(OS_LINUX) const char kOmniboxInteraction[] = "omnibox_used"; +const char kNewTabSessionTimeMet[] = "new_tab_session_time_met"; const char kHistoryDeleted[] = "history_deleted"; const char kIncognitoWindowOpened[] = "incognito_window_opened"; -const char kSessionTime[] = "session_time"; #endif // defined(OS_WIN) || defined(OS_LINUX) #if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_IOS)
diff --git a/components/feature_engagement/public/event_constants.h b/components/feature_engagement/public/event_constants.h index 0b93423..e6d514b2 100644 --- a/components/feature_engagement/public/event_constants.h +++ b/components/feature_engagement/public/event_constants.h
@@ -17,6 +17,9 @@ // The user has interacted with the omnibox. extern const char kOmniboxInteraction[]; +// The user has satisfied the session time requirement to show the NewTabPromo +// by accumulating 2 hours of active session time (one-off event). +extern const char kNewTabSessionTimeMet[]; // All the events declared below are the string names // of deferred onboarding events for the Incognito Window @@ -26,12 +29,6 @@ // The user has opened an incognito window. extern const char kIncognitoWindowOpened[]; -// All the events declared below are the string names -// of common deferred onboarding events - -// The user has accumulated 2 hours of active session time (one-off event). -extern const char kSessionTime[]; - #endif // defined(OS_WIN) || defined(OS_LINUX) #if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_IOS)
diff --git a/components/feedback/system_logs/system_logs_fetcher.h b/components/feedback/system_logs/system_logs_fetcher.h index 1799d4f..238bb60 100644 --- a/components/feedback/system_logs/system_logs_fetcher.h +++ b/components/feedback/system_logs/system_logs_fetcher.h
@@ -51,7 +51,8 @@ // Adds a source to use when fetching. void AddSource(std::unique_ptr<SystemLogsSource> source); - // Starts the fetch process. + // Starts the fetch process. After the fetch completes, this instance calls + // |callback|, then schedules itself to be deleted. void Fetch(const SysLogsFetcherCallback& callback); private:
diff --git a/components/guest_view/browser/bad_message.h b/components/guest_view/browser/bad_message.h index 2e81eed2..a0b2c4c 100644 --- a/components/guest_view/browser/bad_message.h +++ b/components/guest_view/browser/bad_message.h
@@ -23,6 +23,7 @@ // values in histograms. enum BadMessageReason { GVM_EMBEDDER_FORBIDDEN_ACCESS_TO_GUEST = 0, + GVM_INVALID_GUESTVIEW_TYPE = 1, // Please add new elements here. The naming convention is abbreviated class // name (e.g. GuestViewManager becomes GVM) plus a unique description of
diff --git a/components/guest_view/browser/guest_view_manager.cc b/components/guest_view/browser/guest_view_manager.cc index ec30cd29..12b34750 100644 --- a/components/guest_view/browser/guest_view_manager.cc +++ b/components/guest_view/browser/guest_view_manager.cc
@@ -304,8 +304,11 @@ if (guest_view_registry_.empty()) RegisterGuestViewTypes(); auto view_it = guest_view_registry_.find(view_type); - CHECK(view_it != guest_view_registry_.end()) - << "Invalid GuestView created of type \"" << view_type << "\""; + if (view_it == guest_view_registry_.end()) { + bad_message::ReceivedBadMessage(embedder_process_id, + bad_message::GVM_INVALID_GUESTVIEW_TYPE); + return; + } // Register the cleanup callback for when this view is destroyed. RegisterViewDestructionCallback(embedder_process_id,
diff --git a/components/infobars/core/infobar_delegate.h b/components/infobars/core/infobar_delegate.h index 1405106..513d447 100644 --- a/components/infobars/core/infobar_delegate.h +++ b/components/infobars/core/infobar_delegate.h
@@ -240,7 +240,7 @@ protected: InfoBarDelegate(); - InfoBar* infobar() { return infobar_; } + InfoBar* infobar() const { return infobar_; } private: // The InfoBar associated with us.
diff --git a/components/ntp_snippets/BUILD.gn b/components/ntp_snippets/BUILD.gn index 81a03549..84b1769 100644 --- a/components/ntp_snippets/BUILD.gn +++ b/components/ntp_snippets/BUILD.gn
@@ -42,8 +42,13 @@ "content_suggestions_provider.h", "content_suggestions_service.cc", "content_suggestions_service.h", - "contextual_suggestions_source.cc", - "contextual_suggestions_source.h", + "contextual/contextual_json_request.cc", + "contextual/contextual_json_request.h", + "contextual/contextual_suggestions_fetcher.h", + "contextual/contextual_suggestions_fetcher_impl.cc", + "contextual/contextual_suggestions_fetcher_impl.h", + "contextual/contextual_suggestions_source.cc", + "contextual/contextual_suggestions_source.h", "features.cc", "features.h", "ntp_snippets_constants.cc", @@ -60,11 +65,6 @@ "reading_list/reading_list_suggestions_provider.h", "remote/cached_image_fetcher.cc", "remote/cached_image_fetcher.h", - "remote/contextual_json_request.cc", - "remote/contextual_json_request.h", - "remote/contextual_suggestions_fetcher.h", - "remote/contextual_suggestions_fetcher_impl.cc", - "remote/contextual_suggestions_fetcher_impl.h", "remote/json_request.cc", "remote/json_request.h", "remote/json_to_categories.cc", @@ -182,13 +182,13 @@ "category_unittest.cc", "content_suggestions_metrics_unittest.cc", "content_suggestions_service_unittest.cc", - "contextual_suggestions_source_unittest.cc", + "contextual/contextual_json_request_unittest.cc", + "contextual/contextual_suggestions_fetcher_impl_unittest.cc", + "contextual/contextual_suggestions_source_unittest.cc", "offline_pages/recent_tab_suggestions_provider_unittest.cc", "physical_web_pages/physical_web_page_suggestions_provider_unittest.cc", "reading_list/reading_list_suggestions_provider_unittest.cc", "remote/cached_image_fetcher_unittest.cc", - "remote/contextual_json_request_unittest.cc", - "remote/contextual_suggestions_fetcher_impl_unittest.cc", "remote/json_request_unittest.cc", "remote/prefetched_pages_tracker_impl_unittest.cc", "remote/remote_suggestion_unittest.cc",
diff --git a/components/ntp_snippets/content_suggestions_service.h b/components/ntp_snippets/content_suggestions_service.h index e1624e6f..aa9837d 100644 --- a/components/ntp_snippets/content_suggestions_service.h +++ b/components/ntp_snippets/content_suggestions_service.h
@@ -26,7 +26,7 @@ #include "components/ntp_snippets/category_rankers/category_ranker.h" #include "components/ntp_snippets/category_status.h" #include "components/ntp_snippets/content_suggestions_provider.h" -#include "components/ntp_snippets/contextual_suggestions_source.h" +#include "components/ntp_snippets/contextual/contextual_suggestions_source.h" #include "components/ntp_snippets/remote/remote_suggestions_scheduler.h" #include "components/ntp_snippets/user_classifier.h" #include "components/signin/core/browser/signin_manager.h"
diff --git a/components/ntp_snippets/remote/contextual_json_request.cc b/components/ntp_snippets/contextual/contextual_json_request.cc similarity index 98% rename from components/ntp_snippets/remote/contextual_json_request.cc rename to components/ntp_snippets/contextual/contextual_json_request.cc index 66e7754..2aba9e5f 100644 --- a/components/ntp_snippets/remote/contextual_json_request.cc +++ b/components/ntp_snippets/contextual/contextual_json_request.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/ntp_snippets/remote/contextual_json_request.h" +#include "components/ntp_snippets/contextual/contextual_json_request.h" #include <algorithm> #include <utility>
diff --git a/components/ntp_snippets/remote/contextual_json_request.h b/components/ntp_snippets/contextual/contextual_json_request.h similarity index 94% rename from components/ntp_snippets/remote/contextual_json_request.h rename to components/ntp_snippets/contextual/contextual_json_request.h index cf379da..9898805 100644 --- a/components/ntp_snippets/remote/contextual_json_request.h +++ b/components/ntp_snippets/contextual/contextual_json_request.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_NTP_SNIPPETS_REMOTE_CONTEXTUAL_JSON_REQUEST_H_ -#define COMPONENTS_NTP_SNIPPETS_REMOTE_CONTEXTUAL_JSON_REQUEST_H_ +#ifndef COMPONENTS_NTP_SNIPPETS_CONTEXTUAL_CONTEXTUAL_JSON_REQUEST_H_ +#define COMPONENTS_NTP_SNIPPETS_CONTEXTUAL_CONTEXTUAL_JSON_REQUEST_H_ #include <memory> #include <string> @@ -112,4 +112,4 @@ } // namespace ntp_snippets -#endif // COMPONENTS_NTP_SNIPPETS_REMOTE_CONTEXTUAL_JSON_REQUEST_H_ +#endif // COMPONENTS_NTP_SNIPPETS_CONTEXTUAL_CONTEXTUAL_JSON_REQUEST_H_
diff --git a/components/ntp_snippets/remote/contextual_json_request_unittest.cc b/components/ntp_snippets/contextual/contextual_json_request_unittest.cc similarity index 97% rename from components/ntp_snippets/remote/contextual_json_request_unittest.cc rename to components/ntp_snippets/contextual/contextual_json_request_unittest.cc index af37225a..d501dd1 100644 --- a/components/ntp_snippets/remote/contextual_json_request_unittest.cc +++ b/components/ntp_snippets/contextual/contextual_json_request_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/ntp_snippets/remote/contextual_json_request.h" +#include "components/ntp_snippets/contextual/contextual_json_request.h" #include <utility>
diff --git a/components/ntp_snippets/remote/contextual_suggestions_fetcher.h b/components/ntp_snippets/contextual/contextual_suggestions_fetcher.h similarity index 84% rename from components/ntp_snippets/remote/contextual_suggestions_fetcher.h rename to components/ntp_snippets/contextual/contextual_suggestions_fetcher.h index 3a488dbd..fb5794f 100644 --- a/components/ntp_snippets/remote/contextual_suggestions_fetcher.h +++ b/components/ntp_snippets/contextual/contextual_suggestions_fetcher.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_NTP_SNIPPETS_REMOTE_CONTEXTUAL_SUGGESTIONS_FETCHER_H_ -#define COMPONENTS_NTP_SNIPPETS_REMOTE_CONTEXTUAL_SUGGESTIONS_FETCHER_H_ +#ifndef COMPONENTS_NTP_SNIPPETS_CONTEXTUAL_CONTEXTUAL_SUGGESTIONS_FETCHER_H_ +#define COMPONENTS_NTP_SNIPPETS_CONTEXTUAL_CONTEXTUAL_SUGGESTIONS_FETCHER_H_ #include <memory> #include <string> @@ -41,4 +41,4 @@ } // namespace ntp_snippets -#endif // COMPONENTS_NTP_SNIPPETS_REMOTE_CONTEXTUAL_SUGGESTIONS_FETCHER_H_ +#endif // COMPONENTS_NTP_SNIPPETS_CONTEXTUAL_CONTEXTUAL_SUGGESTIONS_FETCHER_H_
diff --git a/components/ntp_snippets/remote/contextual_suggestions_fetcher_impl.cc b/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl.cc similarity index 98% rename from components/ntp_snippets/remote/contextual_suggestions_fetcher_impl.cc rename to components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl.cc index 5a1977e..dcf9d84 100644 --- a/components/ntp_snippets/remote/contextual_suggestions_fetcher_impl.cc +++ b/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/ntp_snippets/remote/contextual_suggestions_fetcher_impl.h" +#include "components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl.h" #include "base/memory/ptr_util.h" #include "base/strings/stringprintf.h"
diff --git a/components/ntp_snippets/remote/contextual_suggestions_fetcher_impl.h b/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl.h similarity index 89% rename from components/ntp_snippets/remote/contextual_suggestions_fetcher_impl.h rename to components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl.h index 84de3d3..d0c9f1d9 100644 --- a/components/ntp_snippets/remote/contextual_suggestions_fetcher_impl.h +++ b/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_NTP_SNIPPETS_REMOTE_CONTEXTUAL_SUGGESTIONS_FETCHER_IMPL_H_ -#define COMPONENTS_NTP_SNIPPETS_REMOTE_CONTEXTUAL_SUGGESTIONS_FETCHER_IMPL_H_ +#ifndef COMPONENTS_NTP_SNIPPETS_CONTEXTUAL_CONTEXTUAL_SUGGESTIONS_FETCHER_IMPL_H_ +#define COMPONENTS_NTP_SNIPPETS_CONTEXTUAL_CONTEXTUAL_SUGGESTIONS_FETCHER_IMPL_H_ #include <memory> #include <queue> @@ -15,8 +15,8 @@ #include "base/time/clock.h" #include "components/ntp_snippets/category.h" #include "components/ntp_snippets/category_info.h" -#include "components/ntp_snippets/remote/contextual_json_request.h" -#include "components/ntp_snippets/remote/contextual_suggestions_fetcher.h" +#include "components/ntp_snippets/contextual/contextual_json_request.h" +#include "components/ntp_snippets/contextual/contextual_suggestions_fetcher.h" #include "components/ntp_snippets/remote/remote_suggestion.h" #include "components/ntp_snippets/status.h" #include "net/url_request/url_request_context_getter.h" @@ -101,4 +101,4 @@ } // namespace ntp_snippets -#endif // COMPONENTS_NTP_SNIPPETS_REMOTE_CONTEXTUAL_SUGGESTIONS_FETCHER_IMPL_H_ +#endif // COMPONENTS_NTP_SNIPPETS_CONTEXTUAL_CONTEXTUAL_SUGGESTIONS_FETCHER_IMPL_H_
diff --git a/components/ntp_snippets/remote/contextual_suggestions_fetcher_impl_unittest.cc b/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl_unittest.cc similarity index 98% rename from components/ntp_snippets/remote/contextual_suggestions_fetcher_impl_unittest.cc rename to components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl_unittest.cc index 37796ba4c..0fed25d 100644 --- a/components/ntp_snippets/remote/contextual_suggestions_fetcher_impl_unittest.cc +++ b/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/ntp_snippets/remote/contextual_suggestions_fetcher_impl.h" +#include "components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl.h" #include <utility> #include <vector>
diff --git a/components/ntp_snippets/contextual_suggestions_source.cc b/components/ntp_snippets/contextual/contextual_suggestions_source.cc similarity index 97% rename from components/ntp_snippets/contextual_suggestions_source.cc rename to components/ntp_snippets/contextual/contextual_suggestions_source.cc index c59d3e0..58b30d5 100644 --- a/components/ntp_snippets/contextual_suggestions_source.cc +++ b/components/ntp_snippets/contextual/contextual_suggestions_source.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/ntp_snippets/contextual_suggestions_source.h" +#include "components/ntp_snippets/contextual/contextual_suggestions_source.h" #include <iterator> #include <memory>
diff --git a/components/ntp_snippets/contextual_suggestions_source.h b/components/ntp_snippets/contextual/contextual_suggestions_source.h similarity index 88% rename from components/ntp_snippets/contextual_suggestions_source.h rename to components/ntp_snippets/contextual/contextual_suggestions_source.h index 3a99178..859ecf7 100644 --- a/components/ntp_snippets/contextual_suggestions_source.h +++ b/components/ntp_snippets/contextual/contextual_suggestions_source.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_NTP_SNIPPETS_CONTEXTUAL_SUGGESTIONS_SOURCE_H_ -#define COMPONENTS_NTP_SNIPPETS_CONTEXTUAL_SUGGESTIONS_SOURCE_H_ +#ifndef COMPONENTS_NTP_SNIPPETS_CONTEXTUAL_CONTEXTUAL_SUGGESTIONS_SOURCE_H_ +#define COMPONENTS_NTP_SNIPPETS_CONTEXTUAL_CONTEXTUAL_SUGGESTIONS_SOURCE_H_ #include <map> #include <memory> @@ -14,7 +14,7 @@ #include "base/optional.h" #include "components/image_fetcher/core/image_fetcher.h" #include "components/ntp_snippets/callbacks.h" -#include "components/ntp_snippets/remote/contextual_suggestions_fetcher.h" +#include "components/ntp_snippets/contextual/contextual_suggestions_fetcher.h" namespace ntp_snippets { @@ -71,4 +71,4 @@ } // namespace ntp_snippets -#endif // COMPONENTS_NTP_SNIPPETS_CONTEXTUAL_SUGGESTIONS_SOURCE_H_ +#endif // COMPONENTS_NTP_SNIPPETS_CONTEXTUAL_CONTEXTUAL_SUGGESTIONS_SOURCE_H_
diff --git a/components/ntp_snippets/contextual_suggestions_source_unittest.cc b/components/ntp_snippets/contextual/contextual_suggestions_source_unittest.cc similarity index 98% rename from components/ntp_snippets/contextual_suggestions_source_unittest.cc rename to components/ntp_snippets/contextual/contextual_suggestions_source_unittest.cc index c713fe9..f6c5b869 100644 --- a/components/ntp_snippets/contextual_suggestions_source_unittest.cc +++ b/components/ntp_snippets/contextual/contextual_suggestions_source_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/ntp_snippets/contextual_suggestions_source.h" +#include "components/ntp_snippets/contextual/contextual_suggestions_source.h" #include <memory> #include <utility> @@ -17,8 +17,8 @@ #include "components/image_fetcher/core/image_fetcher_impl.h" #include "components/ntp_snippets/category_info.h" #include "components/ntp_snippets/content_suggestion.h" +#include "components/ntp_snippets/contextual/contextual_suggestions_fetcher.h" #include "components/ntp_snippets/remote/cached_image_fetcher.h" -#include "components/ntp_snippets/remote/contextual_suggestions_fetcher.h" #include "components/ntp_snippets/remote/json_to_categories.h" #include "components/ntp_snippets/remote/remote_suggestion.h" #include "components/ntp_snippets/remote/remote_suggestion_builder.h"
diff --git a/components/omnibox/browser/history_url_provider_unittest.cc b/components/omnibox/browser/history_url_provider_unittest.cc index bbc8e0c..5011aec 100644 --- a/components/omnibox/browser/history_url_provider_unittest.cc +++ b/components/omnibox/browser/history_url_provider_unittest.cc
@@ -1178,9 +1178,7 @@ } autocomplete_->scoring_params_ = test_cases[i].scoring_params; - // Test the experiment (scoring enabled). When scoring is disabled, it uses - // the default experimental scoring. - autocomplete_->scoring_params_.experimental_scoring_enabled = true; + // Test the experimental scoring params. ASSERT_NO_FATAL_FAILURE(RunTest(ASCIIToUTF16(test_cases[i].input), std::string(), false, output, max_matches)); for (int j = 0; j < max_matches; ++j) {
diff --git a/components/omnibox/browser/omnibox_field_trial.cc b/components/omnibox/browser/omnibox_field_trial.cc index 1413e0d..22e7b00 100644 --- a/components/omnibox/browser/omnibox_field_trial.cc +++ b/components/omnibox/browser/omnibox_field_trial.cc
@@ -428,20 +428,11 @@ void OmniboxFieldTrial::GetExperimentalHUPScoringParams( HUPScoringParams* scoring_params) { - scoring_params->experimental_scoring_enabled = false; - VariationParams params; if (!variations::GetVariationParams(kBundledExperimentFieldTrialName, ¶ms)) return; - VariationParams::const_iterator it = params.find(kHUPNewScoringEnabledParam); - if (it != params.end()) { - int enabled = 0; - if (base::StringToInt(it->second, &enabled)) - scoring_params->experimental_scoring_enabled = (enabled != 0); - } - InitializeScoreBuckets(params, kHUPNewScoringTypedCountRelevanceCapParam, kHUPNewScoringTypedCountHalfLifeTimeParam, kHUPNewScoringTypedCountScoreBucketsParam, @@ -757,8 +748,6 @@ const char OmniboxFieldTrial::kPhysicalWebAfterTypingRule[] = "PhysicalWebAfterTyping"; -const char OmniboxFieldTrial::kHUPNewScoringEnabledParam[] = - "HUPExperimentalScoringEnabled"; const char OmniboxFieldTrial::kHUPNewScoringTypedCountRelevanceCapParam[] = "TypedCountRelevanceCap"; const char OmniboxFieldTrial::kHUPNewScoringTypedCountHalfLifeTimeParam[] =
diff --git a/components/omnibox/browser/omnibox_field_trial.h b/components/omnibox/browser/omnibox_field_trial.h index 3dfa3734..bc94a4b 100644 --- a/components/omnibox/browser/omnibox_field_trial.h +++ b/components/omnibox/browser/omnibox_field_trial.h
@@ -109,9 +109,7 @@ bool use_decay_factor_; }; - HUPScoringParams() : experimental_scoring_enabled(false) {} - - bool experimental_scoring_enabled; + HUPScoringParams() {} ScoreBuckets typed_count_buckets; @@ -262,8 +260,7 @@ // bundled omnibox field trial. // Initializes the HUP |scoring_params| based on the active HUP scoring - // experiment. If there is no such experiment, this function simply sets - // |scoring_params|->experimental_scoring_enabled to false. + // experiment. static void GetDefaultHUPScoringParams(HUPScoringParams* scoring_params); static void GetExperimentalHUPScoringParams(HUPScoringParams* scoring_params); @@ -469,7 +466,6 @@ static const char kPhysicalWebAfterTypingRule[]; // Parameter names used by the HUP new scoring experiments. - static const char kHUPNewScoringEnabledParam[]; static const char kHUPNewScoringTypedCountRelevanceCapParam[]; static const char kHUPNewScoringTypedCountHalfLifeTimeParam[]; static const char kHUPNewScoringTypedCountScoreBucketsParam[];
diff --git a/components/omnibox/browser/omnibox_field_trial_unittest.cc b/components/omnibox/browser/omnibox_field_trial_unittest.cc index f4d9183..3890a55 100644 --- a/components/omnibox/browser/omnibox_field_trial_unittest.cc +++ b/components/omnibox/browser/omnibox_field_trial_unittest.cc
@@ -396,7 +396,6 @@ TEST_F(OmniboxFieldTrialTest, HUPNewScoringFieldTrial) { { std::map<std::string, std::string> params; - params[std::string(OmniboxFieldTrial::kHUPNewScoringEnabledParam)] = "1"; params[std::string( OmniboxFieldTrial::kHUPNewScoringTypedCountRelevanceCapParam)] = "56"; params[std::string( @@ -419,7 +418,6 @@ HUPScoringParams scoring_params; OmniboxFieldTrial::GetExperimentalHUPScoringParams(&scoring_params); - EXPECT_TRUE(scoring_params.experimental_scoring_enabled); EXPECT_EQ(56, scoring_params.typed_count_buckets.relevance_cap()); EXPECT_EQ(77, scoring_params.typed_count_buckets.half_life_days()); ASSERT_EQ(3u, scoring_params.typed_count_buckets.buckets().size()); @@ -441,7 +439,6 @@ TEST_F(OmniboxFieldTrialTest, HUPNewScoringFieldTrialWithDecayFactor) { { std::map<std::string, std::string> params; - params[OmniboxFieldTrial::kHUPNewScoringEnabledParam] = "1"; params[OmniboxFieldTrial::kHUPNewScoringTypedCountHalfLifeTimeParam] = "10"; params[OmniboxFieldTrial::kHUPNewScoringTypedCountUseDecayFactorParam] = "1"; @@ -455,7 +452,6 @@ HUPScoringParams scoring_params; OmniboxFieldTrial::GetExperimentalHUPScoringParams(&scoring_params); - EXPECT_TRUE(scoring_params.experimental_scoring_enabled); EXPECT_EQ(10, scoring_params.typed_count_buckets.half_life_days()); ASSERT_EQ(3u, scoring_params.typed_count_buckets.buckets().size()); ASSERT_TRUE(scoring_params.typed_count_buckets.use_decay_factor());
diff --git a/components/password_manager/core/browser/login_database_ios.cc b/components/password_manager/core/browser/login_database_ios.cc index 0019abb..41bd8de 100644 --- a/components/password_manager/core/browser/login_database_ios.cc +++ b/components/password_manager/core/browser/login_database_ios.cc
@@ -48,7 +48,7 @@ // item as long as it uniquely identifies it. We are arbitrarily choosing the // |kSecAttrAccount| attribute for this purpose. CFDictionarySetValue(attributes, kSecAttrAccount, item_ref); - std::string plain_text_utf8 = UTF16ToUTF8(plain_text); + std::string plain_text_utf8 = base::UTF16ToUTF8(plain_text); ScopedCFTypeRef<CFDataRef> data( CFDataCreate(NULL, reinterpret_cast<const UInt8*>(plain_text_utf8.data()), plain_text_utf8.size()));
diff --git a/components/password_manager/core/browser/login_database_ios_unittest.cc b/components/password_manager/core/browser/login_database_ios_unittest.cc index 4ada9cf..761a0e6 100644 --- a/components/password_manager/core/browser/login_database_ios_unittest.cc +++ b/components/password_manager/core/browser/login_database_ios_unittest.cc
@@ -17,6 +17,7 @@ #include "testing/platform_test.h" using base::ScopedCFTypeRef; +using base::UTF16ToUTF8; using autofill::PasswordForm; namespace password_manager {
diff --git a/components/payments/content/payment_request.cc b/components/payments/content/payment_request.cc index 6359865..a55f986 100644 --- a/components/payments/content/payment_request.cc +++ b/components/payments/content/payment_request.cc
@@ -8,6 +8,7 @@ #include <utility> #include "base/memory/ptr_util.h" +#include "base/stl_util.h" #include "components/payments/content/can_make_payment_query_factory.h" #include "components/payments/content/origin_security_checker.h" #include "components/payments/content/payment_details_validation.h" @@ -110,6 +111,30 @@ state_ = base::MakeUnique<PaymentRequestState>( spec_.get(), this, delegate_->GetApplicationLocale(), delegate_->GetPersonalDataManager(), delegate_.get(), &journey_logger_); + + journey_logger_.SetRequestedInformation( + spec_->request_shipping(), spec_->request_payer_email(), + spec_->request_payer_phone(), spec_->request_payer_name()); + + // Log metrics around which payment methods are requested by the merchant. + GURL google_pay_url(kGooglePayMethodName); + GURL android_pay_url(kAndroidPayMethodName); + // Looking for payment methods that are NOT google-related payment methods. + auto non_google_it = + std::find_if(spec_->url_payment_method_identifiers().begin(), + spec_->url_payment_method_identifiers().end(), + [google_pay_url, android_pay_url](const GURL& url) { + return url != google_pay_url && url != android_pay_url; + }); + journey_logger_.SetRequestedPaymentMethodTypes( + /*requested_basic_card=*/!spec_->supported_card_networks().empty(), + /*requested_method_google=*/ + base::ContainsValue(spec_->url_payment_method_identifiers(), + google_pay_url) || + base::ContainsValue(spec_->url_payment_method_identifiers(), + android_pay_url), + /*requested_method_other=*/non_google_it != + spec_->url_payment_method_identifiers().end()); } void PaymentRequest::Show() { @@ -124,7 +149,6 @@ LOG(ERROR) << "A PaymentRequest UI is already showing"; journey_logger_.SetNotShown( JourneyLogger::NOT_SHOWN_REASON_CONCURRENT_REQUESTS); - has_recorded_completion_ = true; client_->OnError(mojom::PaymentErrorReason::USER_CANCEL); OnConnectionTerminated(); return; @@ -133,7 +157,6 @@ if (!state_->AreRequestedMethodsSupported()) { journey_logger_.SetNotShown( JourneyLogger::NOT_SHOWN_REASON_NO_SUPPORTED_PAYMENT_METHOD); - has_recorded_completion_ = true; client_->OnError(mojom::PaymentErrorReason::NOT_SUPPORTED); if (observer_for_testing_) observer_for_testing_->OnNotSupportedError(); @@ -142,9 +165,6 @@ } journey_logger_.SetEventOccurred(JourneyLogger::EVENT_SHOWN); - journey_logger_.SetRequestedInformation( - spec_->request_shipping(), spec_->request_payer_email(), - spec_->request_payer_phone(), spec_->request_payer_name()); delegate_->ShowDialog(this); }
diff --git a/components/payments/content/payment_request_spec.cc b/components/payments/content/payment_request_spec.cc index c831329..e328318 100644 --- a/components/payments/content/payment_request_spec.cc +++ b/components/payments/content/payment_request_spec.cc
@@ -129,6 +129,8 @@ } // namespace const char kBasicCardMethodName[] = "basic-card"; +const char kGooglePayMethodName[] = "https://google.com/pay"; +const char kAndroidPayMethodName[] = "https://android.com/pay"; PaymentRequestSpec::PaymentRequestSpec( mojom::PaymentOptionsPtr options,
diff --git a/components/payments/content/payment_request_spec.h b/components/payments/content/payment_request_spec.h index 4745acf..01a9e8cc 100644 --- a/components/payments/content/payment_request_spec.h +++ b/components/payments/content/payment_request_spec.h
@@ -23,8 +23,11 @@ class PaymentInstrument; -// Identifier for the basic card payment method in the PaymentMethodData. +// Identifier for the basic card payment method and google-related payment +// methods in the PaymentMethodData. extern const char kBasicCardMethodName[]; +extern const char kGooglePayMethodName[]; +extern const char kAndroidPayMethodName[]; // The spec contains all the options that the merchant has specified about this // Payment Request. It's a (mostly) read-only view, which can be updated in
diff --git a/components/payments/core/journey_logger.cc b/components/payments/core/journey_logger.cc index 14c89929..1cf94f3 100644 --- a/components/payments/core/journey_logger.cc +++ b/components/payments/core/journey_logger.cc
@@ -136,6 +136,20 @@ SetEventOccurred(EVENT_REQUEST_PAYER_NAME); } +void JourneyLogger::SetRequestedPaymentMethodTypes( + bool requested_basic_card, + bool requested_method_google, + bool requested_method_other) { + if (requested_basic_card) + SetEventOccurred(EVENT_REQUEST_METHOD_BASIC_CARD); + + if (requested_method_google) + SetEventOccurred(EVENT_REQUEST_METHOD_GOOGLE); + + if (requested_method_other) + SetEventOccurred(EVENT_REQUEST_METHOD_OTHER); +} + void JourneyLogger::SetCompleted() { RecordJourneyStatsHistograms(COMPLETION_STATUS_COMPLETED); }
diff --git a/components/payments/core/journey_logger.h b/components/payments/core/journey_logger.h index 6b8104a..779b276c 100644 --- a/components/payments/core/journey_logger.h +++ b/components/payments/core/journey_logger.h
@@ -69,23 +69,44 @@ // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.payments // GENERATED_JAVA_CLASS_NAME_OVERRIDE: Event enum Event { + // Initiated means the PaymentRequest object was constructed. EVENT_INITIATED = 0, + // PaymentRequest was triggered via .show() and a native UI was shown. EVENT_SHOWN = 1 << 0, EVENT_PAY_CLICKED = 1 << 1, EVENT_RECEIVED_INSTRUMENT_DETAILS = 1 << 2, + // PaymentRequest was triggered via .show() and no UI was shown because we + // skipped directly to the payment app. EVENT_SKIPPED_SHOW = 1 << 3, + // .complete() was called by the merchant, completing the flow. EVENT_COMPLETED = 1 << 4, + // The user aborted the flow by either dismissing it explicitely, or + // navigating away (if possible). EVENT_USER_ABORTED = 1 << 5, + // Other reasons for aborting include the merchant calling .abort(), the + // merchant triggering a navigation, the tab closing, the browser closing, + // etc. See implementation for details. EVENT_OTHER_ABORTED = 1 << 6, EVENT_HAD_INITIAL_FORM_OF_PAYMENT = 1 << 7, EVENT_HAD_NECESSARY_COMPLETE_SUGGESTIONS = 1 << 8, + // canMakePayment was called with a result of "true" or "false", + // respectively. An absence of both events means canMakePayment was not + // called, or the user was in incognito mode. EVENT_CAN_MAKE_PAYMENT_TRUE = 1 << 9, EVENT_CAN_MAKE_PAYMENT_FALSE = 1 << 10, + // Correspond to the merchant specifying requestShipping, requestPayerName, + // requestPayerEmail, requestPayerPhone. EVENT_REQUEST_SHIPPING = 1 << 11, EVENT_REQUEST_PAYER_NAME = 1 << 12, EVENT_REQUEST_PAYER_EMAIL = 1 << 13, EVENT_REQUEST_PAYER_PHONE = 1 << 14, - EVENT_ENUM_MAX = 32768, + // The merchant requested at least one basic-card method. + EVENT_REQUEST_METHOD_BASIC_CARD = 1 << 15, + // The merchant requested a Google payment method. + EVENT_REQUEST_METHOD_GOOGLE = 1 << 16, + // The merchant requested a non-Google, non-basic-card payment method. + EVENT_REQUEST_METHOD_OTHER = 1 << 17, + EVENT_ENUM_MAX = 262144, }; // The reason why the Payment Request was aborted. @@ -152,6 +173,14 @@ bool requested_phone, bool requested_name); + // Records the requested payment method types. A value should be true if at + // least one payment method in the category (basic-card, google payment method + // or other url-based payment method, respectively) is requested. + // TODO(crbug.com/754811): Add support for non-basic-card, non-URL methods. + void SetRequestedPaymentMethodTypes(bool requested_basic_card, + bool requested_method_google, + bool requested_method_other); + // Records that the Payment Request was completed successfully, and starts the // logging of all the journey metrics. void SetCompleted();
diff --git a/components/payments/core/journey_logger_unittest.cc b/components/payments/core/journey_logger_unittest.cc index acb1e4ab..389a2bf7 100644 --- a/components/payments/core/journey_logger_unittest.cc +++ b/components/payments/core/journey_logger_unittest.cc
@@ -338,6 +338,9 @@ logger.SetRequestedInformation( /*requested_shipping=*/false, /*requested_email=*/false, /*requested_phone=*/false, /*requested_name=*/false); + logger.SetRequestedPaymentMethodTypes( + /*requested_basic_card=*/true, /*requested_method_google=*/true, + /*requested_method_other=*/false); // Simulate that the user had suggestions for all the requested sections. logger.SetNumberOfSuggestionsShown(JourneyLogger::SECTION_PAYMENT_METHOD, 1, @@ -364,6 +367,9 @@ EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER); } // Tests that the completion status metrics based on whether the user had @@ -378,6 +384,9 @@ logger.SetRequestedInformation( /*requested_shipping=*/false, /*requested_email=*/false, /*requested_phone=*/false, /*requested_name=*/false); + logger.SetRequestedPaymentMethodTypes( + /*requested_basic_card=*/true, /*requested_method_google=*/true, + /*requested_method_other=*/false); // Simulate that the user had suggestions for all the requested sections. logger.SetNumberOfSuggestionsShown(JourneyLogger::SECTION_PAYMENT_METHOD, 1, @@ -404,6 +413,9 @@ EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER); } // Tests that the completion status metrics based on whether the user had @@ -418,6 +430,9 @@ logger.SetRequestedInformation( /*requested_shipping=*/false, /*requested_email=*/false, /*requested_phone=*/false, /*requested_name=*/false); + logger.SetRequestedPaymentMethodTypes( + /*requested_basic_card=*/true, /*requested_method_google=*/true, + /*requested_method_other=*/false); // Simulate that the user had suggestions for all the requested sections. logger.SetNumberOfSuggestionsShown(JourneyLogger::SECTION_PAYMENT_METHOD, 1, @@ -444,6 +459,9 @@ EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER); } // Tests that the completion status metrics based on whether the user had @@ -459,6 +477,9 @@ logger.SetRequestedInformation( /*requested_shipping=*/false, /*requested_email=*/false, /*requested_phone=*/false, /*requested_name=*/false); + logger.SetRequestedPaymentMethodTypes( + /*requested_basic_card=*/true, /*requested_method_google=*/true, + /*requested_method_other=*/false); // Simulate that the user had suggestions for all the requested sections. logger.SetNumberOfSuggestionsShown(JourneyLogger::SECTION_PAYMENT_METHOD, 1, @@ -485,6 +506,9 @@ EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER); } // Tests that the completion status metrics based on whether the user had @@ -499,6 +523,9 @@ logger.SetRequestedInformation( /*requested_shipping=*/false, /*requested_email=*/false, /*requested_phone=*/false, /*requested_name=*/false); + logger.SetRequestedPaymentMethodTypes( + /*requested_basic_card=*/true, /*requested_method_google=*/true, + /*requested_method_other=*/false); // Simulate that the user had suggestions for none of the requested sections. logger.SetNumberOfSuggestionsShown(JourneyLogger::SECTION_PAYMENT_METHOD, 0, @@ -525,6 +552,9 @@ EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER); } // Tests that the completion status metrics based on whether the user had @@ -539,6 +569,9 @@ logger.SetRequestedInformation( /*requested_shipping=*/false, /*requested_email=*/false, /*requested_phone=*/false, /*requested_name=*/false); + logger.SetRequestedPaymentMethodTypes( + /*requested_basic_card=*/true, /*requested_method_google=*/true, + /*requested_method_other=*/false); // Simulate that the user had suggestions for none of the requested sections. logger.SetNumberOfSuggestionsShown(JourneyLogger::SECTION_PAYMENT_METHOD, 0, @@ -565,6 +598,9 @@ EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER); } // Tests that the completion status metrics based on whether the user had @@ -579,6 +615,9 @@ logger.SetRequestedInformation( /*requested_shipping=*/false, /*requested_email=*/false, /*requested_phone=*/false, /*requested_name=*/false); + logger.SetRequestedPaymentMethodTypes( + /*requested_basic_card=*/true, /*requested_method_google=*/true, + /*requested_method_other=*/false); // Simulate that the user had suggestions for none of the requested sections. logger.SetNumberOfSuggestionsShown(JourneyLogger::SECTION_PAYMENT_METHOD, 0, @@ -605,6 +644,9 @@ EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER); } // Tests that the completion status metrics based on whether the user had @@ -620,6 +662,9 @@ logger.SetRequestedInformation( /*requested_shipping=*/false, /*requested_email=*/false, /*requested_phone=*/false, /*requested_name=*/false); + logger.SetRequestedPaymentMethodTypes( + /*requested_basic_card=*/true, /*requested_method_google=*/true, + /*requested_method_other=*/false); // Simulate that the user had suggestions for none of the requested sections. logger.SetNumberOfSuggestionsShown(JourneyLogger::SECTION_PAYMENT_METHOD, 0, @@ -646,6 +691,9 @@ EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER); } // Tests that the completion status metrics based on whether the user had @@ -661,6 +709,9 @@ logger.SetRequestedInformation( /*requested_shipping=*/false, /*requested_email=*/false, /*requested_phone=*/false, /*requested_name=*/false); + logger.SetRequestedPaymentMethodTypes( + /*requested_basic_card=*/true, /*requested_method_google=*/true, + /*requested_method_other=*/false); // Simulate that the user had incomplete suggestions for the requested // sections. @@ -688,6 +739,9 @@ EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER); } // Tests that the completion status metrics based on whether the user had @@ -703,6 +757,9 @@ logger.SetRequestedInformation( /*requested_shipping=*/true, /*requested_email=*/false, /*requested_phone=*/false, /*requested_name=*/false); + logger.SetRequestedPaymentMethodTypes( + /*requested_basic_card=*/true, /*requested_method_google=*/true, + /*requested_method_other=*/false); // Simulate that the user had incomplete suggestions for one of the requested // sections. @@ -732,6 +789,9 @@ EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER); } // Tests that the completion status metrics based on whether the user had @@ -747,6 +807,9 @@ logger.SetRequestedInformation( /*requested_shipping=*/true, /*requested_email=*/false, /*requested_phone=*/false, /*requested_name=*/false); + logger.SetRequestedPaymentMethodTypes( + /*requested_basic_card=*/true, /*requested_method_google=*/true, + /*requested_method_other=*/false); // Simulate that the user had incomplete suggestions for one of the requested // sections. @@ -776,6 +839,9 @@ EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER); } // Tests that the metrics are logged correctly for two simultaneous Payment @@ -792,10 +858,16 @@ logger1.SetRequestedInformation( /*requested_shipping=*/true, /*requested_email=*/true, /*requested_phone=*/false, /*requested_name=*/false); + logger1.SetRequestedPaymentMethodTypes( + /*requested_basic_card=*/true, /*requested_method_google=*/true, + /*requested_method_other=*/true); logger2.SetEventOccurred(JourneyLogger::EVENT_SHOWN); logger2.SetRequestedInformation( /*requested_shipping=*/true, /*requested_email=*/false, /*requested_phone=*/false, /*requested_name=*/false); + logger2.SetRequestedPaymentMethodTypes( + /*requested_basic_card=*/false, /*requested_method_google=*/false, + /*requested_method_other=*/true); logger1.SetCanMakePaymentValue(true); @@ -827,6 +899,9 @@ EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE); EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD); + EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE); + EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER); // logger1 EXPECT_TRUE(buckets[1].min & JourneyLogger::EVENT_SHOWN); EXPECT_FALSE(buckets[1].min & @@ -842,6 +917,9 @@ EXPECT_TRUE(buckets[1].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); EXPECT_TRUE(buckets[1].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE); EXPECT_FALSE(buckets[1].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE); + EXPECT_TRUE(buckets[1].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD); + EXPECT_TRUE(buckets[1].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE); + EXPECT_TRUE(buckets[1].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER); } // Tests that the Payment Request UKMs are logged correctly when the user aborts @@ -857,6 +935,9 @@ logger.SetRequestedInformation( /*requested_shipping=*/true, /*requested_email=*/true, /*requested_phone=*/false, /*requested_name=*/false); + logger.SetRequestedPaymentMethodTypes( + /*requested_basic_card=*/true, /*requested_method_google=*/false, + /*requested_method_other=*/false); // Simulate that the user aborts after being shown the Payment Request and // clicking pay. @@ -886,7 +967,8 @@ ASSERT_NE(nullptr, step_metric); EXPECT_EQ(JourneyLogger::EVENT_SHOWN | JourneyLogger::EVENT_PAY_CLICKED | JourneyLogger::EVENT_REQUEST_SHIPPING | - JourneyLogger::EVENT_REQUEST_PAYER_EMAIL, + JourneyLogger::EVENT_REQUEST_PAYER_EMAIL | + JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD, step_metric->value); } @@ -903,6 +985,9 @@ logger.SetRequestedInformation( /*requested_shipping=*/true, /*requested_email=*/true, /*requested_phone=*/false, /*requested_name=*/false); + logger.SetRequestedPaymentMethodTypes( + /*requested_basic_card=*/true, /*requested_method_google=*/false, + /*requested_method_other=*/false); // Simulate that the user aborts after being shown the Payment Request. logger.SetEventOccurred(JourneyLogger::EVENT_SHOWN); @@ -928,7 +1013,8 @@ ukm::TestUkmRecorder::FindMetric(entry, internal::kUKMEventsMetricName); ASSERT_NE(nullptr, step_metric); EXPECT_EQ(JourneyLogger::EVENT_SHOWN | JourneyLogger::EVENT_REQUEST_SHIPPING | - JourneyLogger::EVENT_REQUEST_PAYER_EMAIL, + JourneyLogger::EVENT_REQUEST_PAYER_EMAIL | + JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD, step_metric->value); }
diff --git a/components/safe_browsing/BUILD.gn b/components/safe_browsing/BUILD.gn index f09e7c6..41b9f45 100644 --- a/components/safe_browsing/BUILD.gn +++ b/components/safe_browsing/BUILD.gn
@@ -6,7 +6,13 @@ proto_library("csd_proto") { sources = [ - "csd.proto", + "proto/csd.proto", + ] +} + +proto_library("webui_proto") { + sources = [ + "proto/webui.proto", ] }
diff --git a/components/safe_browsing/browser/DEPS b/components/safe_browsing/browser/DEPS index d98a2a4d..b219d834 100644 --- a/components/safe_browsing/browser/DEPS +++ b/components/safe_browsing/browser/DEPS
@@ -1,6 +1,6 @@ include_rules = [ "+components/history/core/browser", - "+components/safe_browsing/csd.pb.h", + "+components/safe_browsing/proto/csd.pb.h", "+content/public/browser", "+ipc/ipc_message.h", "+net/cookies",
diff --git a/components/safe_browsing/browser/threat_details.h b/components/safe_browsing/browser/threat_details.h index 9e6918a..849105c0 100644 --- a/components/safe_browsing/browser/threat_details.h +++ b/components/safe_browsing/browser/threat_details.h
@@ -21,7 +21,7 @@ #include "base/macros.h" #include "base/memory/ref_counted.h" #include "components/safe_browsing/common/safebrowsing_types.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "components/security_interstitials/content/unsafe_resource.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/web_contents_observer.h"
diff --git a/components/safe_browsing/password_protection/password_protection_service.h b/components/safe_browsing/password_protection/password_protection_service.h index 802fbff5..f6ef8d41 100644 --- a/components/safe_browsing/password_protection/password_protection_service.h +++ b/components/safe_browsing/password_protection/password_protection_service.h
@@ -18,7 +18,7 @@ #include "base/task/cancelable_task_tracker.h" #include "base/values.h" #include "components/history/core/browser/history_service_observer.h" -#include "components/safe_browsing/csd.pb.h" +#include "components/safe_browsing/proto/csd.pb.h" #include "components/safe_browsing_db/v4_protocol_manager_util.h" #include "net/url_request/url_request_context_getter.h" #include "third_party/protobuf/src/google/protobuf/repeated_field.h"
diff --git a/components/safe_browsing/csd.proto b/components/safe_browsing/proto/csd.proto similarity index 100% rename from components/safe_browsing/csd.proto rename to components/safe_browsing/proto/csd.proto
diff --git a/components/safe_browsing/web_ui/webui.proto b/components/safe_browsing/proto/webui.proto similarity index 100% rename from components/safe_browsing/web_ui/webui.proto rename to components/safe_browsing/proto/webui.proto
diff --git a/components/safe_browsing/web_ui/BUILD.gn b/components/safe_browsing/web_ui/BUILD.gn index 707f14b6..7bd2a139 100644 --- a/components/safe_browsing/web_ui/BUILD.gn +++ b/components/safe_browsing/web_ui/BUILD.gn
@@ -12,11 +12,11 @@ deps = [ ":constants", - ":webui_proto", "//base", "//components/resources:components_resources_grit", "//components/resources:components_scaled_resources_grit", "//components/safe_browsing:features", + "//components/safe_browsing:webui_proto", "//components/safe_browsing/common:safe_browsing_prefs", "//components/safe_browsing_db:v4_local_database_manager", "//components/strings:components_strings_grit", @@ -33,9 +33,3 @@ "constants.h", ] } - -proto_library("webui_proto") { - sources = [ - "webui.proto", - ] -}
diff --git a/components/safe_browsing/web_ui/safe_browsing_ui.h b/components/safe_browsing/web_ui/safe_browsing_ui.h index 89abc3a..54fef1e 100644 --- a/components/safe_browsing/web_ui/safe_browsing_ui.h +++ b/components/safe_browsing/web_ui/safe_browsing_ui.h
@@ -6,7 +6,7 @@ #define COMPONENTS_SAFE_BROWSING_WEBUI_SAFE_BROWSING_UI_H_ #include "base/macros.h" -#include "components/safe_browsing/web_ui/webui.pb.h" +#include "components/safe_browsing/proto/webui.pb.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_ui_controller.h" #include "content/public/browser/web_ui_data_source.h"
diff --git a/components/safe_browsing_db/BUILD.gn b/components/safe_browsing_db/BUILD.gn index bedfc8e..f4ac984 100644 --- a/components/safe_browsing_db/BUILD.gn +++ b/components/safe_browsing_db/BUILD.gn
@@ -204,7 +204,7 @@ ":v4_protocol_manager_util", ":v4_store", "//base", - "//components/safe_browsing/web_ui:webui_proto", + "//components/safe_browsing:webui_proto", "//content/public/browser", ] } @@ -233,7 +233,7 @@ ":v4_protocol_manager_util", "//base", "//components/data_use_measurement/core", - "//components/safe_browsing/web_ui:webui_proto", + "//components/safe_browsing:webui_proto", "//content/public/browser", "//net", "//url", @@ -255,7 +255,7 @@ ":v4_protocol_manager_util", ":v4_update_protocol_manager", "//base", - "//components/safe_browsing/web_ui:webui_proto", + "//components/safe_browsing:webui_proto", "//content/public/browser", "//net", "//url", @@ -310,7 +310,7 @@ ":v4_protocol_manager_util", ":v4_rice", "//base", - "//components/safe_browsing/web_ui:webui_proto", + "//components/safe_browsing:webui_proto", "//crypto", ] } @@ -338,8 +338,8 @@ ":v4_protocol_manager_util", "//base", "//components/data_use_measurement/core", + "//components/safe_browsing:webui_proto", "//components/safe_browsing/common:safe_browsing_prefs", - "//components/safe_browsing/web_ui:webui_proto", "//net", "//url", ]
diff --git a/components/safe_browsing_db/DEPS b/components/safe_browsing_db/DEPS index 1c63417..c5e7e01 100644 --- a/components/safe_browsing_db/DEPS +++ b/components/safe_browsing_db/DEPS
@@ -2,7 +2,7 @@ "+components/data_use_measurement/core", "+components/safe_browsing/common/safe_browsing_prefs.h", "+components/safe_browsing/features.h", - "+components/safe_browsing/web_ui/webui.pb.h", + "+components/safe_browsing/proto/webui.pb.h", "+components/variations", "+components/version_info", "+content/public/browser",
diff --git a/components/safe_browsing_db/v4_database.cc b/components/safe_browsing_db/v4_database.cc index 9e8a74f0..f380624 100644 --- a/components/safe_browsing_db/v4_database.cc +++ b/components/safe_browsing_db/v4_database.cc
@@ -11,7 +11,7 @@ #include "base/metrics/histogram_macros.h" #include "base/task_runner_util.h" #include "base/threading/thread_task_runner_handle.h" -#include "components/safe_browsing/web_ui/webui.pb.h" +#include "components/safe_browsing/proto/webui.pb.h" #include "components/safe_browsing_db/v4_database.h" #include "content/public/browser/browser_thread.h"
diff --git a/components/safe_browsing_db/v4_database.h b/components/safe_browsing_db/v4_database.h index 576e894..aea51b0 100644 --- a/components/safe_browsing_db/v4_database.h +++ b/components/safe_browsing_db/v4_database.h
@@ -16,7 +16,7 @@ #include "base/memory/weak_ptr.h" #include "base/sequenced_task_runner.h" #include "base/single_thread_task_runner.h" -#include "components/safe_browsing/web_ui/webui.pb.h" +#include "components/safe_browsing/proto/webui.pb.h" #include "components/safe_browsing_db/v4_protocol_manager_util.h" #include "components/safe_browsing_db/v4_store.h"
diff --git a/components/safe_browsing_db/v4_get_hash_protocol_manager.h b/components/safe_browsing_db/v4_get_hash_protocol_manager.h index 6ae5c302..22510c9c 100644 --- a/components/safe_browsing_db/v4_get_hash_protocol_manager.h +++ b/components/safe_browsing_db/v4_get_hash_protocol_manager.h
@@ -24,7 +24,7 @@ #include "base/time/default_clock.h" #include "base/time/time.h" #include "base/timer/timer.h" -#include "components/safe_browsing/web_ui/webui.pb.h" +#include "components/safe_browsing/proto/webui.pb.h" #include "components/safe_browsing_db/safebrowsing.pb.h" #include "components/safe_browsing_db/util.h" #include "components/safe_browsing_db/v4_protocol_manager_util.h"
diff --git a/components/safe_browsing_db/v4_local_database_manager.h b/components/safe_browsing_db/v4_local_database_manager.h index 29d7544..c2cd94f4 100644 --- a/components/safe_browsing_db/v4_local_database_manager.h +++ b/components/safe_browsing_db/v4_local_database_manager.h
@@ -12,7 +12,7 @@ #include <unordered_set> #include "base/memory/weak_ptr.h" -#include "components/safe_browsing/web_ui/webui.pb.h" +#include "components/safe_browsing/proto/webui.pb.h" #include "components/safe_browsing_db/database_manager.h" #include "components/safe_browsing_db/hit_report.h" #include "components/safe_browsing_db/v4_database.h"
diff --git a/components/safe_browsing_db/v4_store.cc b/components/safe_browsing_db/v4_store.cc index e7bce82..2d51d61c 100644 --- a/components/safe_browsing_db/v4_store.cc +++ b/components/safe_browsing_db/v4_store.cc
@@ -12,7 +12,7 @@ #include "base/metrics/sparse_histogram.h" #include "base/stl_util.h" #include "base/strings/stringprintf.h" -#include "components/safe_browsing/web_ui/webui.pb.h" +#include "components/safe_browsing/proto/webui.pb.h" #include "components/safe_browsing_db/v4_rice.h" #include "components/safe_browsing_db/v4_store.pb.h" #include "crypto/secure_hash.h"
diff --git a/components/safe_browsing_db/v4_store.h b/components/safe_browsing_db/v4_store.h index 3ebd47a..392d841c 100644 --- a/components/safe_browsing_db/v4_store.h +++ b/components/safe_browsing_db/v4_store.h
@@ -13,7 +13,7 @@ #include "base/memory/ref_counted.h" #include "base/sequenced_task_runner.h" #include "base/single_thread_task_runner.h" -#include "components/safe_browsing/web_ui/webui.pb.h" +#include "components/safe_browsing/proto/webui.pb.h" #include "components/safe_browsing_db/v4_protocol_manager_util.h" namespace safe_browsing {
diff --git a/components/safe_browsing_db/v4_update_protocol_manager.h b/components/safe_browsing_db/v4_update_protocol_manager.h index db01b070..73f076f6 100644 --- a/components/safe_browsing_db/v4_update_protocol_manager.h +++ b/components/safe_browsing_db/v4_update_protocol_manager.h
@@ -22,7 +22,7 @@ #include "base/time/time.h" #include "base/timer/timer.h" #include "components/safe_browsing/common/safe_browsing_prefs.h" -#include "components/safe_browsing/web_ui/webui.pb.h" +#include "components/safe_browsing/proto/webui.pb.h" #include "components/safe_browsing_db/safebrowsing.pb.h" #include "components/safe_browsing_db/util.h" #include "components/safe_browsing_db/v4_protocol_manager_util.h"
diff --git a/components/security_state/content/content_utils.cc b/components/security_state/content/content_utils.cc index 37dee4f..c532fc1 100644 --- a/components/security_state/content/content_utils.cc +++ b/components/security_state/content/content_utils.cc
@@ -99,7 +99,7 @@ content::SecurityStyleExplanation( l10n_util::GetStringUTF8(IDS_SHA1), l10n_util::GetStringUTF8(IDS_SHA1_DESCRIPTION), - !!security_info.certificate, + security_info.certificate, blink::WebMixedContentContextType::kNotMixedContent)); } @@ -108,7 +108,7 @@ content::SecurityStyleExplanation( l10n_util::GetStringUTF8(IDS_SUBJECT_ALT_NAME_MISSING), l10n_util::GetStringUTF8(IDS_SUBJECT_ALT_NAME_MISSING_DESCRIPTION), - !!security_info.certificate, + security_info.certificate, blink::WebMixedContentContextType::kNotMixedContent)); } @@ -124,7 +124,7 @@ l10n_util::GetStringUTF8(IDS_CERTIFICATE_CHAIN_ERROR), l10n_util::GetStringFUTF8( IDS_CERTIFICATE_CHAIN_ERROR_DESCRIPTION_FORMAT, error_string), - !!security_info.certificate, + security_info.certificate, blink::WebMixedContentContextType::kNotMixedContent); if (is_cert_status_minor_error) { @@ -155,7 +155,7 @@ l10n_util::GetStringUTF8(IDS_VALID_SERVER_CERTIFICATE), l10n_util::GetStringFUTF8( IDS_VALID_SERVER_CERTIFICATE_DESCRIPTION, issuer_name), - !!security_info.certificate, + security_info.certificate, blink::WebMixedContentContextType::kNotMixedContent)); } } @@ -275,7 +275,7 @@ content::SecurityStyleExplanation( l10n_util::GetStringUTF8(IDS_MIXED_ACTIVE_CONTENT_SUMMARY), l10n_util::GetStringUTF8(IDS_MIXED_ACTIVE_CONTENT_DESCRIPTION), - false, blink::WebMixedContentContextType::kBlockable)); + nullptr, blink::WebMixedContentContextType::kBlockable)); } security_style_explanations->displayed_mixed_content = @@ -289,7 +289,7 @@ content::SecurityStyleExplanation( l10n_util::GetStringUTF8(IDS_MIXED_PASSIVE_CONTENT_SUMMARY), l10n_util::GetStringUTF8(IDS_MIXED_PASSIVE_CONTENT_DESCRIPTION), - false, blink::WebMixedContentContextType::kOptionallyBlockable)); + nullptr, blink::WebMixedContentContextType::kOptionallyBlockable)); } security_style_explanations->contained_mixed_form =
diff --git a/components/security_state/content/content_utils_unittest.cc b/components/security_state/content/content_utils_unittest.cc index e2615b32..d4e30e83 100644 --- a/components/security_state/content/content_utils_unittest.cc +++ b/components/security_state/content/content_utils_unittest.cc
@@ -580,7 +580,7 @@ TEST(SecurityStateContentUtilsTest, DefaultSecurityStyleExplanation) { content::SecurityStyleExplanation explanation("summary", "description"); - EXPECT_EQ(false, explanation.has_certificate); + EXPECT_EQ(false, !!explanation.certificate); EXPECT_EQ(blink::WebMixedContentContextType::kNotMixedContent, explanation.mixed_content_type); }
diff --git a/components/security_state/core/security_state.h b/components/security_state/core/security_state.h index 2a77332..9f4e4fb 100644 --- a/components/security_state/core/security_state.h +++ b/components/security_state/core/security_state.h
@@ -32,8 +32,8 @@ // Describes the overall security state of the page. // -// If you reorder, add, or delete values from this enum, you must also -// update the UI icons in ToolbarModelImpl::GetIconForSecurityLevel. +// If you change this enum, you may need to update the UI icons in +// ToolbarModelImpl::GetVectorIcon and GetIconForSecurityState. // // A Java counterpart will be generated for this enum. // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.components.security_state @@ -56,7 +56,7 @@ // HTTPS (non-EV) with valid cert. SECURE, - // HTTPS, but with an outdated protocol version. + // Obsolete, do not use. TODO(lgarron): Remove via https://crbug.com/645698. SECURITY_WARNING, // HTTPS, but the certificate verification chain is anchored on a
diff --git a/components/viz/client/client_shared_bitmap_manager.cc b/components/viz/client/client_shared_bitmap_manager.cc index 8c1d51a..63b30e7 100644 --- a/components/viz/client/client_shared_bitmap_manager.cc +++ b/components/viz/client/client_shared_bitmap_manager.cc
@@ -24,7 +24,7 @@ class ClientSharedBitmap : public SharedBitmap { public: ClientSharedBitmap( - scoped_refptr<cc::mojom::ThreadSafeSharedBitmapAllocationNotifierPtr> + scoped_refptr<mojom::ThreadSafeSharedBitmapAllocationNotifierPtr> shared_bitmap_allocation_notifier, base::SharedMemory* shared_memory, const SharedBitmapId& id, @@ -36,7 +36,7 @@ std::move(shared_bitmap_allocation_notifier)) {} ClientSharedBitmap( - scoped_refptr<cc::mojom::ThreadSafeSharedBitmapAllocationNotifierPtr> + scoped_refptr<mojom::ThreadSafeSharedBitmapAllocationNotifierPtr> shared_bitmap_allocation_notifier, std::unique_ptr<base::SharedMemory> shared_memory_holder, const SharedBitmapId& id, @@ -60,7 +60,7 @@ } private: - scoped_refptr<cc::mojom::ThreadSafeSharedBitmapAllocationNotifierPtr> + scoped_refptr<mojom::ThreadSafeSharedBitmapAllocationNotifierPtr> shared_bitmap_allocation_notifier_; std::unique_ptr<base::SharedMemory> shared_memory_holder_; }; @@ -112,7 +112,7 @@ } // namespace ClientSharedBitmapManager::ClientSharedBitmapManager( - scoped_refptr<cc::mojom::ThreadSafeSharedBitmapAllocationNotifierPtr> + scoped_refptr<mojom::ThreadSafeSharedBitmapAllocationNotifierPtr> shared_bitmap_allocation_notifier) : shared_bitmap_allocation_notifier_( std::move(shared_bitmap_allocation_notifier)) {}
diff --git a/components/viz/client/client_shared_bitmap_manager.h b/components/viz/client/client_shared_bitmap_manager.h index 8bb479c..553bb57 100644 --- a/components/viz/client/client_shared_bitmap_manager.h +++ b/components/viz/client/client_shared_bitmap_manager.h
@@ -13,9 +13,9 @@ #include "base/memory/ref_counted.h" #include "base/memory/shared_memory.h" #include "base/synchronization/lock.h" -#include "cc/ipc/shared_bitmap_allocation_notifier.mojom.h" #include "components/viz/common/resources/shared_bitmap_manager.h" #include "mojo/public/cpp/bindings/thread_safe_interface_ptr.h" +#include "services/viz/public/interfaces/compositing/shared_bitmap_allocation_notifier.mojom.h" namespace viz { @@ -25,7 +25,7 @@ class ClientSharedBitmapManager : public SharedBitmapManager { public: explicit ClientSharedBitmapManager( - scoped_refptr<cc::mojom::ThreadSafeSharedBitmapAllocationNotifierPtr> + scoped_refptr<mojom::ThreadSafeSharedBitmapAllocationNotifierPtr> shared_bitmap_allocation_notifier); ~ClientSharedBitmapManager() override; @@ -43,7 +43,7 @@ uint32_t NotifyAllocatedSharedBitmap(base::SharedMemory* memory, const SharedBitmapId& id); - scoped_refptr<cc::mojom::ThreadSafeSharedBitmapAllocationNotifierPtr> + scoped_refptr<mojom::ThreadSafeSharedBitmapAllocationNotifierPtr> shared_bitmap_allocation_notifier_; base::Lock lock_;
diff --git a/components/viz/host/BUILD.gn b/components/viz/host/BUILD.gn index 092768f..be3dc76 100644 --- a/components/viz/host/BUILD.gn +++ b/components/viz/host/BUILD.gn
@@ -8,6 +8,8 @@ defines = [ "VIZ_HOST_IMPLEMENTATION" ] sources = [ + "hit_test/hit_test_query.cc", + "hit_test/hit_test_query.h", "host_frame_sink_client.h", "host_frame_sink_manager.cc", "host_frame_sink_manager.h", @@ -21,6 +23,7 @@ deps = [ "//base", "//cc/ipc:interfaces", + "//components/viz/common", "//gpu/ipc/client", "//gpu/ipc/common", "//services/ui/gpu/interfaces", @@ -36,6 +39,8 @@ "//gpu/command_buffer/client", "//gpu/ipc/host", "//services/viz/compositing/privileged/interfaces", + "//services/viz/public/interfaces/hit_test", + "//ui/gfx/geometry", ] } @@ -43,6 +48,7 @@ testonly = true sources = [ + "hit_test/hit_test_query_unittest.cc", "host_frame_sink_manager_unittests.cc", "server_gpu_memory_buffer_manager_unittest.cc", ] @@ -52,7 +58,6 @@ "//base", "//base/test:test_support", "//cc/ipc:interfaces", - "//components/viz/host/hit_test:unit_tests", "//gpu/ipc/host", "//mojo/public/cpp/bindings", "//services/ui/gpu/interfaces",
diff --git a/components/viz/host/hit_test/BUILD.gn b/components/viz/host/hit_test/BUILD.gn deleted file mode 100644 index aa16214..0000000 --- a/components/viz/host/hit_test/BUILD.gn +++ /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. - -import("//components/viz/viz.gni") -import("//testing/test.gni") - -viz_source_set("hit_test") { - sources = [ - "hit_test_query.cc", - "hit_test_query.h", - ] - - public_deps = [ - "//components/viz/common", - "//services/viz/public/interfaces/hit_test", - "//ui/gfx", - "//ui/gfx/geometry", - ] -} - -viz_source_set("unit_tests") { - testonly = true - - sources = [ - "hit_test_query_unittest.cc", - ] - - deps = [ - ":hit_test", - "//base", - "//base/test:test_support", - "//cc:test_support", - "//testing/gtest", - ] -}
diff --git a/components/viz/host/hit_test/hit_test_query.h b/components/viz/host/hit_test/hit_test_query.h index 31221bf..a99f745 100644 --- a/components/viz/host/hit_test/hit_test_query.h +++ b/components/viz/host/hit_test/hit_test_query.h
@@ -9,6 +9,7 @@ #include "base/macros.h" #include "components/viz/common/hit_test/aggregated_hit_test_region.h" +#include "components/viz/host/viz_host_export.h" #include "mojo/public/cpp/system/buffer.h" #include "ui/gfx/geometry/point.h" @@ -26,7 +27,7 @@ // Finds the target for a given location based on the AggregatedHitTestRegion // list aggregated by HitTestAggregator. // TODO(riajiang): Handle 3d space cases correctly. -class HitTestQuery { +class VIZ_HOST_EXPORT HitTestQuery { public: HitTestQuery(); ~HitTestQuery();
diff --git a/components/viz/presubmit_checks.py b/components/viz/presubmit_checks.py index 9db40f1..da6c89d 100644 --- a/components/viz/presubmit_checks.py +++ b/components/viz/presubmit_checks.py
@@ -244,6 +244,32 @@ items=errors)] return [] +# Verifies that we use the right module name (viz.mojom) in mojom files and we +# don't specify module name viz.mojom when referring to types in viz.mojom. +def CheckMojoms(input_api, output_api): + source_file_filter = lambda x: input_api.FilterSourceFile(x, + ['.*\.mojom$'], + []) + wrong_module_name=[] + omit_module_name=[] + for f in input_api.AffectedSourceFiles(source_file_filter): + contents = input_api.ReadFile(f, 'rb') + if 'module viz.mojom;' not in contents: + wrong_module_name.append(f.LocalPath()) + elif 'viz.mojom.' in contents: + omit_module_name.append(f.LocalPath()) + + errors=[] + if wrong_module_name: + errors.append(output_api.PresubmitError( + 'Use viz.mojom as the module name in mojom files.', + items=wrong_module_name)) + if omit_module_name: + errors.append(output_api.PresubmitError( + 'Do not specify module name viz.mojom when referring to types ' + + 'in the same module.', items=omit_module_name)) + return errors + def CheckForUseOfWrongClock(input_api, output_api, white_list, @@ -307,6 +333,7 @@ results += CheckDoubleAngles(input_api, output_api, white_list) results += CheckUniquePtr(input_api, output_api, white_list) results += CheckNamespace(input_api, output_api) + results += CheckMojoms(input_api, output_api) results += CheckForUseOfWrongClock(input_api, output_api, white_list) results += FindUselessIfdefs(input_api, output_api) return results
diff --git a/components/viz/service/DEPS b/components/viz/service/DEPS index a29ec613..d840a11 100644 --- a/components/viz/service/DEPS +++ b/components/viz/service/DEPS
@@ -2,6 +2,7 @@ "+cc", "-components/viz/common/switches.h", "+components/viz/service", + "+services/viz/public/interfaces", "+third_party/skia", "+ui/gfx", "+ui/gfx/geometry", @@ -12,6 +13,5 @@ ".*_unittest\.cc": [ "+components/viz/test", "+services/compositing/privileged/interfaces", - "+services/viz/public/interfaces/compositing", ] }
diff --git a/components/viz/service/display_embedder/shared_bitmap_allocation_notifier_impl.cc b/components/viz/service/display_embedder/shared_bitmap_allocation_notifier_impl.cc index d320a3d..bc81f59 100644 --- a/components/viz/service/display_embedder/shared_bitmap_allocation_notifier_impl.cc +++ b/components/viz/service/display_embedder/shared_bitmap_allocation_notifier_impl.cc
@@ -21,7 +21,7 @@ } void SharedBitmapAllocationNotifierImpl::Bind( - cc::mojom::SharedBitmapAllocationNotifierRequest request) { + mojom::SharedBitmapAllocationNotifierRequest request) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); if (binding_.is_bound()) { DLOG(ERROR) << "Only one SharedBitmapAllocationNotifierRequest is "
diff --git a/components/viz/service/display_embedder/shared_bitmap_allocation_notifier_impl.h b/components/viz/service/display_embedder/shared_bitmap_allocation_notifier_impl.h index 4e9330a..080fece 100644 --- a/components/viz/service/display_embedder/shared_bitmap_allocation_notifier_impl.h +++ b/components/viz/service/display_embedder/shared_bitmap_allocation_notifier_impl.h
@@ -9,10 +9,10 @@ #include "base/observer_list.h" #include "base/threading/thread_checker.h" -#include "cc/ipc/shared_bitmap_allocation_notifier.mojom.h" #include "components/viz/common/quads/shared_bitmap.h" #include "components/viz/service/viz_service_export.h" #include "mojo/public/cpp/bindings/binding.h" +#include "services/viz/public/interfaces/compositing/shared_bitmap_allocation_notifier.mojom.h" namespace viz { class ServerSharedBitmapManager; @@ -23,7 +23,7 @@ }; class VIZ_SERVICE_EXPORT SharedBitmapAllocationNotifierImpl - : NON_EXPORTED_BASE(public cc::mojom::SharedBitmapAllocationNotifier) { + : NON_EXPORTED_BASE(public mojom::SharedBitmapAllocationNotifier) { public: explicit SharedBitmapAllocationNotifierImpl( ServerSharedBitmapManager* manager); @@ -33,9 +33,9 @@ void AddObserver(SharedBitmapAllocationObserver* observer); void RemoveObserver(SharedBitmapAllocationObserver* observer); - void Bind(cc::mojom::SharedBitmapAllocationNotifierRequest request); + void Bind(mojom::SharedBitmapAllocationNotifierRequest request); - // cc::mojom::SharedBitmapAllocationNotifier overrides: + // mojom::SharedBitmapAllocationNotifier overrides: void DidAllocateSharedBitmap(mojo::ScopedSharedBufferHandle buffer, const SharedBitmapId& id) override; void DidDeleteSharedBitmap(const SharedBitmapId& id) override; @@ -51,7 +51,7 @@ private: THREAD_CHECKER(thread_checker_); ServerSharedBitmapManager* const manager_; - mojo::Binding<cc::mojom::SharedBitmapAllocationNotifier> binding_; + mojo::Binding<mojom::SharedBitmapAllocationNotifier> binding_; std::unordered_set<SharedBitmapId, SharedBitmapIdHash> owned_bitmaps_; base::ObserverList<SharedBitmapAllocationObserver> observers_; uint32_t last_sequence_number_ = 0;
diff --git a/components/viz/service/frame_sinks/DEPS b/components/viz/service/frame_sinks/DEPS index 0216da50..d878155 100644 --- a/components/viz/service/frame_sinks/DEPS +++ b/components/viz/service/frame_sinks/DEPS
@@ -6,5 +6,4 @@ "+gpu/ipc/common", "+mojo/public/cpp/bindings", "+services/viz/compositing/privileged/interfaces", - "+services/viz/public/interfaces/compositing", ]
diff --git a/components/viz/service/hit_test/DEPS b/components/viz/service/hit_test/DEPS index 37540ce..38ff3f7 100644 --- a/components/viz/service/hit_test/DEPS +++ b/components/viz/service/hit_test/DEPS
@@ -1,6 +1,5 @@ include_rules = [ "+components/viz/service/surfaces", - "+services/viz/public/interfaces/hit_test", ] specific_include_rules = {
diff --git a/components/viz/service/hit_test/hit_test_aggregator.cc b/components/viz/service/hit_test/hit_test_aggregator.cc index 301a38e..4b07ea15 100644 --- a/components/viz/service/hit_test/hit_test_aggregator.cc +++ b/components/viz/service/hit_test/hit_test_aggregator.cc
@@ -47,15 +47,16 @@ HitTestAggregator::~HitTestAggregator() = default; void HitTestAggregator::SubmitHitTestRegionList( + const SurfaceId& frame_sink_id, mojom::HitTestRegionListPtr hit_test_region_list) { DCHECK(ValidateHitTestRegionList(hit_test_region_list)); // TODO(gklassen): Runtime validation that hit_test_region_list is valid. // TODO(gklassen): Inform FrameSink that the hit_test_region_list is invalid. // TODO(gklassen): FrameSink needs to inform the host of a difficult renderer. - pending_[hit_test_region_list->surface_id] = std::move(hit_test_region_list); + pending_[frame_sink_id] = std::move(hit_test_region_list); } -void HitTestAggregator::PostTaskAggregate(SurfaceId display_surface_id) { +void HitTestAggregator::PostTaskAggregate(const SurfaceId& display_surface_id) { base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::BindOnce(&HitTestAggregator::Aggregate, @@ -170,7 +171,7 @@ AggregatedHitTestRegion* regions = static_cast<AggregatedHitTestRegion*>(write_buffer_.get()); - regions[0].frame_sink_id = hit_test_region_list->surface_id.frame_sink_id(); + regions[0].frame_sink_id = surface_id.frame_sink_id(); regions[0].flags = hit_test_region_list->flags; regions[0].rect = hit_test_region_list->bounds; regions[0].transform = hit_test_region_list->transform;
diff --git a/components/viz/service/hit_test/hit_test_aggregator.h b/components/viz/service/hit_test/hit_test_aggregator.h index 787d4a7..9d08d05 100644 --- a/components/viz/service/hit_test/hit_test_aggregator.h +++ b/components/viz/service/hit_test/hit_test_aggregator.h
@@ -30,11 +30,12 @@ // to SubmitCompositorFrame. This is collected in pending_ until // surfaces are aggregated and put on the display. void SubmitHitTestRegionList( + const SurfaceId& surface_id, mojom::HitTestRegionListPtr hit_test_region_list); // Performs the work of Aggregate by creating a PostTask so that // the work is not directly on the call. - void PostTaskAggregate(SurfaceId display_surface_id); + void PostTaskAggregate(const SurfaceId& display_surface_id); // Called after surfaces have been aggregated into the DisplayFrame. // In this call HitTestRegionList structures received from active surfaces
diff --git a/components/viz/service/hit_test/hit_test_aggregator_unittest.cc b/components/viz/service/hit_test/hit_test_aggregator_unittest.cc index 002d50c7..c52abcb 100644 --- a/components/viz/service/hit_test/hit_test_aggregator_unittest.cc +++ b/components/viz/service/hit_test/hit_test_aggregator_unittest.cc
@@ -232,7 +232,6 @@ id++; auto hit_test_region_list = mojom::HitTestRegionList::New(); - hit_test_region_list->surface_id = surface_id; hit_test_region_list->flags = mojom::kHitTestMine; hit_test_region_list->bounds.SetRect(0, 0, 1024, 768); @@ -251,7 +250,7 @@ } GetAggregator(kDisplayFrameSink) - ->SubmitHitTestRegionList(std::move(hit_test_region_list)); + ->SubmitHitTestRegionList(surface_id, std::move(hit_test_region_list)); return id; } @@ -296,11 +295,11 @@ SurfaceId display_surface_id = MakeSurfaceId(kDisplayFrameSink, 1); auto hit_test_region_list = mojom::HitTestRegionList::New(); - hit_test_region_list->surface_id = display_surface_id; hit_test_region_list->flags = mojom::kHitTestMine; hit_test_region_list->bounds.SetRect(0, 0, 1024, 768); - aggregator->SubmitHitTestRegionList(std::move(hit_test_region_list)); + aggregator->SubmitHitTestRegionList(display_surface_id, + std::move(hit_test_region_list)); EXPECT_EQ(aggregator->Count(), 0); EXPECT_EQ(aggregator->GetPendingCount(), 1); @@ -345,10 +344,9 @@ SurfaceId e_surface_id = MakeSurfaceId(kDisplayFrameSink, 1); - auto e_hit_test_data = mojom::HitTestRegionList::New(); - e_hit_test_data->surface_id = e_surface_id; - e_hit_test_data->flags = mojom::kHitTestMine; - e_hit_test_data->bounds.SetRect(0, 0, 1024, 768); + auto e_hit_test_region_list = mojom::HitTestRegionList::New(); + e_hit_test_region_list->flags = mojom::kHitTestMine; + e_hit_test_region_list->bounds.SetRect(0, 0, 1024, 768); auto e_hit_test_region_r1 = mojom::HitTestRegion::New(); e_hit_test_region_r1->surface_id = e_surface_id; @@ -360,14 +358,15 @@ e_hit_test_region_r2->flags = mojom::kHitTestMine; e_hit_test_region_r2->rect.SetRect(400, 100, 300, 400); - e_hit_test_data->regions.push_back(std::move(e_hit_test_region_r1)); - e_hit_test_data->regions.push_back(std::move(e_hit_test_region_r2)); + e_hit_test_region_list->regions.push_back(std::move(e_hit_test_region_r1)); + e_hit_test_region_list->regions.push_back(std::move(e_hit_test_region_r2)); // Submit mojom::HitTestRegionList. EXPECT_EQ(aggregator->GetPendingCount(), 0); - aggregator->SubmitHitTestRegionList(std::move(e_hit_test_data)); + aggregator->SubmitHitTestRegionList(e_surface_id, + std::move(e_hit_test_region_list)); EXPECT_EQ(aggregator->GetPendingCount(), 1); // Add Surfaces to DisplayFrame in unexpected order. @@ -427,10 +426,9 @@ SurfaceId c1_surface_id = MakeSurfaceId(kDisplayFrameSink, 2); SurfaceId c2_surface_id = MakeSurfaceId(kDisplayFrameSink, 3); - auto e_hit_test_data = mojom::HitTestRegionList::New(); - e_hit_test_data->surface_id = e_surface_id; - e_hit_test_data->flags = mojom::kHitTestMine; - e_hit_test_data->bounds.SetRect(0, 0, 1024, 768); + auto e_hit_test_region_list = mojom::HitTestRegionList::New(); + e_hit_test_region_list->flags = mojom::kHitTestMine; + e_hit_test_region_list->bounds.SetRect(0, 0, 1024, 768); auto e_hit_test_region_c1 = mojom::HitTestRegion::New(); e_hit_test_region_c1->flags = mojom::kHitTestChildSurface; @@ -442,26 +440,27 @@ e_hit_test_region_c2->surface_id = c2_surface_id; e_hit_test_region_c2->rect.SetRect(400, 100, 400, 300); - e_hit_test_data->regions.push_back(std::move(e_hit_test_region_c1)); - e_hit_test_data->regions.push_back(std::move(e_hit_test_region_c2)); + e_hit_test_region_list->regions.push_back(std::move(e_hit_test_region_c1)); + e_hit_test_region_list->regions.push_back(std::move(e_hit_test_region_c2)); - auto c1_hit_test_data = mojom::HitTestRegionList::New(); - c1_hit_test_data->surface_id = c1_surface_id; + auto c1_hit_test_region_list = mojom::HitTestRegionList::New(); - auto c2_hit_test_data = mojom::HitTestRegionList::New(); - c2_hit_test_data->surface_id = c2_surface_id; + auto c2_hit_test_region_list = mojom::HitTestRegionList::New(); // Submit in unexpected order. EXPECT_EQ(aggregator->GetPendingCount(), 0); - aggregator->SubmitHitTestRegionList(std::move(c1_hit_test_data)); + aggregator->SubmitHitTestRegionList(c1_surface_id, + std::move(c1_hit_test_region_list)); EXPECT_EQ(aggregator->GetPendingCount(), 1); - aggregator->SubmitHitTestRegionList(std::move(e_hit_test_data)); + aggregator->SubmitHitTestRegionList(e_surface_id, + std::move(e_hit_test_region_list)); EXPECT_EQ(aggregator->GetPendingCount(), 2); - aggregator->SubmitHitTestRegionList(std::move(c2_hit_test_data)); + aggregator->SubmitHitTestRegionList(c2_surface_id, + std::move(c2_hit_test_region_list)); EXPECT_EQ(aggregator->GetPendingCount(), 3); // Surfaces added to DisplayFrame in unexpected order. @@ -531,10 +530,9 @@ SurfaceId e_surface_id = MakeSurfaceId(kDisplayFrameSink, 1); SurfaceId c_surface_id = MakeSurfaceId(kDisplayFrameSink, 2); - auto e_hit_test_data = mojom::HitTestRegionList::New(); - e_hit_test_data->surface_id = e_surface_id; - e_hit_test_data->flags = mojom::kHitTestMine; - e_hit_test_data->bounds.SetRect(0, 0, 1024, 768); + auto e_hit_test_region_list = mojom::HitTestRegionList::New(); + e_hit_test_region_list->flags = mojom::kHitTestMine; + e_hit_test_region_list->bounds.SetRect(0, 0, 1024, 768); auto e_hit_test_region_div = mojom::HitTestRegion::New(); e_hit_test_region_div->flags = mojom::kHitTestMine; @@ -546,22 +544,23 @@ e_hit_test_region_c->surface_id = c_surface_id; e_hit_test_region_c->rect.SetRect(100, 100, 200, 500); - e_hit_test_data->regions.push_back(std::move(e_hit_test_region_div)); - e_hit_test_data->regions.push_back(std::move(e_hit_test_region_c)); + e_hit_test_region_list->regions.push_back(std::move(e_hit_test_region_div)); + e_hit_test_region_list->regions.push_back(std::move(e_hit_test_region_c)); - auto c_hit_test_data = mojom::HitTestRegionList::New(); - c_hit_test_data->surface_id = c_surface_id; - c_hit_test_data->flags = mojom::kHitTestMine; - c_hit_test_data->bounds.SetRect(0, 0, 200, 500); + auto c_hit_test_region_list = mojom::HitTestRegionList::New(); + c_hit_test_region_list->flags = mojom::kHitTestMine; + c_hit_test_region_list->bounds.SetRect(0, 0, 200, 500); // Submit in unexpected order. EXPECT_EQ(aggregator->GetPendingCount(), 0); - aggregator->SubmitHitTestRegionList(std::move(c_hit_test_data)); + aggregator->SubmitHitTestRegionList(c_surface_id, + std::move(c_hit_test_region_list)); EXPECT_EQ(aggregator->GetPendingCount(), 1); - aggregator->SubmitHitTestRegionList(std::move(e_hit_test_data)); + aggregator->SubmitHitTestRegionList(e_surface_id, + std::move(e_hit_test_region_list)); EXPECT_EQ(aggregator->GetPendingCount(), 2); // Surfaces added to DisplayFrame in unexpected order. @@ -629,10 +628,9 @@ SurfaceId e_surface_id = MakeSurfaceId(kDisplayFrameSink, 1); SurfaceId c_surface_id = MakeSurfaceId(kDisplayFrameSink, 2); - auto e_hit_test_data = mojom::HitTestRegionList::New(); - e_hit_test_data->surface_id = e_surface_id; - e_hit_test_data->flags = mojom::kHitTestMine; - e_hit_test_data->bounds.SetRect(0, 0, 1024, 768); + auto e_hit_test_region_list = mojom::HitTestRegionList::New(); + e_hit_test_region_list->flags = mojom::kHitTestMine; + e_hit_test_region_list->bounds.SetRect(0, 0, 1024, 768); auto e_hit_test_region_div = mojom::HitTestRegion::New(); e_hit_test_region_div->flags = mojom::kHitTestMine; @@ -644,22 +642,23 @@ e_hit_test_region_c->surface_id = c_surface_id; e_hit_test_region_c->rect.SetRect(100, 100, 200, 500); - e_hit_test_data->regions.push_back(std::move(e_hit_test_region_c)); - e_hit_test_data->regions.push_back(std::move(e_hit_test_region_div)); + e_hit_test_region_list->regions.push_back(std::move(e_hit_test_region_c)); + e_hit_test_region_list->regions.push_back(std::move(e_hit_test_region_div)); - auto c_hit_test_data = mojom::HitTestRegionList::New(); - c_hit_test_data->surface_id = c_surface_id; - c_hit_test_data->flags = mojom::kHitTestMine; - c_hit_test_data->bounds.SetRect(0, 0, 200, 500); + auto c_hit_test_region_list = mojom::HitTestRegionList::New(); + c_hit_test_region_list->flags = mojom::kHitTestMine; + c_hit_test_region_list->bounds.SetRect(0, 0, 200, 500); // Submit in unexpected order. EXPECT_EQ(aggregator->GetPendingCount(), 0); - aggregator->SubmitHitTestRegionList(std::move(c_hit_test_data)); + aggregator->SubmitHitTestRegionList(c_surface_id, + std::move(c_hit_test_region_list)); EXPECT_EQ(aggregator->GetPendingCount(), 1); - aggregator->SubmitHitTestRegionList(std::move(e_hit_test_data)); + aggregator->SubmitHitTestRegionList(e_surface_id, + std::move(e_hit_test_region_list)); EXPECT_EQ(aggregator->GetPendingCount(), 2); // Surfaces added to DisplayFrame in unexpected order. @@ -729,10 +728,9 @@ SurfaceId a_surface_id = MakeSurfaceId(kDisplayFrameSink, 3); SurfaceId b_surface_id = MakeSurfaceId(kDisplayFrameSink, 4); - auto e_hit_test_data = mojom::HitTestRegionList::New(); - e_hit_test_data->surface_id = e_surface_id; - e_hit_test_data->flags = mojom::kHitTestMine; - e_hit_test_data->bounds.SetRect(0, 0, 1024, 768); + auto e_hit_test_region_list = mojom::HitTestRegionList::New(); + e_hit_test_region_list->flags = mojom::kHitTestMine; + e_hit_test_region_list->bounds.SetRect(0, 0, 1024, 768); auto e_hit_test_region_c = mojom::HitTestRegion::New(); e_hit_test_region_c->flags = mojom::kHitTestChildSurface; @@ -740,12 +738,11 @@ e_hit_test_region_c->rect.SetRect(300, 100, 1600, 800); e_hit_test_region_c->transform.Translate(200, 100); - e_hit_test_data->regions.push_back(std::move(e_hit_test_region_c)); + e_hit_test_region_list->regions.push_back(std::move(e_hit_test_region_c)); - auto c_hit_test_data = mojom::HitTestRegionList::New(); - c_hit_test_data->surface_id = c_surface_id; - c_hit_test_data->flags = mojom::kHitTestIgnore; - c_hit_test_data->bounds.SetRect(0, 0, 1600, 800); + auto c_hit_test_region_list = mojom::HitTestRegionList::New(); + c_hit_test_region_list->flags = mojom::kHitTestIgnore; + c_hit_test_region_list->bounds.SetRect(0, 0, 1600, 800); auto c_hit_test_region_a = mojom::HitTestRegion::New(); c_hit_test_region_a->flags = mojom::kHitTestChildSurface; @@ -757,33 +754,35 @@ c_hit_test_region_b->surface_id = b_surface_id; c_hit_test_region_b->rect.SetRect(0, 100, 800, 600); - c_hit_test_data->regions.push_back(std::move(c_hit_test_region_a)); - c_hit_test_data->regions.push_back(std::move(c_hit_test_region_b)); + c_hit_test_region_list->regions.push_back(std::move(c_hit_test_region_a)); + c_hit_test_region_list->regions.push_back(std::move(c_hit_test_region_b)); - auto a_hit_test_data = mojom::HitTestRegionList::New(); - a_hit_test_data->surface_id = a_surface_id; - a_hit_test_data->flags = mojom::kHitTestMine; - a_hit_test_data->bounds.SetRect(0, 0, 200, 100); + auto a_hit_test_region_list = mojom::HitTestRegionList::New(); + a_hit_test_region_list->flags = mojom::kHitTestMine; + a_hit_test_region_list->bounds.SetRect(0, 0, 200, 100); - auto b_hit_test_data = mojom::HitTestRegionList::New(); - b_hit_test_data->surface_id = b_surface_id; - b_hit_test_data->flags = mojom::kHitTestMine; - b_hit_test_data->bounds.SetRect(0, 100, 800, 600); + auto b_hit_test_region_list = mojom::HitTestRegionList::New(); + b_hit_test_region_list->flags = mojom::kHitTestMine; + b_hit_test_region_list->bounds.SetRect(0, 100, 800, 600); // Submit in unexpected order. EXPECT_EQ(aggregator->GetPendingCount(), 0); - aggregator->SubmitHitTestRegionList(std::move(c_hit_test_data)); + aggregator->SubmitHitTestRegionList(c_surface_id, + std::move(c_hit_test_region_list)); EXPECT_EQ(aggregator->GetPendingCount(), 1); - aggregator->SubmitHitTestRegionList(std::move(a_hit_test_data)); + aggregator->SubmitHitTestRegionList(a_surface_id, + std::move(a_hit_test_region_list)); EXPECT_EQ(aggregator->GetPendingCount(), 2); - aggregator->SubmitHitTestRegionList(std::move(b_hit_test_data)); + aggregator->SubmitHitTestRegionList(b_surface_id, + std::move(b_hit_test_region_list)); EXPECT_EQ(aggregator->GetPendingCount(), 3); - aggregator->SubmitHitTestRegionList(std::move(e_hit_test_data)); + aggregator->SubmitHitTestRegionList(e_surface_id, + std::move(e_hit_test_region_list)); EXPECT_EQ(aggregator->GetPendingCount(), 4); // Surfaces added to DisplayFrame in unexpected order. @@ -871,61 +870,61 @@ SurfaceId c2_surface_id = MakeSurfaceId(kDisplayFrameSink, 3); SurfaceId c3_surface_id = MakeSurfaceId(kDisplayFrameSink, 4); - auto e_hit_test_data = mojom::HitTestRegionList::New(); - e_hit_test_data->surface_id = e_surface_id; - e_hit_test_data->flags = mojom::kHitTestMine; - e_hit_test_data->bounds.SetRect(0, 0, 1024, 768); + auto e_hit_test_region_list = mojom::HitTestRegionList::New(); + e_hit_test_region_list->flags = mojom::kHitTestMine; + e_hit_test_region_list->bounds.SetRect(0, 0, 1024, 768); auto e_hit_test_region_c1 = mojom::HitTestRegion::New(); e_hit_test_region_c1->flags = mojom::kHitTestChildSurface; e_hit_test_region_c1->surface_id = c1_surface_id; e_hit_test_region_c1->rect.SetRect(100, 100, 700, 700); - e_hit_test_data->regions.push_back(std::move(e_hit_test_region_c1)); + e_hit_test_region_list->regions.push_back(std::move(e_hit_test_region_c1)); - auto c1_hit_test_data = mojom::HitTestRegionList::New(); - c1_hit_test_data->surface_id = c1_surface_id; - c1_hit_test_data->flags = mojom::kHitTestMine; - c1_hit_test_data->bounds.SetRect(0, 0, 600, 600); + auto c1_hit_test_region_list = mojom::HitTestRegionList::New(); + c1_hit_test_region_list->flags = mojom::kHitTestMine; + c1_hit_test_region_list->bounds.SetRect(0, 0, 600, 600); auto c1_hit_test_region_c2 = mojom::HitTestRegion::New(); c1_hit_test_region_c2->flags = mojom::kHitTestChildSurface; c1_hit_test_region_c2->surface_id = c2_surface_id; c1_hit_test_region_c2->rect.SetRect(100, 100, 500, 500); - c1_hit_test_data->regions.push_back(std::move(c1_hit_test_region_c2)); + c1_hit_test_region_list->regions.push_back(std::move(c1_hit_test_region_c2)); - auto c2_hit_test_data = mojom::HitTestRegionList::New(); - c2_hit_test_data->surface_id = c2_surface_id; - c2_hit_test_data->flags = mojom::kHitTestMine; - c2_hit_test_data->bounds.SetRect(0, 0, 400, 400); + auto c2_hit_test_region_list = mojom::HitTestRegionList::New(); + c2_hit_test_region_list->flags = mojom::kHitTestMine; + c2_hit_test_region_list->bounds.SetRect(0, 0, 400, 400); auto c2_hit_test_region_c3 = mojom::HitTestRegion::New(); c2_hit_test_region_c3->flags = mojom::kHitTestChildSurface; c2_hit_test_region_c3->surface_id = c3_surface_id; c2_hit_test_region_c3->rect.SetRect(100, 100, 300, 300); - c2_hit_test_data->regions.push_back(std::move(c2_hit_test_region_c3)); + c2_hit_test_region_list->regions.push_back(std::move(c2_hit_test_region_c3)); - auto c3_hit_test_data = mojom::HitTestRegionList::New(); - c3_hit_test_data->surface_id = c3_surface_id; - c3_hit_test_data->flags = mojom::kHitTestMine; - c3_hit_test_data->bounds.SetRect(0, 0, 200, 200); + auto c3_hit_test_region_list = mojom::HitTestRegionList::New(); + c3_hit_test_region_list->flags = mojom::kHitTestMine; + c3_hit_test_region_list->bounds.SetRect(0, 0, 200, 200); // Submit in unexpected order. EXPECT_EQ(aggregator->GetPendingCount(), 0); - aggregator->SubmitHitTestRegionList(std::move(c1_hit_test_data)); + aggregator->SubmitHitTestRegionList(c1_surface_id, + std::move(c1_hit_test_region_list)); EXPECT_EQ(aggregator->GetPendingCount(), 1); - aggregator->SubmitHitTestRegionList(std::move(c3_hit_test_data)); + aggregator->SubmitHitTestRegionList(c3_surface_id, + std::move(c3_hit_test_region_list)); EXPECT_EQ(aggregator->GetPendingCount(), 2); - aggregator->SubmitHitTestRegionList(std::move(e_hit_test_data)); + aggregator->SubmitHitTestRegionList(e_surface_id, + std::move(e_hit_test_region_list)); EXPECT_EQ(aggregator->GetPendingCount(), 3); - aggregator->SubmitHitTestRegionList(std::move(c2_hit_test_data)); + aggregator->SubmitHitTestRegionList(c2_surface_id, + std::move(c2_hit_test_region_list)); EXPECT_EQ(aggregator->GetPendingCount(), 4); // Surfaces added to DisplayFrame in unexpected order. @@ -1004,10 +1003,9 @@ SurfaceId e_surface_id = MakeSurfaceId(kDisplayFrameSink, 1); SurfaceId c_surface_id = MakeSurfaceId(kDisplayFrameSink, 2); - auto e_hit_test_data = mojom::HitTestRegionList::New(); - e_hit_test_data->surface_id = e_surface_id; - e_hit_test_data->flags = mojom::kHitTestMine; - e_hit_test_data->bounds.SetRect(0, 0, 1024, 768); + auto e_hit_test_region_list = mojom::HitTestRegionList::New(); + e_hit_test_region_list->flags = mojom::kHitTestMine; + e_hit_test_region_list->bounds.SetRect(0, 0, 1024, 768); auto e_hit_test_region_div = mojom::HitTestRegion::New(); e_hit_test_region_div->flags = mojom::kHitTestMine; @@ -1019,19 +1017,19 @@ e_hit_test_region_c->surface_id = c_surface_id; e_hit_test_region_c->rect.SetRect(100, 100, 200, 500); - e_hit_test_data->regions.push_back(std::move(e_hit_test_region_c)); - e_hit_test_data->regions.push_back(std::move(e_hit_test_region_div)); + e_hit_test_region_list->regions.push_back(std::move(e_hit_test_region_c)); + e_hit_test_region_list->regions.push_back(std::move(e_hit_test_region_div)); - auto c_hit_test_data = mojom::HitTestRegionList::New(); - c_hit_test_data->surface_id = c_surface_id; - c_hit_test_data->flags = mojom::kHitTestMine; - c_hit_test_data->bounds.SetRect(0, 0, 200, 500); + auto c_hit_test_region_list = mojom::HitTestRegionList::New(); + c_hit_test_region_list->flags = mojom::kHitTestMine; + c_hit_test_region_list->bounds.SetRect(0, 0, 200, 500); // Submit in unexpected order, but not the child. EXPECT_EQ(aggregator->GetPendingCount(), 0); - aggregator->SubmitHitTestRegionList(std::move(e_hit_test_data)); + aggregator->SubmitHitTestRegionList(e_surface_id, + std::move(e_hit_test_region_list)); EXPECT_EQ(aggregator->GetPendingCount(), 1); // Surfaces added to DisplayFrame in unexpected order. @@ -1152,10 +1150,9 @@ SurfaceId e_surface_id = MakeSurfaceId(kDisplayFrameSink, 1); SurfaceId c_surface_id = MakeSurfaceId(kDisplayFrameSink, 2); - auto e_hit_test_data = mojom::HitTestRegionList::New(); - e_hit_test_data->surface_id = e_surface_id; - e_hit_test_data->flags = mojom::kHitTestMine; - e_hit_test_data->bounds.SetRect(0, 0, 1024, 768); + auto e_hit_test_region_list = mojom::HitTestRegionList::New(); + e_hit_test_region_list->flags = mojom::kHitTestMine; + e_hit_test_region_list->bounds.SetRect(0, 0, 1024, 768); auto e_hit_test_region_div = mojom::HitTestRegion::New(); e_hit_test_region_div->flags = mojom::kHitTestMine; @@ -1167,13 +1164,12 @@ e_hit_test_region_c->surface_id = c_surface_id; e_hit_test_region_c->rect.SetRect(100, 100, 200, 500); - e_hit_test_data->regions.push_back(std::move(e_hit_test_region_c)); - e_hit_test_data->regions.push_back(std::move(e_hit_test_region_div)); + e_hit_test_region_list->regions.push_back(std::move(e_hit_test_region_c)); + e_hit_test_region_list->regions.push_back(std::move(e_hit_test_region_div)); - auto c_hit_test_data = mojom::HitTestRegionList::New(); - c_hit_test_data->surface_id = c_surface_id; - c_hit_test_data->flags = mojom::kHitTestMine; - c_hit_test_data->bounds.SetRect(0, 0, 200, 500); + auto c_hit_test_region_list = mojom::HitTestRegionList::New(); + c_hit_test_region_list->flags = mojom::kHitTestMine; + c_hit_test_region_list->bounds.SetRect(0, 0, 200, 500); EXPECT_EQ(aggregator->GetActiveRegionCount(), 0); @@ -1181,10 +1177,12 @@ EXPECT_EQ(aggregator->GetPendingCount(), 0); - aggregator->SubmitHitTestRegionList(std::move(c_hit_test_data)); + aggregator->SubmitHitTestRegionList(c_surface_id, + std::move(c_hit_test_region_list)); EXPECT_EQ(aggregator->GetPendingCount(), 1); - aggregator->SubmitHitTestRegionList(std::move(e_hit_test_data)); + aggregator->SubmitHitTestRegionList(e_surface_id, + std::move(e_hit_test_region_list)); EXPECT_EQ(aggregator->GetPendingCount(), 2); EXPECT_EQ(aggregator->GetActiveRegionCount(), 0);
diff --git a/components/viz/test/data/background_filter_rotated_sw.png b/components/viz/test/data/background_filter_rotated_sw.png index 94bbb8e6..5b9395f 100644 --- a/components/viz/test/data/background_filter_rotated_sw.png +++ b/components/viz/test/data/background_filter_rotated_sw.png Binary files differ
diff --git a/components/viz/test/data/rotated_drop_shadow_filter_sw.png b/components/viz/test/data/rotated_drop_shadow_filter_sw.png index d7c0cb4..0dd39e27 100644 --- a/components/viz/test/data/rotated_drop_shadow_filter_sw.png +++ b/components/viz/test/data/rotated_drop_shadow_filter_sw.png Binary files differ
diff --git a/components/viz/test/data/rotated_filter_sw.png b/components/viz/test/data/rotated_filter_sw.png index 12b12f0..02bf842 100644 --- a/components/viz/test/data/rotated_filter_sw.png +++ b/components/viz/test/data/rotated_filter_sw.png Binary files differ
diff --git a/components/wallpaper/wallpaper_manager_base.cc b/components/wallpaper/wallpaper_manager_base.cc index 225ffe1..4b33021 100644 --- a/components/wallpaper/wallpaper_manager_base.cc +++ b/components/wallpaper/wallpaper_manager_base.cc
@@ -450,7 +450,11 @@ GetUserWallpaperInfo(account_id, &info); info.type = DEFAULT; SetUserWallpaperInfo(account_id, info, true /* is_persistent */); - SetDefaultWallpaperNow(account_id); + + // If we're at the login screen, do not change the wallpaper but defer it + // until the user logs in to the system. + if (user_manager::UserManager::Get()->IsUserLoggedIn()) + SetDefaultWallpaperNow(account_id); } // static
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index 22b9286..de15ce1 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn
@@ -119,7 +119,8 @@ "//services/file:lib", "//services/file/public/interfaces", "//services/metrics/public/cpp:metrics_cpp", - "//services/network/public/interfaces:interfaces", + "//services/network/public/cpp", + "//services/network/public/interfaces", "//services/resource_coordinator:lib", "//services/resource_coordinator/public/cpp:resource_coordinator_cpp", "//services/service_manager", @@ -187,6 +188,8 @@ ] sources = [ + "$target_gen_dir/devtools/protocol/browser.cc", + "$target_gen_dir/devtools/protocol/browser.h", "$target_gen_dir/devtools/protocol/dom.cc", "$target_gen_dir/devtools/protocol/dom.h", "$target_gen_dir/devtools/protocol/emulation.cc", @@ -546,6 +549,8 @@ "devtools/devtools_url_request_interceptor.h", "devtools/forwarding_agent_host.cc", "devtools/forwarding_agent_host.h", + "devtools/protocol/browser_handler.cc", + "devtools/protocol/browser_handler.h", "devtools/protocol/devtools_domain_handler.cc", "devtools/protocol/devtools_domain_handler.h", "devtools/protocol/dom_handler.cc", @@ -663,6 +668,8 @@ "download/download_request_handle.h", "download/download_resource_handler.cc", "download/download_resource_handler.h", + "download/download_response_handler.cc", + "download/download_response_handler.h", "download/download_stats.cc", "download/download_stats.h", "download/download_task_runner.cc",
diff --git a/content/browser/DEPS b/content/browser/DEPS index 378c891..9ffada491 100644 --- a/content/browser/DEPS +++ b/content/browser/DEPS
@@ -126,13 +126,13 @@ "+third_party/WebKit/public/platform/reporting.mojom.h", "+third_party/WebKit/public/public_features.h", "+third_party/WebKit/public/web/WebAXEnums.h", - "+third_party/WebKit/public/web/WebCompositionUnderline.h", "+third_party/WebKit/public/web/WebConsoleMessage.h", "+third_party/WebKit/public/web/WebContextMenuData.h", "+third_party/WebKit/public/web/WebDeviceEmulationParams.h", "+third_party/WebKit/public/web/WebDragStatus.h", "+third_party/WebKit/public/web/WebFindOptions.h", "+third_party/WebKit/public/web/WebFrameSerializerCacheControlPolicy.h", + "+third_party/WebKit/public/web/WebImeTextSpan.h", "+third_party/WebKit/public/web/WebMediaPlayerAction.h", "+third_party/WebKit/public/web/WebPluginAction.h", "+third_party/WebKit/public/web/WebPopupType.h",
diff --git a/content/browser/android/content_view_core.h b/content/browser/android/content_view_core.h index 868a81bc..f29b174b6 100644 --- a/content/browser/android/content_view_core.h +++ b/content/browser/android/content_view_core.h
@@ -281,6 +281,7 @@ void SelectBetweenCoordinates(const gfx::PointF& base, const gfx::PointF& extent); + void UpdateCursor(const content::CursorInfo& info); void OnTouchDown(const base::android::ScopedJavaLocalRef<jobject>& event); ui::ViewAndroid* GetViewAndroid() const;
diff --git a/content/browser/android/ime_adapter_android.cc b/content/browser/android/ime_adapter_android.cc index d23bbe9..275e2468 100644 --- a/content/browser/android/ime_adapter_android.cc +++ b/content/browser/android/ime_adapter_android.cc
@@ -27,7 +27,7 @@ #include "jni/ImeAdapter_jni.h" #include "third_party/WebKit/public/platform/WebInputEvent.h" #include "third_party/WebKit/public/platform/WebTextInputType.h" -#include "ui/base/ime/composition_underline.h" +#include "ui/base/ime/ime_text_span.h" using base::android::AttachCurrentThread; using base::android::ConvertJavaStringToUTF16; @@ -73,37 +73,37 @@ } // Callback from Java to convert BackgroundColorSpan data to a -// ui::CompositionUnderline instance, and append it to |underlines_ptr|. +// ui::ImeTextSpan instance, and append it to |ime_text_spans_ptr|. void AppendBackgroundColorSpan(JNIEnv*, const JavaParamRef<jclass>&, - jlong underlines_ptr, + jlong ime_text_spans_ptr, jint start, jint end, jint background_color) { DCHECK_GE(start, 0); DCHECK_GE(end, 0); // Do not check |background_color|. - std::vector<ui::CompositionUnderline>* underlines = - reinterpret_cast<std::vector<ui::CompositionUnderline>*>(underlines_ptr); - underlines->push_back(ui::CompositionUnderline( + std::vector<ui::ImeTextSpan>* ime_text_spans = + reinterpret_cast<std::vector<ui::ImeTextSpan>*>(ime_text_spans_ptr); + ime_text_spans->push_back(ui::ImeTextSpan( static_cast<unsigned>(start), static_cast<unsigned>(end), SK_ColorTRANSPARENT, false, static_cast<unsigned>(background_color))); } // Callback from Java to convert UnderlineSpan data to a -// ui::CompositionUnderline instance, and append it to |underlines_ptr|. +// ui::ImeTextSpan instance, and append it to |ime_text_spans_ptr|. void AppendUnderlineSpan(JNIEnv*, const JavaParamRef<jclass>&, - jlong underlines_ptr, + jlong ime_text_spans_ptr, jint start, jint end) { DCHECK_GE(start, 0); DCHECK_GE(end, 0); - std::vector<ui::CompositionUnderline>* underlines = - reinterpret_cast<std::vector<ui::CompositionUnderline>*>(underlines_ptr); - underlines->push_back(ui::CompositionUnderline( - static_cast<unsigned>(start), static_cast<unsigned>(end), SK_ColorBLACK, - false, SK_ColorTRANSPARENT)); + std::vector<ui::ImeTextSpan>* ime_text_spans = + reinterpret_cast<std::vector<ui::ImeTextSpan>*>(ime_text_spans_ptr); + ime_text_spans->push_back( + ui::ImeTextSpan(static_cast<unsigned>(start), static_cast<unsigned>(end), + SK_ColorBLACK, false, SK_ColorTRANSPARENT)); } ImeAdapterAndroid::ImeAdapterAndroid(JNIEnv* env, @@ -210,13 +210,13 @@ base::string16 text16 = ConvertJavaStringToUTF16(env, text_str); - std::vector<ui::CompositionUnderline> underlines = - GetUnderlinesFromSpans(env, obj, text, text16); + std::vector<ui::ImeTextSpan> ime_text_spans = + GetImeTextSpansFromJava(env, obj, text, text16); // Default to plain underline if we didn't find any span that we care about. - if (underlines.empty()) { - underlines.push_back(ui::CompositionUnderline( - 0, text16.length(), SK_ColorBLACK, false, SK_ColorTRANSPARENT)); + if (ime_text_spans.empty()) { + ime_text_spans.push_back(ui::ImeTextSpan(0, text16.length(), SK_ColorBLACK, + false, SK_ColorTRANSPARENT)); } // relative_cursor_pos is as described in the Android API for @@ -225,7 +225,7 @@ if (relative_cursor_pos > 0) relative_cursor_pos = text16.length() + relative_cursor_pos - 1; - rwhi->ImeSetComposition(text16, underlines, gfx::Range::InvalidRange(), + rwhi->ImeSetComposition(text16, ime_text_spans, gfx::Range::InvalidRange(), relative_cursor_pos, relative_cursor_pos); } @@ -240,8 +240,8 @@ base::string16 text16 = ConvertJavaStringToUTF16(env, text_str); - std::vector<ui::CompositionUnderline> underlines = - GetUnderlinesFromSpans(env, obj, text, text16); + std::vector<ui::ImeTextSpan> ime_text_spans = + GetImeTextSpansFromJava(env, obj, text, text16); // relative_cursor_pos is as described in the Android API for // InputConnection#commitText, whereas the parameters for @@ -251,7 +251,7 @@ else relative_cursor_pos -= text16.length(); - rwhi->ImeCommitText(text16, underlines, gfx::Range::InvalidRange(), + rwhi->ImeCommitText(text16, ime_text_spans, gfx::Range::InvalidRange(), relative_cursor_pos); } @@ -336,12 +336,12 @@ if (!rfh) return; - std::vector<ui::CompositionUnderline> underlines; - underlines.push_back(ui::CompositionUnderline(0, end - start, SK_ColorBLACK, - false, SK_ColorTRANSPARENT)); + std::vector<ui::ImeTextSpan> ime_text_spans; + ime_text_spans.push_back(ui::ImeTextSpan(0, end - start, SK_ColorBLACK, false, + SK_ColorTRANSPARENT)); rfh->GetFrameInputHandler()->SetCompositionFromExistingText(start, end, - underlines); + ime_text_spans); } void ImeAdapterAndroid::DeleteSurroundingText(JNIEnv*, @@ -412,22 +412,22 @@ return nullptr; } -std::vector<ui::CompositionUnderline> ImeAdapterAndroid::GetUnderlinesFromSpans( +std::vector<ui::ImeTextSpan> ImeAdapterAndroid::GetImeTextSpansFromJava( JNIEnv* env, const base::android::JavaParamRef<jobject>& obj, const base::android::JavaParamRef<jobject>& text, const base::string16& text16) { - std::vector<ui::CompositionUnderline> underlines; + std::vector<ui::ImeTextSpan> ime_text_spans; // Iterate over spans in |text|, dispatch those that we care about (e.g., // BackgroundColorSpan) to a matching callback (e.g., - // AppendBackgroundColorSpan()), and populate |underlines|. - Java_ImeAdapter_populateUnderlinesFromSpans( - env, obj, text, reinterpret_cast<jlong>(&underlines)); + // AppendBackgroundColorSpan()), and populate |ime_text_spans|. + Java_ImeAdapter_populateImeTextSpansFromJava( + env, obj, text, reinterpret_cast<jlong>(&ime_text_spans)); // Sort spans by |.startOffset|. - std::sort(underlines.begin(), underlines.end()); + std::sort(ime_text_spans.begin(), ime_text_spans.end()); - return underlines; + return ime_text_spans; } } // namespace content
diff --git a/content/browser/android/ime_adapter_android.h b/content/browser/android/ime_adapter_android.h index 06bd658..9e591fe 100644 --- a/content/browser/android/ime_adapter_android.h +++ b/content/browser/android/ime_adapter_android.h
@@ -16,7 +16,7 @@ namespace ui { -struct CompositionUnderline; +struct ImeTextSpan; } // namespace ui @@ -113,7 +113,7 @@ private: RenderWidgetHostImpl* GetFocusedWidget(); RenderFrameHost* GetFocusedFrame(); - std::vector<ui::CompositionUnderline> GetUnderlinesFromSpans( + std::vector<ui::ImeTextSpan> GetImeTextSpansFromJava( JNIEnv* env, const base::android::JavaParamRef<jobject>& obj, const base::android::JavaParamRef<jobject>& text,
diff --git a/content/browser/android/java/gin_java_bridge_dispatcher_host.cc b/content/browser/android/java/gin_java_bridge_dispatcher_host.cc index ed067a5..55a902efa 100644 --- a/content/browser/android/java/gin_java_bridge_dispatcher_host.cc +++ b/content/browser/android/java/gin_java_bridge_dispatcher_host.cc
@@ -159,24 +159,19 @@ } JavaObjectWeakGlobalRef -GinJavaBridgeDispatcherHost::RemoveHolderAndAdvanceLocked( +GinJavaBridgeDispatcherHost::RemoveHolderLocked( int32_t holder, ObjectMap::iterator* iter_ptr) { objects_lock_.AssertAcquired(); JavaObjectWeakGlobalRef result; scoped_refptr<GinJavaBoundObject> object((*iter_ptr)->second); - bool object_erased = false; if (!object->IsNamed()) { object->RemoveHolder(holder); if (!object->HasHolders()) { result = object->GetWeakRef(); - objects_.erase((*iter_ptr)++); - object_erased = true; + objects_.erase(*iter_ptr); } } - if (!object_erased) { - ++(*iter_ptr); - } return result; } @@ -372,8 +367,7 @@ auto iter = objects_.find(object_id); if (iter == objects_.end()) return; - JavaObjectWeakGlobalRef ref = - RemoveHolderAndAdvanceLocked(routing_id, &iter); + JavaObjectWeakGlobalRef ref = RemoveHolderLocked(routing_id, &iter); if (!ref.is_uninitialized()) { RemoveFromRetainedObjectSetLocked(ref); }
diff --git a/content/browser/android/java/gin_java_bridge_dispatcher_host.h b/content/browser/android/java/gin_java_bridge_dispatcher_host.h index aeffec89..7e0b723 100644 --- a/content/browser/android/java/gin_java_bridge_dispatcher_host.h +++ b/content/browser/android/java/gin_java_bridge_dispatcher_host.h
@@ -95,7 +95,7 @@ bool FindObjectId(const base::android::JavaRef<jobject>& object, GinJavaBoundObject::ObjectID* object_id); void RemoveFromRetainedObjectSetLocked(const JavaObjectWeakGlobalRef& ref); - JavaObjectWeakGlobalRef RemoveHolderAndAdvanceLocked( + JavaObjectWeakGlobalRef RemoveHolderLocked( int32_t holder, ObjectMap::iterator* iter_ptr);
diff --git a/content/browser/appcache/appcache_disk_cache.cc b/content/browser/appcache/appcache_disk_cache.cc index 16dbe75..66dba6fc 100644 --- a/content/browser/appcache/appcache_disk_cache.cc +++ b/content/browser/appcache/appcache_disk_cache.cc
@@ -220,20 +220,16 @@ const base::FilePath& disk_cache_directory, int disk_cache_size, bool force, - const scoped_refptr<base::SingleThreadTaskRunner>& cache_thread, + base::OnceClosure post_cleanup_callback, const net::CompletionCallback& callback) { - return Init(net::APP_CACHE, - disk_cache_directory, - disk_cache_size, - force, - cache_thread, - callback); + return Init(net::APP_CACHE, disk_cache_directory, disk_cache_size, force, + std::move(post_cleanup_callback), callback); } int AppCacheDiskCache::InitWithMemBackend( int mem_cache_size, const net::CompletionCallback& callback) { - return Init(net::MEMORY_CACHE, base::FilePath(), mem_cache_size, false, NULL, - callback); + return Init(net::MEMORY_CACHE, base::FilePath(), mem_cache_size, false, + base::OnceClosure(), callback); } void AppCacheDiskCache::Disable() { @@ -340,13 +336,12 @@ AppCacheDiskCache::PendingCall::~PendingCall() {} -int AppCacheDiskCache::Init( - net::CacheType cache_type, - const base::FilePath& cache_directory, - int cache_size, - bool force, - const scoped_refptr<base::SingleThreadTaskRunner>& cache_thread, - const net::CompletionCallback& callback) { +int AppCacheDiskCache::Init(net::CacheType cache_type, + const base::FilePath& cache_directory, + int cache_size, + bool force, + base::OnceClosure post_cleanup_callback, + const net::CompletionCallback& callback) { DCHECK(!is_initializing_or_waiting_to_initialize() && !disk_cache_.get()); is_disabled_ = false; create_backend_callback_ = new CreateBackendCallbackShim(this); @@ -355,12 +350,9 @@ cache_type, use_simple_cache_ ? net::CACHE_BACKEND_SIMPLE : net::CACHE_BACKEND_DEFAULT, - cache_directory, - cache_size, - force, - cache_thread, - NULL, + cache_directory, cache_size, force, NULL, &(create_backend_callback_->backend_ptr_), + std::move(post_cleanup_callback), base::Bind(&CreateBackendCallbackShim::Callback, create_backend_callback_)); if (rv == net::ERR_IO_PENDING)
diff --git a/content/browser/appcache/appcache_disk_cache.h b/content/browser/appcache/appcache_disk_cache.h index b5d67eb..876e8ec 100644 --- a/content/browser/appcache/appcache_disk_cache.h +++ b/content/browser/appcache/appcache_disk_cache.h
@@ -11,15 +11,12 @@ #include <set> #include <vector> +#include "base/callback_forward.h" #include "base/memory/ref_counted.h" #include "content/browser/appcache/appcache_response.h" #include "content/common/content_export.h" #include "net/disk_cache/disk_cache.h" -namespace base { -class SingleThreadTaskRunner; -} // namespace base - namespace content { // An implementation of AppCacheDiskCacheInterface that @@ -31,12 +28,11 @@ ~AppCacheDiskCache() override; // Initializes the object to use disk backed storage. - int InitWithDiskBackend( - const base::FilePath& disk_cache_directory, - int disk_cache_size, - bool force, - const scoped_refptr<base::SingleThreadTaskRunner>& cache_thread, - const net::CompletionCallback& callback); + int InitWithDiskBackend(const base::FilePath& disk_cache_directory, + int disk_cache_size, + bool force, + base::OnceClosure post_cleanup_callback, + const net::CompletionCallback& callback); // Initializes the object to use memory only storage. // This is used for Chrome's incognito browsing. @@ -107,7 +103,7 @@ const base::FilePath& directory, int cache_size, bool force, - const scoped_refptr<base::SingleThreadTaskRunner>& cache_thread, + base::OnceClosure post_cleanup_callback, const net::CompletionCallback& callback); void OnCreateBackendComplete(int rv); void AddOpenEntry(EntryImpl* entry) { open_entries_.insert(entry); }
diff --git a/content/browser/appcache/appcache_disk_cache_unittest.cc b/content/browser/appcache/appcache_disk_cache_unittest.cc index 5241805..f8ef08c 100644 --- a/content/browser/appcache/appcache_disk_cache_unittest.cc +++ b/content/browser/appcache/appcache_disk_cache_unittest.cc
@@ -9,9 +9,12 @@ #include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/single_thread_task_runner.h" +#include "base/test/scoped_task_environment.h" #include "base/threading/thread_task_runner_handle.h" #include "net/base/io_buffer.h" #include "net/base/net_errors.h" +#include "net/base/test_completion_callback.h" +#include "net/disk_cache/disk_cache.h" #include "testing/gtest/include/gtest/gtest.h" namespace content { @@ -21,31 +24,25 @@ AppCacheDiskCacheTest() {} void SetUp() override { - // Use the current thread for the DiskCache's cache_thread. - message_loop_.reset(new base::MessageLoopForIO()); - cache_thread_ = base::ThreadTaskRunnerHandle::Get(); ASSERT_TRUE(directory_.CreateUniqueTempDir()); completion_callback_ = base::Bind( &AppCacheDiskCacheTest::OnComplete, base::Unretained(this)); } - void TearDown() override { - base::RunLoop().RunUntilIdle(); - message_loop_.reset(NULL); - } + void TearDown() override { scoped_task_environment_.RunUntilIdle(); } void FlushCacheTasks() { - base::RunLoop().RunUntilIdle(); + disk_cache::FlushCacheThreadForTesting(); + scoped_task_environment_.RunUntilIdle(); } void OnComplete(int err) { completion_results_.push_back(err); } + base::test::ScopedTaskEnvironment scoped_task_environment_; base::ScopedTempDir directory_; - std::unique_ptr<base::MessageLoop> message_loop_; - scoped_refptr<base::SingleThreadTaskRunner> cache_thread_; net::CompletionCallback completion_callback_; std::vector<int> completion_results_; @@ -60,7 +57,7 @@ std::unique_ptr<AppCacheDiskCache> disk_cache(new AppCacheDiskCache); EXPECT_FALSE(disk_cache->is_disabled()); disk_cache->InitWithDiskBackend(directory_.GetPath(), k10MBytes, false, - cache_thread_, completion_callback_); + base::OnceClosure(), completion_callback_); disk_cache->CreateEntry(1, &entry, completion_callback_); disk_cache->OpenEntry(2, &entry, completion_callback_); disk_cache->DoomEntry(3, completion_callback_); @@ -91,7 +88,7 @@ std::unique_ptr<AppCacheDiskCache> disk_cache(new AppCacheDiskCache); EXPECT_FALSE(disk_cache->is_disabled()); disk_cache->InitWithDiskBackend(directory_.GetPath(), k10MBytes, false, - cache_thread_, completion_callback_); + base::OnceClosure(), completion_callback_); FlushCacheTasks(); EXPECT_EQ(1u, completion_results_.size()); EXPECT_EQ(net::OK, completion_results_[0]); @@ -126,7 +123,7 @@ std::unique_ptr<AppCacheDiskCache> disk_cache(new AppCacheDiskCache); EXPECT_FALSE(disk_cache->is_disabled()); disk_cache->InitWithDiskBackend(directory_.GetPath(), k10MBytes, false, - cache_thread_, completion_callback_); + base::OnceClosure(), completion_callback_); FlushCacheTasks(); EXPECT_EQ(1u, completion_results_.size()); EXPECT_EQ(net::OK, completion_results_[0]); @@ -182,4 +179,26 @@ FlushCacheTasks(); } +TEST_F(AppCacheDiskCacheTest, CleanupCallback) { + // Test that things delete fine when we disable the cache and wait for + // the cleanup callback. + + net::TestClosure cleanup_done; + net::TestCompletionCallback init_done; + std::unique_ptr<AppCacheDiskCache> disk_cache(new AppCacheDiskCache); + EXPECT_FALSE(disk_cache->is_disabled()); + disk_cache->InitWithDiskBackend(directory_.GetPath(), k10MBytes, false, + cleanup_done.closure(), init_done.callback()); + EXPECT_EQ(net::OK, init_done.WaitForResult()); + + disk_cache->Disable(); + cleanup_done.WaitForResult(); + + // Ensure the directory can be deleted at this point. + EXPECT_TRUE(base::DirectoryExists(directory_.GetPath())); + EXPECT_FALSE(base::IsDirectoryEmpty(directory_.GetPath())); + EXPECT_TRUE(base::DeleteFile(directory_.GetPath(), true)); + EXPECT_FALSE(base::DirectoryExists(directory_.GetPath())); +} + } // namespace content
diff --git a/content/browser/appcache/appcache_service_impl.cc b/content/browser/appcache/appcache_service_impl.cc index 9af861b..356dc48 100644 --- a/content/browser/appcache/appcache_service_impl.cc +++ b/content/browser/appcache/appcache_service_impl.cc
@@ -431,14 +431,11 @@ storage_.reset(); } -void AppCacheServiceImpl::Initialize( - const base::FilePath& cache_directory, - const scoped_refptr<base::SingleThreadTaskRunner>& cache_thread) { +void AppCacheServiceImpl::Initialize(const base::FilePath& cache_directory) { DCHECK(!storage_.get()); cache_directory_ = cache_directory; - cache_thread_ = cache_thread; AppCacheStorageImpl* storage = new AppCacheStorageImpl(this); - storage->Initialize(cache_directory, db_task_runner_, cache_thread); + storage->Initialize(cache_directory, db_task_runner_); storage_.reset(storage); } @@ -480,7 +477,7 @@ for (auto& observer : observers_) observer.OnServiceReinitialized(old_storage_ref.get()); - Initialize(cache_directory_, cache_thread_); + Initialize(cache_directory_); } void AppCacheServiceImpl::GetAllAppCacheInfo(
diff --git a/content/browser/appcache/appcache_service_impl.h b/content/browser/appcache/appcache_service_impl.h index f42e72a..e0ea217 100644 --- a/content/browser/appcache/appcache_service_impl.h +++ b/content/browser/appcache/appcache_service_impl.h
@@ -26,7 +26,6 @@ namespace base { class FilePath; -class SingleThreadTaskRunner; } // namespace base namespace net { @@ -88,9 +87,7 @@ explicit AppCacheServiceImpl(storage::QuotaManagerProxy* quota_manager_proxy); ~AppCacheServiceImpl() override; - void Initialize( - const base::FilePath& cache_directory, - const scoped_refptr<base::SingleThreadTaskRunner>& cache_thread); + void Initialize(const base::FilePath& cache_directory); void AddObserver(Observer* observer) { observers_.AddObserver(observer); @@ -215,7 +212,6 @@ base::FilePath cache_directory_; scoped_refptr<base::SequencedTaskRunner> db_task_runner_; - scoped_refptr<base::SingleThreadTaskRunner> cache_thread_; AppCachePolicy* appcache_policy_; AppCacheQuotaClient* quota_client_; AppCacheExecutableHandlerFactory* handler_factory_;
diff --git a/content/browser/appcache/appcache_storage_impl.cc b/content/browser/appcache/appcache_storage_impl.cc index 6e8dac79..0601161 100644 --- a/content/browser/appcache/appcache_storage_impl.cc +++ b/content/browser/appcache/appcache_storage_impl.cc
@@ -1415,8 +1415,9 @@ last_deletable_response_rowid_(0), database_(NULL), is_disabled_(false), - weak_factory_(this) { -} + delete_and_start_over_pending_(false), + expecting_cleanup_complete_on_disable_(false), + weak_factory_(this) {} AppCacheStorageImpl::~AppCacheStorageImpl() { for (auto* task : pending_quota_queries_) @@ -1437,8 +1438,7 @@ void AppCacheStorageImpl::Initialize( const base::FilePath& cache_directory, - const scoped_refptr<base::SequencedTaskRunner>& db_task_runner, - const scoped_refptr<base::SingleThreadTaskRunner>& cache_thread) { + const scoped_refptr<base::SequencedTaskRunner>& db_task_runner) { cache_directory_ = cache_directory; is_incognito_ = cache_directory_.empty(); @@ -1448,7 +1448,6 @@ database_ = new AppCacheDatabase(db_file_path); db_task_runner_ = db_task_runner; - cache_thread_ = cache_thread; scoped_refptr<InitTask> task(new InitTask(this)); task->Schedule(); @@ -1914,11 +1913,12 @@ base::Bind(&AppCacheStorageImpl::OnDiskCacheInitialized, base::Unretained(this))); } else { + expecting_cleanup_complete_on_disable_ = true; rv = disk_cache_->InitWithDiskBackend( - cache_directory_.Append(kDiskCacheDirectoryName), - kMaxDiskCacheSize, + cache_directory_.Append(kDiskCacheDirectoryName), kMaxDiskCacheSize, false, - cache_thread_.get(), + base::BindOnce(&AppCacheStorageImpl::OnDiskCacheCleanupComplete, + weak_factory_.GetWeakPtr()), base::Bind(&AppCacheStorageImpl::OnDiskCacheInitialized, base::Unretained(this))); } @@ -1947,23 +1947,31 @@ DCHECK(is_disabled_); if (!is_incognito_) { VLOG(1) << "Deleting existing appcache data and starting over."; + // We can have tasks in flight to close file handles on both the db // and cache threads, we need to allow those tasks to cycle thru - // prior to deleting the files and calling reinit. - cache_thread_->PostTaskAndReply( - FROM_HERE, - base::Bind(&base::DoNothing), - base::Bind(&AppCacheStorageImpl::DeleteAndStartOverPart2, - weak_factory_.GetWeakPtr())); + // prior to deleting the files and calling reinit. We will know that the + // cache ones will be finished once we get into OnDiskCacheCleanupComplete, + // so let that known to synchronize with the DB thread. + delete_and_start_over_pending_ = true; + + // Won't get a callback about cleanup being done, so call it ourselves. + if (!expecting_cleanup_complete_on_disable_) + OnDiskCacheCleanupComplete(); } } -void AppCacheStorageImpl::DeleteAndStartOverPart2() { - db_task_runner_->PostTaskAndReply( - FROM_HERE, - base::Bind(base::IgnoreResult(&base::DeleteFile), cache_directory_, true), - base::Bind(&AppCacheStorageImpl::CallScheduleReinitialize, - weak_factory_.GetWeakPtr())); +void AppCacheStorageImpl::OnDiskCacheCleanupComplete() { + expecting_cleanup_complete_on_disable_ = false; + if (delete_and_start_over_pending_) { + delete_and_start_over_pending_ = false; + db_task_runner_->PostTaskAndReply( + FROM_HERE, + base::Bind(base::IgnoreResult(&base::DeleteFile), cache_directory_, + true), + base::Bind(&AppCacheStorageImpl::CallScheduleReinitialize, + weak_factory_.GetWeakPtr())); + } } void AppCacheStorageImpl::CallScheduleReinitialize() {
diff --git a/content/browser/appcache/appcache_storage_impl.h b/content/browser/appcache/appcache_storage_impl.h index cde701e1..c8d0629 100644 --- a/content/browser/appcache/appcache_storage_impl.h +++ b/content/browser/appcache/appcache_storage_impl.h
@@ -24,7 +24,7 @@ #include "content/common/content_export.h" namespace base { -class SingleThreadTaskRunner; +class SequencedTaskRunner; } // namespace base namespace content { @@ -38,8 +38,7 @@ void Initialize( const base::FilePath& cache_directory, - const scoped_refptr<base::SequencedTaskRunner>& db_task_runner, - const scoped_refptr<base::SingleThreadTaskRunner>& cache_thread); + const scoped_refptr<base::SequencedTaskRunner>& db_task_runner); void Disable(); bool is_disabled() const { return is_disabled_; } @@ -121,8 +120,9 @@ void DeleteOneResponse(); void OnDeletedOneResponse(int rv); void OnDiskCacheInitialized(int rv); + void OnDiskCacheCleanupComplete(); + void DeleteAndStartOver(); - void DeleteAndStartOverPart2(); void CallScheduleReinitialize(); void LazilyCommitLastAccessTimes(); void OnLazyCommitTimer(); @@ -154,10 +154,8 @@ bool is_incognito_; // This class operates primarily on the IO thread, but schedules - // its DatabaseTasks on the db thread. Separately, the disk_cache uses - // the cache thread. + // its DatabaseTasks on the db thread. scoped_refptr<base::SequencedTaskRunner> db_task_runner_; - scoped_refptr<base::SingleThreadTaskRunner> cache_thread_; // Structures to keep track of DatabaseTasks that are in-flight. DatabaseTaskQueue scheduled_database_tasks_; @@ -180,6 +178,14 @@ // disk cache and cannot continue. bool is_disabled_; + // This is set when we want to use the post-cleanup callback to initiate + // directory deletion. + bool delete_and_start_over_pending_; + + // This is set when we know that a call to Disable() will result in + // OnDiskCacheCleanupComplete() eventually called. + bool expecting_cleanup_complete_on_disable_; + std::unique_ptr<AppCacheDiskCache> disk_cache_; base::OneShotTimer lazy_commit_timer_;
diff --git a/content/browser/appcache/appcache_storage_impl_unittest.cc b/content/browser/appcache/appcache_storage_impl_unittest.cc index 8a33138..f9a93934 100644 --- a/content/browser/appcache/appcache_storage_impl_unittest.cc +++ b/content/browser/appcache/appcache_storage_impl_unittest.cc
@@ -419,7 +419,7 @@ void SetUpTest() { DCHECK(io_thread->task_runner()->BelongsToCurrentThread()); service_.reset(new AppCacheServiceImpl(nullptr)); - service_->Initialize(base::FilePath(), background_thread->task_runner()); + service_->Initialize(base::FilePath()); mock_quota_manager_proxy_ = new MockQuotaManagerProxy(); service_->quota_manager_proxy_ = mock_quota_manager_proxy_; delegate_.reset(new MockStorageDelegate(this)); @@ -1739,8 +1739,7 @@ // Recreate the service to point at the db and corruption on disk. service_.reset(new AppCacheServiceImpl(NULL)); service_->set_request_context(io_thread->request_context()); - service_->Initialize(temp_directory_.GetPath(), - background_thread->task_runner()); + service_->Initialize(temp_directory_.GetPath()); mock_quota_manager_proxy_ = new MockQuotaManagerProxy(); service_->quota_manager_proxy_ = mock_quota_manager_proxy_; delegate_.reset(new MockStorageDelegate(this));
diff --git a/content/browser/appcache/appcache_update_url_loader_request.cc b/content/browser/appcache/appcache_update_url_loader_request.cc index 590bd6f..3d7d8d2 100644 --- a/content/browser/appcache/appcache_update_url_loader_request.cc +++ b/content/browser/appcache/appcache_update_url_loader_request.cc
@@ -40,7 +40,7 @@ } std::string AppCacheUpdateJob::UpdateURLLoaderRequest::GetMimeType() const { - return response_->mime_type; + return response_.mime_type; } void AppCacheUpdateJob::UpdateURLLoaderRequest::SetSiteForCookies( @@ -55,12 +55,12 @@ net::HttpResponseHeaders* AppCacheUpdateJob::UpdateURLLoaderRequest::GetResponseHeaders() const { - return response_->headers.get(); + return response_.headers.get(); } int AppCacheUpdateJob::UpdateURLLoaderRequest::GetResponseCode() const { - if (response_->headers) - return response_->headers->response_code(); + if (response_.headers) + return response_.headers->response_code(); return 0; } @@ -82,7 +82,7 @@ url_loader_ = nullptr; handle_watcher_.Cancel(); handle_.reset(); - response_.reset(nullptr); + response_ = ResourceResponseHead(); http_response_info_.reset(nullptr); read_requested_ = false; return 0; @@ -92,8 +92,7 @@ const ResourceResponseHead& response_head, const base::Optional<net::SSLInfo>& ssl_info, mojom::DownloadedTempFilePtr downloaded_file) { - response_.reset(new ResourceResponseHead()); - *response_ = response_head; + response_ = response_head; // TODO(ananta/michaeln) // Populate other fields in the HttpResponseInfo class. It would be good to @@ -116,7 +115,7 @@ void AppCacheUpdateJob::UpdateURLLoaderRequest::OnReceiveRedirect( const net::RedirectInfo& redirect_info, const ResourceResponseHead& response_head) { - *response_ = response_head; + response_ = response_head; fetcher_->OnReceivedRedirect(redirect_info); } @@ -191,8 +190,8 @@ } uint32_t available = 0; - MojoResult result = - MojoToNetPendingBuffer::BeginRead(&handle_, &pending_read_, &available); + MojoResult result = network::MojoToNetPendingBuffer::BeginRead( + &handle_, &pending_read_, &available); DCHECK_NE(result, MOJO_RESULT_BUSY); if (result == MOJO_RESULT_SHOULD_WAIT) { @@ -215,8 +214,8 @@ int bytes_to_be_read = std::min<int>(buffer_size_, available); - scoped_refptr<MojoToNetIOBuffer> buffer = - new MojoToNetIOBuffer(pending_read_.get(), bytes_to_be_read); + auto buffer = base::MakeRefCounted<network::MojoToNetIOBuffer>( + pending_read_.get(), bytes_to_be_read); fetcher_->OnReadCompleted(buffer.get(), bytes_to_be_read); }
diff --git a/content/browser/appcache/appcache_update_url_loader_request.h b/content/browser/appcache/appcache_update_url_loader_request.h index 185f0ff..ebe478c 100644 --- a/content/browser/appcache/appcache_update_url_loader_request.h +++ b/content/browser/appcache/appcache_update_url_loader_request.h
@@ -11,12 +11,13 @@ #include "base/macros.h" #include "content/browser/appcache/appcache_update_request_base.h" -#include "content/common/net_adapters.h" #include "content/public/common/resource_request.h" +#include "content/public/common/resource_response.h" #include "content/public/common/url_loader.mojom.h" #include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/system/simple_watcher.h" #include "net/base/io_buffer.h" +#include "services/network/public/cpp/net_adapters.h" namespace net { class HttpResponseInfo; @@ -26,7 +27,6 @@ class URLLoaderFactoryGetter; struct ResourceRequest; -struct ResourceResponseHead; // URLLoaderClient subclass for the UpdateRequestBase class. Provides // functionality to update the AppCache using functionality provided by the @@ -91,7 +91,7 @@ scoped_refptr<URLLoaderFactoryGetter> loader_factory_getter_; ResourceRequest request_; - std::unique_ptr<ResourceResponseHead> response_; + ResourceResponseHead response_; ResourceRequestCompletionStatus response_status_; // Response details. std::unique_ptr<net::HttpResponseInfo> http_response_info_; @@ -114,7 +114,7 @@ // Please look at the StartReading() function for details. bool read_requested_; // Adapter for transferring data from a mojo data pipe to net. - scoped_refptr<MojoToNetPendingBuffer> pending_read_; + scoped_refptr<network::MojoToNetPendingBuffer> pending_read_; DISALLOW_COPY_AND_ASSIGN(UpdateURLLoaderRequest); };
diff --git a/content/browser/appcache/appcache_url_loader_job.cc b/content/browser/appcache/appcache_url_loader_job.cc index 5679b7a..0e578654 100644 --- a/content/browser/appcache/appcache_url_loader_job.cc +++ b/content/browser/appcache/appcache_url_loader_job.cc
@@ -9,9 +9,9 @@ #include "content/browser/appcache/appcache_subresource_url_factory.h" #include "content/browser/appcache/appcache_url_loader_request.h" #include "content/browser/url_loader_factory_getter.h" -#include "content/common/net_adapters.h" #include "content/public/common/resource_type.h" #include "net/http/http_status_code.h" +#include "services/network/public/cpp/net_adapters.h" namespace content { @@ -393,7 +393,7 @@ uint32_t num_bytes; // TODO: we should use the abstractions in MojoAsyncResourceHandler. - MojoResult result = NetToMojoPendingBuffer::BeginWrite( + MojoResult result = network::NetToMojoPendingBuffer::BeginWrite( &response_body_stream_, &pending_write_, &num_bytes); if (result == MOJO_RESULT_SHOULD_WAIT) { // The pipe is full. We need to wait for it to have more space. @@ -410,8 +410,8 @@ } CHECK_GT(static_cast<uint32_t>(std::numeric_limits<int>::max()), num_bytes); - scoped_refptr<NetToMojoIOBuffer> buffer = - new NetToMojoIOBuffer(pending_write_.get()); + auto buffer = + base::MakeRefCounted<network::NetToMojoIOBuffer>(pending_write_.get()); reader_->ReadData( buffer.get(), info_->response_data_size(),
diff --git a/content/browser/appcache/appcache_url_loader_job.h b/content/browser/appcache/appcache_url_loader_job.h index a1328c9..d696045 100644 --- a/content/browser/appcache/appcache_url_loader_job.h +++ b/content/browser/appcache/appcache_url_loader_job.h
@@ -22,11 +22,14 @@ #include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/system/data_pipe.h" +namespace network { +class NetToMojoPendingBuffer; +} + namespace content { class AppCacheRequest; class AppCacheURLLoaderRequest; -class NetToMojoPendingBuffer; class URLLoaderFactoryGetter; // Holds information about the subresource load request like the routing id, @@ -183,7 +186,7 @@ // mojo data pipe entities. mojo::ScopedDataPipeProducerHandle response_body_stream_; - scoped_refptr<NetToMojoPendingBuffer> pending_write_; + scoped_refptr<network::NetToMojoPendingBuffer> pending_write_; mojo::SimpleWatcher writable_handle_watcher_;
diff --git a/content/browser/appcache/chrome_appcache_service.cc b/content/browser/appcache/chrome_appcache_service.cc index cdceb0a..7d2fab2 100644 --- a/content/browser/appcache/chrome_appcache_service.cc +++ b/content/browser/appcache/chrome_appcache_service.cc
@@ -44,8 +44,7 @@ set_request_context(request_context_getter->GetURLRequestContext()); // Init our base class. - Initialize(cache_path_, - BrowserThread::GetTaskRunnerForThread(BrowserThread::CACHE).get()); + Initialize(cache_path_); set_appcache_policy(this); set_special_storage_policy(special_storage_policy.get()); }
diff --git a/content/browser/background_sync/background_sync_manager_unittest.cc b/content/browser/background_sync/background_sync_manager_unittest.cc index 47d6096..b74b824 100644 --- a/content/browser/background_sync/background_sync_manager_unittest.cc +++ b/content/browser/background_sync/background_sync_manager_unittest.cc
@@ -36,6 +36,7 @@ #include "content/public/test/background_sync_test_util.h" #include "content/public/test/test_browser_context.h" #include "content/public/test/test_browser_thread_bundle.h" +#include "content/public/test/test_utils.h" #include "content/test/mock_background_sync_controller.h" #include "content/test/mock_permission_manager.h" #include "content/test/test_background_sync_manager.h" @@ -406,7 +407,7 @@ void DeleteServiceWorkerAndStartOver() { helper_->context()->ScheduleDeleteAndStartOver(); - base::RunLoop().RunUntilIdle(); + content::RunAllBlockingPoolTasksUntilIdle(); } int MaxTagLength() const { return BackgroundSyncManager::kMaxTagLength; }
diff --git a/content/browser/blob_storage/blob_url_loader_factory.cc b/content/browser/blob_storage/blob_url_loader_factory.cc index a9406a33..85afc946 100644 --- a/content/browser/blob_storage/blob_url_loader_factory.cc +++ b/content/browser/blob_storage/blob_url_loader_factory.cc
@@ -5,14 +5,15 @@ #include "content/browser/blob_storage/blob_url_loader_factory.h" #include <stddef.h> +#include <utility> #include "base/bind.h" #include "base/logging.h" #include "base/macros.h" +#include "base/memory/ptr_util.h" #include "base/memory/weak_ptr.h" #include "base/threading/thread_task_runner_handle.h" #include "content/browser/blob_storage/chrome_blob_storage_context.h" #include "content/browser/storage_partition_impl.h" -#include "content/common/net_adapters.h" #include "content/public/browser/browser_thread.h" #include "content/public/common/url_loader.mojom.h" #include "mojo/public/cpp/system/simple_watcher.h" @@ -26,6 +27,7 @@ #include "storage/browser/blob/blob_reader.h" #include "storage/browser/blob/blob_storage_context.h" #include "storage/browser/blob/blob_url_request_job.h" +#include "storage/browser/blob/mojo_blob_reader.h" #include "storage/browser/fileapi/file_system_context.h" namespace content { @@ -33,10 +35,12 @@ namespace { constexpr size_t kDefaultAllocationSize = 512 * 1024; -// This class handles a request for a blob:// url. It self-destructs (see -// DeleteIfNeeded) when it has finished responding. +// This class handles a request for a blob:// url. It self-destructs (directly, +// or after passing ownership to storage::MojoBlobReader at the end of the Start +// method) when it has finished responding. // Note: some of this code is duplicated from storage::BlobURLRequestJob. -class BlobURLLoader : public mojom::URLLoader { +class BlobURLLoader : public storage::MojoBlobReader::Delegate, + public mojom::URLLoader { public: BlobURLLoader(mojom::URLLoaderRequest url_loader_request, const ResourceRequest& request, @@ -46,37 +50,29 @@ : binding_(this, std::move(url_loader_request)), client_(std::move(client)), blob_handle_(std::move(blob_handle)), - writable_handle_watcher_(FROM_HERE, - mojo::SimpleWatcher::ArmingPolicy::MANUAL), - peer_closed_handle_watcher_(FROM_HERE, - mojo::SimpleWatcher::ArmingPolicy::MANUAL), weak_factory_(this) { DCHECK_CURRENTLY_ON(BrowserThread::IO); // PostTask since it might destruct. - base::ThreadTaskRunnerHandle::Get()->PostTask( + base::SequencedTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::Bind(&BlobURLLoader::Start, weak_factory_.GetWeakPtr(), request, make_scoped_refptr(file_system_context))); } + private: void Start(const ResourceRequest& request, scoped_refptr<storage::FileSystemContext> file_system_context) { if (!blob_handle_) { - NotifyCompleted(net::ERR_FILE_NOT_FOUND); + OnComplete(net::ERR_FILE_NOT_FOUND, 0); + delete this; return; } - blob_reader_ = blob_handle_->CreateReader(file_system_context.get()); - // We only support GET request per the spec. if (request.method != "GET") { - NotifyCompleted(net::ERR_METHOD_NOT_SUPPORTED); - return; - } - - if (blob_reader_->net_error()) { - NotifyCompleted(blob_reader_->net_error()); + OnComplete(net::ERR_METHOD_NOT_SUPPORTED, 0); + delete this; return; } @@ -95,112 +91,65 @@ // We don't support multiple range requests in one single URL request, // because we need to do multipart encoding here. // TODO(jianli): Support multipart byte range requests. - NotifyCompleted(net::ERR_REQUEST_RANGE_NOT_SATISFIABLE); + OnComplete(net::ERR_REQUEST_RANGE_NOT_SATISFIABLE, 0); + delete this; + return; } } } - storage::BlobReader::Status size_status = - blob_reader_->CalculateSize(base::Bind(&BlobURLLoader::DidCalculateSize, - weak_factory_.GetWeakPtr())); - switch (size_status) { - case storage::BlobReader::Status::NET_ERROR: - NotifyCompleted(blob_reader_->net_error()); - return; - case storage::BlobReader::Status::IO_PENDING: - return; - case storage::BlobReader::Status::DONE: - DidCalculateSize(net::OK); - return; - } - - NOTREACHED(); + storage::MojoBlobReader::Create(file_system_context.get(), + blob_handle_.get(), byte_range_, + base::WrapUnique(this)); } - ~BlobURLLoader() override {} - - private: // mojom::URLLoader implementation: void FollowRedirect() override { NOTREACHED(); } void SetPriority(net::RequestPriority priority, int32_t intra_priority_value) override {} - // Notifies the client that the request completed. Takes care of deleting this - // object now if possible (i.e. no outstanding data pipe), otherwise this - // object will be deleted when the data pipe is closed. - void NotifyCompleted(int error_code) { - if (error_code != net::OK && !sent_headers_) { - net::HttpStatusCode status_code = - storage::BlobURLRequestJob::NetErrorToHttpStatusCode(error_code); - ResourceResponseHead response; - response.headers = storage::BlobURLRequestJob::GenerateHeaders( - status_code, nullptr, nullptr, nullptr, nullptr); - client_->OnReceiveResponse(response, base::nullopt, nullptr); - } - ResourceRequestCompletionStatus request_complete_data; - // TODO(kinuko): We should probably set the error_code here, - // while it makes existing tests fail. crbug.com/732750 - request_complete_data.completion_time = base::TimeTicks::Now(); - request_complete_data.encoded_body_length = total_written_bytes_; - request_complete_data.decoded_body_length = total_written_bytes_; - client_->OnComplete(request_complete_data); - - DeleteIfNeeded(); + // storage::MojoBlobReader::Delegate implementation: + mojo::ScopedDataPipeProducerHandle PassDataPipe() override { + mojo::DataPipe data_pipe(kDefaultAllocationSize); + response_body_consumer_handle_ = std::move(data_pipe.consumer_handle); + return std::move(data_pipe.producer_handle); } - void DidCalculateSize(int result) { - if (result != net::OK) { - NotifyCompleted(result); - return; - } - - // Apply the range requirement. - if (!byte_range_.ComputeBounds(blob_reader_->total_size())) { - NotifyCompleted(net::ERR_REQUEST_RANGE_NOT_SATISFIABLE); - return; - } - - DCHECK_LE(byte_range_.first_byte_position(), - byte_range_.last_byte_position() + 1); - uint64_t length = - base::checked_cast<uint64_t>(byte_range_.last_byte_position() - - byte_range_.first_byte_position() + 1); - - if (byte_range_set_) - blob_reader_->SetReadRange(byte_range_.first_byte_position(), length); + RequestSideData DidCalculateSize(uint64_t total_size, + uint64_t content_size) override { + total_size_ = total_size; + bool result = byte_range_.ComputeBounds(total_size); + DCHECK(result); net::HttpStatusCode status_code = net::HTTP_OK; if (byte_range_set_ && byte_range_.IsValid()) { status_code = net::HTTP_PARTIAL_CONTENT; } else { + DCHECK_EQ(total_size, content_size); // TODO(horo): When the requester doesn't need the side data // (ex:FileReader) we should skip reading the side data. - if (blob_reader_->has_side_data() && - blob_reader_->ReadSideData(base::Bind(&BlobURLLoader::DidReadMetadata, - weak_factory_.GetWeakPtr())) == - storage::BlobReader::Status::IO_PENDING) { - return; - } + return REQUEST_SIDE_DATA; } - HeadersCompleted(status_code); + HeadersCompleted(status_code, content_size, nullptr); + return DONT_REQUEST_SIDE_DATA; } - void DidReadMetadata(storage::BlobReader::Status result) { - if (result != storage::BlobReader::Status::DONE) { - NotifyCompleted(blob_reader_->net_error()); - return; - } - HeadersCompleted(net::HTTP_OK); + void DidReadSideData(net::IOBufferWithSize* data) override { + HeadersCompleted(net::HTTP_OK, total_size_, data); } - void HeadersCompleted(net::HttpStatusCode status_code) { + void HeadersCompleted(net::HttpStatusCode status_code, + uint64_t content_size, + net::IOBufferWithSize* metadata) { ResourceResponseHead response; response.content_length = 0; + if (status_code == net::HTTP_OK || status_code == net::HTTP_PARTIAL_CONTENT) + response.content_length = content_size; response.headers = storage::BlobURLRequestJob::GenerateHeaders( - status_code, blob_handle_.get(), blob_reader_.get(), &byte_range_, - &response.content_length); + status_code, blob_handle_.get(), &byte_range_, total_size_, + content_size); std::string mime_type; response.headers->GetMimeType(&mime_type); @@ -214,112 +163,38 @@ client_->OnReceiveResponse(response, base::nullopt, nullptr); sent_headers_ = true; - net::IOBufferWithSize* metadata = blob_reader_->side_data(); if (metadata) { const uint8_t* data = reinterpret_cast<const uint8_t*>(metadata->data()); client_->OnReceiveCachedMetadata( std::vector<uint8_t>(data, data + metadata->size())); } - - mojo::DataPipe data_pipe(kDefaultAllocationSize); - response_body_stream_ = std::move(data_pipe.producer_handle); - response_body_consumer_handle_ = std::move(data_pipe.consumer_handle); - peer_closed_handle_watcher_.Watch( - response_body_stream_.get(), MOJO_HANDLE_SIGNAL_PEER_CLOSED, - base::Bind(&BlobURLLoader::OnResponseBodyStreamClosed, - base::Unretained(this))); - peer_closed_handle_watcher_.ArmOrNotify(); - - writable_handle_watcher_.Watch( - response_body_stream_.get(), MOJO_HANDLE_SIGNAL_WRITABLE, - base::Bind(&BlobURLLoader::OnResponseBodyStreamReady, - base::Unretained(this))); - - // Start reading... - ReadMore(); } - void ReadMore() { - DCHECK(!pending_write_.get()); - - uint32_t num_bytes; - // TODO: we should use the abstractions in MojoAsyncResourceHandler. - MojoResult result = NetToMojoPendingBuffer::BeginWrite( - &response_body_stream_, &pending_write_, &num_bytes); - if (result == MOJO_RESULT_SHOULD_WAIT) { - // The pipe is full. We need to wait for it to have more space. - writable_handle_watcher_.ArmOrNotify(); - return; - } else if (result != MOJO_RESULT_OK) { - // The response body stream is in a bad state. Bail. - writable_handle_watcher_.Cancel(); - response_body_stream_.reset(); - NotifyCompleted(net::ERR_UNEXPECTED); - return; - } - - CHECK_GT(static_cast<uint32_t>(std::numeric_limits<int>::max()), num_bytes); - scoped_refptr<net::IOBuffer> buf( - new NetToMojoIOBuffer(pending_write_.get())); - int bytes_read; - storage::BlobReader::Status read_status = blob_reader_->Read( - buf.get(), static_cast<int>(num_bytes), &bytes_read, - base::Bind(&BlobURLLoader::DidRead, weak_factory_.GetWeakPtr(), false)); - switch (read_status) { - case storage::BlobReader::Status::NET_ERROR: - NotifyCompleted(blob_reader_->net_error()); - return; - case storage::BlobReader::Status::IO_PENDING: - // Wait for DidRead. - return; - case storage::BlobReader::Status::DONE: - if (bytes_read > 0) { - DidRead(true, bytes_read); - } else { - writable_handle_watcher_.Cancel(); - pending_write_->Complete(0); - pending_write_ = nullptr; // This closes the data pipe. - NotifyCompleted(net::OK); - return; - } - } - } - - void DidRead(bool completed_synchronously, int num_bytes) { + void DidRead(int num_bytes) override { if (response_body_consumer_handle_.is_valid()) { // Send the data pipe on the first OnReadCompleted call. client_->OnStartLoadingResponseBody( std::move(response_body_consumer_handle_)); } - response_body_stream_ = pending_write_->Complete(num_bytes); - total_written_bytes_ += num_bytes; - pending_write_ = nullptr; - if (completed_synchronously) { - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, - base::Bind(&BlobURLLoader::ReadMore, weak_factory_.GetWeakPtr())); - } else { - ReadMore(); + } + + void OnComplete(net::Error error_code, + uint64_t total_written_bytes) override { + if (error_code != net::OK && !sent_headers_) { + net::HttpStatusCode status_code = + storage::BlobURLRequestJob::NetErrorToHttpStatusCode(error_code); + ResourceResponseHead response; + response.headers = storage::BlobURLRequestJob::GenerateHeaders( + status_code, nullptr, nullptr, 0, 0); + client_->OnReceiveResponse(response, base::nullopt, nullptr); } - } - - void OnResponseBodyStreamClosed(MojoResult result) { - response_body_stream_.reset(); - pending_write_ = nullptr; - DeleteIfNeeded(); - } - - void OnResponseBodyStreamReady(MojoResult result) { - // TODO: Handle a bad |result| value. - DCHECK_EQ(result, MOJO_RESULT_OK); - ReadMore(); - } - - void DeleteIfNeeded() { - bool has_data_pipe = - pending_write_.get() || response_body_stream_.is_valid(); - if (!has_data_pipe) - delete this; + ResourceRequestCompletionStatus request_complete_data; + // TODO(kinuko): We should probably set the error_code here, + // while it makes existing tests fail. crbug.com/732750 + request_complete_data.completion_time = base::TimeTicks::Now(); + request_complete_data.encoded_body_length = total_written_bytes; + request_complete_data.decoded_body_length = total_written_bytes; + client_->OnComplete(request_complete_data); } mojo::Binding<mojom::URLLoader> binding_; @@ -328,18 +203,11 @@ bool byte_range_set_ = false; net::HttpByteRange byte_range_; + uint64_t total_size_ = 0; bool sent_headers_ = false; std::unique_ptr<storage::BlobDataHandle> blob_handle_; - std::unique_ptr<storage::BlobReader> blob_reader_; - - // TODO(jam): share with URLLoaderImpl - mojo::ScopedDataPipeProducerHandle response_body_stream_; mojo::ScopedDataPipeConsumerHandle response_body_consumer_handle_; - scoped_refptr<NetToMojoPendingBuffer> pending_write_; - mojo::SimpleWatcher writable_handle_watcher_; - mojo::SimpleWatcher peer_closed_handle_watcher_; - int64_t total_written_bytes_ = 0; base::WeakPtrFactory<BlobURLLoader> weak_factory_;
diff --git a/content/browser/browser_associated_interface_unittest.cc b/content/browser/browser_associated_interface_unittest.cc index c18a79d..8b315e3 100644 --- a/content/browser/browser_associated_interface_unittest.cc +++ b/content/browser/browser_associated_interface_unittest.cc
@@ -95,7 +95,7 @@ void OnFilterRemoved() override { // Check that the bindings are cleared by // BrowserAssociatedInterface::ClearBindings() callbacks. - EXPECT_FALSE(internal_state_->bindings_.get()); + EXPECT_FALSE(internal_state_->bindings_.has_value()); } // mojom::BrowserAssociatedInterfaceTestDriver:
diff --git a/content/browser/browser_plugin/browser_plugin_guest.cc b/content/browser/browser_plugin/browser_plugin_guest.cc index 0eed74e..e44dd5ab 100644 --- a/content/browser/browser_plugin/browser_plugin_guest.cc +++ b/content/browser/browser_plugin/browser_plugin_guest.cc
@@ -62,15 +62,16 @@ namespace { -std::vector<ui::CompositionUnderline> ConvertToUiUnderline( - const std::vector<blink::WebCompositionUnderline>& underlines) { - std::vector<ui::CompositionUnderline> ui_underlines; - for (const auto& underline : underlines) { - ui_underlines.emplace_back(ui::CompositionUnderline( - underline.start_offset, underline.end_offset, underline.color, - underline.thick, underline.background_color)); +std::vector<ui::ImeTextSpan> ConvertToUiImeTextSpan( + const std::vector<blink::WebImeTextSpan>& ime_text_spans) { + std::vector<ui::ImeTextSpan> ui_ime_text_spans; + for (const auto& ime_text_span : ime_text_spans) { + ui_ime_text_spans.emplace_back( + ui::ImeTextSpan(ime_text_span.start_offset, ime_text_span.end_offset, + ime_text_span.color, ime_text_span.thick, + ime_text_span.background_color)); } - return ui_underlines; + return ui_ime_text_spans; } }; // namespace @@ -929,29 +930,30 @@ void BrowserPluginGuest::OnImeSetComposition( int browser_plugin_instance_id, const BrowserPluginHostMsg_SetComposition_Params& params) { - std::vector<ui::CompositionUnderline> ui_underlines = - ConvertToUiUnderline(params.underlines); + std::vector<ui::ImeTextSpan> ui_ime_text_spans = + ConvertToUiImeTextSpan(params.ime_text_spans); GetWebContents() ->GetRenderViewHost() ->GetWidget() ->GetWidgetInputHandler() - ->ImeSetComposition(params.text, ui_underlines, params.replacement_range, - params.selection_start, params.selection_end); + ->ImeSetComposition(params.text, ui_ime_text_spans, + params.replacement_range, params.selection_start, + params.selection_end); } void BrowserPluginGuest::OnImeCommitText( int browser_plugin_instance_id, const base::string16& text, - const std::vector<blink::WebCompositionUnderline>& underlines, + const std::vector<blink::WebImeTextSpan>& ime_text_spans, const gfx::Range& replacement_range, int relative_cursor_pos) { - std::vector<ui::CompositionUnderline> ui_underlines = - ConvertToUiUnderline(underlines); + std::vector<ui::ImeTextSpan> ui_ime_text_spans = + ConvertToUiImeTextSpan(ime_text_spans); GetWebContents() ->GetRenderViewHost() ->GetWidget() ->GetWidgetInputHandler() - ->ImeCommitText(text, ui_underlines, replacement_range, + ->ImeCommitText(text, ui_ime_text_spans, replacement_range, relative_cursor_pos); }
diff --git a/content/browser/browser_plugin/browser_plugin_guest.h b/content/browser/browser_plugin/browser_plugin_guest.h index 725b77d..ac97e22 100644 --- a/content/browser/browser_plugin/browser_plugin_guest.h +++ b/content/browser/browser_plugin/browser_plugin_guest.h
@@ -38,8 +38,8 @@ #include "third_party/WebKit/public/platform/WebDragOperation.h" #include "third_party/WebKit/public/platform/WebFocusType.h" #include "third_party/WebKit/public/platform/WebInputEvent.h" -#include "third_party/WebKit/public/web/WebCompositionUnderline.h" #include "third_party/WebKit/public/web/WebDragStatus.h" +#include "third_party/WebKit/public/web/WebImeTextSpan.h" #include "ui/base/ime/text_input_mode.h" #include "ui/base/ime/text_input_type.h" #include "ui/gfx/geometry/rect.h" @@ -336,12 +336,11 @@ void OnImeSetComposition( int instance_id, const BrowserPluginHostMsg_SetComposition_Params& params); - void OnImeCommitText( - int instance_id, - const base::string16& text, - const std::vector<blink::WebCompositionUnderline>& underlines, - const gfx::Range& replacement_range, - int relative_cursor_pos); + void OnImeCommitText(int instance_id, + const base::string16& text, + const std::vector<blink::WebImeTextSpan>& ime_text_spans, + const gfx::Range& replacement_range, + int relative_cursor_pos); void OnImeFinishComposingText(int instance_id, bool keep_selection); void OnExtendSelectionAndDelete(int instance_id, int before, int after); void OnImeCancelComposition();
diff --git a/content/browser/cache_storage/cache_storage_cache_unittest.cc b/content/browser/cache_storage/cache_storage_cache_unittest.cc index 5802535..ca22403 100644 --- a/content/browser/cache_storage/cache_storage_cache_unittest.cc +++ b/content/browser/cache_storage/cache_storage_cache_unittest.cc
@@ -1418,6 +1418,8 @@ EXPECT_TRUE(TestResponseType(network::mojom::FetchResponseType::kDefault)); EXPECT_TRUE(TestResponseType(network::mojom::FetchResponseType::kError)); EXPECT_TRUE(TestResponseType(network::mojom::FetchResponseType::kOpaque)); + EXPECT_TRUE( + TestResponseType(network::mojom::FetchResponseType::kOpaqueRedirect)); } TEST_P(CacheStorageCacheTestP, WriteSideData) {
diff --git a/content/browser/devtools/BUILD.gn b/content/browser/devtools/BUILD.gn index 1f3a739e..611d028 100644 --- a/content/browser/devtools/BUILD.gn +++ b/content/browser/devtools/BUILD.gn
@@ -74,6 +74,8 @@ # These are relative to $target_gen_dir. outputs = [ + "protocol/browser.cc", + "protocol/browser.h", "protocol/dom.cc", "protocol/dom.h", "protocol/emulation.cc",
diff --git a/content/browser/devtools/browser_devtools_agent_host.cc b/content/browser/devtools/browser_devtools_agent_host.cc index bb7a585..74d57201 100644 --- a/content/browser/devtools/browser_devtools_agent_host.cc +++ b/content/browser/devtools/browser_devtools_agent_host.cc
@@ -9,6 +9,7 @@ #include "base/memory/ptr_util.h" #include "base/single_thread_task_runner.h" #include "content/browser/devtools/devtools_session.h" +#include "content/browser/devtools/protocol/browser_handler.h" #include "content/browser/devtools/protocol/io_handler.h" #include "content/browser/devtools/protocol/memory_handler.h" #include "content/browser/devtools/protocol/protocol.h" @@ -51,6 +52,7 @@ if (only_discovery_) return; + session->AddHandler(base::WrapUnique(new protocol::BrowserHandler())); session->AddHandler(base::WrapUnique(new protocol::IOHandler( GetIOContext()))); session->AddHandler(base::WrapUnique(new protocol::MemoryHandler()));
diff --git a/content/browser/devtools/protocol/browser_handler.cc b/content/browser/devtools/protocol/browser_handler.cc new file mode 100644 index 0000000..b5fd5f4 --- /dev/null +++ b/content/browser/devtools/protocol/browser_handler.cc
@@ -0,0 +1,38 @@ +// 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 "content/browser/devtools/protocol/browser_handler.h" + +#include "content/public/browser/devtools_agent_host.h" +#include "content/public/common/content_client.h" +#include "content/public/common/user_agent.h" +#include "v8/include/v8-version-string.h" + +namespace content { +namespace protocol { + +BrowserHandler::BrowserHandler() + : DevToolsDomainHandler(Browser::Metainfo::domainName) {} + +BrowserHandler::~BrowserHandler() {} + +void BrowserHandler::Wire(UberDispatcher* dispatcher) { + Browser::Dispatcher::wire(dispatcher, this); +} + +Response BrowserHandler::GetVersion(std::string* protocol_version, + std::string* product, + std::string* revision, + std::string* user_agent, + std::string* js_version) { + *protocol_version = DevToolsAgentHost::GetProtocolVersion(); + *revision = GetWebKitRevision(); + *product = GetContentClient()->GetProduct(); + *user_agent = GetContentClient()->GetUserAgent(); + *js_version = V8_VERSION_STRING; + return Response::OK(); +} + +} // namespace protocol +} // namespace content
diff --git a/content/browser/devtools/protocol/browser_handler.h b/content/browser/devtools/protocol/browser_handler.h new file mode 100644 index 0000000..fe109fe --- /dev/null +++ b/content/browser/devtools/protocol/browser_handler.h
@@ -0,0 +1,37 @@ +// 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 CONTENT_BROWSER_DEVTOOLS_PROTOCOL_BROWSER_HANDLER_H_ +#define CONTENT_BROWSER_DEVTOOLS_PROTOCOL_BROWSER_HANDLER_H_ + +#include "base/macros.h" +#include "content/browser/devtools/protocol/browser.h" +#include "content/browser/devtools/protocol/devtools_domain_handler.h" + +namespace content { + +namespace protocol { + +class BrowserHandler : public DevToolsDomainHandler, public Browser::Backend { + public: + BrowserHandler(); + ~BrowserHandler() override; + + void Wire(UberDispatcher* dispatcher) override; + + // Protocol methods. + Response GetVersion(std::string* protocol_version, + std::string* product, + std::string* revision, + std::string* user_agent, + std::string* js_version) override; + + private: + DISALLOW_COPY_AND_ASSIGN(BrowserHandler); +}; + +} // namespace protocol +} // namespace content + +#endif // CONTENT_BROWSER_DEVTOOLS_PROTOCOL_BROWSER_HANDLER_H_
diff --git a/content/browser/devtools/protocol/devtools_protocol_browsertest.cc b/content/browser/devtools/protocol/devtools_protocol_browsertest.cc index 9a526397..4d89cb2b 100644 --- a/content/browser/devtools/protocol/devtools_protocol_browsertest.cc +++ b/content/browser/devtools/protocol/devtools_protocol_browsertest.cc
@@ -167,12 +167,6 @@ return true; } - void ShowCertificateViewerInDevTools( - WebContents* web_contents, - scoped_refptr<net::X509Certificate> certificate) override { - last_shown_certificate_ = certificate; - } - base::DictionaryValue* SendCommand( const std::string& method, std::unique_ptr<base::DictionaryValue> params) { @@ -353,10 +347,6 @@ return urls; } - const scoped_refptr<net::X509Certificate>& last_shown_certificate() { - return last_shown_certificate_; - } - const scoped_refptr<net::X509Certificate>& ok_cert() { return ok_cert_; } const scoped_refptr<net::X509Certificate>& expired_cert() { @@ -419,7 +409,6 @@ std::unique_ptr<base::DictionaryValue> waiting_for_notification_params_; int waiting_for_command_result_id_; bool in_dispatch_; - scoped_refptr<net::X509Certificate> last_shown_certificate_; scoped_refptr<net::X509Certificate> ok_cert_; scoped_refptr<net::X509Certificate> expired_cert_; bool agent_host_can_close_; @@ -586,17 +575,21 @@ bool MatchesBitmap(const SkBitmap& expected_bmp, const SkBitmap& actual_bmp, const gfx::Rect& matching_mask, + float device_scale_factor, int error_limit) { // Number of pixels with an error int error_pixels_count = 0; gfx::Rect error_bounding_rect = gfx::Rect(); + // Scale expectations along with the mask. + device_scale_factor = device_scale_factor ? device_scale_factor : 1; + // Check that bitmaps have identical dimensions. - EXPECT_EQ(expected_bmp.width(), actual_bmp.width()); - EXPECT_EQ(expected_bmp.height(), actual_bmp.height()); - if (expected_bmp.width() != actual_bmp.width() || - expected_bmp.height() != actual_bmp.height()) { + EXPECT_EQ(expected_bmp.width() * device_scale_factor, actual_bmp.width()); + EXPECT_EQ(expected_bmp.height() * device_scale_factor, actual_bmp.height()); + if (expected_bmp.width() * device_scale_factor != actual_bmp.width() || + expected_bmp.height() * device_scale_factor != actual_bmp.height()) { return false; } @@ -604,7 +597,8 @@ for (int x = matching_mask.x(); x < matching_mask.right(); ++x) { for (int y = matching_mask.y(); y < matching_mask.bottom(); ++y) { - SkColor actual_color = actual_bmp.getColor(x, y); + SkColor actual_color = + actual_bmp.getColor(x * device_scale_factor, y * device_scale_factor); SkColor expected_color = expected_bmp.getColor(x, y); if (!ColorsMatchWithinLimit(actual_color, expected_color, error_limit)) { if (error_pixels_count < 10) { @@ -632,13 +626,14 @@ enum ScreenshotEncoding { ENCODING_PNG, ENCODING_JPEG }; void CaptureScreenshotAndCompareTo(const SkBitmap& expected_bitmap, ScreenshotEncoding encoding, - bool fromSurface, + bool from_surface, + float device_scale_factor = 0, const gfx::RectF& clip = gfx::RectF(), float clip_scale = 0) { std::unique_ptr<base::DictionaryValue> params(new base::DictionaryValue()); params->SetString("format", encoding == ENCODING_PNG ? "png" : "jpeg"); params->SetInteger("quality", 100); - params->SetBoolean("fromSurface", fromSurface); + params->SetBoolean("fromSurface", from_surface); if (clip_scale) { std::unique_ptr<base::DictionaryValue> clip_value( new base::DictionaryValue()); @@ -674,13 +669,14 @@ matching_mask.Inset(4, 4, 4, 4); #endif EXPECT_TRUE(MatchesBitmap(expected_bitmap, *result_bitmap, matching_mask, - error_limit)); + device_scale_factor, error_limit)); } // Takes a screenshot of a colored box that is positioned inside the frame. void PlaceAndCaptureBox(const gfx::Size& frame_size, const gfx::Size& box_size, - float screenshot_scale) { + float screenshot_scale, + float device_scale_factor) { static const int kBoxOffsetHeight = 100; const gfx::Size scaled_box_size = ScaleToFlooredSize(box_size, screenshot_scale); @@ -711,7 +707,7 @@ params.reset(new base::DictionaryValue()); params->SetInteger("width", frame_size.width()); params->SetInteger("height", frame_size.height()); - params->SetDouble("deviceScaleFactor", 1); + params->SetDouble("deviceScaleFactor", device_scale_factor); params->SetBoolean("mobile", false); SendCommand("Emulation.setDeviceMetricsOverride", std::move(params)); @@ -727,8 +723,8 @@ expected_bitmap.allocN32Pixels(scaled_box_size.width(), scaled_box_size.height()); expected_bitmap.eraseColor(SkColorSetRGB(0x00, 0x00, 0xff)); - CaptureScreenshotAndCompareTo(expected_bitmap, ENCODING_PNG, true, clip, - screenshot_scale); + CaptureScreenshotAndCompareTo(expected_bitmap, ENCODING_PNG, true, + device_scale_factor, clip, screenshot_scale); // Reset for next screenshot. SendCommand("Emulation.clearDeviceMetricsOverride", nullptr); @@ -801,12 +797,17 @@ Attach(); // Test capturing a subarea inside the emulated frame at different scales. - PlaceAndCaptureBox(kFrameSize, gfx::Size(100, 200), 1.0); - PlaceAndCaptureBox(kFrameSize, gfx::Size(100, 200), 2.0); - PlaceAndCaptureBox(kFrameSize, gfx::Size(100, 200), 0.5); + PlaceAndCaptureBox(kFrameSize, gfx::Size(100, 200), 1.0, 1.); + PlaceAndCaptureBox(kFrameSize, gfx::Size(100, 200), 2.0, 1.); + PlaceAndCaptureBox(kFrameSize, gfx::Size(100, 200), 0.5, 1.); // Ensure that content outside the emulated frame is painted, too. - PlaceAndCaptureBox(kFrameSize, gfx::Size(10, 8192), 1.0); + PlaceAndCaptureBox(kFrameSize, gfx::Size(10, 8192), 1.0, 1.); + + // Check non-1 device scale factor. + PlaceAndCaptureBox(kFrameSize, gfx::Size(100, 200), 1.0, 2.); + // Ensure not emulating device scale factor works. + PlaceAndCaptureBox(kFrameSize, gfx::Size(100, 200), 1.0, 0.); } // Verifies that setDefaultBackgroundColor and captureScreenshot support a @@ -1548,59 +1549,6 @@ EXPECT_THAT(console_messages_, ElementsAre("before", "at", "done", "after")); } -// Tests that the Security.showCertificateViewer command shows the -// certificate corresponding to the visible navigation entry, even when -// an interstitial is showing. Regression test for -// https://crbug.com/647759. -IN_PROC_BROWSER_TEST_F(DevToolsProtocolTest, ShowCertificateViewer) { - // First test that the correct certificate is shown for a normal - // (non-interstitial) page. - NavigateToURLBlockUntilNavigationsComplete(shell(), GURL("about:blank"), 1); - Attach(); - - // Set a dummy certificate on the NavigationEntry. - shell() - ->web_contents() - ->GetController() - .GetVisibleEntry() - ->GetSSL() - .certificate = ok_cert(); - - std::unique_ptr<base::DictionaryValue> params1(new base::DictionaryValue()); - SendCommand("Security.showCertificateViewer", std::move(params1), true); - - scoped_refptr<net::X509Certificate> normal_page_cert = shell() - ->web_contents() - ->GetController() - .GetVisibleEntry() - ->GetSSL() - .certificate; - ASSERT_TRUE(normal_page_cert); - EXPECT_EQ(normal_page_cert, last_shown_certificate()); - - // Now test that the correct certificate is shown on an interstitial. - TestInterstitialDelegate* delegate = new TestInterstitialDelegate; - WebContentsImpl* web_contents = - static_cast<WebContentsImpl*>(shell()->web_contents()); - GURL interstitial_url("https://example.test"); - InterstitialPageImpl* interstitial = new InterstitialPageImpl( - web_contents, static_cast<RenderWidgetHostDelegate*>(web_contents), true, - interstitial_url, delegate); - interstitial->Show(); - WaitForInterstitialAttach(web_contents); - - // Set the transient navigation entry certificate. - NavigationEntry* transient_entry = - web_contents->GetController().GetTransientEntry(); - ASSERT_TRUE(transient_entry); - transient_entry->GetSSL().certificate = expired_cert(); - ASSERT_TRUE(transient_entry->GetSSL().certificate); - - std::unique_ptr<base::DictionaryValue> params2(new base::DictionaryValue()); - SendCommand("Security.showCertificateViewer", std::move(params2), true); - EXPECT_EQ(transient_entry->GetSSL().certificate, last_shown_certificate()); -} - IN_PROC_BROWSER_TEST_F(DevToolsProtocolTest, CertificateError) { net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS); https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_EXPIRED);
diff --git a/content/browser/devtools/protocol/io_handler.h b/content/browser/devtools/protocol/io_handler.h index 3bff07c7..066541c 100644 --- a/content/browser/devtools/protocol/io_handler.h +++ b/content/browser/devtools/protocol/io_handler.h
@@ -49,4 +49,4 @@ } // namespace protocol } // namespace content -#endif // CONTENT_BROWSER_DEVTOOLS_PROTOCOL_TRACING_HANDLER_H_ +#endif // CONTENT_BROWSER_DEVTOOLS_PROTOCOL_IO_HANDLER_H_
diff --git a/content/browser/devtools/protocol/page_handler.cc b/content/browser/devtools/protocol/page_handler.cc index 714cccf7..21c9d64 100644 --- a/content/browser/devtools/protocol/page_handler.cc +++ b/content/browser/devtools/protocol/page_handler.cc
@@ -458,8 +458,10 @@ if (!modified_params.view_size.height) emulated_view_size.set_height(original_view_size.height()); - dpfactor = - modified_params.device_scale_factor / screen_info.device_scale_factor; + dpfactor = modified_params.device_scale_factor + ? modified_params.device_scale_factor / + screen_info.device_scale_factor + : 1; // When clip is specified, we scale viewport via clip, otherwise we use // scale. modified_params.scale = clip.isJust() ? 1 : dpfactor;
diff --git a/content/browser/devtools/protocol/security_handler.cc b/content/browser/devtools/protocol/security_handler.cc index 0ba37a9..803f58f 100644 --- a/content/browser/devtools/protocol/security_handler.cc +++ b/content/browser/devtools/protocol/security_handler.cc
@@ -6,6 +6,7 @@ #include <string> +#include "base/base64.h" #include "content/browser/devtools/devtools_session.h" #include "content/browser/frame_host/render_frame_host_impl.h" #include "content/public/browser/navigation_controller.h" @@ -14,6 +15,7 @@ #include "content/public/browser/ssl_status.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_delegate.h" +#include "net/cert/x509_certificate.h" #include "third_party/WebKit/public/platform/WebMixedContentContextType.h" namespace content { @@ -66,12 +68,32 @@ const std::vector<SecurityStyleExplanation>& explanations_to_add, Explanations* explanations) { for (const auto& it : explanations_to_add) { + std::unique_ptr<protocol::Array<String>> certificate = + protocol::Array<String>::create(); + if (it.certificate) { + std::string der; + std::string encoded; + bool rv = net::X509Certificate::GetDEREncoded( + it.certificate->os_cert_handle(), &der); + DCHECK(rv); + base::Base64Encode(der, &encoded); + + certificate->addItem(encoded); + + for (auto* cert : it.certificate->GetIntermediateCertificates()) { + rv = net::X509Certificate::GetDEREncoded(cert, &der); + DCHECK(rv); + base::Base64Encode(der, &encoded); + certificate->addItem(encoded); + } + } + explanations->addItem( Security::SecurityStateExplanation::Create() .SetSecurityState(security_style) .SetSummary(it.summary) .SetDescription(it.description) - .SetHasCertificate(it.has_certificate) + .SetCertificate(std::move(certificate)) .SetMixedContentType(MixedContentTypeToProtocolMixedContentType( it.mixed_content_type)) .Build()); @@ -210,19 +232,6 @@ return Response::OK(); } -Response SecurityHandler::ShowCertificateViewer() { - if (!host_) - return Response::InternalError(); - WebContents* web_contents = WebContents::FromRenderFrameHost(host_); - scoped_refptr<net::X509Certificate> certificate = - web_contents->GetController().GetVisibleEntry()->GetSSL().certificate; - if (!certificate) - return Response::Error("Could not find certificate"); - web_contents->GetDelegate()->ShowCertificateViewerInDevTools( - web_contents, certificate); - return Response::OK(); -} - Response SecurityHandler::HandleCertificateError(int event_id, const String& action) { if (cert_error_callbacks_.find(event_id) == cert_error_callbacks_.end()) {
diff --git a/content/browser/devtools/protocol/security_handler.h b/content/browser/devtools/protocol/security_handler.h index 96c24ff3..c70fdef 100644 --- a/content/browser/devtools/protocol/security_handler.h +++ b/content/browser/devtools/protocol/security_handler.h
@@ -40,7 +40,6 @@ // Security::Backend overrides. Response Enable() override; Response Disable() override; - Response ShowCertificateViewer() override; Response HandleCertificateError(int event_id, const String& action) override; Response SetOverrideCertificateErrors(bool override) override;
diff --git a/content/browser/devtools/protocol_config.json b/content/browser/devtools/protocol_config.json index a43e4ef..057470ce 100644 --- a/content/browser/devtools/protocol_config.json +++ b/content/browser/devtools/protocol_config.json
@@ -10,6 +10,10 @@ "export_header": "content/common/content_export.h", "options": [ { + "domain": "Browser", + "include": ["getVersion"] + }, + { "domain": "DOM", "include": ["setFileInputFiles"], "include_events": [],
diff --git a/content/browser/devtools/render_frame_devtools_agent_host.cc b/content/browser/devtools/render_frame_devtools_agent_host.cc index b95c89a2..10503c7 100644 --- a/content/browser/devtools/render_frame_devtools_agent_host.cc +++ b/content/browser/devtools/render_frame_devtools_agent_host.cc
@@ -18,6 +18,7 @@ #include "content/browser/devtools/devtools_frame_trace_recorder.h" #include "content/browser/devtools/devtools_manager.h" #include "content/browser/devtools/devtools_session.h" +#include "content/browser/devtools/protocol/browser_handler.h" #include "content/browser/devtools/protocol/dom_handler.h" #include "content/browser/devtools/protocol/emulation_handler.h" #include "content/browser/devtools/protocol/input_handler.h" @@ -506,6 +507,7 @@ protocol::EmulationHandler* emulation_handler = new protocol::EmulationHandler(); + session->AddHandler(base::WrapUnique(new protocol::BrowserHandler())); session->AddHandler(base::WrapUnique(new protocol::DOMHandler())); session->AddHandler(base::WrapUnique(emulation_handler)); session->AddHandler(base::WrapUnique(new protocol::InputHandler()));
diff --git a/content/browser/dom_storage/dom_storage_host.cc b/content/browser/dom_storage/dom_storage_host.cc index 162cdc7..38655ef 100644 --- a/content/browser/dom_storage/dom_storage_host.cc +++ b/content/browser/dom_storage/dom_storage_host.cc
@@ -32,8 +32,16 @@ references.namespace_ = context_->GetStorageNamespace(namespace_id); if (!references.namespace_.get()) return context_->DiagnoseSessionNamespaceId(namespace_id); - references.area_ = references.namespace_->OpenStorageArea(origin); - DCHECK(references.area_.get()); + + // namespace->OpenStorageArea() is called only once per process + // (areas_open_count[area] is 0). + references.area_ = references.namespace_->GetOpenStorageArea(origin); + if (!references.area_ || !areas_open_count_[references.area_.get()]) { + references.area_ = references.namespace_->OpenStorageArea(origin); + DCHECK(references.area_.get()); + DCHECK_EQ(0, areas_open_count_[references.area_.get()]); + } + ++areas_open_count_[references.area_.get()]; connections_[connection_id] = references; return base::nullopt; } @@ -42,7 +50,15 @@ const auto found = connections_.find(connection_id); if (found == connections_.end()) return; - found->second.namespace_->CloseStorageArea(found->second.area_.get()); + DOMStorageArea* area = found->second.area_.get(); + DCHECK(areas_open_count_[area]); + + // namespace->CloseStorageArea() is called only once per process + // (areas_open_count[area] becomes 0). + if (--areas_open_count_[area] == 0) { + found->second.namespace_->CloseStorageArea(area); + areas_open_count_.erase(area); + } connections_.erase(found); } @@ -84,29 +100,34 @@ return area->GetItem(key); } -bool DOMStorageHost::SetAreaItem( - int connection_id, const base::string16& key, - const base::string16& value, const GURL& page_url, - base::NullableString16* old_value) { +bool DOMStorageHost::SetAreaItem(int connection_id, + const base::string16& key, + const base::string16& value, + const base::NullableString16& client_old_value, + const GURL& page_url) { DOMStorageArea* area = GetOpenArea(connection_id); if (!area) return false; - if (!area->SetItem(key, value, old_value)) + base::NullableString16 old_value; + if (!area->SetItem(key, value, &old_value)) return false; - if (old_value->is_null() || old_value->string() != value) - context_->NotifyItemSet(area, key, value, *old_value, page_url); + if (old_value.is_null() || old_value.string() != value) + context_->NotifyItemSet(area, key, value, old_value, page_url); return true; } bool DOMStorageHost::RemoveAreaItem( - int connection_id, const base::string16& key, const GURL& page_url, - base::string16* old_value) { + int connection_id, + const base::string16& key, + const base::NullableString16& client_old_value, + const GURL& page_url) { DOMStorageArea* area = GetOpenArea(connection_id); if (!area) return false; - if (!area->RemoveItem(key, old_value)) + base::string16 old_value; + if (!area->RemoveItem(key, &old_value)) return false; - context_->NotifyItemRemoved(area, key, *old_value, page_url); + context_->NotifyItemRemoved(area, key, old_value, page_url); return true; }
diff --git a/content/browser/dom_storage/dom_storage_host.h b/content/browser/dom_storage/dom_storage_host.h index 6b931d19..5804806 100644 --- a/content/browser/dom_storage/dom_storage_host.h +++ b/content/browser/dom_storage/dom_storage_host.h
@@ -45,13 +45,15 @@ base::NullableString16 GetAreaKey(int connection_id, unsigned index); base::NullableString16 GetAreaItem(int connection_id, const base::string16& key); - bool SetAreaItem(int connection_id, const base::string16& key, - const base::string16& value, const GURL& page_url, - base::NullableString16* old_value); + bool SetAreaItem(int connection_id, + const base::string16& key, + const base::string16& value, + const base::NullableString16& client_old_value, + const GURL& page_url); bool RemoveAreaItem(int connection_id, const base::string16& key, - const GURL& page_url, - base::string16* old_value); + const base::NullableString16& client_old_value, + const GURL& page_url); bool ClearArea(int connection_id, const GURL& page_url); bool HasAreaOpen(int namespace_id, const GURL& origin) const; bool HasConnection(int connection_id) const { @@ -75,6 +77,7 @@ scoped_refptr<DOMStorageContextImpl> context_; AreaMap connections_; + std::map<DOMStorageArea*, int> areas_open_count_; DISALLOW_COPY_AND_ASSIGN(DOMStorageHost); };
diff --git a/content/browser/dom_storage/dom_storage_message_filter.cc b/content/browser/dom_storage/dom_storage_message_filter.cc index ec5622f..bb64fcc 100644 --- a/content/browser/dom_storage/dom_storage_message_filter.cc +++ b/content/browser/dom_storage/dom_storage_message_filter.cc
@@ -112,27 +112,30 @@ } void DOMStorageMessageFilter::OnSetItem( - int connection_id, const base::string16& key, - const base::string16& value, const GURL& page_url) { - DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO)); - DCHECK_EQ(0, connection_dispatching_message_for_); - base::AutoReset<int> auto_reset(&connection_dispatching_message_for_, - connection_id); - base::NullableString16 not_used; - bool success = host_->SetAreaItem(connection_id, key, value, - page_url, ¬_used); - Send(new DOMStorageMsg_AsyncOperationComplete(success)); -} - -void DOMStorageMessageFilter::OnRemoveItem( - int connection_id, const base::string16& key, + int connection_id, + const base::string16& key, + const base::string16& value, + const base::NullableString16& client_old_value, const GURL& page_url) { DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO)); DCHECK_EQ(0, connection_dispatching_message_for_); base::AutoReset<int> auto_reset(&connection_dispatching_message_for_, connection_id); - base::string16 not_used; - host_->RemoveAreaItem(connection_id, key, page_url, ¬_used); + bool success = + host_->SetAreaItem(connection_id, key, value, client_old_value, page_url); + Send(new DOMStorageMsg_AsyncOperationComplete(success)); +} + +void DOMStorageMessageFilter::OnRemoveItem( + int connection_id, + const base::string16& key, + const base::NullableString16& client_old_value, + const GURL& page_url) { + DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO)); + DCHECK_EQ(0, connection_dispatching_message_for_); + base::AutoReset<int> auto_reset(&connection_dispatching_message_for_, + connection_id); + host_->RemoveAreaItem(connection_id, key, client_old_value, page_url); Send(new DOMStorageMsg_AsyncOperationComplete(true)); }
diff --git a/content/browser/dom_storage/dom_storage_message_filter.h b/content/browser/dom_storage/dom_storage_message_filter.h index c3394e7..ff199f8 100644 --- a/content/browser/dom_storage/dom_storage_message_filter.h +++ b/content/browser/dom_storage/dom_storage_message_filter.h
@@ -55,9 +55,14 @@ const GURL& origin); void OnCloseStorageArea(int connection_id); void OnLoadStorageArea(int connection_id, DOMStorageValuesMap* map); - void OnSetItem(int connection_id, const base::string16& key, - const base::string16& value, const GURL& page_url); - void OnRemoveItem(int connection_id, const base::string16& key, + void OnSetItem(int connection_id, + const base::string16& key, + const base::string16& value, + const base::NullableString16& client_old_value, + const GURL& page_url); + void OnRemoveItem(int connection_id, + const base::string16& key, + const base::NullableString16& client_old_value, const GURL& page_url); void OnClear(int connection_id, const GURL& page_url); void OnFlushMessages();
diff --git a/content/browser/dom_storage/dom_storage_namespace.cc b/content/browser/dom_storage/dom_storage_namespace.cc index 847b1930..10568d3 100644 --- a/content/browser/dom_storage/dom_storage_namespace.cc +++ b/content/browser/dom_storage/dom_storage_namespace.cc
@@ -196,6 +196,13 @@ origins->push_back(entry.first); } +int DOMStorageNamespace::GetAreaOpenCount(const GURL& origin) const { + const auto& found = areas_.find(origin); + if (found == areas_.end()) + return 0; + return found->second.open_count_; +} + DOMStorageNamespace::AreaHolder* DOMStorageNamespace::GetAreaHolder(const GURL& origin) { AreaMap::iterator found = areas_.find(origin);
diff --git a/content/browser/dom_storage/dom_storage_namespace.h b/content/browser/dom_storage/dom_storage_namespace.h index 8f75f2ab..2fdab5a 100644 --- a/content/browser/dom_storage/dom_storage_namespace.h +++ b/content/browser/dom_storage/dom_storage_namespace.h
@@ -85,6 +85,8 @@ void GetOriginsWithAreas(std::vector<GURL>* origins) const; + int GetAreaOpenCount(const GURL& origin) const; + private: friend class base::RefCountedThreadSafe<DOMStorageNamespace>;
diff --git a/content/browser/download/download_request_core.cc b/content/browser/download/download_request_core.cc index e37a480..2f3619b 100644 --- a/content/browser/download/download_request_core.cc +++ b/content/browser/download/download_request_core.cc
@@ -461,106 +461,4 @@ request() ? request()->url().spec().c_str() : "<NULL request>"); } -// static -DownloadInterruptReason DownloadRequestCore::HandleSuccessfulServerResponse( - const net::HttpResponseHeaders& http_headers, - DownloadSaveInfo* save_info) { - switch (http_headers.response_code()) { - case -1: // Non-HTTP request. - case net::HTTP_OK: - case net::HTTP_NON_AUTHORITATIVE_INFORMATION: - case net::HTTP_PARTIAL_CONTENT: - // Expected successful codes. - break; - - case net::HTTP_CREATED: - case net::HTTP_ACCEPTED: - // Per RFC 7231 the entity being transferred is metadata about the - // resource at the target URL and not the resource at that URL (or the - // resource that would be at the URL once processing is completed in the - // case of HTTP_ACCEPTED). However, we currently don't have special - // handling for these response and they are downloaded the same as a - // regular response. - break; - - case net::HTTP_NO_CONTENT: - case net::HTTP_RESET_CONTENT: - // These two status codes don't have an entity (or rather RFC 7231 - // requires that there be no entity). They are treated the same as the - // resource not being found since there is no entity to download. - - case net::HTTP_NOT_FOUND: - return DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT; - break; - - case net::HTTP_REQUESTED_RANGE_NOT_SATISFIABLE: - // Retry by downloading from the start automatically: - // If we haven't received data when we get this error, we won't. - return DOWNLOAD_INTERRUPT_REASON_SERVER_NO_RANGE; - break; - case net::HTTP_UNAUTHORIZED: - case net::HTTP_PROXY_AUTHENTICATION_REQUIRED: - // Server didn't authorize this request. - return DOWNLOAD_INTERRUPT_REASON_SERVER_UNAUTHORIZED; - break; - case net::HTTP_FORBIDDEN: - // Server forbids access to this resource. - return DOWNLOAD_INTERRUPT_REASON_SERVER_FORBIDDEN; - break; - default: // All other errors. - // Redirection and informational codes should have been handled earlier - // in the stack. - // TODO(xingliu): Handle HTTP_PRECONDITION_FAILED and resurrect - // DOWNLOAD_INTERRUPT_REASON_SERVER_PRECONDITION for range requests. - // This will change extensions::api::download::InterruptReason. - DCHECK_NE(3, http_headers.response_code() / 100); - DCHECK_NE(1, http_headers.response_code() / 100); - return DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED; - } - - // The caller is expecting a partial response. - if (save_info && (save_info->offset > 0 || save_info->length > 0)) { - if (http_headers.response_code() != net::HTTP_PARTIAL_CONTENT) { - // Server should send partial content when "If-Match" or - // "If-Unmodified-Since" check passes, and the range request header has - // last byte position. e.g. "Range:bytes=50-99". - if (save_info->length != DownloadSaveInfo::kLengthFullContent) - return DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT; - - // Requested a partial range, but received the entire response, when - // the range request header is "Range:bytes={offset}-". - save_info->offset = 0; - save_info->hash_of_partial_file.clear(); - save_info->hash_state.reset(); - return DOWNLOAD_INTERRUPT_REASON_NONE; - } - - int64_t first_byte = -1; - int64_t last_byte = -1; - int64_t length = -1; - if (!http_headers.GetContentRangeFor206(&first_byte, &last_byte, &length)) - return DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT; - DCHECK_GE(first_byte, 0); - - if (first_byte != save_info->offset || - (save_info->length > 0 && - last_byte != save_info->offset + save_info->length - 1)) { - // The server returned a different range than the one we requested. Assume - // the response is bad. - // - // In the future we should consider allowing offsets that are less than - // the offset we've requested, since in theory we can truncate the partial - // file at the offset and continue. - return DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT; - } - - return DOWNLOAD_INTERRUPT_REASON_NONE; - } - - if (http_headers.response_code() == net::HTTP_PARTIAL_CONTENT) - return DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT; - - return DOWNLOAD_INTERRUPT_REASON_NONE; -} - } // namespace content
diff --git a/content/browser/download/download_request_core.h b/content/browser/download/download_request_core.h index 93c4315a..52fd227 100644 --- a/content/browser/download/download_request_core.h +++ b/content/browser/download/download_request_core.h
@@ -115,10 +115,6 @@ net::URLRequest* request() const { return request_; } private: - static DownloadInterruptReason HandleSuccessfulServerResponse( - const net::HttpResponseHeaders& http_headers, - DownloadSaveInfo* save_info); - std::unique_ptr<DownloadCreateInfo> CreateDownloadCreateInfo( DownloadInterruptReason result);
diff --git a/content/browser/download/download_response_handler.cc b/content/browser/download/download_response_handler.cc new file mode 100644 index 0000000..715df6d --- /dev/null +++ b/content/browser/download/download_response_handler.cc
@@ -0,0 +1,70 @@ +// 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 "content/browser/download/download_response_handler.h" + +#include "content/browser/download/download_stats.h" +#include "content/browser/download/download_utils.h" + +namespace content { + +DownloadResponseHandler::DownloadResponseHandler( + ResourceRequest* resource_request, + Delegate* delegate, + bool is_parallel_request) + : delegate_(delegate) { + if (!is_parallel_request) + RecordDownloadCount(UNTHROTTLED_COUNT); + + // TODO(qinmin): create the DownloadSaveInfo from |resource_request| +} + +DownloadResponseHandler::~DownloadResponseHandler() = default; + +void DownloadResponseHandler::OnReceiveResponse( + const content::ResourceResponseHead& head, + const base::Optional<net::SSLInfo>& ssl_info, + mojom::DownloadedTempFilePtr downloaded_file) { + // TODO(qinmin): create the DownloadCreateInfo from |head|. + + // TODO(qinmin): pass DownloadSaveInfo here. + DownloadInterruptReason result = + head.headers + ? HandleSuccessfulServerResponse(*(head.headers.get()), nullptr) + : DOWNLOAD_INTERRUPT_REASON_NONE; + if (result != DOWNLOAD_INTERRUPT_REASON_NONE) { + delegate_->OnResponseStarted(download_create_info_, + mojo::ScopedDataPipeConsumerHandle()); + } +} + +void DownloadResponseHandler::OnReceiveRedirect( + const net::RedirectInfo& redirect_info, + const content::ResourceResponseHead& head) {} + +void DownloadResponseHandler::OnDataDownloaded(int64_t data_length, + int64_t encoded_length) {} + +void DownloadResponseHandler::OnUploadProgress( + int64_t current_position, + int64_t total_size, + OnUploadProgressCallback callback) {} + +void DownloadResponseHandler::OnReceiveCachedMetadata( + const std::vector<uint8_t>& data) {} + +void DownloadResponseHandler::OnTransferSizeUpdated( + int32_t transfer_size_diff) {}; + +void DownloadResponseHandler::OnStartLoadingResponseBody( + mojo::ScopedDataPipeConsumerHandle body) { + delegate_->OnResponseStarted(download_create_info_, std::move(body)); +} + +void DownloadResponseHandler::OnComplete( + const content::ResourceRequestCompletionStatus& completion_status) { + // TODO(qinmin): passing the |completion_status| to DownloadFile. +} + +} // namespace content
diff --git a/content/browser/download/download_response_handler.h b/content/browser/download/download_response_handler.h new file mode 100644 index 0000000..f60158e --- /dev/null +++ b/content/browser/download/download_response_handler.h
@@ -0,0 +1,59 @@ +// 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 CONTENT_BROWSER_DOWNLOAD_RESPONSE_HANDLER_ +#define CONTENT_BROWSER_DOWNLOAD_RESPONSE_HANDLER_ + +#include "content/browser/download/download_create_info.h" +#include "content/public/common/resource_request.h" +#include "content/public/common/url_loader.mojom.h" + +namespace content { + +// This class is responsible for handling the server response for a download. +// It passes the DataPipeConsumerHandle and completion status to the download +// sink. The class is common to both navigation triggered downloads and +// context menu downloads +class DownloadResponseHandler : public mojom::URLLoaderClient { + public: + class Delegate { + public: + virtual void OnResponseStarted( + const DownloadCreateInfo& download_create_info, + mojo::ScopedDataPipeConsumerHandle body) = 0; + }; + + DownloadResponseHandler(ResourceRequest* resource_request, + Delegate* delegate, + bool is_parallel_request); + ~DownloadResponseHandler() override; + + // mojom::URLLoaderClient + void OnReceiveResponse(const content::ResourceResponseHead& head, + const base::Optional<net::SSLInfo>& ssl_info, + mojom::DownloadedTempFilePtr downloaded_file) override; + void OnReceiveRedirect(const net::RedirectInfo& redirect_info, + const content::ResourceResponseHead& head) override; + void OnDataDownloaded(int64_t data_length, int64_t encoded_length) override; + void OnUploadProgress(int64_t current_position, + int64_t total_size, + OnUploadProgressCallback callback) override; + void OnReceiveCachedMetadata(const std::vector<uint8_t>& data) override; + void OnTransferSizeUpdated(int32_t transfer_size_diff) override; + void OnStartLoadingResponseBody( + mojo::ScopedDataPipeConsumerHandle body) override; + void OnComplete(const content::ResourceRequestCompletionStatus& + completion_status) override; + + private: + Delegate* const delegate_; + + DownloadCreateInfo download_create_info_; + + DISALLOW_COPY_AND_ASSIGN(DownloadResponseHandler); +}; + +} // namespace content + +#endif // CONTENT_BROWSER_DOWNLOAD_RESPONSE_HANDLER
diff --git a/content/browser/download/download_utils.cc b/content/browser/download/download_utils.cc index 856a531..3e288d8 100644 --- a/content/browser/download/download_utils.cc +++ b/content/browser/download/download_utils.cc
@@ -10,12 +10,14 @@ #include "content/browser/download/download_interrupt_reasons_impl.h" #include "content/browser/download/download_stats.h" #include "content/public/browser/browser_thread.h" +#include "content/public/browser/download_save_info.h" #include "content/public/browser/download_url_parameters.h" #include "content/public/common/resource_request.h" #include "net/base/elements_upload_data_stream.h" #include "net/base/load_flags.h" #include "net/base/upload_bytes_element_reader.h" #include "net/http/http_request_headers.h" +#include "net/http/http_status_code.h" #include "net/url_request/url_request_context.h" namespace content { @@ -250,5 +252,105 @@ return request; } +DownloadInterruptReason HandleSuccessfulServerResponse( + const net::HttpResponseHeaders& http_headers, + DownloadSaveInfo* save_info) { + switch (http_headers.response_code()) { + case -1: // Non-HTTP request. + case net::HTTP_OK: + case net::HTTP_NON_AUTHORITATIVE_INFORMATION: + case net::HTTP_PARTIAL_CONTENT: + // Expected successful codes. + break; + + case net::HTTP_CREATED: + case net::HTTP_ACCEPTED: + // Per RFC 7231 the entity being transferred is metadata about the + // resource at the target URL and not the resource at that URL (or the + // resource that would be at the URL once processing is completed in the + // case of HTTP_ACCEPTED). However, we currently don't have special + // handling for these response and they are downloaded the same as a + // regular response. + break; + + case net::HTTP_NO_CONTENT: + case net::HTTP_RESET_CONTENT: + // These two status codes don't have an entity (or rather RFC 7231 + // requires that there be no entity). They are treated the same as the + // resource not being found since there is no entity to download. + + case net::HTTP_NOT_FOUND: + return DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT; + break; + + case net::HTTP_REQUESTED_RANGE_NOT_SATISFIABLE: + // Retry by downloading from the start automatically: + // If we haven't received data when we get this error, we won't. + return DOWNLOAD_INTERRUPT_REASON_SERVER_NO_RANGE; + break; + case net::HTTP_UNAUTHORIZED: + case net::HTTP_PROXY_AUTHENTICATION_REQUIRED: + // Server didn't authorize this request. + return DOWNLOAD_INTERRUPT_REASON_SERVER_UNAUTHORIZED; + break; + case net::HTTP_FORBIDDEN: + // Server forbids access to this resource. + return DOWNLOAD_INTERRUPT_REASON_SERVER_FORBIDDEN; + break; + default: // All other errors. + // Redirection and informational codes should have been handled earlier + // in the stack. + // TODO(xingliu): Handle HTTP_PRECONDITION_FAILED and resurrect + // DOWNLOAD_INTERRUPT_REASON_SERVER_PRECONDITION for range requests. + // This will change extensions::api::download::InterruptReason. + DCHECK_NE(3, http_headers.response_code() / 100); + DCHECK_NE(1, http_headers.response_code() / 100); + return DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED; + } + + // The caller is expecting a partial response. + if (save_info && (save_info->offset > 0 || save_info->length > 0)) { + if (http_headers.response_code() != net::HTTP_PARTIAL_CONTENT) { + // Server should send partial content when "If-Match" or + // "If-Unmodified-Since" check passes, and the range request header has + // last byte position. e.g. "Range:bytes=50-99". + if (save_info->length != DownloadSaveInfo::kLengthFullContent) + return DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT; + + // Requested a partial range, but received the entire response, when + // the range request header is "Range:bytes={offset}-". + save_info->offset = 0; + save_info->hash_of_partial_file.clear(); + save_info->hash_state.reset(); + return DOWNLOAD_INTERRUPT_REASON_NONE; + } + + int64_t first_byte = -1; + int64_t last_byte = -1; + int64_t length = -1; + if (!http_headers.GetContentRangeFor206(&first_byte, &last_byte, &length)) + return DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT; + DCHECK_GE(first_byte, 0); + + if (first_byte != save_info->offset || + (save_info->length > 0 && + last_byte != save_info->offset + save_info->length - 1)) { + // The server returned a different range than the one we requested. Assume + // the response is bad. + // + // In the future we should consider allowing offsets that are less than + // the offset we've requested, since in theory we can truncate the partial + // file at the offset and continue. + return DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT; + } + + return DOWNLOAD_INTERRUPT_REASON_NONE; + } + + if (http_headers.response_code() == net::HTTP_PARTIAL_CONTENT) + return DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT; + + return DOWNLOAD_INTERRUPT_REASON_NONE; +} } // namespace content
diff --git a/content/browser/download/download_utils.h b/content/browser/download/download_utils.h index 741218a..4b8c2ef 100644 --- a/content/browser/download/download_utils.h +++ b/content/browser/download/download_utils.h
@@ -8,6 +8,7 @@ #include "content/public/browser/download_interrupt_reasons.h" #include "net/base/net_errors.h" #include "net/cert/cert_status_flags.h" +#include "net/http/http_response_headers.h" namespace net { class URLRequest; @@ -17,6 +18,7 @@ class DownloadUrlParameters; struct ResourceRequest; +struct DownloadSaveInfo; // Handle the url request completion status and return the interrupt reasons. // |cert_status| is ignored if error_code is not net::ERR_ABORTED. @@ -29,9 +31,13 @@ DownloadUrlParameters* params); // Create a URLRequest from |params|. -std::unique_ptr<net::URLRequest> CreateURLRequestOnIOThread( +std::unique_ptr<net::URLRequest> CONTENT_EXPORT CreateURLRequestOnIOThread( DownloadUrlParameters* params); +DownloadInterruptReason CONTENT_EXPORT +HandleSuccessfulServerResponse(const net::HttpResponseHeaders& http_headers, + DownloadSaveInfo* save_info); + } // namespace content #endif // CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_UTILS_H_
diff --git a/content/browser/download/parallel_download_job.cc b/content/browser/download/parallel_download_job.cc index 519711e..c800f09 100644 --- a/content/browser/download/parallel_download_job.cc +++ b/content/browser/download/parallel_download_job.cc
@@ -134,8 +134,10 @@ void ParallelDownloadJob::BuildParallelRequests() { DCHECK(!requests_sent_); DCHECK(!is_paused()); - if (is_canceled_) + if (is_canceled_ || + download_item_->GetLastReason() != DOWNLOAD_INTERRUPT_REASON_NONE) { return; + } // TODO(qinmin): The size of |slices_to_download| should be no larger than // |kParallelRequestCount| unless |kParallelRequestCount| is changed after
diff --git a/content/browser/download/parallel_download_job_unittest.cc b/content/browser/download/parallel_download_job_unittest.cc index ae7d5b04c..223a3a1 100644 --- a/content/browser/download/parallel_download_job_unittest.cc +++ b/content/browser/download/parallel_download_job_unittest.cc
@@ -9,6 +9,7 @@ #include "base/memory/ptr_util.h" #include "base/run_loop.h" +#include "base/test/mock_callback.h" #include "base/test/scoped_task_environment.h" #include "content/browser/download/download_destination_observer.h" #include "content/browser/download/download_file_impl.h" @@ -22,6 +23,7 @@ using ::testing::_; using ::testing::NiceMock; +using ::testing::Return; using ::testing::StrictMock; namespace content { @@ -91,6 +93,11 @@ ParallelDownloadJob::WorkerMap& workers() { return workers_; } + void MakeFileInitialized(const DownloadFile::InitializeCallback& callback, + DownloadInterruptReason result) { + ParallelDownloadJob::OnDownloadFileInitialized(callback, result); + } + int GetParallelRequestCount() const override { return request_count_; } int64_t GetMinSliceSize() const override { return min_slice_size_; } int GetMinRemainingTimeInSeconds() const override { @@ -198,7 +205,7 @@ // Task 1: Range:50-, for 50 bytes. CreateParallelJob(0, 100, DownloadItem::ReceivedSlices(), 2, 1, 10); BuildParallelRequests(); - EXPECT_EQ(1, static_cast<int>(job_->workers().size())); + EXPECT_EQ(1u, job_->workers().size()); VerifyWorker(50, 0); DestroyParallelJob(); @@ -208,7 +215,7 @@ // Task 2: Range:66-, for 34 bytes. CreateParallelJob(0, 100, DownloadItem::ReceivedSlices(), 3, 1, 10); BuildParallelRequests(); - EXPECT_EQ(2, static_cast<int>(job_->workers().size())); + EXPECT_EQ(2u, job_->workers().size()); VerifyWorker(33, 33); VerifyWorker(66, 0); DestroyParallelJob(); @@ -242,7 +249,7 @@ DownloadItem::ReceivedSlices slices = {DownloadItem::ReceivedSlice(0, 17)}; CreateParallelJob(12, 88, slices, 3, 1, 10); BuildParallelRequests(); - EXPECT_EQ(2, static_cast<int>(job_->workers().size())); + EXPECT_EQ(2u, job_->workers().size()); VerifyWorker(44, 27); VerifyWorker(71, 0); DestroyParallelJob(); @@ -256,7 +263,7 @@ slices = {DownloadItem::ReceivedSlice(0, 60)}; CreateParallelJob(60, 40, slices, 4, 20, 10); BuildParallelRequests(); - EXPECT_EQ(1, static_cast<int>(job_->workers().size())); + EXPECT_EQ(1u, job_->workers().size()); VerifyWorker(80, 0); DestroyParallelJob(); @@ -277,7 +284,7 @@ DownloadItem::ReceivedSlice(40, 10), DownloadItem::ReceivedSlice(90, 10)}; CreateParallelJob(0, 12, slices, 2, 1, 10); BuildParallelRequests(); - EXPECT_EQ(3, static_cast<int>(job_->workers().size())); + EXPECT_EQ(3u, job_->workers().size()); VerifyWorker(30, 10); VerifyWorker(50, 40); VerifyWorker(100, 0); @@ -359,7 +366,7 @@ DownloadItem::ReceivedSlices slices = {DownloadItem::ReceivedSlice(0, 99)}; CreateParallelJob(99, 1, slices, 3, 1, 10); BuildParallelRequests(); - EXPECT_EQ(0, static_cast<int>(job_->workers().size())); + EXPECT_EQ(0u, job_->workers().size()); DestroyParallelJob(); } @@ -398,4 +405,26 @@ task_environment_.RunUntilIdle(); } +// Interruption from IO thread after the file initialized and before building +// the parallel requests, should correctly stop the download. +TEST_F(ParallelDownloadJobTest, InterruptOnStartup) { + DownloadItem::ReceivedSlices slices = {DownloadItem::ReceivedSlice(0, 99)}; + CreateParallelJob(99, 1, slices, 3, 1, 10); + + // Start to build the requests without any error. + base::MockCallback<DownloadFile::InitializeCallback> callback; + EXPECT_CALL(callback, Run(_)).Times(1); + job_->MakeFileInitialized(callback.Get(), DOWNLOAD_INTERRUPT_REASON_NONE); + + // Simulate and inject an error from IO thread after file initializd. + EXPECT_CALL(*download_item_.get(), GetLastReason()) + .WillOnce(Return(DOWNLOAD_INTERRUPT_REASON_NETWORK_DISCONNECTED)); + + // Because of the error, no parallel requests are built. + task_environment_.RunUntilIdle(); + EXPECT_EQ(0u, job_->workers().size()); + + DestroyParallelJob(); +} + } // namespace content
diff --git a/content/browser/frame_host/input/legacy_ipc_frame_input_handler.cc b/content/browser/frame_host/input/legacy_ipc_frame_input_handler.cc index 849d9c1..b44c9e5 100644 --- a/content/browser/frame_host/input/legacy_ipc_frame_input_handler.cc +++ b/content/browser/frame_host/input/legacy_ipc_frame_input_handler.cc
@@ -20,17 +20,18 @@ void LegacyIPCFrameInputHandler::SetCompositionFromExistingText( int32_t start, int32_t end, - const std::vector<ui::CompositionUnderline>& ui_underlines) { - std::vector<blink::WebCompositionUnderline> underlines; - for (const auto& underline : ui_underlines) { - blink::WebCompositionUnderline blink_underline( - underline.start_offset, underline.end_offset, underline.color, - underline.thick, underline.background_color); - underlines.push_back(blink_underline); + const std::vector<ui::ImeTextSpan>& ui_ime_text_spans) { + std::vector<blink::WebImeTextSpan> ime_text_spans; + for (const auto& ime_text_span : ui_ime_text_spans) { + blink::WebImeTextSpan blink_ime_text_span( + ime_text_span.start_offset, ime_text_span.end_offset, + ime_text_span.color, ime_text_span.thick, + ime_text_span.background_color); + ime_text_spans.push_back(blink_ime_text_span); } SendInput(base::MakeUnique<InputMsg_SetCompositionFromExistingText>( - routing_id_, start, end, underlines)); + routing_id_, start, end, ime_text_spans)); } void LegacyIPCFrameInputHandler::ExtendSelectionAndDelete(int32_t before,
diff --git a/content/browser/frame_host/input/legacy_ipc_frame_input_handler.h b/content/browser/frame_host/input/legacy_ipc_frame_input_handler.h index 7a10e51..c46e6940 100644 --- a/content/browser/frame_host/input/legacy_ipc_frame_input_handler.h +++ b/content/browser/frame_host/input/legacy_ipc_frame_input_handler.h
@@ -24,7 +24,7 @@ void SetCompositionFromExistingText( int32_t start, int32_t end, - const std::vector<ui::CompositionUnderline>& underlines) override; + const std::vector<ui::ImeTextSpan>& ime_text_spans) override; void ExtendSelectionAndDelete(int32_t before, int32_t after) override; void DeleteSurroundingText(int32_t before, int32_t after) override; void DeleteSurroundingTextInCodePoints(int32_t before,
diff --git a/content/browser/gpu/gpu_internals_ui.cc b/content/browser/gpu/gpu_internals_ui.cc index 622a11b..0cedc801 100644 --- a/content/browser/gpu/gpu_internals_ui.cc +++ b/content/browser/gpu/gpu_internals_ui.cc
@@ -311,6 +311,8 @@ return "SCANOUT"; case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE: return "SCANOUT_CPU_READ_WRITE"; + case gfx::BufferUsage::SCANOUT_VDA_WRITE: + return "SCANOUT_VDA_WRITE"; case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE: return "GPU_READ_CPU_READ_WRITE"; case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT:
diff --git a/content/browser/loader/redirect_to_file_resource_handler.cc b/content/browser/loader/redirect_to_file_resource_handler.cc index 3bddfd7..d6acbbc 100644 --- a/content/browser/loader/redirect_to_file_resource_handler.cc +++ b/content/browser/loader/redirect_to_file_resource_handler.cc
@@ -134,11 +134,6 @@ net::URLRequest* request) : LayeredResourceHandler(request, std::move(next_handler)), buf_(new net::GrowableIOBuffer()), - buf_write_pending_(false), - write_cursor_(0), - writer_(NULL), - next_buffer_size_(kInitialReadBufSize), - completed_during_write_(false), weak_factory_(this) {} RedirectToFileResourceHandler::~RedirectToFileResourceHandler() { @@ -158,7 +153,12 @@ void RedirectToFileResourceHandler::OnResponseStarted( ResourceResponse* response, std::unique_ptr<ResourceController> controller) { - DCHECK(writer_); + if (!writer_) { + response_pending_file_creation_ = response; + HoldController(std::move(controller)); + request()->LogBlockedBy("RedirectToFileResourceHandler"); + return; + } response->head.download_file_path = writer_->path(); next_handler_->OnResponseStarted(response, std::move(controller)); } @@ -168,12 +168,7 @@ std::unique_ptr<ResourceController> controller) { DCHECK(!writer_); - // Defer starting the request until we have created the temporary file. - // TODO(darin): This is sub-optimal. We should not delay starting the - // network request like this. - will_start_url_ = url; - HoldController(std::move(controller)); - request()->LogBlockedBy("RedirectToFileResourceHandler"); + // Create the file ASAP but don't block. if (create_temporary_file_stream_.is_null()) { CreateTemporaryFileStream( base::Bind(&RedirectToFileResourceHandler::DidCreateTemporaryFile, @@ -183,6 +178,7 @@ base::Bind(&RedirectToFileResourceHandler::DidCreateTemporaryFile, weak_factory_.GetWeakPtr())); } + next_handler_->OnWillStart(url, std::move(controller)); } void RedirectToFileResourceHandler::OnWillRead( @@ -252,23 +248,30 @@ std::unique_ptr<net::FileStream> file_stream, ShareableFileReference* deletable_file) { DCHECK(!writer_); - DCHECK(has_controller()); if (error_code != base::File::FILE_OK) { - CancelWithError(net::FileErrorToNetError(error_code)); + if (has_controller()) { + CancelWithError(net::FileErrorToNetError(error_code)); + } else { + OutOfBandCancel(net::FileErrorToNetError(error_code), + true /* tell_renderer */); + } return; } writer_ = new Writer(this, std::move(file_stream), deletable_file); - // Resume the request. - request()->LogUnblocked(); - next_handler_->OnWillStart(std::move(will_start_url_), ReleaseController()); + if (response_pending_file_creation_) { + scoped_refptr<ResourceResponse> response = + std::move(response_pending_file_creation_); + request()->LogUnblocked(); + OnResponseStarted(response.get(), ReleaseController()); + } } void RedirectToFileResourceHandler::DidWriteToFile(int result) { bool failed = false; if (result > 0) { - next_handler_->OnDataDownloaded(result); + OnDataDownloaded(result); write_cursor_ += result; // WriteMore will resume the request if the request hasn't completed and // there's more buffer space. @@ -349,7 +352,7 @@ break; if (rv <= 0) return false; - next_handler_->OnDataDownloaded(rv); + OnDataDownloaded(rv); write_cursor_ += rv; }
diff --git a/content/browser/loader/redirect_to_file_resource_handler.h b/content/browser/loader/redirect_to_file_resource_handler.h index 9f642e7..079b3ae 100644 --- a/content/browser/loader/redirect_to_file_resource_handler.h +++ b/content/browser/loader/redirect_to_file_resource_handler.h
@@ -97,6 +97,8 @@ bool BufIsFull() const; + // If populated, OnResponseStarted completion is pending on file creation. + scoped_refptr<ResourceResponse> response_pending_file_creation_; CreateTemporaryFileStreamFunction create_temporary_file_stream_; // We allocate a single, fixed-size IO buffer (buf_) used to read from the @@ -107,24 +109,23 @@ // tracks the offset into buf_ that we are writing to disk. scoped_refptr<net::GrowableIOBuffer> buf_; - bool buf_write_pending_; - int write_cursor_; + bool buf_write_pending_ = false; + int write_cursor_ = 0; // Helper writer object which maintains references to the net::FileStream and // storage::ShareableFileReference. This is maintained separately so that, // on Windows, the temporary file isn't deleted until after it is closed. class Writer; - Writer* writer_; + Writer* writer_ = nullptr; // |next_buffer_size_| is the size of the buffer to be allocated on the next // OnWillRead() call. We exponentially grow the size of the buffer allocated // when our owner fills our buffers. On the first OnWillRead() call, we // allocate a buffer of 32k and double it in OnReadCompleted() if the buffer // was filled, up to a maximum size of 512k. - int next_buffer_size_; + int next_buffer_size_ = kInitialReadBufSize; - bool completed_during_write_; - GURL will_start_url_; + bool completed_during_write_ = false; net::URLRequestStatus completed_status_; base::WeakPtrFactory<RedirectToFileResourceHandler> weak_factory_;
diff --git a/content/browser/loader/redirect_to_file_resource_handler_unittest.cc b/content/browser/loader/redirect_to_file_resource_handler_unittest.cc index aaee16d..e7074444 100644 --- a/content/browser/loader/redirect_to_file_resource_handler_unittest.cc +++ b/content/browser/loader/redirect_to_file_resource_handler_unittest.cc
@@ -275,19 +275,24 @@ create_file_stream_callback_ = create_file_stream_callback; } - // Simulates starting the request, the response starting, and stream creation - // completing with the specified error code. Has |test_handler_| resume the - // request, if needed. Returns final status of |mock_loader_|. - MockResourceLoader::Status StartAndCreateStream(base::File::Error file_error) - WARN_UNUSED_RESULT { - DCHECK(file_stream_); + void PerformOnWillStart() { + MockResourceLoader::Status expected_status; + if (GetParam() == CompletionMode::ASYNC) { + expected_status = MockResourceLoader::Status::CALLBACK_PENDING; + } else { + expected_status = MockResourceLoader::Status::IDLE; + } + EXPECT_EQ(expected_status, mock_loader_->OnWillStart(url_request_->url())); + } - EXPECT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, - mock_loader_->OnWillStart(url_request_->url())); + // Sets up the file stream or error, and performs the file callback. + void PerformCreateFile(base::File::Error file_error) { + DCHECK(file_stream_); file_stream_->set_expect_closed(file_error == base::File::FILE_OK); if (file_error != base::File::FILE_OK) file_stream_ = nullptr; + base::ResetAndReturn(&create_file_stream_callback_) .Run(file_error, std::move(file_stream_), // Not really used by the test, but the ResourceHandler expects it @@ -297,6 +302,18 @@ storage::ShareableFileReference::DELETE_ON_FINAL_RELEASE, base::ThreadTaskRunnerHandle::Get().get()) .get()); + } + + // Simulates starting the request, the response starting, and stream creation + // completing with the specified error code. Has |test_handler_| resume the + // request, if needed. Returns final status of |mock_loader_|. + MockResourceLoader::Status StartAndCreateStream(base::File::Error file_error) + WARN_UNUSED_RESULT { + PerformOnWillStart(); + + // Create the file right away. + PerformCreateFile(file_error); + // If this is an async test, |test_handler_| will defer the OnWillStart // event on success (On error, its OnWillStart method is not called). if (file_error == base::File::FILE_OK && @@ -389,6 +406,67 @@ CompleteRequestSuccessfully(test_data.size()); } +TEST_P(RedirectToFileResourceHandlerTest, SingleBodyReadDelayedFileOnResponse) { + std::string test_data = CreateTestData(kMaxInitialSyncReadSize); + + PerformOnWillStart(); + if (GetParam() == CompletionMode::ASYNC) { + EXPECT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, + mock_loader_->status()); + test_handler_->Resume(); + mock_loader_->WaitUntilIdleOrCanceled(); + } + ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status()); + mock_loader_->OnResponseStarted(make_scoped_refptr(new ResourceResponse())); + ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, + mock_loader_->status()); + + PerformCreateFile(base::File::FILE_OK); + + if (GetParam() == CompletionMode::ASYNC) { + EXPECT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, + mock_loader_->status()); + test_handler_->Resume(); + mock_loader_->WaitUntilIdleOrCanceled(); + } + EXPECT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status()); + + ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead()); + ASSERT_EQ(MockResourceLoader::Status::IDLE, + mock_loader_->OnReadCompleted(test_data)); + // Wait for the write to complete, in the async case. + base::RunLoop().RunUntilIdle(); + + CompleteRequestSuccessfully(test_data.size()); +} + +TEST_P(RedirectToFileResourceHandlerTest, SingleBodyReadDelayedFileError) { + std::string test_data = CreateTestData(0); + + PerformOnWillStart(); + if (GetParam() == CompletionMode::ASYNC) { + EXPECT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, + mock_loader_->status()); + test_handler_->Resume(); + mock_loader_->WaitUntilIdleOrCanceled(); + } + ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status()); + mock_loader_->OnResponseStarted(make_scoped_refptr(new ResourceResponse())); + ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, + mock_loader_->status()); + + PerformCreateFile(base::File::FILE_ERROR_FAILED); + + EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->status()); + EXPECT_EQ(0, test_handler_->on_response_completed_called()); + EXPECT_EQ(net::ERR_FAILED, mock_loader_->error_code()); + ASSERT_EQ(MockResourceLoader::Status::IDLE, + mock_loader_->OnResponseCompleted( + net::URLRequestStatus::FromError(net::ERR_FAILED))); + EXPECT_FALSE(test_handler_->final_status().is_success()); + EXPECT_EQ(net::ERR_FAILED, test_handler_->final_status().error()); +} + TEST_P(RedirectToFileResourceHandlerTest, ManySequentialBodyReads) { const size_t kBytesPerRead = 128; std::string test_data = @@ -757,9 +835,17 @@ EXPECT_EQ(0, test_handler_->on_response_completed_called()); EXPECT_EQ(net::ERR_FAILED, mock_loader_->error_code()); - ASSERT_EQ(MockResourceLoader::Status::IDLE, - mock_loader_->OnResponseCompleted( - net::URLRequestStatus::FromError(net::ERR_FAILED))); + if (GetParam() == CompletionMode::ASYNC) { + EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->status()); + ASSERT_EQ(MockResourceLoader::Status::IDLE, + mock_loader_->OnResponseCompletedFromExternalOutOfBandCancel( + net::URLRequestStatus::FromError(net::ERR_FAILED))); + } else { + ASSERT_EQ(MockResourceLoader::Status::IDLE, + mock_loader_->OnResponseCompleted( + net::URLRequestStatus::FromError(net::ERR_FAILED))); + } + EXPECT_EQ(0, test_handler_->total_bytes_downloaded()); EXPECT_FALSE(test_handler_->final_status().is_success()); EXPECT_EQ(net::ERR_FAILED, test_handler_->final_status().error());
diff --git a/content/browser/media/media_browsertest.cc b/content/browser/media/media_browsertest.cc index 1345092..239bfb2 100644 --- a/content/browser/media/media_browsertest.cc +++ b/content/browser/media/media_browsertest.cc
@@ -241,15 +241,6 @@ IN_PROC_BROWSER_TEST_F(MediaTest, VideoBearRotated270) { RunVideoSizeTest("bear_rotate_270.mp4", 720, 1280); } - -// Android can't reliably load lots of videos on a page. -// See http://crbug.com/749265 -#if !defined(OS_ANDROID) -IN_PROC_BROWSER_TEST_F(MediaTest, LoadManyVideos) { - base::StringPairs query_params; - RunMediaTestPage("load_many_videos.html", query_params, kEnded, true); -} -#endif // !defined(OS_ANDROID) #endif // BUILDFLAG(USE_PROPRIETARY_CODECS) #if defined(OS_CHROMEOS)
diff --git a/content/browser/renderer_host/input/legacy_ipc_widget_input_handler.cc b/content/browser/renderer_host/input/legacy_ipc_widget_input_handler.cc index 12f039c..282843f 100644 --- a/content/browser/renderer_host/input/legacy_ipc_widget_input_handler.cc +++ b/content/browser/renderer_host/input/legacy_ipc_widget_input_handler.cc
@@ -13,15 +13,16 @@ namespace content { namespace { -std::vector<blink::WebCompositionUnderline> ConvertToBlinkUnderline( - const std::vector<ui::CompositionUnderline>& ui_underlines) { - std::vector<blink::WebCompositionUnderline> underlines; - for (const auto& underline : ui_underlines) { - underlines.emplace_back(blink::WebCompositionUnderline( - underline.start_offset, underline.end_offset, underline.color, - underline.thick, underline.background_color)); +std::vector<blink::WebImeTextSpan> ConvertToBlinkImeTextSpan( + const std::vector<ui::ImeTextSpan>& ui_ime_text_spans) { + std::vector<blink::WebImeTextSpan> ime_text_spans; + for (const auto& ime_text_span : ui_ime_text_spans) { + ime_text_spans.emplace_back(blink::WebImeTextSpan( + ime_text_span.start_offset, ime_text_span.end_offset, + ime_text_span.color, ime_text_span.thick, + ime_text_span.background_color)); } - return underlines; + return ime_text_spans; } } // namespace @@ -29,7 +30,6 @@ LegacyIPCWidgetInputHandler::LegacyIPCWidgetInputHandler( LegacyInputRouterImpl* input_router) : input_router_(input_router) {} - LegacyIPCWidgetInputHandler::~LegacyIPCWidgetInputHandler() {} void LegacyIPCWidgetInputHandler::SetFocus(bool focused) { @@ -52,25 +52,25 @@ void LegacyIPCWidgetInputHandler::ImeSetComposition( const base::string16& text, - const std::vector<ui::CompositionUnderline>& ui_underlines, + const std::vector<ui::ImeTextSpan>& ui_ime_text_spans, const gfx::Range& range, int32_t start, int32_t end) { - std::vector<blink::WebCompositionUnderline> underlines = - ConvertToBlinkUnderline(ui_underlines); + std::vector<blink::WebImeTextSpan> ime_text_spans = + ConvertToBlinkImeTextSpan(ui_ime_text_spans); SendInput(base::MakeUnique<InputMsg_ImeSetComposition>( - input_router_->routing_id(), text, underlines, range, start, end)); + input_router_->routing_id(), text, ime_text_spans, range, start, end)); } void LegacyIPCWidgetInputHandler::ImeCommitText( const base::string16& text, - const std::vector<ui::CompositionUnderline>& ui_underlines, + const std::vector<ui::ImeTextSpan>& ui_ime_text_spans, const gfx::Range& range, int32_t relative_cursor_position) { - std::vector<blink::WebCompositionUnderline> underlines = - ConvertToBlinkUnderline(ui_underlines); + std::vector<blink::WebImeTextSpan> ime_text_spans = + ConvertToBlinkImeTextSpan(ui_ime_text_spans); SendInput(base::MakeUnique<InputMsg_ImeCommitText>( - input_router_->routing_id(), text, underlines, range, + input_router_->routing_id(), text, ime_text_spans, range, relative_cursor_position)); }
diff --git a/content/browser/renderer_host/input/legacy_ipc_widget_input_handler.h b/content/browser/renderer_host/input/legacy_ipc_widget_input_handler.h index 9bc8f0c6..7bfd9e7 100644 --- a/content/browser/renderer_host/input/legacy_ipc_widget_input_handler.h +++ b/content/browser/renderer_host/input/legacy_ipc_widget_input_handler.h
@@ -27,14 +27,13 @@ void SetEditCommandsForNextKeyEvent( const std::vector<EditCommand>& commands) override; void CursorVisibilityChanged(bool visible) override; - void ImeSetComposition( - const base::string16& text, - const std::vector<ui::CompositionUnderline>& underlines, - const gfx::Range& range, - int32_t start, - int32_t end) override; + void ImeSetComposition(const base::string16& text, + const std::vector<ui::ImeTextSpan>& ime_text_spans, + const gfx::Range& range, + int32_t start, + int32_t end) override; void ImeCommitText(const base::string16& text, - const std::vector<ui::CompositionUnderline>& underlines, + const std::vector<ui::ImeTextSpan>& ime_text_spans, const gfx::Range& range, int32_t relative_cursor_position) override; void ImeFinishComposingText(bool keep_selection) override;
diff --git a/content/browser/renderer_host/input/mock_widget_input_handler.cc b/content/browser/renderer_host/input/mock_widget_input_handler.cc index df93838..5e9c0f7 100644 --- a/content/browser/renderer_host/input/mock_widget_input_handler.cc +++ b/content/browser/renderer_host/input/mock_widget_input_handler.cc
@@ -32,14 +32,14 @@ void MockWidgetInputHandler::ImeSetComposition( const base::string16& text, - const std::vector<ui::CompositionUnderline>& underlines, + const std::vector<ui::ImeTextSpan>& ime_text_spans, const gfx::Range& range, int32_t start, int32_t end) {} void MockWidgetInputHandler::ImeCommitText( const base::string16& text, - const std::vector<ui::CompositionUnderline>& underlines, + const std::vector<ui::ImeTextSpan>& ime_text_spans, const gfx::Range& range, int32_t relative_cursor_position) {}
diff --git a/content/browser/renderer_host/input/mock_widget_input_handler.h b/content/browser/renderer_host/input/mock_widget_input_handler.h index 8eb481b..adae4d3 100644 --- a/content/browser/renderer_host/input/mock_widget_input_handler.h +++ b/content/browser/renderer_host/input/mock_widget_input_handler.h
@@ -36,14 +36,13 @@ void SetEditCommandsForNextKeyEvent( const std::vector<content::EditCommand>& commands) override; void CursorVisibilityChanged(bool visible) override; - void ImeSetComposition( - const base::string16& text, - const std::vector<ui::CompositionUnderline>& underlines, - const gfx::Range& range, - int32_t start, - int32_t end) override; + void ImeSetComposition(const base::string16& text, + const std::vector<ui::ImeTextSpan>& ime_text_spans, + const gfx::Range& range, + int32_t start, + int32_t end) override; void ImeCommitText(const base::string16& text, - const std::vector<ui::CompositionUnderline>& underlines, + const std::vector<ui::ImeTextSpan>& ime_text_spans, const gfx::Range& range, int32_t relative_cursor_position) override; void ImeFinishComposingText(bool keep_selection) override;
diff --git a/content/browser/renderer_host/media/audio_input_device_manager.cc b/content/browser/renderer_host/media/audio_input_device_manager.cc index 876e113..581e2b1 100644 --- a/content/browser/renderer_host/media/audio_input_device_manager.cc +++ b/content/browser/renderer_host/media/audio_input_device_manager.cc
@@ -168,25 +168,13 @@ UMA_HISTOGRAM_TIMES("Media.AudioInputDeviceManager.OpenOnDeviceThreadTime", base::TimeTicks::Now() - start_time); - media::AudioParameters valid_input_params = - input_params.IsValid() - ? input_params - : media::AudioParameters::UnavailableDeviceParams(); - StreamDeviceInfo info(device.type, device.name, device.id); info.session_id = session_id; - info.device.input.sample_rate = valid_input_params.sample_rate(); - info.device.input.channel_layout = valid_input_params.channel_layout(); - info.device.input.frames_per_buffer = valid_input_params.frames_per_buffer(); - info.device.input.effects = valid_input_params.effects(); - info.device.input.mic_positions = valid_input_params.mic_positions(); + info.device.input = input_params.IsValid() + ? input_params + : media::AudioParameters::UnavailableDeviceParams(); info.device.matched_output_device_id = matched_output_device_id; - info.device.matched_output.sample_rate = matched_output_params.sample_rate(); - info.device.matched_output.channel_layout = - matched_output_params.channel_layout(); - info.device.matched_output.frames_per_buffer = - matched_output_params.frames_per_buffer(); - info.device.matched_output.effects = matched_output_params.effects(); + info.device.matched_output = matched_output_params; devices_.push_back(info);
diff --git a/content/browser/renderer_host/media/audio_input_device_manager_unittest.cc b/content/browser/renderer_host/media/audio_input_device_manager_unittest.cc index cfb976b..e0ce863 100644 --- a/content/browser/renderer_host/media/audio_input_device_manager_unittest.cc +++ b/content/browser/renderer_host/media/audio_input_device_manager_unittest.cc
@@ -343,10 +343,9 @@ manager_->GetOpenedDeviceInfoById(session_id); EXPECT_TRUE( media::AudioParameters(media::AudioParameters::AUDIO_FAKE, - static_cast<media::ChannelLayout>( - device_info->device.input.channel_layout), - device_info->device.input.sample_rate, 16, - device_info->device.input.frames_per_buffer) + device_info->device.input.channel_layout(), + device_info->device.input.sample_rate(), 16, + device_info->device.input.frames_per_buffer()) .IsValid()); manager_->Close(session_id);
diff --git a/content/browser/renderer_host/media/audio_output_authorization_handler.cc b/content/browser/renderer_host/media/audio_output_authorization_handler.cc index 9bdfbc9..b19c9978 100644 --- a/content/browser/renderer_host/media/audio_output_authorization_handler.cc +++ b/content/browser/renderer_host/media/audio_output_authorization_handler.cc
@@ -131,11 +131,10 @@ if (info && !info->device.matched_output_device_id.empty()) { media::AudioParameters params( media::AudioParameters::AUDIO_PCM_LOW_LATENCY, - static_cast<media::ChannelLayout>( - info->device.matched_output.channel_layout), - info->device.matched_output.sample_rate, 16, - info->device.matched_output.frames_per_buffer); - params.set_effects(info->device.matched_output.effects); + info->device.matched_output.channel_layout(), + info->device.matched_output.sample_rate(), 16, + info->device.matched_output.frames_per_buffer()); + params.set_effects(info->device.matched_output.effects()); // We don't need the origin for authorization in this case, but it's used // for hashing the device id before sending it back to the renderer.
diff --git a/content/browser/renderer_host/media/media_stream_manager.cc b/content/browser/renderer_host/media/media_stream_manager.cc index 661136c6..6f353fa3 100644 --- a/content/browser/renderer_host/media/media_stream_manager.cc +++ b/content/browser/renderer_host/media/media_stream_manager.cc
@@ -1175,10 +1175,10 @@ *existing_device_info = device_info; // Make sure that the audio |effects| reflect what the request // is set to and not what the capabilities are. - FilterAudioEffects(request->controls, - &existing_device_info->device.input.effects); - EnableHotwordEffect(request->controls, - &existing_device_info->device.input.effects); + int effects = existing_device_info->device.input.effects(); + FilterAudioEffects(request->controls, &effects); + EnableHotwordEffect(request->controls, &effects); + existing_device_info->device.input.set_effects(effects); *existing_request_state = request->state(device_info.device.type); return true; } @@ -1308,6 +1308,7 @@ DCHECK_CURRENTLY_ON(BrowserThread::IO); DVLOG(1) << "Opened({stream_type = " << stream_type << "} " << "{capture_session_id = " << capture_session_id << "})"; + // Find the request(s) containing this device and mark it as used. // It can be used in several requests since the same device can be // requested from the same web page. @@ -1336,10 +1337,10 @@ // parameters to the default settings (including supported effects), // we need to adjust those settings here according to what the // request asks for. - FilterAudioEffects(request->controls, - &device_info.device.input.effects); - EnableHotwordEffect(request->controls, - &device_info.device.input.effects); + int effects = device_info.device.input.effects(); + FilterAudioEffects(request->controls, &effects); + EnableHotwordEffect(request->controls, &effects); + device_info.device.input.set_effects(effects); device_info.device.matched_output = info->device.matched_output; } @@ -1504,8 +1505,13 @@ if (sample_rate <= 0 || sample_rate > 96000) sample_rate = 44100; - device_info.device.input.sample_rate = sample_rate; - device_info.device.input.channel_layout = media::CHANNEL_LAYOUT_STEREO; + media::AudioParameters params( + device_info.device.input.format(), media::CHANNEL_LAYOUT_STEREO, + sample_rate, device_info.device.input.bits_per_sample(), + device_info.device.input.frames_per_buffer()); + params.set_effects(device_info.device.input.effects()); + params.set_mic_positions(device_info.device.input.mic_positions()); + device_info.device.input = params; } if (device_info.device.type == request->audio_type())
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index 503f889..ccf75652 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -803,6 +803,12 @@ // sites are hosted by a RenderProcessHost. This class is meant to help reusing // RenderProcessHosts among SiteInstances, not to perform security checks for a // RenderProcessHost. +// +// TODO(alexmos): Currently, the tracking in this class and in +// UnmatchedServiceWorkerProcessTracker is associated with a BrowserContext, +// but it needs to also consider StoragePartitions, so that process reuse is +// allowed only within the same StoragePartition. For now, the tracking is +// done only for the default StoragePartition. See https://crbug.com/752667. const void* const kCommittedSiteProcessCountTrackerKey = "CommittedSiteProcessCountTrackerKey"; const void* const kPendingSiteProcessCountTrackerKey = @@ -898,6 +904,37 @@ CountPerProcessPerSiteMap map_; }; +bool ShouldUseSiteProcessTracking(BrowserContext* browser_context, + StoragePartition* dest_partition, + const GURL& site_url) { + if (site_url.is_empty()) + return false; + + // TODO(alexmos): Sites should be tracked separately for each + // StoragePartition. For now, track them only in the default one. + StoragePartition* default_partition = + BrowserContext::GetDefaultStoragePartition(browser_context); + if (dest_partition != default_partition) + return false; + + return true; +} + +bool ShouldTrackProcessForSite(BrowserContext* browser_context, + RenderProcessHost* render_process_host, + const GURL& site_url) { + return ShouldUseSiteProcessTracking( + browser_context, render_process_host->GetStoragePartition(), site_url); +} + +bool ShouldFindReusableProcessHostForSite(BrowserContext* browser_context, + const GURL& site_url) { + return ShouldUseSiteProcessTracking( + browser_context, + BrowserContext::GetStoragePartitionForSite(browser_context, site_url), + site_url); +} + const void* const kUnmatchedServiceWorkerProcessTrackerKey = "UnmatchedServiceWorkerProcessTrackerKey"; @@ -910,6 +947,12 @@ // processes are reused for a navigation to a matching site. After a single // matching navigation is put into the process, all service workers for that // site in that process are considered 'matched.' +// +// TODO(alexmos): Currently, the tracking in this class and in +// SiteProcessCountTracker is associated with a BrowserContext, but it needs to +// also consider StoragePartitions, so that process reuse is allowed only +// within the same StoragePartition. For now, the tracking is done only for +// the default StoragePartition. See https://crbug.com/752667. class UnmatchedServiceWorkerProcessTracker : public base::SupportsUserData::Data, public RenderProcessHostObserver { @@ -920,6 +963,10 @@ RenderProcessHost* render_process_host, const GURL& site_url) { DCHECK(!site_url.is_empty()); + if (!ShouldTrackProcessForSite(browser_context, render_process_host, + site_url)) + return; + UnmatchedServiceWorkerProcessTracker* tracker = static_cast<UnmatchedServiceWorkerProcessTracker*>( browser_context->GetUserData( @@ -936,8 +983,9 @@ // the process from the tracker if it exists. static RenderProcessHost* MatchWithSite(BrowserContext* browser_context, const GURL& site_url) { - if (site_url.is_empty()) + if (!ShouldFindReusableProcessHostForSite(browser_context, site_url)) return nullptr; + UnmatchedServiceWorkerProcessTracker* tracker = static_cast<UnmatchedServiceWorkerProcessTracker*>( browser_context->GetUserData( @@ -1986,7 +2034,7 @@ } void RenderProcessHostImpl::BindSharedBitmapAllocationNotifier( - cc::mojom::SharedBitmapAllocationNotifierRequest request) { + viz::mojom::SharedBitmapAllocationNotifierRequest request) { shared_bitmap_allocation_notifier_impl_.Bind(std::move(request)); } @@ -2261,7 +2309,8 @@ BrowserContext* browser_context, RenderProcessHost* render_process_host, const GURL& site_url) { - if (site_url.is_empty()) + if (!ShouldTrackProcessForSite(browser_context, render_process_host, + site_url)) return; SiteProcessCountTracker* tracker = static_cast<SiteProcessCountTracker*>( @@ -2279,7 +2328,8 @@ BrowserContext* browser_context, RenderProcessHost* render_process_host, const GURL& site_url) { - if (site_url.is_empty()) + if (!ShouldTrackProcessForSite(browser_context, render_process_host, + site_url)) return; SiteProcessCountTracker* tracker = static_cast<SiteProcessCountTracker*>( @@ -2297,7 +2347,8 @@ BrowserContext* browser_context, RenderProcessHost* render_process_host, const GURL& site_url) { - if (site_url.is_empty()) + if (!ShouldTrackProcessForSite(browser_context, render_process_host, + site_url)) return; SiteProcessCountTracker* tracker = static_cast<SiteProcessCountTracker*>( @@ -2315,7 +2366,8 @@ BrowserContext* browser_context, RenderProcessHost* render_process_host, const GURL& site_url) { - if (site_url.is_empty()) + if (!ShouldTrackProcessForSite(browser_context, render_process_host, + site_url)) return; SiteProcessCountTracker* tracker = static_cast<SiteProcessCountTracker*>( @@ -3889,7 +3941,7 @@ RenderProcessHost* RenderProcessHostImpl::FindReusableProcessHostForSite( BrowserContext* browser_context, const GURL& site_url) { - if (site_url.is_empty()) + if (!ShouldFindReusableProcessHostForSite(browser_context, site_url)) return nullptr; std::set<RenderProcessHost*> eligible_foreground_hosts;
diff --git a/content/browser/renderer_host/render_process_host_impl.h b/content/browser/renderer_host/render_process_host_impl.h index ede5f06..546795b 100644 --- a/content/browser/renderer_host/render_process_host_impl.h +++ b/content/browser/renderer_host/render_process_host_impl.h
@@ -439,7 +439,7 @@ blink::mojom::OffscreenCanvasProviderRequest request); void BindFrameSinkProvider(mojom::FrameSinkProviderRequest request); void BindSharedBitmapAllocationNotifier( - cc::mojom::SharedBitmapAllocationNotifierRequest request); + viz::mojom::SharedBitmapAllocationNotifierRequest request); void CreateStoragePartitionService( mojom::StoragePartitionServiceRequest request); void CreateRendererHost(mojom::RendererHostRequest request);
diff --git a/content/browser/renderer_host/render_process_host_unittest.cc b/content/browser/renderer_host/render_process_host_unittest.cc index c5db4da3..7952100 100644 --- a/content/browser/renderer_host/render_process_host_unittest.cc +++ b/content/browser/renderer_host/render_process_host_unittest.cc
@@ -754,6 +754,97 @@ EXPECT_EQ(main_test_rfh()->GetProcess(), site_instance->GetProcess()); } +// Helper test class to modify the StoragePartition returned for a particular +// site URL. +class StoragePartitionContentBrowserClient : public ContentBrowserClient { + public: + StoragePartitionContentBrowserClient(const GURL& site, + const std::string& partition_domain, + const std::string& partition_name) + : site_(site), + partition_domain_(partition_domain), + partition_name_(partition_name) {} + ~StoragePartitionContentBrowserClient() override {} + + private: + void GetStoragePartitionConfigForSite(BrowserContext* browser_context, + const GURL& site, + bool can_be_default, + std::string* partition_domain, + std::string* partition_name, + bool* in_memory) override { + partition_domain->clear(); + partition_name->clear(); + *in_memory = false; + + if (site == site_) { + *partition_domain = partition_domain_; + *partition_name = partition_name_; + } + } + + GURL site_; + std::string partition_domain_; + std::string partition_name_; +}; + +// Check that a SiteInstance cannot reuse a RenderProcessHost in a different +// StoragePartition. +TEST_F(RenderProcessHostUnitTest, + DoNotReuseProcessInDifferentStoragePartition) { + const GURL kUrl("https://foo.com"); + NavigateAndCommit(kUrl); + + // Change foo.com SiteInstances to use a different StoragePartition. + StoragePartitionContentBrowserClient modified_client(kUrl, "foo_domain", + "foo_name"); + ContentBrowserClient* regular_client = + SetBrowserClientForTesting(&modified_client); + + // Create a foo.com SiteInstance and check that its process does not + // reuse the foo process from the first navigation, since it's now in a + // different StoragePartiiton. + scoped_refptr<SiteInstanceImpl> site_instance = + SiteInstanceImpl::CreateForURL(browser_context(), kUrl); + site_instance->set_process_reuse_policy( + SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); + RenderProcessHost* process = site_instance->GetProcess(); + EXPECT_NE(main_test_rfh()->GetProcess(), process); + + SetBrowserClientForTesting(regular_client); +} + +// Check that a SiteInstance cannot reuse a ServiceWorker process in a +// different StoragePartition. +TEST_F(RenderProcessHostUnitTest, + DoNotReuseServiceWorkerProcessInDifferentStoragePartition) { + const GURL kUrl("https://foo.com"); + + // Create a RenderProcessHost for a service worker. + scoped_refptr<SiteInstanceImpl> sw_site_instance = + SiteInstanceImpl::CreateForURL(browser_context(), kUrl); + sw_site_instance->set_is_for_service_worker(); + RenderProcessHost* sw_process = sw_site_instance->GetProcess(); + + // Change foo.com SiteInstances to use a different StoragePartition. + StoragePartitionContentBrowserClient modified_client(kUrl, "foo_domain", + "foo_name"); + ContentBrowserClient* regular_client = + SetBrowserClientForTesting(&modified_client); + + // Create a foo.com SiteInstance and check that its process does not reuse + // the ServiceWorker foo.com process, since it's now in a different + // StoragePartition. + scoped_refptr<SiteInstanceImpl> site_instance = + SiteInstanceImpl::CreateForURL(browser_context(), kUrl); + site_instance->set_process_reuse_policy( + SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); + RenderProcessHost* process = site_instance->GetProcess(); + EXPECT_NE(sw_process, process); + + SetBrowserClientForTesting(regular_client); +} + class SpareRenderProcessHostUnitTest : public RenderViewHostImplTestHarness { protected: void SetUp() override {
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc index 66146f0..4d07580 100644 --- a/content/browser/renderer_host/render_widget_host_impl.cc +++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -83,7 +83,7 @@ #include "skia/ext/image_operations.h" #include "skia/ext/platform_canvas.h" #include "storage/browser/fileapi/isolated_context.h" -#include "third_party/WebKit/public/web/WebCompositionUnderline.h" +#include "third_party/WebKit/public/web/WebImeTextSpan.h" #include "ui/base/clipboard/clipboard.h" #include "ui/base/ui_base_switches.h" #include "ui/display/display_switches.h" @@ -1719,21 +1719,21 @@ void RenderWidgetHostImpl::ImeSetComposition( const base::string16& text, - const std::vector<ui::CompositionUnderline>& underlines, + const std::vector<ui::ImeTextSpan>& ime_text_spans, const gfx::Range& replacement_range, int selection_start, int selection_end) { GetWidgetInputHandler()->ImeSetComposition( - text, underlines, replacement_range, selection_start, selection_end); + text, ime_text_spans, replacement_range, selection_start, selection_end); } void RenderWidgetHostImpl::ImeCommitText( const base::string16& text, - const std::vector<ui::CompositionUnderline>& underlines, + const std::vector<ui::ImeTextSpan>& ime_text_spans, const gfx::Range& replacement_range, int relative_cursor_pos) { - GetWidgetInputHandler()->ImeCommitText(text, underlines, replacement_range, - relative_cursor_pos); + GetWidgetInputHandler()->ImeCommitText( + text, ime_text_spans, replacement_range, relative_cursor_pos); } void RenderWidgetHostImpl::ImeFinishComposingText(bool keep_selection) { @@ -1741,9 +1741,9 @@ } void RenderWidgetHostImpl::ImeCancelComposition() { - GetWidgetInputHandler()->ImeSetComposition( - base::string16(), std::vector<ui::CompositionUnderline>(), - gfx::Range::InvalidRange(), 0, 0); + GetWidgetInputHandler()->ImeSetComposition(base::string16(), + std::vector<ui::ImeTextSpan>(), + gfx::Range::InvalidRange(), 0, 0); } void RenderWidgetHostImpl::RejectMouseLockOrUnlockIfNecessary() {
diff --git a/content/browser/renderer_host/render_widget_host_impl.h b/content/browser/renderer_host/render_widget_host_impl.h index 8cc27498..52b5fa9 100644 --- a/content/browser/renderer_host/render_widget_host_impl.h +++ b/content/browser/renderer_host/render_widget_host_impl.h
@@ -415,12 +415,11 @@ // (on Windows); // * when it receives a "preedit_changed" signal of GtkIMContext (on Linux); // * when markedText of NSTextInput is called (on Mac). - void ImeSetComposition( - const base::string16& text, - const std::vector<ui::CompositionUnderline>& underlines, - const gfx::Range& replacement_range, - int selection_start, - int selection_end); + void ImeSetComposition(const base::string16& text, + const std::vector<ui::ImeTextSpan>& ime_text_spans, + const gfx::Range& replacement_range, + int selection_start, + int selection_end); // Deletes the ongoing composition if any, inserts the specified text, and // moves the cursor. @@ -430,7 +429,7 @@ // * when it receives a "commit" signal of GtkIMContext (on Linux); // * when insertText of NSTextInput is called (on Mac). void ImeCommitText(const base::string16& text, - const std::vector<ui::CompositionUnderline>& underlines, + const std::vector<ui::ImeTextSpan>& ime_text_spans, const gfx::Range& replacement_range, int relative_cursor_pos);
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc index 0793aa9..f18390c 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.cc +++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -743,7 +743,10 @@ } void RenderWidgetHostViewAndroid::UpdateCursor(const WebCursor& cursor) { - // There are no cursors on Android. + CursorInfo cursor_info; + cursor.GetCursorInfo(&cursor_info); + view_.OnCursorChanged(cursor_info.type, cursor_info.custom_image, + cursor_info.hotspot); } void RenderWidgetHostViewAndroid::SetIsLoading(bool is_loading) {
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc index ffd1e2ee..f693b0e3 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura.cc +++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
@@ -61,7 +61,7 @@ #include "services/service_manager/public/cpp/interface_provider.h" #include "services/ui/public/interfaces/window_manager_constants.mojom.h" #include "third_party/WebKit/public/platform/WebInputEvent.h" -#include "third_party/WebKit/public/web/WebCompositionUnderline.h" +#include "third_party/WebKit/public/web/WebImeTextSpan.h" #include "ui/accessibility/platform/aura_window_properties.h" #include "ui/aura/client/aura_constants.h" #include "ui/aura/client/cursor_client.h" @@ -1191,7 +1191,7 @@ // TODO(suzhe): due to a bug of webkit, we can't use selection range with // composition string. See: https://bugs.webkit.org/show_bug.cgi?id=37788 text_input_manager_->GetActiveWidget()->ImeSetComposition( - composition.text, composition.underlines, gfx::Range::InvalidRange(), + composition.text, composition.ime_text_spans, gfx::Range::InvalidRange(), composition.selection.end(), composition.selection.end()); has_composition_text_ = !composition.text.empty(); @@ -1218,8 +1218,7 @@ if (text_input_manager_ && text_input_manager_->GetActiveWidget()) { if (text.length()) text_input_manager_->GetActiveWidget()->ImeCommitText( - text, std::vector<ui::CompositionUnderline>(), - gfx::Range::InvalidRange(), 0); + text, std::vector<ui::ImeTextSpan>(), gfx::Range::InvalidRange(), 0); else if (has_composition_text_) text_input_manager_->GetActiveWidget()->ImeFinishComposingText(false); }
diff --git a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc index fa9609c..c111633 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc +++ b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
@@ -1648,14 +1648,14 @@ composition_text.text = base::ASCIIToUTF16("|a|b"); // Focused segment - composition_text.underlines.push_back( - ui::CompositionUnderline(0, 3, 0xff000000, true, 0x78563412)); + composition_text.ime_text_spans.push_back( + ui::ImeTextSpan(0, 3, 0xff000000, true, 0x78563412)); // Non-focused segment, with different background color. - composition_text.underlines.push_back( - ui::CompositionUnderline(3, 4, 0xff000000, false, 0xefcdab90)); + composition_text.ime_text_spans.push_back( + ui::ImeTextSpan(3, 4, 0xff000000, false, 0xefcdab90)); - const ui::CompositionUnderlines& underlines = composition_text.underlines; + const ui::ImeTextSpans& ime_text_spans = composition_text.ime_text_spans; // Caret is at the end. (This emulates Japanese MSIME 2007 and later) composition_text.selection = gfx::Range(4); @@ -1672,15 +1672,16 @@ InputMsg_ImeSetComposition::Read(msg, ¶ms); // composition text EXPECT_EQ(composition_text.text, std::get<0>(params)); - // underlines - ASSERT_EQ(underlines.size(), std::get<1>(params).size()); - for (size_t i = 0; i < underlines.size(); ++i) { - EXPECT_EQ(underlines[i].start_offset, + // ime spans + ASSERT_EQ(ime_text_spans.size(), std::get<1>(params).size()); + for (size_t i = 0; i < ime_text_spans.size(); ++i) { + EXPECT_EQ(ime_text_spans[i].start_offset, std::get<1>(params)[i].start_offset); - EXPECT_EQ(underlines[i].end_offset, std::get<1>(params)[i].end_offset); - EXPECT_EQ(underlines[i].color, std::get<1>(params)[i].color); - EXPECT_EQ(underlines[i].thick, std::get<1>(params)[i].thick); - EXPECT_EQ(underlines[i].background_color, + EXPECT_EQ(ime_text_spans[i].end_offset, + std::get<1>(params)[i].end_offset); + EXPECT_EQ(ime_text_spans[i].color, std::get<1>(params)[i].color); + EXPECT_EQ(ime_text_spans[i].thick, std::get<1>(params)[i].thick); + EXPECT_EQ(ime_text_spans[i].background_color, std::get<1>(params)[i].background_color); } EXPECT_EQ(gfx::Range::InvalidRange(), std::get<2>(params)); @@ -1704,12 +1705,12 @@ composition_text.text = base::ASCIIToUTF16("|a|b"); // Focused segment - composition_text.underlines.push_back( - ui::CompositionUnderline(0, 3, 0xff000000, true, 0x78563412)); + composition_text.ime_text_spans.push_back( + ui::ImeTextSpan(0, 3, 0xff000000, true, 0x78563412)); // Non-focused segment, with different background color. - composition_text.underlines.push_back( - ui::CompositionUnderline(3, 4, 0xff000000, false, 0xefcdab90)); + composition_text.ime_text_spans.push_back( + ui::ImeTextSpan(3, 4, 0xff000000, false, 0xefcdab90)); // Caret is at the end. (This emulates Japanese MSIME 2007 and later) composition_text.selection = gfx::Range(4);
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.h b/content/browser/renderer_host/render_widget_host_view_mac.h index 9374bf3..72664cd 100644 --- a/content/browser/renderer_host/render_widget_host_view_mac.h +++ b/content/browser/renderer_host/render_widget_host_view_mac.h
@@ -37,7 +37,7 @@ #import "ui/base/cocoa/command_dispatcher.h" #include "ui/base/cocoa/remote_layer_api.h" #import "ui/base/cocoa/tool_tip_base_view.h" -#include "ui/base/ime/composition_underline.h" +#include "ui/base/ime/ime_text_span.h" #include "ui/display/display_observer.h" namespace content { @@ -127,7 +127,7 @@ NSRange markedTextSelectedRange_; // Underline information of the |markedText_|. - std::vector<ui::CompositionUnderline> underlines_; + std::vector<ui::ImeTextSpan> ime_text_spans_; // Replacement range information received from |setMarkedText:|. gfx::Range setMarkedTextReplacementRange_;
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm index db0fb3681..d61f81f 100644 --- a/content/browser/renderer_host/render_widget_host_view_mac.mm +++ b/content/browser/renderer_host/render_widget_host_view_mac.mm
@@ -280,7 +280,7 @@ // Extract underline information from an attributed string. Mostly copied from // third_party/WebKit/Source/WebKit/mac/WebView/WebHTMLView.mm void ExtractUnderlines(NSAttributedString* string, - std::vector<ui::CompositionUnderline>* underlines) { + std::vector<ui::ImeTextSpan>* ime_text_spans) { int length = [[string string] length]; int i = 0; while (i < length) { @@ -295,9 +295,9 @@ color = WebColorFromNSColor( [colorAttr colorUsingColorSpaceName:NSDeviceRGBColorSpace]); } - underlines->push_back( - ui::CompositionUnderline(range.location, NSMaxRange(range), color, - [style intValue] > 1, SK_ColorTRANSPARENT)); + ime_text_spans->push_back( + ui::ImeTextSpan(range.location, NSMaxRange(range), color, + [style intValue] > 1, SK_ColorTRANSPARENT)); } i = range.location + range.length; } @@ -2197,7 +2197,7 @@ textToBeInserted_.clear(); markedText_.clear(); markedTextSelectedRange_ = NSMakeRange(NSNotFound, 0); - underlines_.clear(); + ime_text_spans_.clear(); setMarkedTextReplacementRange_ = gfx::Range::InvalidRange(); unmarkTextCalled_ = NO; hasEditCommands_ = NO; @@ -2259,8 +2259,7 @@ BOOL textInserted = NO; if (textToBeInserted_.length() > ((hasMarkedText_ || oldHasMarkedText) ? 0u : 1u)) { - widgetHost->ImeCommitText(textToBeInserted_, - std::vector<ui::CompositionUnderline>(), + widgetHost->ImeCommitText(textToBeInserted_, std::vector<ui::ImeTextSpan>(), gfx::Range::InvalidRange(), 0); textInserted = YES; } @@ -2272,7 +2271,7 @@ // composition node in WebKit. // When marked text is available, |markedTextSelectedRange_| will be the // range being selected inside the marked text. - widgetHost->ImeSetComposition(markedText_, underlines_, + widgetHost->ImeSetComposition(markedText_, ime_text_spans_, setMarkedTextReplacementRange_, markedTextSelectedRange_.location, NSMaxRange(markedTextSelectedRange_)); @@ -3306,7 +3305,7 @@ hasMarkedText_ = NO; markedText_.clear(); markedTextSelectedRange_ = NSMakeRange(NSNotFound, 0); - underlines_.clear(); + ime_text_spans_.clear(); // If we are handling a key down event, then FinishComposingText() will be // called in keyEvent: method. @@ -3335,13 +3334,13 @@ markedText_ = base::SysNSStringToUTF16(im_text); hasMarkedText_ = (length > 0); - underlines_.clear(); + ime_text_spans_.clear(); if (isAttributedString) { - ExtractUnderlines(string, &underlines_); + ExtractUnderlines(string, &ime_text_spans_); } else { // Use a thin black underline by default. - underlines_.push_back(ui::CompositionUnderline(0, length, SK_ColorBLACK, - false, SK_ColorTRANSPARENT)); + ime_text_spans_.push_back( + ui::ImeTextSpan(0, length, SK_ColorBLACK, false, SK_ColorTRANSPARENT)); } // If we are handling a key down event, then SetComposition() will be @@ -3356,7 +3355,7 @@ } else { if (renderWidgetHostView_->GetActiveWidget()) { renderWidgetHostView_->GetActiveWidget()->ImeSetComposition( - markedText_, underlines_, gfx::Range(replacementRange), + markedText_, ime_text_spans_, gfx::Range(replacementRange), newSelRange.location, NSMaxRange(newSelRange)); } } @@ -3415,8 +3414,8 @@ gfx::Range replacement_range(replacementRange); if (renderWidgetHostView_->GetActiveWidget()) { renderWidgetHostView_->GetActiveWidget()->ImeCommitText( - base::SysNSStringToUTF16(im_text), - std::vector<ui::CompositionUnderline>(), replacement_range, 0); + base::SysNSStringToUTF16(im_text), std::vector<ui::ImeTextSpan>(), + replacement_range, 0); } }
diff --git a/content/browser/service_worker/embedded_worker_test_helper.cc b/content/browser/service_worker/embedded_worker_test_helper.cc index 29101c3..ae990c7 100644 --- a/content/browser/service_worker/embedded_worker_test_helper.cc +++ b/content/browser/service_worker/embedded_worker_test_helper.cc
@@ -324,8 +324,7 @@ scoped_refptr<base::SequencedTaskRunner> database_task_runner = base::ThreadTaskRunnerHandle::Get(); wrapper_->InitInternal(user_data_directory, std::move(database_task_runner), - base::ThreadTaskRunnerHandle::Get(), nullptr, nullptr, - nullptr, nullptr); + nullptr, nullptr, nullptr, nullptr); wrapper_->process_manager()->SetProcessIdForTest(mock_render_process_id()); wrapper_->process_manager()->SetNewProcessIdForTest(new_render_process_id());
diff --git a/content/browser/service_worker/service_worker_context_core.cc b/content/browser/service_worker/service_worker_context_core.cc index 0da7ae5..192fb408 100644 --- a/content/browser/service_worker/service_worker_context_core.cc +++ b/content/browser/service_worker/service_worker_context_core.cc
@@ -237,7 +237,6 @@ ServiceWorkerContextCore::ServiceWorkerContextCore( const base::FilePath& path, scoped_refptr<base::SequencedTaskRunner> database_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> disk_cache_thread, storage::QuotaManagerProxy* quota_manager_proxy, storage::SpecialStoragePolicy* special_storage_policy, base::WeakPtr<storage::BlobStorageContext> blob_storage_context, @@ -259,8 +258,7 @@ // These get a WeakPtr from weak_factory_, so must be set after weak_factory_ // is initialized. storage_ = ServiceWorkerStorage::Create( - path, AsWeakPtr(), std::move(database_task_runner), - std::move(disk_cache_thread), quota_manager_proxy, + path, AsWeakPtr(), std::move(database_task_runner), quota_manager_proxy, special_storage_policy); embedded_worker_registry_ = EmbeddedWorkerRegistry::Create(AsWeakPtr()); job_coordinator_.reset(new ServiceWorkerJobCoordinator(AsWeakPtr()));
diff --git a/content/browser/service_worker/service_worker_context_core.h b/content/browser/service_worker/service_worker_context_core.h index 62f5142..29dcfc4 100644 --- a/content/browser/service_worker/service_worker_context_core.h +++ b/content/browser/service_worker/service_worker_context_core.h
@@ -31,7 +31,6 @@ namespace base { class FilePath; -class SingleThreadTaskRunner; } namespace storage { @@ -117,7 +116,6 @@ ServiceWorkerContextCore( const base::FilePath& user_data_directory, scoped_refptr<base::SequencedTaskRunner> database_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> disk_cache_thread, storage::QuotaManagerProxy* quota_manager_proxy, storage::SpecialStoragePolicy* special_storage_policy, base::WeakPtr<storage::BlobStorageContext> blob_context,
diff --git a/content/browser/service_worker/service_worker_context_unittest.cc b/content/browser/service_worker/service_worker_context_unittest.cc index 28f6242..fee4a77b 100644 --- a/content/browser/service_worker/service_worker_context_unittest.cc +++ b/content/browser/service_worker/service_worker_context_unittest.cc
@@ -699,7 +699,7 @@ MakeRegisteredCallback(&called, ®istration_id)); ASSERT_FALSE(called); - base::RunLoop().RunUntilIdle(); + content::RunAllBlockingPoolTasksUntilIdle(); EXPECT_TRUE(called); context()->storage()->FindRegistrationForId( @@ -709,7 +709,7 @@ SERVICE_WORKER_OK, false /* expect_waiting */, true /* expect_active */)); - base::RunLoop().RunUntilIdle(); + content::RunAllBlockingPoolTasksUntilIdle(); // Next handle ids should be 1 (the next call should return 2) because // registered worker should have taken ID 0. @@ -724,7 +724,7 @@ registration_id, pattern.GetOrigin(), base::Bind(&ExpectRegisteredWorkers, SERVICE_WORKER_ERROR_ABORT, false /* expect_waiting */, true /* expect_active */)); - base::RunLoop().RunUntilIdle(); + content::RunAllBlockingPoolTasksUntilIdle(); // The context started over and the storage was re-initialized, so the // registration should not be found. @@ -735,7 +735,7 @@ SERVICE_WORKER_ERROR_NOT_FOUND, false /* expect_waiting */, true /* expect_active */)); - base::RunLoop().RunUntilIdle(); + content::RunAllBlockingPoolTasksUntilIdle(); called = false; context()->RegisterServiceWorker( @@ -743,7 +743,7 @@ MakeRegisteredCallback(&called, ®istration_id)); ASSERT_FALSE(called); - base::RunLoop().RunUntilIdle(); + content::RunAllBlockingPoolTasksUntilIdle(); EXPECT_TRUE(called); context()->storage()->FindRegistrationForId( @@ -753,7 +753,7 @@ SERVICE_WORKER_OK, false /* expect_waiting */, true /* expect_active */)); - base::RunLoop().RunUntilIdle(); + content::RunAllBlockingPoolTasksUntilIdle(); // The new context should take over next handle ids. ID 2 should have been // taken by the running registration, so the following method calls return 3.
diff --git a/content/browser/service_worker/service_worker_context_wrapper.cc b/content/browser/service_worker/service_worker_context_wrapper.cc index a95eca5..5ca5bcb 100644 --- a/content/browser/service_worker/service_worker_context_wrapper.cc +++ b/content/browser/service_worker/service_worker_context_wrapper.cc
@@ -199,11 +199,9 @@ scoped_refptr<base::SequencedTaskRunner> database_task_runner = base::CreateSequencedTaskRunnerWithTraits( {base::MayBlock(), base::TaskShutdownBehavior::BLOCK_SHUTDOWN}); - scoped_refptr<base::SingleThreadTaskRunner> disk_cache_thread = - BrowserThread::GetTaskRunnerForThread(BrowserThread::CACHE); InitInternal(user_data_directory, std::move(database_task_runner), - std::move(disk_cache_thread), quota_manager_proxy, - special_storage_policy, blob_context, loader_factory_getter); + quota_manager_proxy, special_storage_policy, blob_context, + loader_factory_getter); } void ServiceWorkerContextWrapper::Shutdown() { @@ -851,7 +849,6 @@ void ServiceWorkerContextWrapper::InitInternal( const base::FilePath& user_data_directory, scoped_refptr<base::SequencedTaskRunner> database_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> disk_cache_thread, storage::QuotaManagerProxy* quota_manager_proxy, storage::SpecialStoragePolicy* special_storage_policy, ChromeBlobStorageContext* blob_context, @@ -861,7 +858,6 @@ BrowserThread::IO, FROM_HERE, base::Bind(&ServiceWorkerContextWrapper::InitInternal, this, user_data_directory, std::move(database_task_runner), - std::move(disk_cache_thread), base::RetainedRef(quota_manager_proxy), base::RetainedRef(special_storage_policy), base::RetainedRef(blob_context), @@ -882,10 +878,9 @@ ? blob_context->context()->AsWeakPtr() : nullptr; context_core_.reset(new ServiceWorkerContextCore( - user_data_directory, std::move(database_task_runner), - std::move(disk_cache_thread), quota_manager_proxy, special_storage_policy, - blob_storage_context, loader_factory_getter, core_observer_list_.get(), - this)); + user_data_directory, std::move(database_task_runner), quota_manager_proxy, + special_storage_policy, blob_storage_context, loader_factory_getter, + core_observer_list_.get(), this)); } void ServiceWorkerContextWrapper::ShutdownOnIO() {
diff --git a/content/browser/service_worker/service_worker_context_wrapper.h b/content/browser/service_worker/service_worker_context_wrapper.h index 557e01f..ed9a9f1 100644 --- a/content/browser/service_worker/service_worker_context_wrapper.h +++ b/content/browser/service_worker/service_worker_context_wrapper.h
@@ -23,7 +23,6 @@ namespace base { class FilePath; -class SingleThreadTaskRunner; } namespace storage { @@ -277,7 +276,6 @@ void InitInternal( const base::FilePath& user_data_directory, scoped_refptr<base::SequencedTaskRunner> database_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> disk_cache_thread, storage::QuotaManagerProxy* quota_manager_proxy, storage::SpecialStoragePolicy* special_storage_policy, ChromeBlobStorageContext* blob_context,
diff --git a/content/browser/service_worker/service_worker_installed_scripts_sender.cc b/content/browser/service_worker/service_worker_installed_scripts_sender.cc index bf4cbfed..51c683e 100644 --- a/content/browser/service_worker/service_worker_installed_scripts_sender.cc +++ b/content/browser/service_worker/service_worker_installed_scripts_sender.cc
@@ -10,8 +10,8 @@ #include "content/browser/service_worker/service_worker_disk_cache.h" #include "content/browser/service_worker/service_worker_script_cache_map.h" #include "content/browser/service_worker/service_worker_storage.h" -#include "content/common/net_adapters.h" #include "net/http/http_response_headers.h" +#include "services/network/public/cpp/net_adapters.h" namespace content { @@ -176,7 +176,7 @@ // an equivalent error. DCHECK(!pending_write_); uint32_t num_bytes = 0; - MojoResult rv = NetToMojoPendingBuffer::BeginWrite( + MojoResult rv = network::NetToMojoPendingBuffer::BeginWrite( &body_handle_, &pending_write_, &num_bytes); switch (rv) { case MOJO_RESULT_INVALID_ARGUMENT: @@ -193,8 +193,8 @@ break; } - scoped_refptr<NetToMojoIOBuffer> buffer = - base::MakeRefCounted<NetToMojoIOBuffer>(pending_write_.get()); + scoped_refptr<network::NetToMojoIOBuffer> buffer = + base::MakeRefCounted<network::NetToMojoIOBuffer>(pending_write_.get()); reader_->ReadData(buffer.get(), num_bytes, base::Bind(&Sender::OnResponseDataRead, AsWeakPtr())); } @@ -253,7 +253,7 @@ std::unique_ptr<MetaDataSender> meta_data_sender_; // For body. - scoped_refptr<NetToMojoPendingBuffer> pending_write_; + scoped_refptr<network::NetToMojoPendingBuffer> pending_write_; mojo::SimpleWatcher watcher_; // Pipes.
diff --git a/content/browser/service_worker/service_worker_storage.cc b/content/browser/service_worker/service_worker_storage.cc index a810d71a..1bc1b23 100644 --- a/content/browser/service_worker/service_worker_storage.cc +++ b/content/browser/service_worker/service_worker_storage.cc
@@ -5,16 +5,15 @@ #include "content/browser/service_worker/service_worker_storage.h" #include <stddef.h> +#include <utility> #include "base/bind_helpers.h" #include "base/files/file_util.h" #include "base/memory/ptr_util.h" #include "base/message_loop/message_loop.h" #include "base/sequenced_task_runner.h" -#include "base/single_thread_task_runner.h" #include "base/task_runner_util.h" #include "base/task_scheduler/post_task.h" -#include "base/threading/thread_task_runner_handle.h" #include "base/trace_event/trace_event.h" #include "content/browser/service_worker/service_worker_context_core.h" #include "content/browser/service_worker/service_worker_disk_cache.h" @@ -30,6 +29,8 @@ #include "storage/browser/quota/quota_manager_proxy.h" #include "storage/browser/quota/special_storage_policy.h" +using std::swap; + namespace content { namespace { @@ -121,12 +122,10 @@ const base::FilePath& path, const base::WeakPtr<ServiceWorkerContextCore>& context, scoped_refptr<base::SequencedTaskRunner> database_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> disk_cache_thread, storage::QuotaManagerProxy* quota_manager_proxy, storage::SpecialStoragePolicy* special_storage_policy) { return base::WrapUnique( new ServiceWorkerStorage(path, context, std::move(database_task_runner), - std::move(disk_cache_thread), quota_manager_proxy, special_storage_policy)); } @@ -136,7 +135,7 @@ ServiceWorkerStorage* old_storage) { return base::WrapUnique(new ServiceWorkerStorage( old_storage->path_, context, old_storage->database_task_runner_, - old_storage->disk_cache_thread_, old_storage->quota_manager_proxy_.get(), + old_storage->quota_manager_proxy_.get(), old_storage->special_storage_policy_.get())); } @@ -810,13 +809,27 @@ void ServiceWorkerStorage::DeleteAndStartOver(const StatusCallback& callback) { Disable(); - // Delete the database on the database thread. - base::PostTaskAndReplyWithResult( - database_task_runner_.get(), FROM_HERE, - base::Bind(&ServiceWorkerDatabase::DestroyDatabase, - base::Unretained(database_.get())), - base::Bind(&ServiceWorkerStorage::DidDeleteDatabase, - weak_factory_.GetWeakPtr(), callback)); + // Will be used in DiskCacheImplDoneWithDisk() + delete_and_start_over_callback_ = callback; + + // Won't get a callback about cleanup being done, so call it ourselves. + if (!expecting_done_with_disk_on_disable_) + DiskCacheImplDoneWithDisk(); +} + +void ServiceWorkerStorage::DiskCacheImplDoneWithDisk() { + expecting_done_with_disk_on_disable_ = false; + if (!delete_and_start_over_callback_.is_null()) { + StatusCallback callback; + swap(callback, delete_and_start_over_callback_); + // Delete the database on the database thread. + PostTaskAndReplyWithResult( + database_task_runner_.get(), FROM_HERE, + base::Bind(&ServiceWorkerDatabase::DestroyDatabase, + base::Unretained(database_.get())), + base::Bind(&ServiceWorkerStorage::DidDeleteDatabase, + weak_factory_.GetWeakPtr(), callback)); + } } int64_t ServiceWorkerStorage::NewRegistrationId() { @@ -891,17 +904,16 @@ const base::FilePath& path, base::WeakPtr<ServiceWorkerContextCore> context, scoped_refptr<base::SequencedTaskRunner> database_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> disk_cache_thread, storage::QuotaManagerProxy* quota_manager_proxy, storage::SpecialStoragePolicy* special_storage_policy) : next_registration_id_(kInvalidServiceWorkerRegistrationId), next_version_id_(kInvalidServiceWorkerVersionId), next_resource_id_(kInvalidServiceWorkerResourceId), state_(UNINITIALIZED), + expecting_done_with_disk_on_disable_(false), path_(path), context_(context), database_task_runner_(std::move(database_task_runner)), - disk_cache_thread_(std::move(disk_cache_thread)), quota_manager_proxy_(quota_manager_proxy), special_storage_policy_(special_storage_policy), is_purge_pending_(false), @@ -1435,8 +1447,11 @@ void ServiceWorkerStorage::InitializeDiskCache() { disk_cache_->set_is_waiting_to_initialize(false); + expecting_done_with_disk_on_disable_ = true; int rv = disk_cache_->InitWithDiskBackend( - GetDiskCachePath(), kMaxDiskCacheSize, false, disk_cache_thread_, + GetDiskCachePath(), kMaxDiskCacheSize, false, + base::BindOnce(&ServiceWorkerStorage::DiskCacheImplDoneWithDisk, + weak_factory_.GetWeakPtr()), base::Bind(&ServiceWorkerStorage::OnDiskCacheInitialized, weak_factory_.GetWeakPtr())); if (rv != net::ERR_IO_PENDING) @@ -1894,12 +1909,18 @@ } DVLOG(1) << "Deleted ServiceWorkerDatabase successfully."; - // Delete the disk cache on the cache thread. + // Delete the disk cache. Use BLOCK_SHUTDOWN to try to avoid things being + // half-deleted. + // TODO(falken): Investigate if BLOCK_SHUTDOWN is needed, as the next startup + // is expected to cleanup the disk cache anyway. Also investigate whether + // ClearSessionOnlyOrigins() should try to delete relevant entries from the + // disk cache before shutdown. + // TODO(nhiroki): What if there is a bunch of files in the cache directory? // Deleting the directory could take a long time and restart could be delayed. // We should probably rename the directory and delete it later. - base::PostTaskAndReplyWithResult( - disk_cache_thread_.get(), FROM_HERE, + PostTaskWithTraitsAndReplyWithResult( + FROM_HERE, {base::MayBlock(), base::TaskShutdownBehavior::BLOCK_SHUTDOWN}, base::Bind(&base::DeleteFile, GetDiskCachePath(), true), base::Bind(&ServiceWorkerStorage::DidDeleteDiskCache, weak_factory_.GetWeakPtr(), callback));
diff --git a/content/browser/service_worker/service_worker_storage.h b/content/browser/service_worker/service_worker_storage.h index a588025f..243428f 100644 --- a/content/browser/service_worker/service_worker_storage.h +++ b/content/browser/service_worker/service_worker_storage.h
@@ -28,7 +28,6 @@ namespace base { class SequencedTaskRunner; -class SingleThreadTaskRunner; } namespace storage { @@ -82,7 +81,6 @@ const base::FilePath& path, const base::WeakPtr<ServiceWorkerContextCore>& context, scoped_refptr<base::SequencedTaskRunner> database_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> disk_cache_thread, storage::QuotaManagerProxy* quota_manager_proxy, storage::SpecialStoragePolicy* special_storage_policy); @@ -355,7 +353,6 @@ const base::FilePath& path, base::WeakPtr<ServiceWorkerContextCore> context, scoped_refptr<base::SequencedTaskRunner> database_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> disk_cache_thread, storage::QuotaManagerProxy* quota_manager_proxy, storage::SpecialStoragePolicy* special_storage_policy); @@ -531,9 +528,13 @@ bool IsDisabled() const; void ScheduleDeleteAndStartOver(); - void DidDeleteDatabase( - const StatusCallback& callback, - ServiceWorkerDatabase::Status status); + + // Posted by the underlying cache implementation after it finishes making + // disk changes upon its destruction. + void DiskCacheImplDoneWithDisk(); + void DidDeleteDatabase(const StatusCallback& callback, + ServiceWorkerDatabase::Status status); + // Posted when we finish deleting the cache directory. void DidDeleteDiskCache( const StatusCallback& callback, bool result); @@ -561,6 +562,19 @@ }; State state_; + // non-null between when DeleteAndStartOver() is called and when the + // underlying disk cache stops using the disk. + StatusCallback delete_and_start_over_callback_; + + // This is set when we know that a call to Disable() will result in + // DiskCacheImplDoneWithDisk() eventually called. This might not happen + // for many reasons: + // 1) A previous call to Disable() may have already triggered that. + // 2) We may be using a memory backend. + // 3) |disk_cache_| might not have been created yet. + // ... so it's easier to keep track of the case when it will happen. + bool expecting_done_with_disk_on_disable_; + base::FilePath path_; // The context should be valid while the storage is alive. @@ -570,7 +584,6 @@ std::unique_ptr<ServiceWorkerDatabase> database_; scoped_refptr<base::SequencedTaskRunner> database_task_runner_; - scoped_refptr<base::SingleThreadTaskRunner> disk_cache_thread_; scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy_; scoped_refptr<storage::SpecialStoragePolicy> special_storage_policy_;
diff --git a/content/browser/service_worker/service_worker_storage_unittest.cc b/content/browser/service_worker/service_worker_storage_unittest.cc index 0fd82a1..e0c29fb 100644 --- a/content/browser/service_worker/service_worker_storage_unittest.cc +++ b/content/browser/service_worker/service_worker_storage_unittest.cc
@@ -27,10 +27,12 @@ #include "content/public/common/content_client.h" #include "content/public/common/origin_trial_policy.h" #include "content/public/test/test_browser_thread_bundle.h" +#include "content/public/test/test_utils.h" #include "ipc/ipc_message.h" #include "net/base/io_buffer.h" #include "net/base/net_errors.h" #include "net/base/test_completion_callback.h" +#include "net/disk_cache/disk_cache.h" #include "net/http/http_response_headers.h" #include "net/http/http_util.h" #include "net/test/cert_test_util.h" @@ -311,7 +313,8 @@ void TearDown() override { helper_.reset(); - base::RunLoop().RunUntilIdle(); + disk_cache::FlushCacheThreadForTesting(); + content::RunAllBlockingPoolTasksUntilIdle(); } bool InitUserDataDirectory() {
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc index 375c004..e159471 100644 --- a/content/browser/site_per_process_browsertest.cc +++ b/content/browser/site_per_process_browsertest.cc
@@ -10175,74 +10175,6 @@ FrameHostMsg_ContextMenu(rfh->GetRoutingID(), ContextMenuParams())); } -// Test iframe "allow" attribute is propagated correctly. -IN_PROC_BROWSER_TEST_F(SitePerProcessFeaturePolicyBrowserTest, AllowedIFrames) { - GURL url(embedded_test_server()->GetURL("/allowed_frames.html")); - EXPECT_TRUE(NavigateToURL(shell(), url)); - - FrameTreeNode* root = web_contents()->GetFrameTree()->root(); - - // Iframes without "allow" attribute, or an empty "allow" attribute will not - // have any allowed features propagated. - EXPECT_TRUE( - root->child_at(0)->frame_owner_properties().allowed_features.empty()); - EXPECT_TRUE( - root->child_at(1)->frame_owner_properties().allowed_features.empty()); - - // Make sure the third frame starts out at the correct cross-site page. - EXPECT_EQ(embedded_test_server()->GetURL("bar.com", "/title1.html"), - root->child_at(2)->current_url()); - // Check allowed features are propagated correctly for cross-site iframes. - EXPECT_EQ(root->child_at(2)->frame_owner_properties().allowed_features.size(), - 2u); - EXPECT_EQ(root->child_at(2)->frame_owner_properties().allowed_features[0], - blink::WebFeaturePolicyFeature::kFullscreen); - EXPECT_EQ(root->child_at(2)->frame_owner_properties().allowed_features[1], - blink::WebFeaturePolicyFeature::kVibrate); - - // Check allowed features are propagated correctly for same-site iframes. - EXPECT_EQ(root->child_at(3)->frame_owner_properties().allowed_features.size(), - 2u); - EXPECT_EQ(root->child_at(3)->frame_owner_properties().allowed_features[0], - blink::WebFeaturePolicyFeature::kFullscreen); - EXPECT_EQ(root->child_at(3)->frame_owner_properties().allowed_features[1], - blink::WebFeaturePolicyFeature::kVibrate); -} - -// Test dynamic updates to iframe "allow" attribute are propagated correctly. -IN_PROC_BROWSER_TEST_F(SitePerProcessFeaturePolicyBrowserTest, - AllowedIFramesDynamic) { - GURL main_url(embedded_test_server()->GetURL("/allowed_frames.html")); - EXPECT_TRUE(NavigateToURL(shell(), main_url)); - - FrameTreeNode* root = web_contents()->GetFrameTree()->root(); - - // Test for dynamically removing "allow" attribute. - EXPECT_TRUE(ExecuteScript( - root, "document.getElementById('child-2').removeAttribute('allow')")); - EXPECT_TRUE( - root->child_at(2)->frame_owner_properties().allowed_features.empty()); - - // Test for dynamically setting "allow" attribute by element.setAttribute. - EXPECT_TRUE(ExecuteScript( - root, - "document.getElementById('child-3').setAttribute('allow', 'payment')")); - EXPECT_EQ(root->child_at(3)->frame_owner_properties().allowed_features.size(), - 1u); - EXPECT_EQ(root->child_at(3)->frame_owner_properties().allowed_features[0], - blink::WebFeaturePolicyFeature::kPayment); - - // Test for dynamically setting "allow" attribute by frame.allow="...". - EXPECT_TRUE(ExecuteScript( - root, "document.getElementById('child-3').allow='fullscreen vibrate'")); - EXPECT_EQ(root->child_at(3)->frame_owner_properties().allowed_features.size(), - 2u); - EXPECT_EQ(root->child_at(3)->frame_owner_properties().allowed_features[0], - blink::WebFeaturePolicyFeature::kFullscreen); - EXPECT_EQ(root->child_at(3)->frame_owner_properties().allowed_features[1], - blink::WebFeaturePolicyFeature::kVibrate); -} - // Test iframe container policy is replicated properly to the browser. IN_PROC_BROWSER_TEST_F(SitePerProcessFeaturePolicyBrowserTest, ContainerPolicy) {
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index 4442c8f7..bec99bd 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc
@@ -3403,6 +3403,7 @@ void WebContentsImpl::DidGetResourceResponseStart( const ResourceRequestDetails& details) { + SetNotWaitingForResponse(); controller_.ssl_manager()->DidStartResourceResponse( details.url, details.has_certificate, details.ssl_cert_status);
diff --git a/content/browser/web_contents/web_contents_impl_browsertest.cc b/content/browser/web_contents/web_contents_impl_browsertest.cc index d588e66..6c74fc6 100644 --- a/content/browser/web_contents/web_contents_impl_browsertest.cc +++ b/content/browser/web_contents/web_contents_impl_browsertest.cc
@@ -244,6 +244,7 @@ EXPECT_EQ(&shell()->web_contents()->GetController(), load_observer.controller_); } + // Test that a renderer-initiated navigation to an invalid URL does not leave // around a pending entry that could be used in a URL spoof. We test this in // a browser test because our unit test framework incorrectly calls @@ -484,13 +485,15 @@ base::string16 title = title_watcher.WaitAndGetTitle(); ASSERT_EQ(title, base::ASCIIToUTF16("pushState")); - // LoadingStateChanged should be called 4 times: start and stop for the - // initial load of push_state.html, and start and stop for the "navigation" - // triggered by history.pushState(). However, the start notification for the - // history.pushState() navigation should set to_different_document to false. + // LoadingStateChanged should be called 5 times: start and stop for the + // initial load of push_state.html, once for the switch from + // IsWaitingForResponse() to !IsWaitingForResponse(), and start and stop for + // the "navigation" triggered by history.pushState(). However, the start + // notification for the history.pushState() navigation should set + // to_different_document to false. EXPECT_EQ("pushState", shell()->web_contents()->GetLastCommittedURL().ref()); - EXPECT_EQ(4, delegate->loadingStateChangedCount()); - EXPECT_EQ(3, delegate->loadingStateToDifferentDocumentCount()); + EXPECT_EQ(5, delegate->loadingStateChangedCount()); + EXPECT_EQ(4, delegate->loadingStateToDifferentDocumentCount()); } IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest, @@ -512,6 +515,55 @@ EXPECT_TRUE(new_web_contents_observer.RenderViewCreatedCalled()); } +namespace { + +class DidGetResourceResponseStartObserver : public WebContentsObserver { + public: + DidGetResourceResponseStartObserver(Shell* shell) + : WebContentsObserver(shell->web_contents()), shell_(shell) { + shell->web_contents()->SetDelegate(&delegate_); + EXPECT_FALSE(shell->web_contents()->IsWaitingForResponse()); + EXPECT_FALSE(shell->web_contents()->IsLoading()); + } + + ~DidGetResourceResponseStartObserver() override {} + + void DidGetResourceResponseStart( + const ResourceRequestDetails& details) override { + EXPECT_FALSE(shell_->web_contents()->IsWaitingForResponse()); + EXPECT_TRUE(shell_->web_contents()->IsLoading()); + EXPECT_GT(delegate_.loadingStateChangedCount(), 0); + ++resource_response_start_count_; + } + + int resource_response_start_count() const { + return resource_response_start_count_; + } + + private: + Shell* shell_; + LoadingStateChangedDelegate delegate_; + int resource_response_start_count_ = 0; + + DISALLOW_COPY_AND_ASSIGN(DidGetResourceResponseStartObserver); +}; + +} // namespace + +// Makes sure that the WebContents is no longer marked as waiting for a response +// after DidGetResourceResponseStart() is called. +IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest, + DidGetResourceResponseStartUpdatesWaitingState) { + DidGetResourceResponseStartObserver observer(shell()); + + ASSERT_TRUE(embedded_test_server()->Start()); + LoadStopNotificationObserver load_observer( + &shell()->web_contents()->GetController()); + NavigateToURL(shell(), embedded_test_server()->GetURL("/title1.html")); + load_observer.Wait(); + EXPECT_GT(observer.resource_response_start_count(), 0); +} + struct LoadProgressDelegateAndObserver : public WebContentsDelegate, public WebContentsObserver { LoadProgressDelegateAndObserver(Shell* shell)
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn index ecb25838..0f2c3b3 100644 --- a/content/common/BUILD.gn +++ b/content/common/BUILD.gn
@@ -245,8 +245,6 @@ "net/url_request_service_worker_data.h", "net/url_request_user_data.cc", "net/url_request_user_data.h", - "net_adapters.cc", - "net_adapters.h", "origin_trials/trial_token.cc", "origin_trials/trial_token.h", "origin_trials/trial_token_validator.cc",
diff --git a/content/common/DEPS b/content/common/DEPS index 736590dd..c0da6de2 100644 --- a/content/common/DEPS +++ b/content/common/DEPS
@@ -65,12 +65,12 @@ "+third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerState.h", "+third_party/WebKit/public/platform/modules/serviceworker/service_worker_event_status.mojom.h", "+third_party/WebKit/public/web/WebAXEnums.h", - "+third_party/WebKit/public/web/WebCompositionUnderline.h", "+third_party/WebKit/public/web/WebDeviceEmulationParams.h", "+third_party/WebKit/public/web/WebDragStatus.h", "+third_party/WebKit/public/web/WebFindOptions.h", "+third_party/WebKit/public/web/WebFrameOwnerProperties.h", "+third_party/WebKit/public/web/WebFrameSerializerCacheControlPolicy.h", + "+third_party/WebKit/public/web/WebImeTextSpan.h", "+third_party/WebKit/public/web/WebMediaPlayerAction.h", "+third_party/WebKit/public/web/WebPluginAction.h", "+third_party/WebKit/public/web/WebPopupType.h",
diff --git a/content/common/browser_plugin/browser_plugin_messages.h b/content/common/browser_plugin/browser_plugin_messages.h index 57ac7ad..1258423 100644 --- a/content/common/browser_plugin/browser_plugin_messages.h +++ b/content/common/browser_plugin/browser_plugin_messages.h
@@ -18,8 +18,8 @@ #include "ipc/ipc_message_utils.h" #include "third_party/WebKit/public/platform/WebDragOperation.h" #include "third_party/WebKit/public/platform/WebFocusType.h" -#include "third_party/WebKit/public/web/WebCompositionUnderline.h" #include "third_party/WebKit/public/web/WebDragStatus.h" +#include "third_party/WebKit/public/web/WebImeTextSpan.h" #include "ui/gfx/geometry/point.h" #include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/size.h" @@ -45,7 +45,7 @@ IPC_STRUCT_BEGIN(BrowserPluginHostMsg_SetComposition_Params) IPC_STRUCT_MEMBER(base::string16, text) - IPC_STRUCT_MEMBER(std::vector<blink::WebCompositionUnderline>, underlines) + IPC_STRUCT_MEMBER(std::vector<blink::WebImeTextSpan>, ime_text_spans) IPC_STRUCT_MEMBER(gfx::Range, replacement_range) IPC_STRUCT_MEMBER(int, selection_start) IPC_STRUCT_MEMBER(int, selection_end) @@ -81,13 +81,12 @@ // This message is sent from BrowserPlugin to BrowserPluginGuest to notify that // deleting the current composition and inserting specified text is requested. -IPC_MESSAGE_CONTROL5( - BrowserPluginHostMsg_ImeCommitText, - int /* browser_plugin_instance_id */, - base::string16 /* text */, - std::vector<blink::WebCompositionUnderline> /* underlines */, - gfx::Range /* replacement_range */, - int /* relative_cursor_pos */) +IPC_MESSAGE_CONTROL5(BrowserPluginHostMsg_ImeCommitText, + int /* browser_plugin_instance_id */, + base::string16 /* text */, + std::vector<blink::WebImeTextSpan> /* ime_text_spans */, + gfx::Range /* replacement_range */, + int /* relative_cursor_pos */) // This message is sent from BrowserPlugin to BrowserPluginGuest to notify that // inserting the current composition is requested.
diff --git a/content/common/common.sb b/content/common/common.sb index fbe0ff5..f8fe48b 100644 --- a/content/common/common.sb +++ b/content/common/common.sb
@@ -19,6 +19,7 @@ (define permitted-dir "PERMITTED_DIR") (define homedir-as-literal "USER_HOMEDIR_AS_LITERAL") (define elcap-or-later "ELCAP_OR_LATER") +(define macos-1013 "MACOS_1013") ; Consumes a subpath and appends it to the user's homedir path. (define (user-homedir-path subpath)
diff --git a/content/common/content_param_traits_macros.h b/content/common/content_param_traits_macros.h index a1187c78..9c5638e 100644 --- a/content/common/content_param_traits_macros.h +++ b/content/common/content_param_traits_macros.h
@@ -21,7 +21,7 @@ #include "third_party/WebKit/public/platform/WebContentSecurityPolicy.h" #include "third_party/WebKit/public/platform/WebInputEvent.h" #include "third_party/WebKit/public/platform/WebPageVisibilityState.h" -#include "third_party/WebKit/public/web/WebCompositionUnderline.h" +#include "third_party/WebKit/public/web/WebImeTextSpan.h" #include "third_party/WebKit/public/web/WebSharedWorkerCreationContextType.h" #include "ui/gfx/gpu_memory_buffer.h" #include "ui/gfx/ipc/geometry/gfx_param_traits.h" @@ -52,7 +52,7 @@ IPC_ENUM_TRAITS_MAX_VALUE(blink::WebPageVisibilityState, blink::kWebPageVisibilityStateLast) -IPC_STRUCT_TRAITS_BEGIN(blink::WebCompositionUnderline) +IPC_STRUCT_TRAITS_BEGIN(blink::WebImeTextSpan) IPC_STRUCT_TRAITS_MEMBER(start_offset) IPC_STRUCT_TRAITS_MEMBER(end_offset) IPC_STRUCT_TRAITS_MEMBER(color)
diff --git a/content/common/dom_storage/dom_storage_messages.h b/content/common/dom_storage/dom_storage_messages.h index 3325bf9b..dc552833 100644 --- a/content/common/dom_storage/dom_storage_messages.h +++ b/content/common/dom_storage/dom_storage_messages.h
@@ -77,17 +77,19 @@ // Set a value that's associated with a key in a storage area. // A completion notification is sent in response. -IPC_MESSAGE_CONTROL4(DOMStorageHostMsg_SetItem, +IPC_MESSAGE_CONTROL5(DOMStorageHostMsg_SetItem, int /* connection_id */, base::string16 /* key */, base::string16 /* value */, + base::NullableString16 /* client_old_value */, GURL /* page_url */) // Remove the value associated with a key in a storage area. // A completion notification is sent in response. -IPC_MESSAGE_CONTROL3(DOMStorageHostMsg_RemoveItem, +IPC_MESSAGE_CONTROL4(DOMStorageHostMsg_RemoveItem, int /* connection_id */, base::string16 /* key */, + base::NullableString16 /* client_old_value */, GURL /* page_url */) // Clear the storage area. A completion notification is sent in response.
diff --git a/content/common/frame_messages.h b/content/common/frame_messages.h index e9ad8745..a0c1fa7 100644 --- a/content/common/frame_messages.h +++ b/content/common/frame_messages.h
@@ -193,7 +193,6 @@ IPC_STRUCT_TRAITS_MEMBER(allow_payment_request) IPC_STRUCT_TRAITS_MEMBER(is_display_none) IPC_STRUCT_TRAITS_MEMBER(required_csp) - IPC_STRUCT_TRAITS_MEMBER(allowed_features) IPC_STRUCT_TRAITS_END() IPC_STRUCT_TRAITS_BEGIN(content::PageImportanceSignals)
diff --git a/content/common/frame_owner_properties.cc b/content/common/frame_owner_properties.cc index bbe3764..0a135b4d 100644 --- a/content/common/frame_owner_properties.cc +++ b/content/common/frame_owner_properties.cc
@@ -26,8 +26,7 @@ allow_fullscreen == other.allow_fullscreen && allow_payment_request == other.allow_payment_request && is_display_none == other.is_display_none && - required_csp == other.required_csp && - allowed_features == other.allowed_features; + required_csp == other.required_csp; } } // namespace content
diff --git a/content/common/frame_owner_properties.h b/content/common/frame_owner_properties.h index 693d482..00bd2919 100644 --- a/content/common/frame_owner_properties.h +++ b/content/common/frame_owner_properties.h
@@ -40,8 +40,6 @@ // for a frame. See https://crbug.com/647588 and // https://www.w3.org/TR/csp-embedded-enforcement/#required-csp std::string required_csp; - - std::vector<blink::WebFeaturePolicyFeature> allowed_features; }; } // namespace content
diff --git a/content/common/input/input_handler.mojom b/content/common/input/input_handler.mojom index 39cc748..2613a00 100644 --- a/content/common/input/input_handler.mojom +++ b/content/common/input/input_handler.mojom
@@ -169,13 +169,13 @@ // This message sends a string being composed with an input method. ImeSetComposition(mojo.common.mojom.String16 text, - array<ui.mojom.CompositionUnderline> underlines, + array<ui.mojom.ImeTextSpan> ime_text_spans, gfx.mojom.Range range, int32 start, int32 end); // This message deletes the current composition, inserts specified text, and // moves the cursor. ImeCommitText(mojo.common.mojom.String16 text, - array<ui.mojom.CompositionUnderline> underlines, + array<ui.mojom.ImeTextSpan> ime_text_spans, gfx.mojom.Range range, int32 relative_cursor_position); // This message inserts the ongoing composition. @@ -216,7 +216,7 @@ // Sets the text composition to be between the given start and end offsets in // the currently focused editable field. SetCompositionFromExistingText( - int32 start, int32 end, array<ui.mojom.CompositionUnderline> underlines); + int32 start, int32 end, array<ui.mojom.ImeTextSpan> ime_text_spans); // Deletes the current selection plus the specified number of characters // before and after the selection or caret.
diff --git a/content/common/input_messages.h b/content/common/input_messages.h index 142f8db4..73dedb03 100644 --- a/content/common/input_messages.h +++ b/content/common/input_messages.h
@@ -169,9 +169,9 @@ // Sets the text composition to be between the given start and end offsets in // the currently focused editable field. IPC_MESSAGE_ROUTED3(InputMsg_SetCompositionFromExistingText, - int /* start */, - int /* end */, - std::vector<blink::WebCompositionUnderline> /* underlines */) + int /* start */, + int /* end */, + std::vector<blink::WebImeTextSpan> /* ime_text_spans */) // Deletes the current selection plus the specified number of characters before // and after the selection or caret. @@ -201,22 +201,20 @@ int /* end */) // This message sends a string being composed with an input method. -IPC_MESSAGE_ROUTED5( - InputMsg_ImeSetComposition, - base::string16, /* text */ - std::vector<blink::WebCompositionUnderline>, /* underlines */ - gfx::Range /* replacement_range */, - int, /* selectiont_start */ - int /* selection_end */) +IPC_MESSAGE_ROUTED5(InputMsg_ImeSetComposition, + base::string16, /* text */ + std::vector<blink::WebImeTextSpan>, /* ime_text_spans */ + gfx::Range /* replacement_range */, + int, /* selectiont_start */ + int /* selection_end */) // This message deletes the current composition, inserts specified text, and // moves the cursor. -IPC_MESSAGE_ROUTED4( - InputMsg_ImeCommitText, - base::string16 /* text */, - std::vector<blink::WebCompositionUnderline>, /* underlines */ - gfx::Range /* replacement_range */, - int /* relative_cursor_pos */) +IPC_MESSAGE_ROUTED4(InputMsg_ImeCommitText, + base::string16 /* text */, + std::vector<blink::WebImeTextSpan>, /* ime_text_spans */ + gfx::Range /* replacement_range */, + int /* relative_cursor_pos */) // This message inserts the ongoing composition. IPC_MESSAGE_ROUTED1(InputMsg_ImeFinishComposingText, bool /* keep_selection */)
diff --git a/content/common/media/media_stream_messages.h b/content/common/media/media_stream_messages.h index ea288d3..e44672f 100644 --- a/content/common/media/media_stream_messages.h +++ b/content/common/media/media_stream_messages.h
@@ -25,18 +25,12 @@ IPC_STRUCT_TRAITS_BEGIN(content::StreamDeviceInfo) IPC_STRUCT_TRAITS_MEMBER(device.type) - IPC_STRUCT_TRAITS_MEMBER(device.name) IPC_STRUCT_TRAITS_MEMBER(device.id) IPC_STRUCT_TRAITS_MEMBER(device.video_facing) IPC_STRUCT_TRAITS_MEMBER(device.matched_output_device_id) - IPC_STRUCT_TRAITS_MEMBER(device.input.sample_rate) - IPC_STRUCT_TRAITS_MEMBER(device.input.channel_layout) - IPC_STRUCT_TRAITS_MEMBER(device.input.frames_per_buffer) - IPC_STRUCT_TRAITS_MEMBER(device.input.effects) - IPC_STRUCT_TRAITS_MEMBER(device.input.mic_positions) - IPC_STRUCT_TRAITS_MEMBER(device.matched_output.sample_rate) - IPC_STRUCT_TRAITS_MEMBER(device.matched_output.channel_layout) - IPC_STRUCT_TRAITS_MEMBER(device.matched_output.frames_per_buffer) + IPC_STRUCT_TRAITS_MEMBER(device.name) + IPC_STRUCT_TRAITS_MEMBER(device.input) + IPC_STRUCT_TRAITS_MEMBER(device.matched_output) IPC_STRUCT_TRAITS_MEMBER(device.camera_calibration) IPC_STRUCT_TRAITS_MEMBER(session_id) IPC_STRUCT_TRAITS_END()
diff --git a/content/common/render_message_filter.mojom b/content/common/render_message_filter.mojom index e51d3dc..b61002b7 100644 --- a/content/common/render_message_filter.mojom +++ b/content/common/render_message_filter.mojom
@@ -4,7 +4,6 @@ module content.mojom; -import "cc/ipc/shared_bitmap_allocation_notifier.mojom"; import "content/common/input/input_handler.mojom"; import "content/common/native_types.mojom"; import "content/common/widget.mojom";
diff --git a/content/common/sandbox_mac.h b/content/common/sandbox_mac.h index 8496104..93765ed 100644 --- a/content/common/sandbox_mac.h +++ b/content/common/sandbox_mac.h
@@ -61,6 +61,7 @@ // TODO(kerrnel): this is only for the legacy sandbox. static const char* kSandboxElCapOrLater; + static const char* kSandboxMacOS1013; private: FRIEND_TEST_ALL_PREFIXES(MacDirAccessSandboxTest, StringEscape);
diff --git a/content/common/sandbox_mac.mm b/content/common/sandbox_mac.mm index 9156287..e9789fe 100644 --- a/content/common/sandbox_mac.mm +++ b/content/common/sandbox_mac.mm
@@ -84,6 +84,7 @@ const char* Sandbox::kSandboxPermittedDir = "PERMITTED_DIR"; const char* Sandbox::kSandboxElCapOrLater = "ELCAP_OR_LATER"; +const char* Sandbox::kSandboxMacOS1013 = "MACOS_1013"; // Warm up System APIs that empirically need to be accessed before the Sandbox // is turned on. @@ -282,6 +283,10 @@ if (!compiler.InsertBooleanParam(kSandboxElCapOrLater, elcap_or_later)) return false; + bool macos_1013 = base::mac::IsOS10_13(); + if (!compiler.InsertBooleanParam(kSandboxMacOS1013, macos_1013)) + return false; + // Initialize sandbox. std::string error_str; bool success = compiler.CompileAndApplyProfile(&error_str);
diff --git a/content/network/BUILD.gn b/content/network/BUILD.gn index fe29a2cf..cc11dea 100644 --- a/content/network/BUILD.gn +++ b/content/network/BUILD.gn
@@ -59,6 +59,7 @@ "//content/public/common:common_sources", "//mojo/public/cpp/bindings", "//net", + "//services/network/public/cpp", "//services/service_manager/public/cpp", "//services/service_manager/public/interfaces", ]
diff --git a/content/network/DEPS b/content/network/DEPS index 2f038c7..b24d403 100644 --- a/content/network/DEPS +++ b/content/network/DEPS
@@ -4,7 +4,6 @@ "-content", "+content/common/content_export.h", "+content/common/loader_util.h", - "+content/common/net_adapters.h", "+content/network", "+content/public/common/appcache_info.h", "+content/public/common/content_client.h", @@ -18,6 +17,7 @@ "+content/public/common/url_loader.mojom.h", "+content/public/common/url_loader_factory.mojom.h", "+content/public/network", + "+services/network", "+services/service_manager/public", ]
diff --git a/content/network/url_loader_impl.cc b/content/network/url_loader_impl.cc index b244f79..140cacd 100644 --- a/content/network/url_loader_impl.cc +++ b/content/network/url_loader_impl.cc
@@ -8,7 +8,6 @@ #include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" #include "content/common/loader_util.h" -#include "content/common/net_adapters.h" #include "content/network/network_context.h" #include "content/public/common/referrer.h" #include "content/public/common/resource_response.h" @@ -19,6 +18,7 @@ #include "net/base/upload_bytes_element_reader.h" #include "net/base/upload_file_element_reader.h" #include "net/url_request/url_request_context.h" +#include "services/network/public/cpp/net_adapters.h" namespace content { @@ -289,7 +289,7 @@ if (!pending_write_.get()) { // TODO: we should use the abstractions in MojoAsyncResourceHandler. pending_write_buffer_offset_ = 0; - MojoResult result = NetToMojoPendingBuffer::BeginWrite( + MojoResult result = network::NetToMojoPendingBuffer::BeginWrite( &response_body_stream_, &pending_write_, &pending_write_buffer_size_); if (result != MOJO_RESULT_OK && result != MOJO_RESULT_SHOULD_WAIT) { // The response body stream is in a bad state. Bail. @@ -313,8 +313,8 @@ } } - scoped_refptr<net::IOBuffer> buf(new NetToMojoIOBuffer( - pending_write_.get(), pending_write_buffer_offset_)); + auto buf = base::MakeRefCounted<network::NetToMojoIOBuffer>( + pending_write_.get(), pending_write_buffer_offset_); int bytes_read; url_request_->Read(buf.get(), static_cast<int>(pending_write_buffer_size_ -
diff --git a/content/network/url_loader_impl.h b/content/network/url_loader_impl.h index a349be2..d0c057a9 100644 --- a/content/network/url_loader_impl.h +++ b/content/network/url_loader_impl.h
@@ -18,10 +18,13 @@ #include "net/traffic_annotation/network_traffic_annotation.h" #include "net/url_request/url_request.h" +namespace network { +class NetToMojoPendingBuffer; +} + namespace content { class NetworkContext; -class NetToMojoPendingBuffer; struct ResourceResponse; class CONTENT_EXPORT URLLoaderImpl : public mojom::URLLoader, @@ -73,7 +76,7 @@ int64_t total_written_bytes_ = 0; mojo::ScopedDataPipeProducerHandle response_body_stream_; - scoped_refptr<NetToMojoPendingBuffer> pending_write_; + scoped_refptr<network::NetToMojoPendingBuffer> pending_write_; uint32_t pending_write_buffer_size_ = 0; uint32_t pending_write_buffer_offset_ = 0; mojo::SimpleWatcher writable_handle_watcher_;
diff --git a/content/public/android/BUILD.gn b/content/public/android/BUILD.gn index b07eeb6..23452f5 100644 --- a/content/public/android/BUILD.gn +++ b/content/public/android/BUILD.gn
@@ -378,7 +378,10 @@ android_library("content_javatests") { testonly = true - srcjar_deps = [ "//content/shell/android:content_javatests_aidl" ] + srcjar_deps = [ + "//content/shell/android:content_javatests_aidl", + "//third_party/WebKit/public:blink_cursor_type_java_enums_srcjar", + ] deps = [ ":content_java", @@ -403,6 +406,7 @@ "//net/android:net_java_test_support", "//third_party/android_support_test_runner:rules_java", "//third_party/android_support_test_runner:runner_java", + "//third_party/android_tools:android_support_annotations_java", "//third_party/jsr-305:jsr_305_javalib", "//third_party/junit", "//ui/android:ui_java", @@ -418,6 +422,7 @@ "javatests/src/org/chromium/content/browser/ContentCommandLineTest.java", "javatests/src/org/chromium/content/browser/ContentViewCoreSelectionTest.java", "javatests/src/org/chromium/content/browser/ContentViewLocationTest.java", + "javatests/src/org/chromium/content/browser/ContentViewPointerTypeTest.java", "javatests/src/org/chromium/content/browser/ContentViewPopupZoomerTest.java", "javatests/src/org/chromium/content/browser/ContentViewScrollingTest.java", "javatests/src/org/chromium/content/browser/EncodeHtmlDataUriTest.java",
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java b/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java index 713b236..5370d225 100644 --- a/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java +++ b/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java
@@ -872,9 +872,10 @@ } @CalledByNative - private void populateUnderlinesFromSpans(CharSequence text, long underlines) { + private void populateImeTextSpansFromJava(CharSequence text, long imeTextSpans) { if (DEBUG_LOGS) { - Log.i(TAG, "populateUnderlinesFromSpans: text [%s], underlines [%d]", text, underlines); + Log.i(TAG, "populateImeTextSpansFromJava: text [%s], ime_text_spans [%d]", text, + imeTextSpans); } if (!(text instanceof SpannableString)) return; @@ -883,11 +884,11 @@ spannableString.getSpans(0, text.length(), CharacterStyle.class); for (CharacterStyle span : spans) { if (span instanceof BackgroundColorSpan) { - nativeAppendBackgroundColorSpan(underlines, spannableString.getSpanStart(span), + nativeAppendBackgroundColorSpan(imeTextSpans, spannableString.getSpanStart(span), spannableString.getSpanEnd(span), ((BackgroundColorSpan) span).getBackgroundColor()); } else if (span instanceof UnderlineSpan) { - nativeAppendUnderlineSpan(underlines, spannableString.getSpanStart(span), + nativeAppendUnderlineSpan(imeTextSpans, spannableString.getSpanStart(span), spannableString.getSpanEnd(span)); } } @@ -917,9 +918,9 @@ private native boolean nativeSendKeyEvent(long nativeImeAdapterAndroid, KeyEvent event, int type, int modifiers, long timestampMs, int keyCode, int scanCode, boolean isSystemKey, int unicodeChar); - private static native void nativeAppendUnderlineSpan(long underlinePtr, int start, int end); - private static native void nativeAppendBackgroundColorSpan(long underlinePtr, int start, - int end, int backgroundColor); + private static native void nativeAppendUnderlineSpan(long spanPtr, int start, int end); + private static native void nativeAppendBackgroundColorSpan( + long spanPtr, int start, int end, int backgroundColor); private native void nativeSetComposingText(long nativeImeAdapterAndroid, CharSequence text, String textStr, int newCursorPosition); private native void nativeCommitText(
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/ImeUtils.java b/content/public/android/java/src/org/chromium/content/browser/input/ImeUtils.java index 8ef905d6..b667c45b 100644 --- a/content/public/android/java/src/org/chromium/content/browser/input/ImeUtils.java +++ b/content/public/android/java/src/org/chromium/content/browser/input/ImeUtils.java
@@ -44,7 +44,6 @@ outAttrs.inputType |= EditorInfo.TYPE_TEXT_FLAG_NO_SUGGESTIONS; } - int imeAction = 0; if (inputMode == WebTextInputMode.DEFAULT) { if (inputType == TextInputType.TEXT) { // Normal text field @@ -112,21 +111,8 @@ } } - if (inputMode == WebTextInputMode.DEFAULT && inputType == TextInputType.SEARCH) { - imeAction |= EditorInfo.IME_ACTION_SEARCH; - } else if ((outAttrs.inputType & EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE) != 0) { - // For textarea that sends you to another webpage on enter key press using - // JavaScript, we will only show ENTER. - imeAction |= EditorInfo.IME_ACTION_NONE; - } else if ((inputFlags & WebTextInputFlags.HAVE_NEXT_FOCUSABLE_ELEMENT) != 0) { - imeAction |= EditorInfo.IME_ACTION_NEXT; - } else { - // For last element inside form, we should give preference to GO key as PREVIOUS - // has less importance in those cases. - imeAction |= EditorInfo.IME_ACTION_GO; - } - - outAttrs.imeOptions |= imeAction; + outAttrs.imeOptions |= getImeAction(inputType, inputFlags, inputMode, + (outAttrs.inputType & EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE) != 0); // Handling of autocapitalize. Blink will send the flag taking into account the element's // type. This is not using AutocapitalizeNone because Android does not autocapitalize by @@ -148,6 +134,25 @@ outAttrs.initialSelEnd = initialSelEnd; } + private static int getImeAction( + int inputType, int inputFlags, int inputMode, boolean isMultiLineInput) { + int imeAction = 0; + if (inputMode == WebTextInputMode.DEFAULT && inputType == TextInputType.SEARCH) { + imeAction |= EditorInfo.IME_ACTION_SEARCH; + } else if (isMultiLineInput) { + // For textarea that sends you to another webpage on enter key press using + // JavaScript, we will only show ENTER. + imeAction |= EditorInfo.IME_ACTION_NONE; + } else if ((inputFlags & WebTextInputFlags.HAVE_NEXT_FOCUSABLE_ELEMENT) != 0) { + imeAction |= EditorInfo.IME_ACTION_NEXT; + } else { + // For last element inside form, we should give preference to GO key as PREVIOUS + // has less importance in those cases. + imeAction |= EditorInfo.IME_ACTION_GO; + } + return imeAction; + } + /** * @param editorInfo The EditorInfo * @return Debug string for the given {@EditorInfo}.
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/ContentViewPointerTypeTest.java b/content/public/android/javatests/src/org/chromium/content/browser/ContentViewPointerTypeTest.java new file mode 100644 index 0000000..2f15755 --- /dev/null +++ b/content/public/android/javatests/src/org/chromium/content/browser/ContentViewPointerTypeTest.java
@@ -0,0 +1,96 @@ +// 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. + +package org.chromium.content.browser; + +import android.graphics.Rect; +import android.os.SystemClock; +import android.view.InputDevice; +import android.view.MotionEvent; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.chromium.base.test.util.DisabledTest; +import org.chromium.base.test.util.UrlUtils; +import org.chromium.blink_public.web.WebCursorInfoType; +import org.chromium.content.browser.test.ContentJUnit4ClassRunner; +import org.chromium.content.browser.test.util.DOMUtils; +import org.chromium.content_shell.ShellViewAndroidDelegate.OnCursorUpdateHelper; +import org.chromium.content_shell_apk.ContentShellActivityTestRule; + +/** + * Tests that we can move mouse cursor and test cursor icon. + */ +@RunWith(ContentJUnit4ClassRunner.class) +public class ContentViewPointerTypeTest { + @Rule + public ContentShellActivityTestRule mActivityTestRule = new ContentShellActivityTestRule(); + + private static final String CURSOR_PAGE = UrlUtils.encodeHtmlDataUri("<html>" + + "<body><a id=\"hand\" href=\"about:blank\">pointer</a>" + + "<span id=\"text\">text</span>" + + "<span id=\"help\" style=\"cursor:help;\">help</span></body>" + + "</html>"); + + @Before + public void setUp() throws Exception { + mActivityTestRule.launchContentShellWithUrl(CURSOR_PAGE); + mActivityTestRule.waitForActiveShellToBeDoneLoading(); + } + + private void moveCursor(final float x, final float y) throws Throwable { + mActivityTestRule.runOnUiThreadForTestCommon(new Runnable() { + @Override + public void run() { + MotionEvent.PointerProperties[] pointerProperties = + new MotionEvent.PointerProperties[1]; + MotionEvent.PointerProperties pp = new MotionEvent.PointerProperties(); + pp.id = 0; + pp.toolType = MotionEvent.TOOL_TYPE_MOUSE; + pointerProperties[0] = pp; + + MotionEvent.PointerCoords[] pointerCoords = new MotionEvent.PointerCoords[1]; + MotionEvent.PointerCoords pc = new MotionEvent.PointerCoords(); + pc.x = x; + pc.y = y; + pointerCoords[0] = pc; + + MotionEvent cursorMoveEvent = MotionEvent.obtain(SystemClock.uptimeMillis(), + SystemClock.uptimeMillis() + 1, MotionEvent.ACTION_HOVER_MOVE, 1, + pointerProperties, pointerCoords, 0, 0, 1.0f, 1.0f, 0, 0, + InputDevice.SOURCE_MOUSE, 0); + cursorMoveEvent.setSource(InputDevice.SOURCE_MOUSE); + mActivityTestRule.getContentViewCore() + .getContainerView() + .dispatchGenericMotionEvent(cursorMoveEvent); + } + }); + } + + private void checkPointerTypeForNode(final String nodeId, final int type) throws Throwable { + Rect rect = DOMUtils.getNodeBounds(mActivityTestRule.getWebContents(), nodeId); + float x = (float) (rect.left + rect.right) / 2.0f; + float y = (float) (rect.top + rect.bottom) / 2.0f; + + OnCursorUpdateHelper onCursorUpdateHelper = mActivityTestRule.getOnCursorUpdateHelper(); + int onCursorUpdateCount = onCursorUpdateHelper.getCallCount(); + moveCursor(x, y); + onCursorUpdateHelper.waitForCallback(onCursorUpdateCount); + Assert.assertEquals(type, onCursorUpdateHelper.getPointerType()); + } + + @Test + //@SmallTest + //@Feature({"Main"}) + @DisabledTest(message = "crbug.com/755112") + public void testPointerType() throws Throwable { + checkPointerTypeForNode("hand", WebCursorInfoType.TYPE_HAND); + checkPointerTypeForNode("text", WebCursorInfoType.TYPE_I_BEAM); + checkPointerTypeForNode("help", WebCursorInfoType.TYPE_HELP); + } +}
diff --git a/content/public/app/mojo/content_browser_manifest.json b/content/public/app/mojo/content_browser_manifest.json index 54aadee7..b84e3468 100644 --- a/content/public/app/mojo/content_browser_manifest.json +++ b/content/public/app/mojo/content_browser_manifest.json
@@ -4,13 +4,14 @@ "interface_provider_specs": { "service_manager:connector": { "provides": { + // Interfaces needed by a generic client of content browser. + "app": [ + "memory_instrumentation::mojom::Coordinator" + ], "gpu": [ "content::mojom::FieldTrialRecorder", "media::mojom::AndroidOverlayProvider" ], - "memory_instrumentation": [ - "memory_instrumentation::mojom::Coordinator" - ], "plugin": [ "discardable_memory::mojom::DiscardableSharedMemoryManager", "ui::mojom::Gpu" @@ -25,7 +26,6 @@ "blink::mojom::OffscreenCanvasProvider", "blink::mojom::PermissionService", "blink::mojom::WebSocket", - "cc::mojom::SharedBitmapAllocationNotifier", "content::mojom::FieldTrialRecorder", "content::mojom::FrameSinkProvider", "content::mojom::MediaStreamDispatcherHost", @@ -47,17 +47,14 @@ "resource_coordinator::mojom::CoordinationUnit", "shape_detection::mojom::TextDetection", "storage::mojom::BlobRegistry", - "ui::mojom::Gpu" + "ui::mojom::Gpu", + "viz::mojom::SharedBitmapAllocationNotifier" ], "geolocation_config": [ "device::mojom::GeolocationConfig" ], "service_manager:service_factory": [ "service_manager::mojom::ServiceFactory" - ], - "utility": [ - "discardable_memory::mojom::DiscardableSharedMemoryManager", - "memory_instrumentation::mojom::Coordinator" ] }, "requires": { @@ -67,7 +64,6 @@ "content_browser": [ "ash", "display", - "memory_instrumentation", "url_keyed_metrics", "geolocation_config" ],
diff --git a/content/public/app/mojo/content_gpu_manifest.json b/content/public/app/mojo/content_gpu_manifest.json index a7d05d7..336eefdc7 100644 --- a/content/public/app/mojo/content_gpu_manifest.json +++ b/content/public/app/mojo/content_gpu_manifest.json
@@ -15,7 +15,8 @@ ] }, "requires": { - "content_browser": [ "gpu", "memory_instrumentation" ], + "*": [ "app" ], + "content_browser": [ "gpu" ], "device": [ "device:power_monitor" ] } }
diff --git a/content/public/app/mojo/content_plugin_manifest.json b/content/public/app/mojo/content_plugin_manifest.json index ed8f326..fc78b99 100644 --- a/content/public/app/mojo/content_plugin_manifest.json +++ b/content/public/app/mojo/content_plugin_manifest.json
@@ -4,7 +4,7 @@ "interface_provider_specs": { "service_manager:connector": { "provides": { - "browser": [ + "browser": [ "content::mojom::Child", "IPC::mojom::ChannelBootstrap" ], @@ -13,6 +13,7 @@ ] }, "requires": { + "*": [ "app" ], "content_browser": [ "plugin" ], "device": [ "device:power_monitor" ], "ui": [ "discardable_memory" ]
diff --git a/content/public/app/mojo/content_renderer_manifest.json b/content/public/app/mojo/content_renderer_manifest.json index a44f29e..ed32e78 100644 --- a/content/public/app/mojo/content_renderer_manifest.json +++ b/content/public/app/mojo/content_renderer_manifest.json
@@ -19,7 +19,8 @@ ] }, "requires": { - "content_browser": [ "memory_instrumentation", "renderer" ], + "*": [ "app" ], + "content_browser": [ "renderer" ], "device": [ "device:battery_monitor", "device:power_monitor",
diff --git a/content/public/app/mojo/content_utility_manifest.json b/content/public/app/mojo/content_utility_manifest.json index 3ea2993..5caad0c 100644 --- a/content/public/app/mojo/content_utility_manifest.json +++ b/content/public/app/mojo/content_utility_manifest.json
@@ -14,7 +14,7 @@ ] }, "requires": { - "content_browser": [ "memory_instrumentation" ], + "*": [ "app" ], "device": [ "device:power_monitor", "device:time_zone_monitor"
diff --git a/content/public/browser/BUILD.gn b/content/public/browser/BUILD.gn index 8349727..aa409f7 100644 --- a/content/public/browser/BUILD.gn +++ b/content/public/browser/BUILD.gn
@@ -231,6 +231,7 @@ "restore_type.h", "save_page_type.h", "screen_orientation_delegate.h", + "security_style_explanation.cc", "security_style_explanation.h", "security_style_explanations.cc", "security_style_explanations.h",
diff --git a/content/public/browser/browser_associated_interface.h b/content/public/browser/browser_associated_interface.h index 2b86e21..5fedb75 100644 --- a/content/public/browser/browser_associated_interface.h +++ b/content/public/browser/browser_associated_interface.h
@@ -5,11 +5,11 @@ #ifndef CONTENT_BROWSER_BROWSER_ASSOCIATED_INTERFACE_H_ #define CONTENT_BROWSER_BROWSER_ASSOCIATED_INTERFACE_H_ -#include <memory> #include <string> #include "base/macros.h" #include "base/memory/ref_counted.h" +#include "base/optional.h" #include "content/common/content_export.h" #include "content/public/browser/browser_message_filter.h" #include "content/public/browser/browser_thread.h" @@ -55,7 +55,6 @@ // |filter| and |impl| must live at least as long as this object. BrowserAssociatedInterface(BrowserMessageFilter* filter, Interface* impl) : internal_state_(new InternalState(impl)) { - internal_state_->Initialize(); filter->AddAssociatedInterface( Interface::Name_, base::Bind(&InternalState::BindRequest, internal_state_), @@ -69,16 +68,8 @@ class InternalState : public base::RefCountedThreadSafe<InternalState> { public: - explicit InternalState(Interface* impl) : impl_(impl) {} - - void Initialize() { - if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { - BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, - base::Bind(&InternalState::Initialize, this)); - return; - } - bindings_.reset(new mojo::AssociatedBindingSet<Interface>); - } + explicit InternalState(Interface* impl) + : impl_(impl), bindings_(base::in_place) {} void ClearBindings() { if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { @@ -106,7 +97,7 @@ ~InternalState() {} Interface* impl_; - std::unique_ptr<mojo::AssociatedBindingSet<Interface>> bindings_; + base::Optional<mojo::AssociatedBindingSet<Interface>> bindings_; DISALLOW_COPY_AND_ASSIGN(InternalState); };
diff --git a/content/public/browser/security_style_explanation.cc b/content/public/browser/security_style_explanation.cc new file mode 100644 index 0000000..9d497471 --- /dev/null +++ b/content/public/browser/security_style_explanation.cc
@@ -0,0 +1,36 @@ +// 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 "content/public/browser/security_style_explanation.h" + +namespace content { + +SecurityStyleExplanation::SecurityStyleExplanation() {} + +SecurityStyleExplanation::SecurityStyleExplanation( + const std::string& summary, + const std::string& description) + : summary(summary), + description(description), + mixed_content_type(blink::WebMixedContentContextType::kNotMixedContent) {} + +SecurityStyleExplanation::SecurityStyleExplanation( + const std::string& summary, + const std::string& description, + scoped_refptr<net::X509Certificate> certificate, + blink::WebMixedContentContextType mixed_content_type) + : summary(summary), + description(description), + certificate(certificate), + mixed_content_type(mixed_content_type) {} + +SecurityStyleExplanation::SecurityStyleExplanation( + const SecurityStyleExplanation& other) = default; + +SecurityStyleExplanation& SecurityStyleExplanation::operator=( + const SecurityStyleExplanation& other) = default; + +SecurityStyleExplanation::~SecurityStyleExplanation() {} + +} // namespace content
diff --git a/content/public/browser/security_style_explanation.h b/content/public/browser/security_style_explanation.h index e2d51b9f..9f0b12b 100644 --- a/content/public/browser/security_style_explanation.h +++ b/content/public/browser/security_style_explanation.h
@@ -8,6 +8,7 @@ #include <string> #include "content/common/content_export.h" +#include "net/cert/x509_certificate.h" #include "third_party/WebKit/public/platform/WebMixedContentContextType.h" namespace content { @@ -17,32 +18,24 @@ // resource. An example summary phrase would be "Expired Certificate", // with a description along the lines of "This site's certificate chain // contains errors (net::CERT_DATE_INVALID)". -struct SecurityStyleExplanation { - CONTENT_EXPORT SecurityStyleExplanation(){}; - CONTENT_EXPORT SecurityStyleExplanation(const std::string& summary, - const std::string& description) - : summary(summary), - description(description), - has_certificate(false), - mixed_content_type( - blink::WebMixedContentContextType::kNotMixedContent) {} - CONTENT_EXPORT SecurityStyleExplanation( +struct CONTENT_EXPORT SecurityStyleExplanation { + SecurityStyleExplanation(); + SecurityStyleExplanation(const std::string& summary, + const std::string& description); + SecurityStyleExplanation( const std::string& summary, const std::string& description, - bool has_certificate, - blink::WebMixedContentContextType mixed_content_type) - : summary(summary), - description(description), - has_certificate(has_certificate), - mixed_content_type(mixed_content_type) {} - CONTENT_EXPORT ~SecurityStyleExplanation() {} + scoped_refptr<net::X509Certificate> certificate, + blink::WebMixedContentContextType mixed_content_type); + SecurityStyleExplanation(const SecurityStyleExplanation& other); + SecurityStyleExplanation& operator=(const SecurityStyleExplanation& other); + ~SecurityStyleExplanation(); std::string summary; std::string description; - // |has_certificate| indicates that this explanation has an associated - // certificate. UI surfaces can use this to add a button/link for viewing the - // certificate of the current page. - bool has_certificate; + // |certificate| indicates that this explanation has an associated + // certificate. + scoped_refptr<net::X509Certificate> certificate; // |mixed_content_type| indicates that the explanation describes a particular // type of mixed content. A value of kNotMixedContent means that the // explanation does not relate to mixed content. UI surfaces can use this to
diff --git a/content/public/browser/security_style_explanations.h b/content/public/browser/security_style_explanations.h index 041236d..981970b 100644 --- a/content/public/browser/security_style_explanations.h +++ b/content/public/browser/security_style_explanations.h
@@ -25,11 +25,10 @@ // SecurityStyleExplanation that contains a human-readable explanation of the // factor. A single page may contain multiple explanations, each of which may // have a different severity level ("secure", "warning", "insecure" and "info"). -struct SecurityStyleExplanations { - CONTENT_EXPORT SecurityStyleExplanations(); - CONTENT_EXPORT SecurityStyleExplanations( - const SecurityStyleExplanations& other); - CONTENT_EXPORT ~SecurityStyleExplanations(); +struct CONTENT_EXPORT SecurityStyleExplanations { + SecurityStyleExplanations(); + SecurityStyleExplanations(const SecurityStyleExplanations& other); + ~SecurityStyleExplanations(); // True if the page was loaded over HTTPS and ran mixed (HTTP) content // such as scripts.
diff --git a/content/public/browser/web_contents_delegate.cc b/content/public/browser/web_contents_delegate.cc index 30c545b..959fe72 100644 --- a/content/public/browser/web_contents_delegate.cc +++ b/content/public/browser/web_contents_delegate.cc
@@ -14,7 +14,6 @@ #include "content/public/browser/web_contents.h" #include "content/public/common/bindings_policy.h" #include "content/public/common/url_constants.h" -#include "net/cert/x509_certificate.h" #include "ui/gfx/geometry/rect.h" namespace content { @@ -266,11 +265,6 @@ return blink::kWebSecurityStyleUnknown; } -void WebContentsDelegate::ShowCertificateViewerInDevTools( - WebContents* web_contents, - scoped_refptr<net::X509Certificate> certificate) { -} - void WebContentsDelegate::RequestAppBannerFromDevTools( content::WebContents* web_contents) { }
diff --git a/content/public/browser/web_contents_delegate.h b/content/public/browser/web_contents_delegate.h index 3ffbea6..8b548ba 100644 --- a/content/public/browser/web_contents_delegate.h +++ b/content/public/browser/web_contents_delegate.h
@@ -63,10 +63,6 @@ class Size; } -namespace net { -class X509Certificate; -} - namespace url { class Origin; } @@ -546,11 +542,6 @@ WebContents* web_contents, SecurityStyleExplanations* security_style_explanations); - // Displays platform-specific (OS) dialog with the certificate details. - virtual void ShowCertificateViewerInDevTools( - WebContents* web_contents, - scoped_refptr<net::X509Certificate> certificate); - // Requests the app banner. This method is called from the DevTools. virtual void RequestAppBannerFromDevTools(content::WebContents* web_contents);
diff --git a/content/public/common/media_stream_request.cc b/content/public/common/media_stream_request.cc index 8512aad5..b042198b 100644 --- a/content/public/common/media_stream_request.cc +++ b/content/public/common/media_stream_request.cc
@@ -63,19 +63,21 @@ id(id), video_facing(media::MEDIA_VIDEO_FACING_NONE), name(name), - input(sample_rate, channel_layout, frames_per_buffer) {} + input(media::AudioParameters::AUDIO_FAKE, + static_cast<media::ChannelLayout>(channel_layout), + sample_rate, + 0, + frames_per_buffer) {} MediaStreamDevice::MediaStreamDevice(const MediaStreamDevice& other) = default; MediaStreamDevice::~MediaStreamDevice() {} bool MediaStreamDevice::IsEqual(const MediaStreamDevice& second) const { - const AudioDeviceParameters& input_second = second.input; - return type == second.type && - name == second.name && - id == second.id && - input.sample_rate == input_second.sample_rate && - input.channel_layout == input_second.channel_layout; + const media::AudioParameters& input_second = second.input; + return type == second.type && name == second.name && id == second.id && + input.sample_rate() == input_second.sample_rate() && + input.channel_layout() == input_second.channel_layout(); } MediaStreamDevices::MediaStreamDevices() {} @@ -94,23 +96,6 @@ return NULL; } -MediaStreamDevice::AudioDeviceParameters::AudioDeviceParameters() - : sample_rate(), channel_layout(), frames_per_buffer(), effects() {} - -MediaStreamDevice::AudioDeviceParameters::AudioDeviceParameters( - int sample_rate, - int channel_layout, - int frames_per_buffer) - : sample_rate(sample_rate), - channel_layout(channel_layout), - frames_per_buffer(frames_per_buffer), - effects() {} - -MediaStreamDevice::AudioDeviceParameters::AudioDeviceParameters( - const AudioDeviceParameters& other) = default; - -MediaStreamDevice::AudioDeviceParameters::~AudioDeviceParameters() {} - MediaStreamRequest::MediaStreamRequest( int render_process_id, int render_frame_id,
diff --git a/content/public/common/media_stream_request.h b/content/public/common/media_stream_request.h index f3b09c0..36821c43 100644 --- a/content/public/common/media_stream_request.h +++ b/content/public/common/media_stream_request.h
@@ -122,49 +122,19 @@ // The device's "friendly" name. Not guaranteed to be unique. std::string name; - // Contains properties that match directly with those with the same name - // in media::AudioParameters. - // TODO(ajm): Remove this type and use media::AudioParameters directly. - struct CONTENT_EXPORT AudioDeviceParameters { - AudioDeviceParameters(); - AudioDeviceParameters(int sample_rate, - int channel_layout, - int frames_per_buffer); - AudioDeviceParameters(const AudioDeviceParameters& other); - - ~AudioDeviceParameters(); - - // Preferred sample rate in samples per second for the device. - int sample_rate; - - // Preferred channel configuration for the device. - // TODO(henrika): ideally, we would like to use media::ChannelLayout here - // but including media/base/channel_layout.h violates checkdeps rules. - int channel_layout; - - // Preferred number of frames per buffer for the device. This is filled - // in on the browser side and can be used by the renderer to match the - // expected browser side settings and avoid unnecessary buffering. - // See media::AudioParameters for more. - int frames_per_buffer; - - // See media::AudioParameters::PlatformEffectsMask. - int effects; - - std::vector<media::Point> mic_positions; - }; - // These below two member variables are valid only when the type of device is // audio (i.e. IsAudioInputMediaType returns true). // Contains the device properties of the capture device. - AudioDeviceParameters input; + media::AudioParameters input = + media::AudioParameters::UnavailableDeviceParams(); // If the capture device has an associated output device (e.g. headphones), // this will contain the properties for the output device. If no such device // exists (e.g. webcam w/mic), then the value of this member will be all // zeros. - AudioDeviceParameters matched_output; + media::AudioParameters matched_output = + media::AudioParameters::UnavailableDeviceParams(); // This field is optional and available only for some camera models. base::Optional<CameraCalibration> camera_calibration;
diff --git a/content/public/test/text_input_test_utils.cc b/content/public/test/text_input_test_utils.cc index 65ec8d2..1e7153a 100644 --- a/content/public/test/text_input_test_utils.cc +++ b/content/public/test/text_input_test_utils.cc
@@ -22,8 +22,8 @@ #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_observer.h" #include "content/public/test/test_utils.h" -#include "third_party/WebKit/public/web/WebCompositionUnderline.h" -#include "ui/base/ime/composition_underline.h" +#include "third_party/WebKit/public/web/WebImeTextSpan.h" +#include "ui/base/ime/ime_text_span.h" #include "ui/base/ime/input_method.h" #include "ui/base/ime/input_method_observer.h" @@ -268,22 +268,22 @@ void SendImeCommitTextToWidget( RenderWidgetHost* rwh, const base::string16& text, - const std::vector<ui::CompositionUnderline>& underlines, + const std::vector<ui::ImeTextSpan>& ime_text_spans, const gfx::Range& replacement_range, int relative_cursor_pos) { RenderWidgetHostImpl::From(rwh)->ImeCommitText( - text, underlines, replacement_range, relative_cursor_pos); + text, ime_text_spans, replacement_range, relative_cursor_pos); } void SendImeSetCompositionTextToWidget( RenderWidgetHost* rwh, const base::string16& text, - const std::vector<ui::CompositionUnderline>& underlines, + const std::vector<ui::ImeTextSpan>& ime_text_spans, const gfx::Range& replacement_range, int selection_start, int selection_end) { RenderWidgetHostImpl::From(rwh)->ImeSetComposition( - text, underlines, replacement_range, selection_start, selection_end); + text, ime_text_spans, replacement_range, selection_start, selection_end); } bool DestroyRenderWidgetHost(int32_t process_id,
diff --git a/content/public/test/text_input_test_utils.h b/content/public/test/text_input_test_utils.h index c8d9775..80c055c 100644 --- a/content/public/test/text_input_test_utils.h +++ b/content/public/test/text_input_test_utils.h
@@ -26,7 +26,7 @@ } namespace ui { -struct CompositionUnderline; +struct ImeTextSpan; } namespace content { @@ -74,7 +74,7 @@ void SendImeCommitTextToWidget( RenderWidgetHost* rwh, const base::string16& text, - const std::vector<ui::CompositionUnderline>& underlines, + const std::vector<ui::ImeTextSpan>& ime_text_spans, const gfx::Range& replacement_range, int relative_cursor_pos); @@ -83,7 +83,7 @@ void SendImeSetCompositionTextToWidget( RenderWidgetHost* rwh, const base::string16& text, - const std::vector<ui::CompositionUnderline>& underlines, + const std::vector<ui::ImeTextSpan>& ime_text_spans, const gfx::Range& replacement_range, int selection_start, int selection_end);
diff --git a/content/renderer/browser_plugin/browser_plugin.cc b/content/renderer/browser_plugin/browser_plugin.cc index 88ef96b5..9e281e4 100644 --- a/content/renderer/browser_plugin/browser_plugin.cc +++ b/content/renderer/browser_plugin/browser_plugin.cc
@@ -551,7 +551,7 @@ bool BrowserPlugin::SetComposition( const blink::WebString& text, - const blink::WebVector<blink::WebCompositionUnderline>& underlines, + const blink::WebVector<blink::WebImeTextSpan>& ime_text_spans, const blink::WebRange& replacementRange, int selectionStart, int selectionEnd) { @@ -560,8 +560,8 @@ BrowserPluginHostMsg_SetComposition_Params params; params.text = text.Utf16(); - for (size_t i = 0; i < underlines.size(); ++i) { - params.underlines.push_back(underlines[i]); + for (size_t i = 0; i < ime_text_spans.size(); ++i) { + params.ime_text_spans.push_back(ime_text_spans[i]); } params.replacement_range = @@ -580,15 +580,15 @@ bool BrowserPlugin::CommitText( const blink::WebString& text, - const blink::WebVector<blink::WebCompositionUnderline>& underlines, + const blink::WebVector<blink::WebImeTextSpan>& ime_text_spans, const blink::WebRange& replacementRange, int relative_cursor_pos) { if (!attached()) return false; - std::vector<blink::WebCompositionUnderline> std_underlines; - for (size_t i = 0; i < underlines.size(); ++i) { - std_underlines.push_back(underlines[i]); + std::vector<blink::WebImeTextSpan> std_ime_text_spans; + for (size_t i = 0; i < ime_text_spans.size(); ++i) { + std_ime_text_spans.push_back(ime_text_spans[i]); } gfx::Range replacement_range = replacementRange.IsNull() @@ -597,7 +597,7 @@ static_cast<uint32_t>(replacementRange.EndOffset())); BrowserPluginManager::Get()->Send(new BrowserPluginHostMsg_ImeCommitText( - browser_plugin_instance_id_, text.Utf16(), std_underlines, + browser_plugin_instance_id_, text.Utf16(), std_ime_text_spans, replacement_range, relative_cursor_pos)); // TODO(kochi): This assumes the IPC handling always succeeds. return true;
diff --git a/content/renderer/browser_plugin/browser_plugin.h b/content/renderer/browser_plugin/browser_plugin.h index 637002e8..74abac0 100644 --- a/content/renderer/browser_plugin/browser_plugin.h +++ b/content/renderer/browser_plugin/browser_plugin.h
@@ -14,8 +14,8 @@ #include "base/sequenced_task_runner_helpers.h" #include "content/renderer/mouse_lock_dispatcher.h" #include "content/renderer/render_view_impl.h" -#include "third_party/WebKit/public/web/WebCompositionUnderline.h" #include "third_party/WebKit/public/web/WebDragStatus.h" +#include "third_party/WebKit/public/web/WebImeTextSpan.h" #include "third_party/WebKit/public/web/WebInputMethodController.h" #include "third_party/WebKit/public/web/WebNode.h" @@ -111,15 +111,14 @@ const blink::WebString& value) override; bool SetComposition( const blink::WebString& text, - const blink::WebVector<blink::WebCompositionUnderline>& underlines, + const blink::WebVector<blink::WebImeTextSpan>& ime_text_spans, const blink::WebRange& replacementRange, int selectionStart, int selectionEnd) override; - bool CommitText( - const blink::WebString& text, - const blink::WebVector<blink::WebCompositionUnderline>& underlines, - const blink::WebRange& replacementRange, - int relative_cursor_pos) override; + bool CommitText(const blink::WebString& text, + const blink::WebVector<blink::WebImeTextSpan>& ime_text_spans, + const blink::WebRange& replacementRange, + int relative_cursor_pos) override; bool FinishComposingText( blink::WebInputMethodController::ConfirmCompositionBehavior selection_behavior) override;
diff --git a/content/renderer/dom_storage/dom_storage_cached_area.cc b/content/renderer/dom_storage/dom_storage_cached_area.cc index b2686d9..12480ea8c 100644 --- a/content/renderer/dom_storage/dom_storage_cached_area.cc +++ b/content/renderer/dom_storage/dom_storage_cached_area.cc
@@ -53,16 +53,15 @@ return false; PrimeIfNeeded(connection_id); - base::NullableString16 unused; - if (!map_->SetItem(key, value, &unused)) + base::NullableString16 old_value; + if (!map_->SetItem(key, value, &old_value)) return false; // Ignore mutations to 'key' until OnSetItemComplete. ignore_key_mutations_[key]++; - proxy_->SetItem( - connection_id, key, value, page_url, - base::Bind(&DOMStorageCachedArea::OnSetItemComplete, - weak_factory_.GetWeakPtr(), key)); + proxy_->SetItem(connection_id, key, value, old_value, page_url, + base::Bind(&DOMStorageCachedArea::OnSetItemComplete, + weak_factory_.GetWeakPtr(), key)); return true; } @@ -70,16 +69,16 @@ const base::string16& key, const GURL& page_url) { PrimeIfNeeded(connection_id); - base::string16 unused; - if (!map_->RemoveItem(key, &unused)) + base::string16 old_value; + if (!map_->RemoveItem(key, &old_value)) return; // Ignore mutations to 'key' until OnRemoveItemComplete. ignore_key_mutations_[key]++; - proxy_->RemoveItem( - connection_id, key, page_url, - base::Bind(&DOMStorageCachedArea::OnRemoveItemComplete, - weak_factory_.GetWeakPtr(), key)); + proxy_->RemoveItem(connection_id, key, + base::NullableString16(old_value, false), page_url, + base::Bind(&DOMStorageCachedArea::OnRemoveItemComplete, + weak_factory_.GetWeakPtr(), key)); } void DOMStorageCachedArea::Clear(int connection_id, const GURL& page_url) {
diff --git a/content/renderer/dom_storage/dom_storage_cached_area_unittest.cc b/content/renderer/dom_storage/dom_storage_cached_area_unittest.cc index 4c433271..46b3815e 100644 --- a/content/renderer/dom_storage/dom_storage_cached_area_unittest.cc +++ b/content/renderer/dom_storage/dom_storage_cached_area_unittest.cc
@@ -37,6 +37,7 @@ void SetItem(int connection_id, const base::string16& key, const base::string16& value, + const base::NullableString16& old_value, const GURL& page_url, const CompletionCallback& callback) override { pending_callbacks_.push_back(callback); @@ -49,6 +50,7 @@ void RemoveItem(int connection_id, const base::string16& key, + const base::NullableString16& old_value, const GURL& page_url, const CompletionCallback& callback) override { pending_callbacks_.push_back(callback);
diff --git a/content/renderer/dom_storage/dom_storage_dispatcher.cc b/content/renderer/dom_storage/dom_storage_dispatcher.cc index b52367ad..9d2ec453 100644 --- a/content/renderer/dom_storage/dom_storage_dispatcher.cc +++ b/content/renderer/dom_storage/dom_storage_dispatcher.cc
@@ -114,10 +114,12 @@ void SetItem(int connection_id, const base::string16& key, const base::string16& value, + const base::NullableString16& old_value, const GURL& page_url, const CompletionCallback& callback) override; void RemoveItem(int connection_id, const base::string16& key, + const base::NullableString16& old_value, const GURL& page_url, const CompletionCallback& callback) override; void ClearArea(int connection_id, @@ -243,20 +245,26 @@ } void DomStorageDispatcher::ProxyImpl::SetItem( - int connection_id, const base::string16& key, - const base::string16& value, const GURL& page_url, + int connection_id, + const base::string16& key, + const base::string16& value, + const base::NullableString16& old_value, + const GURL& page_url, const CompletionCallback& callback) { PushPendingCallback(callback); throttling_filter_->SendThrottled(new DOMStorageHostMsg_SetItem( - connection_id, key, value, page_url)); + connection_id, key, value, old_value, page_url)); } void DomStorageDispatcher::ProxyImpl::RemoveItem( - int connection_id, const base::string16& key, const GURL& page_url, + int connection_id, + const base::string16& key, + const base::NullableString16& old_value, + const GURL& page_url, const CompletionCallback& callback) { PushPendingCallback(callback); throttling_filter_->SendThrottled(new DOMStorageHostMsg_RemoveItem( - connection_id, key, page_url)); + connection_id, key, old_value, page_url)); } void DomStorageDispatcher::ProxyImpl::ClearArea(int connection_id,
diff --git a/content/renderer/dom_storage/dom_storage_proxy.h b/content/renderer/dom_storage/dom_storage_proxy.h index 80cd87cdc..8fbd361 100644 --- a/content/renderer/dom_storage/dom_storage_proxy.h +++ b/content/renderer/dom_storage/dom_storage_proxy.h
@@ -26,11 +26,13 @@ virtual void SetItem(int connection_id, const base::string16& key, const base::string16& value, + const base::NullableString16& old_value, const GURL& page_url, const CompletionCallback& callback) = 0; virtual void RemoveItem(int connection_id, const base::string16& key, + const base::NullableString16& old_value, const GURL& page_url, const CompletionCallback& callback) = 0;
diff --git a/content/renderer/frame_owner_properties.cc b/content/renderer/frame_owner_properties.cc index b713022e..21c2541c 100644 --- a/content/renderer/frame_owner_properties.cc +++ b/content/renderer/frame_owner_properties.cc
@@ -24,9 +24,6 @@ result.allow_payment_request = web_frame_owner_properties.allow_payment_request; result.required_csp = web_frame_owner_properties.required_csp.Utf8(); - std::copy(web_frame_owner_properties.allowed_features.begin(), - web_frame_owner_properties.allowed_features.end(), - std::back_inserter(result.allowed_features)); return result; } @@ -44,8 +41,6 @@ result.allow_payment_request = frame_owner_properties.allow_payment_request; result.required_csp = blink::WebString::FromUTF8(frame_owner_properties.required_csp); - result.allowed_features = blink::WebVector<blink::WebFeaturePolicyFeature>( - frame_owner_properties.allowed_features); return result; }
diff --git a/content/renderer/input/frame_input_handler_impl.cc b/content/renderer/input/frame_input_handler_impl.cc index ba35f657..637ebdcb 100644 --- a/content/renderer/input/frame_input_handler_impl.cc +++ b/content/renderer/input/frame_input_handler_impl.cc
@@ -66,11 +66,11 @@ void FrameInputHandlerImpl::SetCompositionFromExistingText( int32_t start, int32_t end, - const std::vector<ui::CompositionUnderline>& ui_underlines) { + const std::vector<ui::ImeTextSpan>& ui_ime_text_spans) { if (!main_thread_task_runner_->BelongsToCurrentThread()) { RunOnMainThread( base::Bind(&FrameInputHandlerImpl::SetCompositionFromExistingText, - weak_this_, start, end, ui_underlines)); + weak_this_, start, end, ui_ime_text_spans)); return; } @@ -78,16 +78,17 @@ return; ImeEventGuard guard(render_frame_->GetRenderWidget()); - std::vector<blink::WebCompositionUnderline> underlines; - for (const auto& underline : ui_underlines) { - blink::WebCompositionUnderline blink_underline( - underline.start_offset, underline.end_offset, underline.color, - underline.thick, underline.background_color); - underlines.push_back(blink_underline); + std::vector<blink::WebImeTextSpan> ime_text_spans; + for (const auto& ime_text_span : ui_ime_text_spans) { + blink::WebImeTextSpan blink_ime_text_span( + ime_text_span.start_offset, ime_text_span.end_offset, + ime_text_span.color, ime_text_span.thick, + ime_text_span.background_color); + ime_text_spans.push_back(blink_ime_text_span); } render_frame_->GetWebFrame()->SetCompositionFromExistingText(start, end, - underlines); + ime_text_spans); } void FrameInputHandlerImpl::ExtendSelectionAndDelete(int32_t before,
diff --git a/content/renderer/input/frame_input_handler_impl.h b/content/renderer/input/frame_input_handler_impl.h index 705f816..6519950 100644 --- a/content/renderer/input/frame_input_handler_impl.h +++ b/content/renderer/input/frame_input_handler_impl.h
@@ -44,7 +44,7 @@ void SetCompositionFromExistingText( int32_t start, int32_t end, - const std::vector<ui::CompositionUnderline>& underlines) override; + const std::vector<ui::ImeTextSpan>& ime_text_spans) override; void ExtendSelectionAndDelete(int32_t before, int32_t after) override; void DeleteSurroundingText(int32_t before, int32_t after) override; void DeleteSurroundingTextInCodePoints(int32_t before,
diff --git a/content/renderer/input/widget_input_handler_impl.cc b/content/renderer/input/widget_input_handler_impl.cc index a042d773..d82da0f3 100644 --- a/content/renderer/input/widget_input_handler_impl.cc +++ b/content/renderer/input/widget_input_handler_impl.cc
@@ -24,17 +24,17 @@ namespace { -std::vector<blink::WebCompositionUnderline> -ConvertUIUnderlinesToBlinkUnderlines( - const std::vector<ui::CompositionUnderline>& ui_underlines) { - std::vector<blink::WebCompositionUnderline> underlines; - for (const auto& underline : ui_underlines) { - blink::WebCompositionUnderline blink_underline( - underline.start_offset, underline.end_offset, underline.color, - underline.thick, underline.background_color); - underlines.push_back(blink_underline); +std::vector<blink::WebImeTextSpan> ConvertUIImeTextSpansToBlinkImeTextSpans( + const std::vector<ui::ImeTextSpan>& ui_ime_text_spans) { + std::vector<blink::WebImeTextSpan> ime_text_spans; + for (const auto& ime_text_span : ui_ime_text_spans) { + blink::WebImeTextSpan blink_ime_text_span( + ime_text_span.start_offset, ime_text_span.end_offset, + ime_text_span.color, ime_text_span.thick, + ime_text_span.background_color); + ime_text_spans.push_back(blink_ime_text_span); } - return underlines; + return ime_text_spans; } } // namespace @@ -89,24 +89,25 @@ void WidgetInputHandlerImpl::ImeSetComposition( const base::string16& text, - const std::vector<ui::CompositionUnderline>& underlines, + const std::vector<ui::ImeTextSpan>& ime_text_spans, const gfx::Range& range, int32_t start, int32_t end) { - RunOnMainThread(base::Bind( - &RenderWidget::OnImeSetComposition, render_widget_, text, - ConvertUIUnderlinesToBlinkUnderlines(underlines), range, start, end)); + RunOnMainThread( + base::Bind(&RenderWidget::OnImeSetComposition, render_widget_, text, + ConvertUIImeTextSpansToBlinkImeTextSpans(ime_text_spans), + range, start, end)); } void WidgetInputHandlerImpl::ImeCommitText( const base::string16& text, - const std::vector<ui::CompositionUnderline>& underlines, + const std::vector<ui::ImeTextSpan>& ime_text_spans, const gfx::Range& range, int32_t relative_cursor_position) { - RunOnMainThread(base::Bind(&RenderWidget::OnImeCommitText, render_widget_, - text, - ConvertUIUnderlinesToBlinkUnderlines(underlines), - range, relative_cursor_position)); + RunOnMainThread( + base::Bind(&RenderWidget::OnImeCommitText, render_widget_, text, + ConvertUIImeTextSpansToBlinkImeTextSpans(ime_text_spans), + range, relative_cursor_position)); } void WidgetInputHandlerImpl::ImeFinishComposingText(bool keep_selection) {
diff --git a/content/renderer/input/widget_input_handler_impl.h b/content/renderer/input/widget_input_handler_impl.h index c05ac43..5c5cddc2 100644 --- a/content/renderer/input/widget_input_handler_impl.h +++ b/content/renderer/input/widget_input_handler_impl.h
@@ -36,14 +36,13 @@ void SetEditCommandsForNextKeyEvent( const std::vector<EditCommand>& commands) override; void CursorVisibilityChanged(bool visible) override; - void ImeSetComposition( - const base::string16& text, - const std::vector<ui::CompositionUnderline>& underlines, - const gfx::Range& range, - int32_t start, - int32_t end) override; + void ImeSetComposition(const base::string16& text, + const std::vector<ui::ImeTextSpan>& ime_text_spans, + const gfx::Range& range, + int32_t start, + int32_t end) override; void ImeCommitText(const base::string16& text, - const std::vector<ui::CompositionUnderline>& underlines, + const std::vector<ui::ImeTextSpan>& ime_text_spans, const gfx::Range& range, int32_t relative_cursor_position) override; void ImeFinishComposingText(bool keep_selection) override;
diff --git a/content/renderer/media/local_media_stream_audio_source.cc b/content/renderer/media/local_media_stream_audio_source.cc index 2c7f1aa8..4d2e913 100644 --- a/content/renderer/media/local_media_stream_audio_source.cc +++ b/content/renderer/media/local_media_stream_audio_source.cc
@@ -22,24 +22,23 @@ MediaStreamSource::SetDeviceInfo(device_info); // If the device buffer size was not provided, use a default. - int frames_per_buffer = device_info.device.input.frames_per_buffer; + int frames_per_buffer = device_info.device.input.frames_per_buffer(); if (frames_per_buffer <= 0) { // TODO(miu): Like in ProcessedLocalAudioSource::GetBufferSize(), we should // re-evaluate whether Android needs special treatment here. Or, perhaps we // should just DCHECK_GT(device_info...frames_per_buffer, 0)? // http://crbug.com/638081 #if defined(OS_ANDROID) - frames_per_buffer = device_info.device.input.sample_rate / 50; // 20 ms + frames_per_buffer = device_info.device.input.sample_rate() / 50; // 20 ms #else - frames_per_buffer = device_info.device.input.sample_rate / 100; // 10 ms + frames_per_buffer = device_info.device.input.sample_rate() / 100; // 10 ms #endif } MediaStreamAudioSource::SetFormat(media::AudioParameters( media::AudioParameters::AUDIO_PCM_LOW_LATENCY, - static_cast<media::ChannelLayout>( - device_info.device.input.channel_layout), - device_info.device.input.sample_rate, + device_info.device.input.channel_layout(), + device_info.device.input.sample_rate(), 16, // Legacy parameter (data is always in 32-bit float format). frames_per_buffer)); }
diff --git a/content/renderer/media/media_stream_audio_processor_options.cc b/content/renderer/media/media_stream_audio_processor_options.cc index 5fdd272..70ce8ad6 100644 --- a/content/renderer/media/media_stream_audio_processor_options.cc +++ b/content/renderer/media/media_stream_audio_processor_options.cc
@@ -292,9 +292,9 @@ // static AudioProcessingProperties AudioProcessingProperties::FromConstraints( const blink::WebMediaConstraints& constraints, - const MediaStreamDevice::AudioDeviceParameters& input_params) { + const media::AudioParameters& input_params) { DCHECK(IsOldAudioConstraints()); - MediaAudioConstraints audio_constraints(constraints, input_params.effects); + MediaAudioConstraints audio_constraints(constraints, input_params.effects()); AudioProcessingProperties properties; properties.enable_sw_echo_cancellation = audio_constraints.GetEchoCancellationProperty(); @@ -524,14 +524,14 @@ std::vector<media::Point> GetArrayGeometryPreferringConstraints( const MediaAudioConstraints& audio_constraints, - const MediaStreamDevice::AudioDeviceParameters& input_params) { + const media::AudioParameters& input_params) { const std::string constraints_geometry = audio_constraints.GetGoogArrayGeometry(); // Give preference to the audio constraint over the device-supplied mic // positions. This is mainly for testing purposes. return constraints_geometry.empty() - ? input_params.mic_positions + ? input_params.mic_positions() : media::ParsePointsFromString(constraints_geometry); }
diff --git a/content/renderer/media/media_stream_audio_processor_options.h b/content/renderer/media/media_stream_audio_processor_options.h index dde2d23..ee9619e 100644 --- a/content/renderer/media/media_stream_audio_processor_options.h +++ b/content/renderer/media/media_stream_audio_processor_options.h
@@ -117,7 +117,7 @@ // TODO(guidou): Remove this function. http://crbug.com/706408 static AudioProcessingProperties FromConstraints( const blink::WebMediaConstraints& constraints, - const MediaStreamDevice::AudioDeviceParameters& input_params); + const media::AudioParameters& input_params); bool enable_sw_echo_cancellation = true; bool disable_hw_echo_cancellation = false; @@ -213,7 +213,7 @@ // TODO(guidou): Remove this function. http://crbug.com/706408 CONTENT_EXPORT std::vector<media::Point> GetArrayGeometryPreferringConstraints( const MediaAudioConstraints& audio_constraints, - const MediaStreamDevice::AudioDeviceParameters& input_params); + const media::AudioParameters& input_params); // TODO(guidou): Remove this function. http://crbug.com/706408 CONTENT_EXPORT bool IsOldAudioConstraints();
diff --git a/content/renderer/media/media_stream_audio_processor_unittest.cc b/content/renderer/media/media_stream_audio_processor_unittest.cc index 9aada88..5f55168 100644 --- a/content/renderer/media/media_stream_audio_processor_unittest.cc +++ b/content/renderer/media/media_stream_audio_processor_unittest.cc
@@ -220,7 +220,6 @@ base::MessageLoop main_thread_message_loop_; media::AudioParameters params_; - MediaStreamDevice::AudioDeviceParameters input_device_params_; // TODO(guidou): Remove this field. http://crbug.com/706408 base::test::ScopedFeatureList scoped_feature_list_; @@ -383,7 +382,7 @@ { // Both geometries empty. MockConstraintFactory constraint_factory; - MediaStreamDevice::AudioDeviceParameters input_params; + media::AudioParameters input_params; const auto& actual_geometry = GetArrayGeometryPreferringConstraints( MakeMediaAudioConstraints(constraint_factory), input_params); @@ -392,9 +391,13 @@ { // Constraints geometry empty. MockConstraintFactory constraint_factory; - MediaStreamDevice::AudioDeviceParameters input_params; - input_params.mic_positions.push_back(media::Point(0, 0, 0)); - input_params.mic_positions.push_back(media::Point(0, 0.05f, 0)); + + std::vector<media::Point> mic_positions; + mic_positions.push_back(media::Point(0, 0, 0)); + mic_positions.push_back(media::Point(0, 0.05f, 0)); + + media::AudioParameters input_params; + input_params.set_mic_positions(mic_positions); const auto& actual_geometry = GetArrayGeometryPreferringConstraints( MakeMediaAudioConstraints(constraint_factory), input_params); @@ -405,7 +408,7 @@ MockConstraintFactory constraint_factory; constraint_factory.AddAdvanced().goog_array_geometry.SetExact( blink::WebString::FromUTF8("-0.02 0 0 0.02 0 0")); - MediaStreamDevice::AudioDeviceParameters input_params; + media::AudioParameters input_params; const auto& actual_geometry = GetArrayGeometryPreferringConstraints( MakeMediaAudioConstraints(constraint_factory), input_params); @@ -416,9 +419,13 @@ MockConstraintFactory constraint_factory; constraint_factory.AddAdvanced().goog_array_geometry.SetExact( blink::WebString::FromUTF8("-0.02 0 0 0.02 0 0")); - MediaStreamDevice::AudioDeviceParameters input_params; - input_params.mic_positions.push_back(media::Point(0, 0, 0)); - input_params.mic_positions.push_back(media::Point(0, 0.05f, 0)); + + std::vector<media::Point> mic_positions; + mic_positions.push_back(media::Point(0, 0, 0)); + mic_positions.push_back(media::Point(0, 0.05f, 0)); + + media::AudioParameters input_params; + input_params.set_mic_positions(mic_positions); // Constraints geometry is preferred. const auto& actual_geometry = GetArrayGeometryPreferringConstraints(
diff --git a/content/renderer/media/mock_media_stream_dispatcher.cc b/content/renderer/media/mock_media_stream_dispatcher.cc index a4b3fe5..5af1804c 100644 --- a/content/renderer/media/mock_media_stream_dispatcher.cc +++ b/content/renderer/media/mock_media_stream_dispatcher.cc
@@ -96,9 +96,10 @@ kAudioOutputDeviceIdPrefix + base::IntToString(session_id_); } audio.session_id = session_id_; - audio.device.input.sample_rate = media::AudioParameters::kAudioCDSampleRate; - audio.device.input.channel_layout = media::CHANNEL_LAYOUT_STEREO; - audio.device.input.frames_per_buffer = audio.device.input.sample_rate / 100; + audio.device.input = media::AudioParameters( + media::AudioParameters::AUDIO_FAKE, media::CHANNEL_LAYOUT_STEREO, + media::AudioParameters::kAudioCDSampleRate, 0, + media::AudioParameters::kAudioCDSampleRate / 100); audio_input_array_.push_back(audio); }
diff --git a/content/renderer/media/user_media_client_impl.cc b/content/renderer/media/user_media_client_impl.cc index ed7ec65..bb26affa 100644 --- a/content/renderer/media/user_media_client_impl.cc +++ b/content/renderer/media/user_media_client_impl.cc
@@ -1086,7 +1086,7 @@ for (auto& device_info : overridden_audio_array) { device_info.device.matched_output_device_id = ""; device_info.device.matched_output = - MediaStreamDevice::AudioDeviceParameters(); + media::AudioParameters::UnavailableDeviceParams(); } }
diff --git a/content/renderer/media/webrtc/processed_local_audio_source.cc b/content/renderer/media/webrtc/processed_local_audio_source.cc index 6fea798..d3a4a35 100644 --- a/content/renderer/media/webrtc/processed_local_audio_source.cc +++ b/content/renderer/media/webrtc/processed_local_audio_source.cc
@@ -87,21 +87,22 @@ ", channel_layout=%d, sample_rate=%d, buffer_size=%d" ", session_id=%d, paired_output_sample_rate=%d" ", paired_output_frames_per_buffer=%d, effects=%d. ", - consumer_render_frame_id_, device_info().device.input.channel_layout, - device_info().device.input.sample_rate, - device_info().device.input.frames_per_buffer, device_info().session_id, - device_info().device.matched_output.sample_rate, - device_info().device.matched_output.frames_per_buffer, - device_info().device.input.effects)); + consumer_render_frame_id_, device_info().device.input.channel_layout(), + device_info().device.input.sample_rate(), + device_info().device.input.frames_per_buffer(), device_info().session_id, + device_info().device.matched_output.sample_rate(), + device_info().device.matched_output.frames_per_buffer(), + device_info().device.input.effects())); // Disable HW echo cancellation if constraints explicitly specified no // echo cancellation. if (audio_processing_properties_.disable_hw_echo_cancellation && - (device_info().device.input.effects & + (device_info().device.input.effects() & media::AudioParameters::ECHO_CANCELLER)) { StreamDeviceInfo modified_device_info(device_info()); - modified_device_info.device.input.effects &= - ~media::AudioParameters::ECHO_CANCELLER; + modified_device_info.device.input.set_effects( + modified_device_info.device.input.effects() & + ~media::AudioParameters::ECHO_CANCELLER); SetDeviceInfo(modified_device_info); } @@ -119,9 +120,9 @@ // If KEYBOARD_MIC effect is set, change the layout to the corresponding // layout that includes the keyboard mic. - media::ChannelLayout channel_layout = static_cast<media::ChannelLayout>( - device_info().device.input.channel_layout); - if ((device_info().device.input.effects & + media::ChannelLayout channel_layout = + device_info().device.input.channel_layout(); + if ((device_info().device.input.effects() & media::AudioParameters::KEYBOARD_MIC) && audio_processing_properties_.goog_experimental_noise_suppression) { if (channel_layout == media::CHANNEL_LAYOUT_STEREO) { @@ -150,14 +151,15 @@ } DVLOG(1) << "Audio input hardware sample rate: " - << device_info().device.input.sample_rate; + << device_info().device.input.sample_rate(); media::AudioSampleRate asr; - if (media::ToAudioSampleRate(device_info().device.input.sample_rate, &asr)) { + if (media::ToAudioSampleRate(device_info().device.input.sample_rate(), + &asr)) { UMA_HISTOGRAM_ENUMERATION( "WebRTC.AudioInputSampleRate", asr, media::kAudioSampleRateMax + 1); } else { UMA_HISTOGRAM_COUNTS("WebRTC.AudioInputSampleRateUnexpected", - device_info().device.input.sample_rate); + device_info().device.input.sample_rate()); } // Determine the audio format required of the AudioCapturerSource. Then, pass @@ -165,9 +167,9 @@ // ProcessedLocalAudioSource to the processor's output format. media::AudioParameters params( media::AudioParameters::AUDIO_PCM_LOW_LATENCY, channel_layout, - device_info().device.input.sample_rate, 16, - GetBufferSize(device_info().device.input.sample_rate)); - params.set_effects(device_info().device.input.effects); + device_info().device.input.sample_rate(), 16, + GetBufferSize(device_info().device.input.sample_rate())); + params.set_effects(device_info().device.input.effects()); DCHECK(params.IsValid()); audio_processor_->OnCaptureFormatChanged(params); MediaStreamAudioSource::SetFormat(audio_processor_->OutputFormat()); @@ -356,7 +358,7 @@ // If audio processing is off and the native hardware buffer size was // provided, use it. It can be harmful, in terms of CPU/power consumption, to // use smaller buffer sizes than the native size (http://crbug.com/362261). - if (int hardware_buffer_size = device_info().device.input.frames_per_buffer) + if (int hardware_buffer_size = device_info().device.input.frames_per_buffer()) return hardware_buffer_size; // If the buffer size is missing from the StreamDeviceInfo, provide 10ms as a
diff --git a/content/renderer/media/webrtc_audio_device_impl.cc b/content/renderer/media/webrtc_audio_device_impl.cc index a7111d0e..147c1f5 100644 --- a/content/renderer/media/webrtc_audio_device_impl.cc +++ b/content/renderer/media/webrtc_audio_device_impl.cc
@@ -487,15 +487,15 @@ // Don't set output parameters unless all of them are valid. const StreamDeviceInfo& device_info = capturers_.back()->device_info(); if (device_info.session_id <= 0 || - !device_info.device.matched_output.sample_rate || - !device_info.device.matched_output.frames_per_buffer) { + !device_info.device.matched_output.sample_rate() || + !device_info.device.matched_output.frames_per_buffer()) { return false; } *session_id = device_info.session_id; - *output_sample_rate = device_info.device.matched_output.sample_rate; + *output_sample_rate = device_info.device.matched_output.sample_rate(); *output_frames_per_buffer = - device_info.device.matched_output.frames_per_buffer; + device_info.device.matched_output.frames_per_buffer(); return true; }
diff --git a/content/renderer/pepper/pepper_plugin_instance_impl.cc b/content/renderer/pepper/pepper_plugin_instance_impl.cc index ea83dcf..f4692bf 100644 --- a/content/renderer/pepper/pepper_plugin_instance_impl.cc +++ b/content/renderer/pepper/pepper_plugin_instance_impl.cc
@@ -110,9 +110,9 @@ #include "third_party/WebKit/public/platform/WebURL.h" #include "third_party/WebKit/public/platform/WebURLError.h" #include "third_party/WebKit/public/platform/WebURLRequest.h" -#include "third_party/WebKit/public/web/WebCompositionUnderline.h" #include "third_party/WebKit/public/web/WebDocument.h" #include "third_party/WebKit/public/web/WebDocumentLoader.h" +#include "third_party/WebKit/public/web/WebImeTextSpan.h" #include "third_party/WebKit/public/web/WebLocalFrame.h" #include "third_party/WebKit/public/web/WebPluginContainer.h" #include "third_party/WebKit/public/web/WebPluginScriptForbiddenScope.h" @@ -945,22 +945,19 @@ bool PepperPluginInstanceImpl::SendCompositionEventToPlugin( PP_InputEvent_Type type, const base::string16& text) { - std::vector<blink::WebCompositionUnderline> empty; - return SendCompositionEventWithUnderlineInformationToPlugin( - type, - text, - empty, - static_cast<int>(text.size()), + std::vector<blink::WebImeTextSpan> empty; + return SendCompositionEventWithImeTextSpanInformationToPlugin( + type, text, empty, static_cast<int>(text.size()), static_cast<int>(text.size())); } -bool -PepperPluginInstanceImpl::SendCompositionEventWithUnderlineInformationToPlugin( - PP_InputEvent_Type type, - const base::string16& text, - const std::vector<blink::WebCompositionUnderline>& underlines, - int selection_start, - int selection_end) { +bool PepperPluginInstanceImpl:: + SendCompositionEventWithImeTextSpanInformationToPlugin( + PP_InputEvent_Type type, + const base::string16& text, + const std::vector<blink::WebImeTextSpan>& ime_text_spans, + int selection_start, + int selection_end) { // Keep a reference on the stack. See NOTE above. scoped_refptr<PepperPluginInstanceImpl> ref(this); @@ -981,9 +978,9 @@ std::vector<size_t> utf16_offsets; utf16_offsets.push_back(selection_start); utf16_offsets.push_back(selection_end); - for (size_t i = 0; i < underlines.size(); ++i) { - utf16_offsets.push_back(underlines[i].start_offset); - utf16_offsets.push_back(underlines[i].end_offset); + for (size_t i = 0; i < ime_text_spans.size(); ++i) { + utf16_offsets.push_back(ime_text_spans[i].start_offset); + utf16_offsets.push_back(ime_text_spans[i].end_offset); } std::vector<size_t> utf8_offsets(utf16_offsets); event.character_text = base::UTF16ToUTF8AndAdjustOffsets(text, &utf8_offsets); @@ -1006,8 +1003,8 @@ offset_set.end()); // Set the composition target. - for (size_t i = 0; i < underlines.size(); ++i) { - if (underlines[i].thick) { + for (size_t i = 0; i < ime_text_spans.size(); ++i) { + if (ime_text_spans[i].thick) { std::vector<uint32_t>::iterator it = std::find(event.composition_segment_offsets.begin(), event.composition_segment_offsets.end(), @@ -1049,15 +1046,12 @@ bool PepperPluginInstanceImpl::HandleCompositionUpdate( const base::string16& text, - const std::vector<blink::WebCompositionUnderline>& underlines, + const std::vector<blink::WebImeTextSpan>& ime_text_spans, int selection_start, int selection_end) { - return SendCompositionEventWithUnderlineInformationToPlugin( - PP_INPUTEVENT_TYPE_IME_COMPOSITION_UPDATE, - text, - underlines, - selection_start, - selection_end); + return SendCompositionEventWithImeTextSpanInformationToPlugin( + PP_INPUTEVENT_TYPE_IME_COMPOSITION_UPDATE, text, ime_text_spans, + selection_start, selection_end); } bool PepperPluginInstanceImpl::HandleCompositionEnd( @@ -2335,7 +2329,7 @@ return false; render_frame_->SimulateImeCommitText( base::UTF8ToUTF16(input_event.character_text), - std::vector<blink::WebCompositionUnderline>(), gfx::Range()); + std::vector<blink::WebImeTextSpan>(), gfx::Range()); break; default: return false; @@ -2358,18 +2352,18 @@ base::string16 utf16_text = base::UTF8ToUTF16AndAdjustOffsets(input_event.character_text, &offsets); - std::vector<blink::WebCompositionUnderline> underlines; + std::vector<blink::WebImeTextSpan> ime_text_spans; for (size_t i = 2; i + 1 < offsets.size(); ++i) { - blink::WebCompositionUnderline underline; - underline.start_offset = offsets[i]; - underline.end_offset = offsets[i + 1]; + blink::WebImeTextSpan ime_text_span; + ime_text_span.start_offset = offsets[i]; + ime_text_span.end_offset = offsets[i + 1]; if (input_event.composition_target_segment == static_cast<int32_t>(i - 2)) - underline.thick = true; - underlines.push_back(underline); + ime_text_span.thick = true; + ime_text_spans.push_back(ime_text_span); } - render_frame_->SimulateImeSetComposition( - utf16_text, underlines, offsets[0], offsets[1]); + render_frame_->SimulateImeSetComposition(utf16_text, ime_text_spans, + offsets[0], offsets[1]); } ContentDecryptorDelegate*
diff --git a/content/renderer/pepper/pepper_plugin_instance_impl.h b/content/renderer/pepper/pepper_plugin_instance_impl.h index f0cc2331..11e1961d 100644 --- a/content/renderer/pepper/pepper_plugin_instance_impl.h +++ b/content/renderer/pepper/pepper_plugin_instance_impl.h
@@ -78,7 +78,7 @@ class WebMouseEvent; class WebPluginContainer; class WebURLResponse; -struct WebCompositionUnderline; +struct WebImeTextSpan; struct WebCursorInfo; struct WebURLError; struct WebPrintParams; @@ -240,7 +240,7 @@ bool HandleCompositionStart(const base::string16& text); bool HandleCompositionUpdate( const base::string16& text, - const std::vector<blink::WebCompositionUnderline>& underlines, + const std::vector<blink::WebImeTextSpan>& ime_text_spans, int selection_start, int selection_end); bool HandleCompositionEnd(const base::string16& text); @@ -688,10 +688,10 @@ // Internal helper functions for HandleCompositionXXX(). bool SendCompositionEventToPlugin(PP_InputEvent_Type type, const base::string16& text); - bool SendCompositionEventWithUnderlineInformationToPlugin( + bool SendCompositionEventWithImeTextSpanInformationToPlugin( PP_InputEvent_Type type, const base::string16& text, - const std::vector<blink::WebCompositionUnderline>& underlines, + const std::vector<blink::WebImeTextSpan>& ime_text_spans, int selection_start, int selection_end);
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index f0b6745..971139b7 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc
@@ -1478,19 +1478,19 @@ void RenderFrameImpl::SimulateImeSetComposition( const base::string16& text, - const std::vector<blink::WebCompositionUnderline>& underlines, + const std::vector<blink::WebImeTextSpan>& ime_text_spans, int selection_start, int selection_end) { - render_view_->OnImeSetComposition( - text, underlines, gfx::Range::InvalidRange(), - selection_start, selection_end); + render_view_->OnImeSetComposition(text, ime_text_spans, + gfx::Range::InvalidRange(), selection_start, + selection_end); } void RenderFrameImpl::SimulateImeCommitText( const base::string16& text, - const std::vector<blink::WebCompositionUnderline>& underlines, + const std::vector<blink::WebImeTextSpan>& ime_text_spans, const gfx::Range& replacement_range) { - render_view_->OnImeCommitText(text, underlines, replacement_range, 0); + render_view_->OnImeCommitText(text, ime_text_spans, replacement_range, 0); } void RenderFrameImpl::SimulateImeFinishComposingText(bool keep_selection) { @@ -1499,7 +1499,7 @@ void RenderFrameImpl::OnImeSetComposition( const base::string16& text, - const std::vector<blink::WebCompositionUnderline>& underlines, + const std::vector<blink::WebImeTextSpan>& ime_text_spans, int selection_start, int selection_end) { // When a PPAPI plugin has focus, we bypass WebKit. @@ -1523,7 +1523,8 @@ // Nonempty: composition is ongoing. if (!pepper_composition_text_.empty()) { focused_pepper_plugin_->HandleCompositionUpdate( - pepper_composition_text_, underlines, selection_start, selection_end); + pepper_composition_text_, ime_text_spans, selection_start, + selection_end); } } } @@ -2215,10 +2216,11 @@ } void RenderFrameImpl::OnSetCompositionFromExistingText( - int start, int end, - const std::vector<blink::WebCompositionUnderline>& underlines) { + int start, + int end, + const std::vector<blink::WebImeTextSpan>& ime_text_spans) { ImeEventGuard guard(GetRenderWidget()); - frame_->SetCompositionFromExistingText(start, end, underlines); + frame_->SetCompositionFromExistingText(start, end, ime_text_spans); } void RenderFrameImpl::OnExecuteNoValueEditCommand(const std::string& name) {
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h index d83c434..8b5770dd 100644 --- a/content/renderer/render_frame_impl.h +++ b/content/renderer/render_frame_impl.h
@@ -103,7 +103,7 @@ class WebPresentationClient; class WebPushClient; class WebSecurityOrigin; -struct WebCompositionUnderline; +struct WebImeTextSpan; struct WebContextMenuData; struct WebCursorInfo; struct WebFindOptions; @@ -372,12 +372,12 @@ // Simulates IME events for testing purpose. void SimulateImeSetComposition( const base::string16& text, - const std::vector<blink::WebCompositionUnderline>& underlines, + const std::vector<blink::WebImeTextSpan>& ime_text_spans, int selection_start, int selection_end); void SimulateImeCommitText( const base::string16& text, - const std::vector<blink::WebCompositionUnderline>& underlines, + const std::vector<blink::WebImeTextSpan>& ime_text_spans, const gfx::Range& replacement_range); void SimulateImeFinishComposingText(bool keep_selection); @@ -385,7 +385,7 @@ // RenderFrame. void OnImeSetComposition( const base::string16& text, - const std::vector<blink::WebCompositionUnderline>& underlines, + const std::vector<blink::WebImeTextSpan>& ime_text_spans, int selection_start, int selection_end); void OnImeCommitText(const base::string16& text, @@ -940,8 +940,9 @@ void OnVisualStateRequest(uint64_t key); void OnSetEditableSelectionOffsets(int start, int end); void OnSetCompositionFromExistingText( - int start, int end, - const std::vector<blink::WebCompositionUnderline>& underlines); + int start, + int end, + const std::vector<blink::WebImeTextSpan>& ime_text_spans); void OnExecuteNoValueEditCommand(const std::string& name); void OnExtendSelectionAndDelete(int before, int after); void OnDeleteSurroundingText(int before, int after);
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc index 6ce744eb..ed991b7 100644 --- a/content/renderer/render_thread_impl.cc +++ b/content/renderer/render_thread_impl.cc
@@ -669,13 +669,13 @@ IsRunningInMash() ? ui::mojom::kServiceName : mojom::kBrowserServiceName, GetIOTaskRunner()); - cc::mojom::SharedBitmapAllocationNotifierPtr + viz::mojom::SharedBitmapAllocationNotifierPtr shared_bitmap_allocation_notifier_ptr; GetConnector()->BindInterface( mojom::kBrowserServiceName, mojo::MakeRequest(&shared_bitmap_allocation_notifier_ptr)); shared_bitmap_manager_ = base::MakeUnique<viz::ClientSharedBitmapManager>( - cc::mojom::ThreadSafeSharedBitmapAllocationNotifierPtr::Create( + viz::mojom::ThreadSafeSharedBitmapAllocationNotifierPtr::Create( shared_bitmap_allocation_notifier_ptr.PassInterface(), GetChannel()->ipc_task_runner_refptr()));
diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc index dec950f..8a8b844 100644 --- a/content/renderer/render_view_browsertest.cc +++ b/content/renderer/render_view_browsertest.cc
@@ -1256,15 +1256,13 @@ case IME_SETCOMPOSITION: view()->OnImeSetComposition( base::WideToUTF16(ime_message->ime_string), - std::vector<blink::WebCompositionUnderline>(), - gfx::Range::InvalidRange(), - ime_message->selection_start, - ime_message->selection_end); + std::vector<blink::WebImeTextSpan>(), gfx::Range::InvalidRange(), + ime_message->selection_start, ime_message->selection_end); break; case IME_COMMITTEXT: view()->OnImeCommitText(base::WideToUTF16(ime_message->ime_string), - std::vector<blink::WebCompositionUnderline>(), + std::vector<blink::WebImeTextSpan>(), gfx::Range::InvalidRange(), 0); break; @@ -1273,11 +1271,9 @@ break; case IME_CANCELCOMPOSITION: - view()->OnImeSetComposition( - base::string16(), - std::vector<blink::WebCompositionUnderline>(), - gfx::Range::InvalidRange(), - 0, 0); + view()->OnImeSetComposition(base::string16(), + std::vector<blink::WebImeTextSpan>(), + gfx::Range::InvalidRange(), 0, 0); break; } @@ -1511,48 +1507,44 @@ ExecuteJavaScriptForTests("document.getElementById('test').focus();"); const base::string16 empty_string; - const std::vector<blink::WebCompositionUnderline> empty_underline; + const std::vector<blink::WebImeTextSpan> empty_ime_text_span; std::vector<gfx::Rect> bounds; view()->OnSetFocus(true); // ASCII composition const base::string16 ascii_composition = base::UTF8ToUTF16("aiueo"); - view()->OnImeSetComposition(ascii_composition, empty_underline, + view()->OnImeSetComposition(ascii_composition, empty_ime_text_span, gfx::Range::InvalidRange(), 0, 0); view()->GetCompositionCharacterBounds(&bounds); ASSERT_EQ(ascii_composition.size(), bounds.size()); for (size_t i = 0; i < bounds.size(); ++i) EXPECT_LT(0, bounds[i].width()); - view()->OnImeCommitText(empty_string, - std::vector<blink::WebCompositionUnderline>(), + view()->OnImeCommitText(empty_string, std::vector<blink::WebImeTextSpan>(), gfx::Range::InvalidRange(), 0); // Non surrogate pair unicode character. const base::string16 unicode_composition = base::UTF8ToUTF16( "\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A"); - view()->OnImeSetComposition(unicode_composition, empty_underline, + view()->OnImeSetComposition(unicode_composition, empty_ime_text_span, gfx::Range::InvalidRange(), 0, 0); view()->GetCompositionCharacterBounds(&bounds); ASSERT_EQ(unicode_composition.size(), bounds.size()); for (size_t i = 0; i < bounds.size(); ++i) EXPECT_LT(0, bounds[i].width()); - view()->OnImeCommitText(empty_string, empty_underline, + view()->OnImeCommitText(empty_string, empty_ime_text_span, gfx::Range::InvalidRange(), 0); // Surrogate pair character. const base::string16 surrogate_pair_char = base::UTF8ToUTF16("\xF0\xA0\xAE\x9F"); - view()->OnImeSetComposition(surrogate_pair_char, - empty_underline, - gfx::Range::InvalidRange(), - 0, - 0); + view()->OnImeSetComposition(surrogate_pair_char, empty_ime_text_span, + gfx::Range::InvalidRange(), 0, 0); view()->GetCompositionCharacterBounds(&bounds); ASSERT_EQ(surrogate_pair_char.size(), bounds.size()); EXPECT_LT(0, bounds[0].width()); EXPECT_EQ(0, bounds[1].width()); - view()->OnImeCommitText(empty_string, empty_underline, + view()->OnImeCommitText(empty_string, empty_ime_text_span, gfx::Range::InvalidRange(), 0); // Mixed string. @@ -1563,10 +1555,8 @@ const bool is_surrogate_pair_empty_rect[8] = { false, true, false, false, true, false, false, true }; view()->OnImeSetComposition(surrogate_pair_mixed_composition, - empty_underline, - gfx::Range::InvalidRange(), - 0, - 0); + empty_ime_text_span, gfx::Range::InvalidRange(), + 0, 0); view()->GetCompositionCharacterBounds(&bounds); ASSERT_EQ(utf16_length, bounds.size()); for (size_t i = 0; i < utf16_length; ++i) { @@ -1576,7 +1566,7 @@ EXPECT_LT(0, bounds[i].width()); } } - view()->OnImeCommitText(empty_string, empty_underline, + view()->OnImeCommitText(empty_string, empty_ime_text_span, gfx::Range::InvalidRange(), 0); } #endif @@ -1592,8 +1582,8 @@ "</html>"); ExecuteJavaScriptForTests("document.getElementById('test1').focus();"); frame()->SetEditableSelectionOffsets(4, 8); - const std::vector<blink::WebCompositionUnderline> empty_underline; - frame()->SetCompositionFromExistingText(7, 10, empty_underline); + const std::vector<blink::WebImeTextSpan> empty_ime_text_span; + frame()->SetCompositionFromExistingText(7, 10, empty_ime_text_span); blink::WebInputMethodController* controller = frame()->GetWebFrame()->GetInputMethodController(); blink::WebTextInputInfo info = controller->TextInputInfo(); @@ -2457,13 +2447,13 @@ ExecuteJavaScriptForTests("document.getElementById('test').focus();"); const base::string16 empty_string; - const std::vector<blink::WebCompositionUnderline> empty_underline; + const std::vector<blink::WebImeTextSpan> empty_ime_text_span; std::vector<gfx::Rect> bounds_at_1x; view()->OnSetFocus(true); // ASCII composition const base::string16 ascii_composition = base::UTF8ToUTF16("aiueo"); - view()->OnImeSetComposition(ascii_composition, empty_underline, + view()->OnImeSetComposition(ascii_composition, empty_ime_text_span, gfx::Range::InvalidRange(), 0, 0); view()->GetCompositionCharacterBounds(&bounds_at_1x); ASSERT_EQ(ascii_composition.size(), bounds_at_1x.size());
diff --git a/content/renderer/render_view_browsertest_mac.mm b/content/renderer/render_view_browsertest_mac.mm index c425813..21e28f8 100644 --- a/content/renderer/render_view_browsertest_mac.mm +++ b/content/renderer/render_view_browsertest_mac.mm
@@ -23,7 +23,7 @@ #include <Cocoa/Cocoa.h> using blink::WebFrameContentDumper; -using blink::WebCompositionUnderline; +using blink::WebImeTextSpan; namespace content { @@ -182,11 +182,11 @@ // Simulate some IME related IPCs. using Text = base::string16; - using Underlines = std::vector<blink::WebCompositionUnderline>; + using ImeTextSpans = std::vector<blink::WebImeTextSpan>; view->OnMessageReceived(InputMsg_ImeSetComposition( - routing_id, Text(), Underlines(), Range(), 0, 0)); + routing_id, Text(), ImeTextSpans(), Range(), 0, 0)); view->OnMessageReceived( - InputMsg_ImeCommitText(routing_id, Text(), Underlines(), Range(), 0)); + InputMsg_ImeCommitText(routing_id, Text(), ImeTextSpans(), Range(), 0)); view->OnMessageReceived(InputMsg_ImeFinishComposingText(routing_id, false)); }
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc index 89e9a3af..5c373d4 100644 --- a/content/renderer/render_widget.cc +++ b/content/renderer/render_widget.cc
@@ -120,7 +120,7 @@ #include "content/renderer/text_input_client_observer.h" #endif -using blink::WebCompositionUnderline; +using blink::WebImeTextSpan; using blink::WebCursorInfo; using blink::WebDeviceEmulationParams; using blink::WebDragOperation; @@ -1660,15 +1660,16 @@ void RenderWidget::OnImeSetComposition( const base::string16& text, - const std::vector<WebCompositionUnderline>& underlines, + const std::vector<WebImeTextSpan>& ime_text_spans, const gfx::Range& replacement_range, - int selection_start, int selection_end) { + int selection_start, + int selection_end) { if (!ShouldHandleImeEvents()) return; #if BUILDFLAG(ENABLE_PLUGINS) if (auto* plugin = GetFocusedPepperPluginInsideWidget()) { - plugin->render_frame()->OnImeSetComposition(text, underlines, + plugin->render_frame()->OnImeSetComposition(text, ime_text_spans, selection_start, selection_end); return; } @@ -1677,8 +1678,7 @@ blink::WebInputMethodController* controller = GetInputMethodController(); if (!controller || !controller->SetComposition( - WebString::FromUTF16(text), - WebVector<WebCompositionUnderline>(underlines), + WebString::FromUTF16(text), WebVector<WebImeTextSpan>(ime_text_spans), replacement_range.IsValid() ? WebRange(replacement_range.start(), replacement_range.length()) : WebRange(), @@ -1693,7 +1693,7 @@ void RenderWidget::OnImeCommitText( const base::string16& text, - const std::vector<WebCompositionUnderline>& underlines, + const std::vector<WebImeTextSpan>& ime_text_spans, const gfx::Range& replacement_range, int relative_cursor_pos) { if (!ShouldHandleImeEvents()) @@ -1710,8 +1710,7 @@ input_handler_->set_handling_input_event(true); if (auto* controller = GetInputMethodController()) { controller->CommitText( - WebString::FromUTF16(text), - WebVector<WebCompositionUnderline>(underlines), + WebString::FromUTF16(text), WebVector<WebImeTextSpan>(ime_text_spans), replacement_range.IsValid() ? WebRange(replacement_range.start(), replacement_range.length()) : WebRange(),
diff --git a/content/renderer/render_widget.h b/content/renderer/render_widget.h index ab1b3ea..3785f02 100644 --- a/content/renderer/render_widget.h +++ b/content/renderer/render_widget.h
@@ -52,7 +52,7 @@ #include "third_party/WebKit/public/platform/WebRect.h" #include "third_party/WebKit/public/platform/WebReferrerPolicy.h" #include "third_party/WebKit/public/platform/WebTextInputInfo.h" -#include "third_party/WebKit/public/web/WebCompositionUnderline.h" +#include "third_party/WebKit/public/web/WebImeTextSpan.h" #include "third_party/WebKit/public/web/WebPopupType.h" #include "third_party/WebKit/public/web/WebTextDirection.h" #include "third_party/WebKit/public/web/WebWidget.h" @@ -435,15 +435,14 @@ void OnSetEditCommandsForNextKeyEvent(const EditCommands& edit_commands); void OnImeSetComposition( const base::string16& text, - const std::vector<blink::WebCompositionUnderline>& underlines, + const std::vector<blink::WebImeTextSpan>& ime_text_spans, const gfx::Range& replacement_range, int selection_start, int selection_end); - void OnImeCommitText( - const base::string16& text, - const std::vector<blink::WebCompositionUnderline>& underlines, - const gfx::Range& replacement_range, - int relative_cursor_pos); + void OnImeCommitText(const base::string16& text, + const std::vector<blink::WebImeTextSpan>& ime_text_spans, + const gfx::Range& replacement_range, + int relative_cursor_pos); void OnImeFinishComposingText(bool keep_selection); // Called by the browser process to update text input state.
diff --git a/content/renderer/render_widget_browsertest.cc b/content/renderer/render_widget_browsertest.cc index 3f8fcf9..7d4cc20 100644 --- a/content/renderer/render_widget_browsertest.cc +++ b/content/renderer/render_widget_browsertest.cc
@@ -37,10 +37,9 @@ } void CommitText(std::string text) { - widget()->OnImeCommitText( - base::UTF8ToUTF16(text), - std::vector<blink::WebCompositionUnderline>(), - gfx::Range::InvalidRange(), 0); + widget()->OnImeCommitText(base::UTF8ToUTF16(text), + std::vector<blink::WebImeTextSpan>(), + gfx::Range::InvalidRange(), 0); } ui::TextInputType GetTextInputType() { return widget()->GetTextInputType(); } @@ -128,10 +127,10 @@ LoadHTML( "<div contenteditable>EDITABLE</div>" "<script> document.querySelector('div').focus(); </script>"); - blink::WebVector<blink::WebCompositionUnderline> emptyUnderlines; + blink::WebVector<blink::WebImeTextSpan> empty_ime_text_spans; DCHECK(widget()->GetInputMethodController()); - widget()->GetInputMethodController()->SetComposition("hello", emptyUnderlines, - blink::WebRange(), 3, 3); + widget()->GetInputMethodController()->SetComposition( + "hello", empty_ime_text_spans, blink::WebRange(), 3, 3); gfx::Range range; GetCompositionRange(&range); EXPECT_TRUE(range.IsValid());
diff --git a/content/renderer/render_widget_fullscreen_pepper.cc b/content/renderer/render_widget_fullscreen_pepper.cc index a40db586f..4206136 100644 --- a/content/renderer/render_widget_fullscreen_pepper.cc +++ b/content/renderer/render_widget_fullscreen_pepper.cc
@@ -30,7 +30,7 @@ using blink::WebCanvas; using blink::WebCoalescedInputEvent; -using blink::WebCompositionUnderline; +using blink::WebImeTextSpan; using blink::WebCursorInfo; using blink::WebGestureEvent; using blink::WebInputEvent;
diff --git a/content/renderer/renderer.sb b/content/renderer/renderer.sb index fd54bf7..daa3666 100644 --- a/content/renderer/renderer.sb +++ b/content/renderer/renderer.sb
@@ -33,8 +33,12 @@ ; https://crbug.com/288697 (allow file-read* - (path "/private/etc/localtime") - (subpath "/usr/share/zoneinfo")) + (path "/private/etc/localtime")) + +; https://crbug.com/754280 +(if (param-true? macos-1013) + (allow file-read-data (subpath "/usr/share/zoneinfo.default")) + (allow file-read-data (subpath "/usr/share/zoneinfo"))) (allow file-read-metadata (path "/private/etc"))
diff --git a/content/shell/android/BUILD.gn b/content/shell/android/BUILD.gn index 4451c1ed..2187a04f 100644 --- a/content/shell/android/BUILD.gn +++ b/content/shell/android/BUILD.gn
@@ -7,6 +7,9 @@ import("//build/config/android/rules.gni") import("//third_party/icu/config.gni") +content_shell_manifest = + "$target_gen_dir/content_shell_manifest/AndroidManifest.xml" + generate_jni("content_shell_jni_headers") { jni_package = "content/shell" sources = [ @@ -60,6 +63,7 @@ testonly = true deps = [ ":content_shell_java_resources", + ":content_shell_manifest", "//base:base_java", "//base:base_java_test_support", "//content/public/android:content_java", @@ -76,10 +80,10 @@ "java/src/org/chromium/content_shell/ShellManager.java", "java/src/org/chromium/content_shell/ShellViewAndroidDelegate.java", ] -} -content_shell_manifest = - "$target_gen_dir/content_shell_manifest/AndroidManifest.xml" + # Manifest used for linting (determining unused resources). + android_manifest = content_shell_manifest +} jinja_template("content_shell_manifest") { testonly = true
diff --git a/content/shell/android/java/src/org/chromium/content_shell/ShellViewAndroidDelegate.java b/content/shell/android/java/src/org/chromium/content_shell/ShellViewAndroidDelegate.java index 0e51e9d..3e0f852 100644 --- a/content/shell/android/java/src/org/chromium/content_shell/ShellViewAndroidDelegate.java +++ b/content/shell/android/java/src/org/chromium/content_shell/ShellViewAndroidDelegate.java
@@ -4,8 +4,11 @@ package org.chromium.content_shell; +import android.graphics.Bitmap; import android.view.ViewGroup; +import org.chromium.base.test.util.CallbackHelper; +import org.chromium.blink_public.web.WebCursorInfoType; import org.chromium.ui.base.ViewAndroidDelegate; /** @@ -13,14 +16,47 @@ * Extended for testing. */ public class ShellViewAndroidDelegate extends ViewAndroidDelegate { + /** + * CallbackHelper for cursor update. + */ + public static class OnCursorUpdateHelper extends CallbackHelper { + private int mPointerType; + public void notifyCalled(int type) { + mPointerType = type; + notifyCalled(); + } + public int getPointerType() { + assert getCallCount() > 0; + return mPointerType; + } + } + private final ViewGroup mContainerView; + private final OnCursorUpdateHelper mOnCursorUpdateHelper; public ShellViewAndroidDelegate(ViewGroup containerView) { mContainerView = containerView; + mOnCursorUpdateHelper = new OnCursorUpdateHelper(); } @Override public ViewGroup getContainerView() { return mContainerView; } + + public OnCursorUpdateHelper getOnCursorUpdateHelper() { + return mOnCursorUpdateHelper; + } + + @Override + public void onCursorChangedToCustom(Bitmap customCursorBitmap, int hotspotX, int hotspotY) { + super.onCursorChangedToCustom(customCursorBitmap, hotspotX, hotspotY); + mOnCursorUpdateHelper.notifyCalled(WebCursorInfoType.TYPE_CUSTOM); + } + + @Override + public void onCursorChanged(int cursorType) { + super.onCursorChanged(cursorType); + mOnCursorUpdateHelper.notifyCalled(cursorType); + } }
diff --git a/content/shell/android/javatests/src/org/chromium/content_shell_apk/ContentShellActivityTestRule.java b/content/shell/android/javatests/src/org/chromium/content_shell_apk/ContentShellActivityTestRule.java index 7106f5d..7f704821 100644 --- a/content/shell/android/javatests/src/org/chromium/content_shell_apk/ContentShellActivityTestRule.java +++ b/content/shell/android/javatests/src/org/chromium/content_shell_apk/ContentShellActivityTestRule.java
@@ -21,6 +21,7 @@ import org.chromium.content_public.browser.NavigationController; import org.chromium.content_public.browser.WebContents; import org.chromium.content_shell.Shell; +import org.chromium.content_shell.ShellViewAndroidDelegate.OnCursorUpdateHelper; import org.chromium.content_shell_apk.ContentShellTestCommon.TestCommonCallback; import java.lang.annotation.ElementType; @@ -76,6 +77,13 @@ } /** + * Returns the OnCursorUpdateHelper. + */ + public OnCursorUpdateHelper getOnCursorUpdateHelper() throws ExecutionException { + return mDelegate.getOnCursorUpdateHelper(); + } + + /** * Returns the current ContentViewCore or null if there is no ContentView. */ public ContentViewCore getContentViewCore() {
diff --git a/content/shell/android/javatests/src/org/chromium/content_shell_apk/ContentShellTestCommon.java b/content/shell/android/javatests/src/org/chromium/content_shell_apk/ContentShellTestCommon.java index cac7590b..75ac4bc 100644 --- a/content/shell/android/javatests/src/org/chromium/content_shell_apk/ContentShellTestCommon.java +++ b/content/shell/android/javatests/src/org/chromium/content_shell_apk/ContentShellTestCommon.java
@@ -32,6 +32,7 @@ import org.chromium.content_public.browser.NavigationController; import org.chromium.content_public.browser.WebContents; import org.chromium.content_shell.Shell; +import org.chromium.content_shell.ShellViewAndroidDelegate.OnCursorUpdateHelper; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; @@ -118,6 +119,18 @@ }, WAIT_FOR_ACTIVE_SHELL_LOADING_TIMEOUT, CriteriaHelper.DEFAULT_POLLING_INTERVAL); } + OnCursorUpdateHelper getOnCursorUpdateHelper() throws ExecutionException { + return ThreadUtils.runOnUiThreadBlocking(new Callable<OnCursorUpdateHelper>() { + @Override + public OnCursorUpdateHelper call() { + return mCallback.getActivityForTestCommon() + .getActiveShell() + .getViewAndroidDelegate() + .getOnCursorUpdateHelper(); + } + }); + } + ContentViewCore getContentViewCore() { return mCallback.getActivityForTestCommon().getActiveShell().getContentViewCore(); }
diff --git a/content/shell/app/blink_test_platform_support_win.cc b/content/shell/app/blink_test_platform_support_win.cc index 672895e..3694b22e 100644 --- a/content/shell/app/blink_test_platform_support_win.cc +++ b/content/shell/app/blink_test_platform_support_win.cc
@@ -19,12 +19,6 @@ #include "base/strings/utf_string_conversions.h" #include "ui/gfx/win/direct_write.h" -#define SIZEOF_STRUCT_WITH_SPECIFIED_LAST_MEMBER(struct_name, member) \ - offsetof(struct_name, member) + \ - (sizeof static_cast<struct_name*>(0)->member) -#define NONCLIENTMETRICS_SIZE_PRE_VISTA \ - SIZEOF_STRUCT_WITH_SPECIFIED_LAST_MEMBER(NONCLIENTMETRICS, lfMessageFont) - namespace content { namespace { @@ -57,35 +51,25 @@ if (::GetSystemMetrics(SM_CXVSCROLL) != 17) errors.push_back("Must use normal size fonts (96 dpi)."); - // Check that we're using the default system fonts. - OSVERSIONINFO version_info = {0}; - version_info.dwOSVersionInfoSize = sizeof(version_info); - ::GetVersionEx(&version_info); - bool is_vista_or_later = (version_info.dwMajorVersion >= 6); NONCLIENTMETRICS metrics = {0}; - metrics.cbSize = is_vista_or_later ? sizeof(NONCLIENTMETRICS) - : NONCLIENTMETRICS_SIZE_PRE_VISTA; + metrics.cbSize = sizeof(NONCLIENTMETRICS); bool success = !!::SystemParametersInfo( SPI_GETNONCLIENTMETRICS, metrics.cbSize, &metrics, 0); CHECK(success); LOGFONTW* system_fonts[] = {&metrics.lfStatusFont, &metrics.lfMenuFont, &metrics.lfSmCaptionFont}; - const wchar_t* required_font = is_vista_or_later ? L"Segoe UI" : L"Tahoma"; - int required_font_size = is_vista_or_later ? -12 : -11; + const wchar_t required_font[] = L"Segoe UI"; + int required_font_size = -12; for (size_t i = 0; i < arraysize(system_fonts); ++i) { if (system_fonts[i]->lfHeight != required_font_size || wcscmp(required_font, system_fonts[i]->lfFaceName)) { - errors.push_back(is_vista_or_later - ? "Must use either the Aero or Basic theme." - : "Must use the default XP theme (Luna)."); + errors.push_back("Must use either the Aero or Basic theme."); break; } } - for (std::list<std::string>::iterator it = errors.begin(); it != errors.end(); - ++it) { - std::cerr << *it << "\n"; - } + for (const auto& error : errors) + std::cerr << error << "\n"; return errors.empty(); }
diff --git a/content/shell/test_runner/text_input_controller.cc b/content/shell/test_runner/text_input_controller.cc index 9e7d7ba..d9f0929 100644 --- a/content/shell/test_runner/text_input_controller.cc +++ b/content/shell/test_runner/text_input_controller.cc
@@ -14,8 +14,8 @@ #include "third_party/WebKit/public/platform/WebCoalescedInputEvent.h" #include "third_party/WebKit/public/platform/WebInputEventResult.h" #include "third_party/WebKit/public/platform/WebKeyboardEvent.h" -#include "third_party/WebKit/public/web/WebCompositionUnderline.h" #include "third_party/WebKit/public/web/WebFrameWidget.h" +#include "third_party/WebKit/public/web/WebImeTextSpan.h" #include "third_party/WebKit/public/web/WebInputMethodController.h" #include "third_party/WebKit/public/web/WebKit.h" #include "third_party/WebKit/public/web/WebLocalFrame.h" @@ -173,7 +173,7 @@ void TextInputController::InsertText(const std::string& text) { if (auto* controller = GetInputMethodController()) { controller->CommitText(blink::WebString::FromUTF8(text), - std::vector<blink::WebCompositionUnderline>(), + std::vector<blink::WebImeTextSpan>(), blink::WebRange(), 0); } } @@ -202,28 +202,28 @@ blink::WebString web_text(blink::WebString::FromUTF8(text)); // Split underline into up to 3 elements (before, selection, and after). - std::vector<blink::WebCompositionUnderline> underlines; - blink::WebCompositionUnderline underline; + std::vector<blink::WebImeTextSpan> ime_text_spans; + blink::WebImeTextSpan ime_text_span; if (!start) { - underline.end_offset = length; + ime_text_span.end_offset = length; } else { - underline.end_offset = start; - underlines.push_back(underline); - underline.start_offset = start; - underline.end_offset = start + length; + ime_text_span.end_offset = start; + ime_text_spans.push_back(ime_text_span); + ime_text_span.start_offset = start; + ime_text_span.end_offset = start + length; } - underline.thick = true; - underlines.push_back(underline); + ime_text_span.thick = true; + ime_text_spans.push_back(ime_text_span); if (start + length < static_cast<int>(web_text.length())) { - underline.start_offset = underline.end_offset; - underline.end_offset = web_text.length(); - underline.thick = false; - underlines.push_back(underline); + ime_text_span.start_offset = ime_text_span.end_offset; + ime_text_span.end_offset = web_text.length(); + ime_text_span.thick = false; + ime_text_spans.push_back(ime_text_span); } if (auto* controller = GetInputMethodController()) { - controller->SetComposition(web_text, underlines, blink::WebRange(), start, - start + length); + controller->SetComposition(web_text, ime_text_spans, blink::WebRange(), + start, start + length); } } @@ -311,12 +311,12 @@ blink::WebString newText = blink::WebString::FromUTF8(text); size_t textLength = newText.length(); - std::vector<blink::WebCompositionUnderline> underlines; - underlines.push_back(blink::WebCompositionUnderline( - 0, textLength, SK_ColorBLACK, false, SK_ColorTRANSPARENT)); + std::vector<blink::WebImeTextSpan> ime_text_spans; + ime_text_spans.push_back(blink::WebImeTextSpan(0, textLength, SK_ColorBLACK, + false, SK_ColorTRANSPARENT)); if (auto* controller = GetInputMethodController()) { controller->SetComposition( - newText, blink::WebVector<blink::WebCompositionUnderline>(underlines), + newText, blink::WebVector<blink::WebImeTextSpan>(ime_text_spans), blink::WebRange(), textLength, textLength); } }
diff --git a/content/test/data/accessibility/aria/aria-col-attr-expected-mac.txt b/content/test/data/accessibility/aria/aria-col-attr-expected-mac.txt index 2f53480..e2f6b921 100644 --- a/content/test/data/accessibility/aria/aria-col-attr-expected-mac.txt +++ b/content/test/data/accessibility/aria/aria-col-attr-expected-mac.txt
@@ -1,5 +1,5 @@ AXWebArea -++AXGrid AXARIAColumnCount='5' +++AXTable AXARIAColumnCount='5' ++++AXRow ++++++AXCell AXTitle='cell 2' AXARIAColumnIndex='2' ++++++++AXStaticText AXValue='cell 2'
diff --git a/content/test/data/accessibility/aria/aria-columnheader-expected-mac.txt b/content/test/data/accessibility/aria/aria-columnheader-expected-mac.txt index ada8210..7c778711 100644 --- a/content/test/data/accessibility/aria/aria-columnheader-expected-mac.txt +++ b/content/test/data/accessibility/aria/aria-columnheader-expected-mac.txt
@@ -1,5 +1,5 @@ AXWebArea -++AXGrid +++AXTable ++++AXRow ++++++AXCell AXTitle='Browser' ++++++++AXStaticText AXValue='Browser'
diff --git a/content/test/data/accessibility/aria/aria-grid-expected-mac.txt b/content/test/data/accessibility/aria/aria-grid-expected-mac.txt index 22c6b08..68f4871 100644 --- a/content/test/data/accessibility/aria/aria-grid-expected-mac.txt +++ b/content/test/data/accessibility/aria/aria-grid-expected-mac.txt
@@ -1,5 +1,5 @@ AXWebArea AXRoleDescription='HTML content' -++AXGrid AXRoleDescription='grid' +++AXTable AXRoleDescription='table' ++++AXRow AXRoleDescription='row' ++++++AXCell AXRoleDescription='cell' AXTitle='Browser' ++++++++AXStaticText AXRoleDescription='text' AXValue='Browser'
diff --git a/content/test/data/accessibility/aria/aria-gridcell-expected-mac.txt b/content/test/data/accessibility/aria/aria-gridcell-expected-mac.txt index 22c6b08..68f4871 100644 --- a/content/test/data/accessibility/aria/aria-gridcell-expected-mac.txt +++ b/content/test/data/accessibility/aria/aria-gridcell-expected-mac.txt
@@ -1,5 +1,5 @@ AXWebArea AXRoleDescription='HTML content' -++AXGrid AXRoleDescription='grid' +++AXTable AXRoleDescription='table' ++++AXRow AXRoleDescription='row' ++++++AXCell AXRoleDescription='cell' AXTitle='Browser' ++++++++AXStaticText AXRoleDescription='text' AXValue='Browser'
diff --git a/content/test/data/accessibility/aria/aria-row-attr-expected-mac.txt b/content/test/data/accessibility/aria/aria-row-attr-expected-mac.txt index 35def74..a4fc45e 100644 --- a/content/test/data/accessibility/aria/aria-row-attr-expected-mac.txt +++ b/content/test/data/accessibility/aria/aria-row-attr-expected-mac.txt
@@ -1,5 +1,5 @@ AXWebArea -++AXGrid AXARIARowCount='5' +++AXTable AXARIARowCount='5' ++++AXRow ++++++AXCell AXTitle='cell 2' AXARIARowIndex='3' ++++++++AXStaticText AXValue='cell 2'
diff --git a/content/test/data/accessibility/aria/aria-row-expected-mac.txt b/content/test/data/accessibility/aria/aria-row-expected-mac.txt index ada8210..7c778711 100644 --- a/content/test/data/accessibility/aria/aria-row-expected-mac.txt +++ b/content/test/data/accessibility/aria/aria-row-expected-mac.txt
@@ -1,5 +1,5 @@ AXWebArea -++AXGrid +++AXTable ++++AXRow ++++++AXCell AXTitle='Browser' ++++++++AXStaticText AXValue='Browser'
diff --git a/content/test/data/accessibility/aria/aria-rowgroup-expected-mac.txt b/content/test/data/accessibility/aria/aria-rowgroup-expected-mac.txt index f22f6ef8..b8033e6 100644 --- a/content/test/data/accessibility/aria/aria-rowgroup-expected-mac.txt +++ b/content/test/data/accessibility/aria/aria-rowgroup-expected-mac.txt
@@ -1,5 +1,5 @@ AXWebArea -++AXGrid +++AXTable ++++AXRow ++++AXRow ++++AXGroup
diff --git a/content/test/data/accessibility/aria/aria-rowheader-expected-mac.txt b/content/test/data/accessibility/aria/aria-rowheader-expected-mac.txt index c8d13ff..5b6be0fa 100644 --- a/content/test/data/accessibility/aria/aria-rowheader-expected-mac.txt +++ b/content/test/data/accessibility/aria/aria-rowheader-expected-mac.txt
@@ -1,5 +1,5 @@ AXWebArea -++AXGrid +++AXTable ++++AXRow ++++++AXCell AXTitle='Browser' ++++++++AXStaticText AXValue='Browser'
diff --git a/content/test/data/accessibility/aria/aria-sort-aria-grid-expected-mac.txt b/content/test/data/accessibility/aria/aria-sort-aria-grid-expected-mac.txt index 747f5a01..b4b49bd 100644 --- a/content/test/data/accessibility/aria/aria-sort-aria-grid-expected-mac.txt +++ b/content/test/data/accessibility/aria/aria-sort-aria-grid-expected-mac.txt
@@ -1,5 +1,5 @@ AXWebArea -++AXGrid +++AXTable ++++AXRow ++++++AXCell AXTitle='Alphabet' ++++++++AXStaticText AXValue='Alphabet' @@ -11,7 +11,7 @@ ++++++++AXStaticText AXValue='B' ++++AXColumn ++++AXGroup -++AXGrid +++AXTable ++++AXRow ++++++AXCell AXTitle='Alphabet' ++++++++AXStaticText AXValue='Alphabet' @@ -23,7 +23,7 @@ ++++++++AXStaticText AXValue='B' ++++AXColumn ++++AXGroup -++AXGrid +++AXTable ++++AXRow ++++++AXCell AXTitle='Alphabet' AXSortDirection='AXAscendingSortDirection' ++++++++AXStaticText AXValue='Alphabet' @@ -35,7 +35,7 @@ ++++++++AXStaticText AXValue='B' ++++AXColumn ++++AXGroup -++AXGrid +++AXTable ++++AXRow ++++++AXCell AXTitle='Alphabet' AXSortDirection='AXDescendingSortDirection' ++++++++AXStaticText AXValue='Alphabet' @@ -47,7 +47,7 @@ ++++++++AXStaticText AXValue='A' ++++AXColumn ++++AXGroup -++AXGrid +++AXTable ++++AXRow ++++++AXCell AXTitle='Alphabet' AXSortDirection='AXUnknownSortDirection' ++++++++AXStaticText AXValue='Alphabet' @@ -59,7 +59,7 @@ ++++++++AXStaticText AXValue='A' ++++AXColumn ++++AXGroup -++AXGrid +++AXTable ++++AXRow ++++++AXCell AXTitle='Alphabet' ++++++++AXStaticText AXValue='Alphabet' @@ -71,7 +71,7 @@ ++++AXColumn ++++AXColumn ++++AXGroup -++AXGrid +++AXTable ++++AXRow ++++++AXCell AXTitle='Alphabet' ++++++++AXStaticText AXValue='Alphabet' @@ -83,7 +83,7 @@ ++++AXColumn ++++AXColumn ++++AXGroup -++AXGrid +++AXTable ++++AXRow ++++++AXCell AXTitle='Alphabet' AXSortDirection='AXAscendingSortDirection' ++++++++AXStaticText AXValue='Alphabet' @@ -95,7 +95,7 @@ ++++AXColumn ++++AXColumn ++++AXGroup -++AXGrid +++AXTable ++++AXRow ++++++AXCell AXTitle='Alphabet' AXSortDirection='AXDescendingSortDirection' ++++++++AXStaticText AXValue='Alphabet' @@ -107,7 +107,7 @@ ++++AXColumn ++++AXColumn ++++AXGroup -++AXGrid +++AXTable ++++AXRow ++++++AXCell AXTitle='Alphabet' AXSortDirection='AXUnknownSortDirection' ++++++++AXStaticText AXValue='Alphabet'
diff --git a/content/test/data/accessibility/aria/table-column-hidden-expected-mac.txt b/content/test/data/accessibility/aria/table-column-hidden-expected-mac.txt index 073f663..a178596 100644 --- a/content/test/data/accessibility/aria/table-column-hidden-expected-mac.txt +++ b/content/test/data/accessibility/aria/table-column-hidden-expected-mac.txt
@@ -1,5 +1,5 @@ AXWebArea -++AXGrid AXARIAColumnCount='4' +++AXTable AXARIAColumnCount='4' ++++AXRow ++++++AXCell AXTitle='Month' AXARIAColumnIndex='1' AXARIARowIndex='1' ++++++++AXStaticText AXValue='Month'
diff --git a/content/test/data/gpu/pixel_webgl_preserved_after_tab_switch.html b/content/test/data/gpu/pixel_webgl_preserved_after_tab_switch.html new file mode 100644 index 0000000..8263a49d --- /dev/null +++ b/content/test/data/gpu/pixel_webgl_preserved_after_tab_switch.html
@@ -0,0 +1,102 @@ +<!DOCTYPE HTML> +<!-- READ BEFORE UPDATING: +If this test is updated make sure to increment the "revision" value of the +associated test in content/test/gpu/page_sets/pixel_tests.py. This will ensure +that the baseline images are regenerated on the next run. +--> +<html> +<head> +<title>WebGL Test: WebGL Content Preserved after Tab Switched</title> +<style type="text/css"> + .nomargin { + margin: 0px auto; + } +</style> +<script src="pixel_webgl_util.js"></script> +</head> +<body onload="main()"> +<canvas id="source" width="100" height="100" class="nomargin"></canvas> +<canvas id="destination" width="100" height="100" class="nomargin"></canvas> + +<script id="vertex" type="x-shader"> +attribute vec2 aVertexPosition; +void main() { +gl_Position = vec4(aVertexPosition, 0.0, 1.0); +} +</script> + +<script id="fragment" type="x-shader"> +precision mediump float; +uniform vec4 uColor; +void main() { +gl_FragColor = uColor; +} +</script> + +<script> + window.canvasSource = document.getElementById("source"); + var canvasDestination = document.getElementById("destination"); + var canvasOptions = { + preserveDrawingBuffer: true + }; + var destinationContext = canvasDestination.getContext("2d", canvasOptions); + + window.canvasSource.addEventListener("webglcontextlost", function(event) { + console.log('context lost'); + event.preventDefault(); + }, false); + + window.canvasSource.addEventListener("webglcontextrestored", init3d, false); + + function copyImage() { + var error = window.gl.getError(); + if (error) { + console.log('Gl Error: ' + error); + } + destinationContext.clearRect(0, 0, 100, 100); + destinationContext.drawImage(window.canvasSource, 0, 0); + } + + function init3d() { + window.gl = window.canvasSource.getContext("webgl", canvasOptions); + var gl = window.gl; + if (gl == null) + console.log("couldn't get webgl context"); + else + console.log(gl); + + gl.viewport(0, 0, window.canvasSource.width, window.canvasSource.height); + gl.clearColor(0, 0.5, 0, 1); + gl.clear(gl.COLOR_BUFFER_BIT); + + var v = document.getElementById("vertex").firstChild.nodeValue; + var f = document.getElementById("fragment").firstChild.nodeValue; + + var vs = gl.createShader(gl.VERTEX_SHADER); + gl.shaderSource(vs, v); + gl.compileShader(vs); + + var fs = gl.createShader(gl.FRAGMENT_SHADER); + gl.shaderSource(fs, f); + gl.compileShader(fs); + + program = gl.createProgram(); + gl.attachShader(program, vs); + gl.attachShader(program, fs); + gl.linkProgram(program); + } + + function main() { + init3d(); + if (gl && setup(gl)) { + copyImage(); + domAutomationController.setAutomationId(1); + domAutomationController.send("SUCCESS"); + } else { + domAutomationController.setAutomationId(1); + domAutomationController.send("FAILURE"); + } + } +</script> +</body> +</html>
diff --git a/content/test/gpu/generate_buildbot_json.py b/content/test/gpu/generate_buildbot_json.py index 0019ccc5..b4702b5c 100755 --- a/content/test/gpu/generate_buildbot_json.py +++ b/content/test/gpu/generate_buildbot_json.py
@@ -264,19 +264,6 @@ 'swarming': True, 'os_type': 'win', }, - 'Win10 Release (Intel HD 530)': { - 'swarming_dimensions': [ - { - 'gpu': '8086:1912', - 'os': 'Windows-10', - }, - ], - 'build_config': 'Release', - # This bot is a one-off and doesn't have similar slaves in the - # swarming pool. - 'swarming': False, - 'os_type': 'win', - }, 'Win10 Release (Intel HD 630)': { 'swarming_dimensions': [ { @@ -290,19 +277,6 @@ 'swarming': False, 'os_type': 'win', }, - 'Win10 Debug (Intel HD 530)': { - 'swarming_dimensions': [ - { - 'gpu': '8086:1912', - 'os': 'Windows-10', - }, - ], - 'build_config': 'Debug', - # This bot is a one-off and doesn't have similar slaves in the - # swarming pool. - 'swarming': False, - 'os_type': 'win', - }, 'Win10 Release (NVIDIA Quadro P400)': { 'swarming_dimensions': [ { @@ -538,19 +512,6 @@ 'swarming': True, 'os_type': 'linux', }, - 'Linux Release (Intel HD 530)': { - 'swarming_dimensions': [ - { - 'gpu': '8086:1912', - 'os': 'Ubuntu' - }, - ], - 'build_config': 'Release', - # This bot is a one-off and doesn't have similar slaves in the - # swarming pool. - 'swarming': False, - 'os_type': 'linux', - }, 'Linux Release (Intel HD 630)': { 'swarming_dimensions': [ { @@ -564,19 +525,6 @@ 'swarming': False, 'os_type': 'linux', }, - 'Linux Debug (Intel HD 530)': { - 'swarming_dimensions': [ - { - 'gpu': '8086:1912', - 'os': 'Ubuntu' - }, - ], - 'build_config': 'Debug', - # This bot is a one-off and doesn't have similar slaves in the - # swarming pool. - 'swarming': False, - 'os_type': 'linux', - }, 'Linux Release (AMD R7 240)': { 'swarming_dimensions': [ { @@ -1351,6 +1299,25 @@ ], 'desktop_args': ['--use-gpu-in-tests'] }, + 'gl_tests_passthrough': { + 'tester_configs': [ + { + 'os_types': ['win'], + } + ], + 'disabled_tester_configs': [ + { + 'names': [ + 'Linux ChromiumOS Ozone (Intel)', + ], + }, + ], + 'test': 'gl_tests', + 'desktop_args': [ + '--use-gpu-in-tests', + '--use-passthrough-cmd-decoder', + ] + }, 'gl_unittests': { 'disabled_tester_configs': [ { @@ -1543,8 +1510,6 @@ 'disabled_tester_configs': [ { 'names': [ - 'Win10 Debug (Intel HD 530)', - 'Win10 Release (Intel HD 530)', 'Win10 Release (Intel HD 630)', ], },
diff --git a/content/test/gpu/gpu_tests/pixel_expectations.py b/content/test/gpu/gpu_tests/pixel_expectations.py index 274eb29..4f1df7a7 100644 --- a/content/test/gpu/gpu_tests/pixel_expectations.py +++ b/content/test/gpu/gpu_tests/pixel_expectations.py
@@ -72,3 +72,6 @@ self.Flaky('Pixel_OffscreenCanvasWebGLSoftwareCompositingWorker', ['mac', ('nvidia', 0xfe9), 'debug'], bug=751328) + + # TODO(xing.xu): remove these after new reference images are generated. + self.Fail('Pixel_WebGLPreserved_After_Tab_Switch', bug=736969)
diff --git a/content/test/gpu/gpu_tests/pixel_integration_test.py b/content/test/gpu/gpu_tests/pixel_integration_test.py index 65121cab..e5d8124 100644 --- a/content/test/gpu/gpu_tests/pixel_integration_test.py +++ b/content/test/gpu/gpu_tests/pixel_integration_test.py
@@ -122,6 +122,18 @@ self.fail('page indicated test failure') if not tab.screenshot_supported: self.fail('Browser does not support screenshot capture') + + if page.create_and_close_new_tab == True: + # Load the tmp tab. + tmp_tab = tab.browser.tabs.New() + tmp_tab.Navigate('chrome://about') + tmp_tab.Close() + # Activate the original tab and wait for completion. + tab.Activate() + tab.action_runner.WaitForJavaScriptCondition( + 'domAutomationController._finished', timeout=300) + tab.EvaluateJavaScript('copyImage()') + screenshot = tab.Screenshot(5) if screenshot is None: self.fail('Could not capture screenshot')
diff --git a/content/test/gpu/gpu_tests/pixel_test_pages.py b/content/test/gpu/gpu_tests/pixel_test_pages.py index 55da2c7..41268b92b 100644 --- a/content/test/gpu/gpu_tests/pixel_test_pages.py +++ b/content/test/gpu/gpu_tests/pixel_test_pages.py
@@ -7,7 +7,8 @@ from the old-style GPU tests. """ def __init__(self, url, name, test_rect, revision, - tolerance=2, browser_args=None, expected_colors=None): + tolerance=2, browser_args=None, expected_colors=None, + create_and_close_new_tab=False): super(PixelTestPage, self).__init__() self.url = url self.name = name @@ -22,6 +23,7 @@ # by contract with _CompareScreenshotSamples in # cloud_storage_integration_test_base.py. self.expected_colors = expected_colors + self.create_and_close_new_tab = create_and_close_new_tab def CopyWithNewBrowserArgsAndSuffix(self, browser_args, suffix): return PixelTestPage( @@ -97,6 +99,13 @@ revision=1), PixelTestPage( + 'pixel_webgl_preserved_after_tab_switch.html', + base_name + '_WebGLPreserved_After_Tab_Switch', + test_rect=[0, 0, 300, 300], + revision=1, + create_and_close_new_tab=True), + + PixelTestPage( 'pixel_scissor.html', base_name + '_ScissorTestWithPreserveDrawingBuffer', test_rect=[0, 0, 300, 300],
diff --git a/content/test/test_render_frame.cc b/content/test/test_render_frame.cc index 09a4d4b..d6c1bb15 100644 --- a/content/test/test_render_frame.cc +++ b/content/test/test_render_frame.cc
@@ -106,8 +106,8 @@ void TestRenderFrame::SetCompositionFromExistingText( int start, int end, - const std::vector<blink::WebCompositionUnderline>& underlines) { - OnSetCompositionFromExistingText(start, end, underlines); + const std::vector<blink::WebImeTextSpan>& ime_text_spans) { + OnSetCompositionFromExistingText(start, end, ime_text_spans); } blink::WebNavigationPolicy TestRenderFrame::DecidePolicyForNavigation(
diff --git a/content/test/test_render_frame.h b/content/test/test_render_frame.h index 567b3555a..cc888aa 100644 --- a/content/test/test_render_frame.h +++ b/content/test/test_render_frame.h
@@ -49,7 +49,7 @@ void SetCompositionFromExistingText( int start, int end, - const std::vector<blink::WebCompositionUnderline>& underlines); + const std::vector<blink::WebImeTextSpan>& ime_text_spans); blink::WebNavigationPolicy DecidePolicyForNavigation( const blink::WebFrameClient::NavigationPolicyInfo& info) override;
diff --git a/device/bluetooth/test/fake_central.cc b/device/bluetooth/test/fake_central.cc index afe554ec6..9f0bc62 100644 --- a/device/bluetooth/test/fake_central.cc +++ b/device/bluetooth/test/fake_central.cc
@@ -28,17 +28,14 @@ const std::string& name, const std::vector<device::BluetoothUUID>& known_service_uuids, SimulatePreconnectedPeripheralCallback callback) { - auto device_iter = devices_.find(address); - if (device_iter == devices_.end()) { - auto fake_peripheral = base::MakeUnique<FakePeripheral>(this, address); - - auto insert_iter = devices_.emplace(address, std::move(fake_peripheral)); - DCHECK(insert_iter.second); - device_iter = insert_iter.first; + FakePeripheral* fake_peripheral = GetFakePeripheral(address); + if (fake_peripheral == nullptr) { + auto fake_peripheral_ptr = base::MakeUnique<FakePeripheral>(this, address); + fake_peripheral = fake_peripheral_ptr.get(); + auto pair = devices_.emplace(address, std::move(fake_peripheral_ptr)); + DCHECK(pair.second); } - FakePeripheral* fake_peripheral = - static_cast<FakePeripheral*>(device_iter->second.get()); fake_peripheral->SetName(name); fake_peripheral->SetSystemConnected(true); fake_peripheral->SetServiceUUIDs(device::BluetoothDevice::UUIDSet( @@ -51,14 +48,12 @@ const std::string& address, uint16_t code, SetNextGATTConnectionResponseCallback callback) { - auto device_iter = devices_.find(address); - if (device_iter == devices_.end()) { + FakePeripheral* fake_peripheral = GetFakePeripheral(address); + if (fake_peripheral == nullptr) { std::move(callback).Run(false); return; } - FakePeripheral* fake_peripheral = - static_cast<FakePeripheral*>(device_iter->second.get()); fake_peripheral->SetNextGATTConnectionResponse(code); std::move(callback).Run(true); } @@ -67,13 +62,12 @@ const std::string& address, uint16_t code, SetNextGATTDiscoveryResponseCallback callback) { - auto device_iter = devices_.find(address); - if (device_iter == devices_.end()) { + FakePeripheral* fake_peripheral = GetFakePeripheral(address); + if (fake_peripheral == nullptr) { std::move(callback).Run(false); + return; } - FakePeripheral* fake_peripheral = - static_cast<FakePeripheral*>(device_iter->second.get()); fake_peripheral->SetNextGATTDiscoveryResponse(code); std::move(callback).Run(true); } @@ -81,19 +75,24 @@ void FakeCentral::SimulateGATTServicesChanged( const std::string& address, SimulateGATTServicesChangedCallback callback) { + FakePeripheral* fake_peripheral = GetFakePeripheral(address); + if (fake_peripheral == nullptr) { + std::move(callback).Run(false); + return; + } + std::move(callback).Run(true); } void FakeCentral::AddFakeService(const std::string& peripheral_address, const device::BluetoothUUID& service_uuid, AddFakeServiceCallback callback) { - auto device_iter = devices_.find(peripheral_address); - if (device_iter == devices_.end()) { + FakePeripheral* fake_peripheral = GetFakePeripheral(peripheral_address); + if (fake_peripheral == nullptr) { std::move(callback).Run(base::nullopt); + return; } - FakePeripheral* fake_peripheral = - static_cast<FakePeripheral*>(device_iter->second.get()); std::move(callback).Run(fake_peripheral->AddFakeService(service_uuid)); } @@ -103,16 +102,11 @@ const std::string& service_id, const std::string& peripheral_address, AddFakeCharacteristicCallback callback) { - auto device_iter = devices_.find(peripheral_address); - if (device_iter == devices_.end()) { - std::move(callback).Run(base::nullopt); - } - FakeRemoteGattService* fake_remote_gatt_service = - static_cast<FakeRemoteGattService*>( - device_iter->second.get()->GetGattService(service_id)); + GetFakeRemoteGattService(peripheral_address, service_id); if (fake_remote_gatt_service == nullptr) { std::move(callback).Run(base::nullopt); + return; } std::move(callback).Run(fake_remote_gatt_service->AddFakeCharacteristic( @@ -124,15 +118,8 @@ const std::string& service_id, const std::string& peripheral_address, RemoveFakeCharacteristicCallback callback) { - auto device_iter = devices_.find(peripheral_address); - if (device_iter == devices_.end()) { - std::move(callback).Run(false); - return; - } - FakeRemoteGattService* fake_remote_gatt_service = - static_cast<FakeRemoteGattService*>( - device_iter->second.get()->GetGattService(service_id)); + GetFakeRemoteGattService(peripheral_address, service_id); if (fake_remote_gatt_service == nullptr) { std::move(callback).Run(false); return; @@ -374,18 +361,34 @@ FakeCentral::~FakeCentral() {} -FakeRemoteGattCharacteristic* FakeCentral::GetFakeRemoteGattCharacteristic( - const std::string& peripheral_address, - const std::string& service_id, - const std::string& characteristic_id) const { +FakePeripheral* FakeCentral::GetFakePeripheral( + const std::string& peripheral_address) const { auto device_iter = devices_.find(peripheral_address); if (device_iter == devices_.end()) { return nullptr; } + return static_cast<FakePeripheral*>(device_iter->second.get()); +} + +FakeRemoteGattService* FakeCentral::GetFakeRemoteGattService( + const std::string& peripheral_address, + const std::string& service_id) const { + FakePeripheral* fake_peripheral = GetFakePeripheral(peripheral_address); + if (fake_peripheral == nullptr) { + return nullptr; + } + + return static_cast<FakeRemoteGattService*>( + fake_peripheral->GetGattService(service_id)); +} + +FakeRemoteGattCharacteristic* FakeCentral::GetFakeRemoteGattCharacteristic( + const std::string& peripheral_address, + const std::string& service_id, + const std::string& characteristic_id) const { FakeRemoteGattService* fake_remote_gatt_service = - static_cast<FakeRemoteGattService*>( - device_iter->second.get()->GetGattService(service_id)); + GetFakeRemoteGattService(peripheral_address, service_id); if (fake_remote_gatt_service == nullptr) { return nullptr; }
diff --git a/device/bluetooth/test/fake_central.h b/device/bluetooth/test/fake_central.h index 775e114..5aa27f22 100644 --- a/device/bluetooth/test/fake_central.h +++ b/device/bluetooth/test/fake_central.h
@@ -15,8 +15,10 @@ namespace bluetooth { +class FakePeripheral; class FakeRemoteGattCharacteristic; class FakeRemoteGattDescriptor; +class FakeRemoteGattService; // Implementation of FakeCentral in // src/device/bluetooth/public/interfaces/test/fake_bluetooth.mojom. @@ -150,6 +152,11 @@ private: ~FakeCentral() override; + FakePeripheral* GetFakePeripheral( + const std::string& peripheral_address) const; + FakeRemoteGattService* GetFakeRemoteGattService( + const std::string& peripheral_address, + const std::string& service_id) const; FakeRemoteGattCharacteristic* GetFakeRemoteGattCharacteristic( const std::string& peripheral_address, const std::string& service_id,
diff --git a/docs/updating_clang.md b/docs/updating_clang.md index 28b1ac13..5ef098d 100644 --- a/docs/updating_clang.md +++ b/docs/updating_clang.md
@@ -27,7 +27,8 @@ 1. Run an exhaustive set of try jobs to test the new compiler: ``` git cl try && - git cl try -m tryserver.chromium.mac -b mac_chromium_asan_rel_ng && + git cl try -m tryserver.chromium.mac -b mac_chromium_asan_rel_ng \ + -b ios-device && \ git cl try -m tryserver.chromium.linux -b linux_chromium_chromeos_dbg_ng \ -b linux_chromium_chromeos_asan_rel_ng -b linux_chromium_msan_rel_ng \ -b fuchsia -b linux_chromium_cfi_rel_ng &&
diff --git a/extensions/browser/api/app_current_window_internal/app_current_window_internal_api.cc b/extensions/browser/api/app_current_window_internal/app_current_window_internal_api.cc index 779e9a2c..6130865 100644 --- a/extensions/browser/api/app_current_window_internal/app_current_window_internal_api.cc +++ b/extensions/browser/api/app_current_window_internal/app_current_window_internal_api.cc
@@ -330,27 +330,21 @@ std::unique_ptr<SetShape::Params> params(SetShape::Params::Create(*args_)); const Region& shape = params->region; - // Build a region from the supplied list of rects. + // Build the list of hit-test rects from the supplied list of rects. // If |rects| is missing, then the input region is removed. This clears the // input region so that the entire window accepts input events. // To specify an empty input region (so the window ignores all input), // |rects| should be an empty list. - std::unique_ptr<SkRegion> region(new SkRegion); + std::unique_ptr<AppWindow::ShapeRects> shape_rects; if (shape.rects) { + shape_rects = base::MakeUnique<AppWindow::ShapeRects>(); + shape_rects->reserve(shape.rects->size()); for (const RegionRect& input_rect : *shape.rects) { - int32_t x = input_rect.left; - int32_t y = input_rect.top; - int32_t width = input_rect.width; - int32_t height = input_rect.height; - - SkIRect rect = SkIRect::MakeXYWH(x, y, width, height); - region->op(rect, SkRegion::kUnion_Op); + shape_rects->emplace_back(input_rect.left, input_rect.top, + input_rect.width, input_rect.height); } - } else { - region.reset(NULL); } - - window()->UpdateShape(std::move(region)); + window()->UpdateShape(std::move(shape_rects)); return RespondNow(NoArguments()); }
diff --git a/extensions/browser/api/feedback_private/feedback_private_delegate.h b/extensions/browser/api/feedback_private/feedback_private_delegate.h index feb1f066..ab9e048 100644 --- a/extensions/browser/api/feedback_private/feedback_private_delegate.h +++ b/extensions/browser/api/feedback_private/feedback_private_delegate.h
@@ -15,6 +15,10 @@ class BrowserContext; } // namespace content +namespace system_logs { +class SystemLogsFetcher; +} // namespace system_logs + namespace extensions { // Delegate class for embedder-specific chrome.feedbackPrivate behavior. @@ -29,6 +33,10 @@ virtual std::unique_ptr<base::DictionaryValue> GetStrings( content::BrowserContext* browser_context, bool from_crash) const = 0; + + // Returns a SystemLogsFetcher for responding to a request for system logs. + virtual system_logs::SystemLogsFetcher* CreateSystemLogsFetcher( + content::BrowserContext* context) const = 0; }; } // namespace extensions
diff --git a/extensions/browser/api/storage/backend_task_runner.cc b/extensions/browser/api/storage/backend_task_runner.cc index 0d5e614..50794e1 100644 --- a/extensions/browser/api/storage/backend_task_runner.cc +++ b/extensions/browser/api/storage/backend_task_runner.cc
@@ -4,15 +4,14 @@ #include "extensions/browser/api/storage/backend_task_runner.h" -#include "base/task_scheduler/lazy_task_runner.h" +#include "extensions/browser/extension_file_task_runner.h" namespace extensions { -base::LazySequencedTaskRunner g_sequenced_task_task_runner = - LAZY_SEQUENCED_TASK_RUNNER_INITIALIZER({base::MayBlock()}); - +// TODO(stanisc): consider switching all calls of GetBackendTaskRunner() to +// GetExtensionFileTaskRunner(). scoped_refptr<base::SequencedTaskRunner> GetBackendTaskRunner() { - return g_sequenced_task_task_runner.Get(); + return GetExtensionFileTaskRunner(); } bool IsOnBackendSequence() {
diff --git a/extensions/browser/app_window/app_window.cc b/extensions/browser/app_window/app_window.cc index ed4ba26..ca452e18 100644 --- a/extensions/browser/app_window/app_window.cc +++ b/extensions/browser/app_window/app_window.cc
@@ -578,8 +578,8 @@ image_loader_ptr_factory_.GetWeakPtr())); } -void AppWindow::UpdateShape(std::unique_ptr<SkRegion> region) { - native_app_window_->UpdateShape(std::move(region)); +void AppWindow::UpdateShape(std::unique_ptr<ShapeRects> rects) { + native_app_window_->UpdateShape(std::move(rects)); } void AppWindow::UpdateDraggableRegions(
diff --git a/extensions/browser/app_window/app_window.h b/extensions/browser/app_window/app_window.h index 7d07ae89..09536a8 100644 --- a/extensions/browser/app_window/app_window.h +++ b/extensions/browser/app_window/app_window.h
@@ -118,6 +118,8 @@ FULLSCREEN_TYPE_FORCED = 1 << 3, }; + using ShapeRects = std::vector<gfx::Rect>; + struct BoundsSpecification { // INT_MIN represents an unspecified position component. static const int kUnspecifiedPosition; @@ -275,8 +277,8 @@ // Specifies a url for the launcher icon. void SetAppIconUrl(const GURL& icon_url); - // Set the window shape. Passing a NULL |region| sets the default shape. - void UpdateShape(std::unique_ptr<SkRegion> region); + // Sets the window shape. Passing a nullptr |rects| sets the default shape. + void UpdateShape(std::unique_ptr<ShapeRects> rects); // Called from the render interface to modify the draggable regions. void UpdateDraggableRegions(const std::vector<DraggableRegion>& regions);
diff --git a/extensions/browser/app_window/native_app_window.h b/extensions/browser/app_window/native_app_window.h index 719180bb..0ae528f 100644 --- a/extensions/browser/app_window/native_app_window.h +++ b/extensions/browser/app_window/native_app_window.h
@@ -29,6 +29,8 @@ class NativeAppWindow : public ui::BaseWindow, public web_modal::WebContentsModalDialogHost { public: + using ShapeRects = std::vector<gfx::Rect>; + // Sets whether the window is fullscreen and the type of fullscreen. // |fullscreen_types| is a bit field of AppWindow::FullscreenType. virtual void SetFullscreen(int fullscreen_types) = 0; @@ -46,12 +48,13 @@ virtual void UpdateDraggableRegions( const std::vector<DraggableRegion>& regions) = 0; - // Returns the region used by frameless windows for dragging. May return NULL. + // Returns the region used by frameless windows for dragging. May return + // nullptr. virtual SkRegion* GetDraggableRegion() = 0; - // Called when the window shape is changed. If |region| is NULL then the + // Called when the window shape is changed. If |region| is nullptr then the // window is restored to the default shape. - virtual void UpdateShape(std::unique_ptr<SkRegion> region) = 0; + virtual void UpdateShape(std::unique_ptr<ShapeRects> rects) = 0; // Allows the window to handle unhandled keyboard messages coming back from // the renderer.
diff --git a/extensions/common/extension_api.cc b/extensions/common/extension_api.cc index a60af27..8dbf447 100644 --- a/extensions/common/extension_api.cc +++ b/extensions/common/extension_api.cc
@@ -183,11 +183,10 @@ // Check to see if there are any parts of this API that are allowed in this // context. - const std::vector<Feature*> features = provider->second->GetChildren(api); - for (std::vector<Feature*>::const_iterator it = features.begin(); - it != features.end(); - ++it) { - if ((*it)->IsAvailableToContext(extension, context, url).is_available()) + const std::vector<const Feature*> features = + provider->second->GetChildren(api); + for (const Feature* feature : features) { + if (feature->IsAvailableToContext(extension, context, url).is_available()) return true; } @@ -210,7 +209,7 @@ Feature::Context context, const GURL& url, CheckAliasStatus check_alias) { - Feature* feature = GetFeatureDependency(full_name); + const Feature* feature = GetFeatureDependency(full_name); if (!feature) { return Feature::Availability(Feature::NOT_PRESENT, std::string("Unknown feature: ") + full_name); @@ -222,7 +221,7 @@ return availability; Feature::Availability alias_availability = - IsAliasAvailable(full_name, feature, extension, context, url); + IsAliasAvailable(full_name, *feature, extension, context, url); return alias_availability.is_available() ? alias_availability : availability; } @@ -272,7 +271,8 @@ return result; } -Feature* ExtensionAPI::GetFeatureDependency(const std::string& full_name) { +const Feature* ExtensionAPI::GetFeatureDependency( + const std::string& full_name) { std::string feature_type; std::string feature_name; SplitDependencyName(full_name, &feature_type, &feature_name); @@ -282,7 +282,7 @@ if (provider == dependency_providers_.end()) return NULL; - Feature* feature = provider->second->GetFeature(feature_name); + const Feature* feature = provider->second->GetFeature(feature_name); // Try getting the feature for the parent API, if this was a child. if (!feature) { std::string child_name; @@ -328,11 +328,11 @@ Feature::Availability ExtensionAPI::IsAliasAvailable( const std::string& full_name, - Feature* feature, + const Feature& feature, const Extension* extension, Feature::Context context, const GURL& url) { - const std::string& alias = feature->alias(); + const std::string& alias = feature.alias(); if (alias.empty()) return Feature::Availability(Feature::NOT_PRESENT, "Alias not defined"); @@ -348,7 +348,7 @@ std::string child_name; GetAPINameFromFullName(full_name, &child_name); std::string full_alias_name = alias + "." + child_name; - Feature* alias_feature = provider->second->GetFeature(full_alias_name); + const Feature* alias_feature = provider->second->GetFeature(full_alias_name); // If there is no child feature, use the alias API feature to check // availability. @@ -356,7 +356,7 @@ alias_feature = provider->second->GetFeature(alias); CHECK(alias_feature) << "Cannot find alias feature " << alias - << " for API feature " << feature->name(); + << " for API feature " << feature.name(); return alias_feature->IsAvailableToContext(extension, context, url); }
diff --git a/extensions/common/extension_api.h b/extensions/common/extension_api.h index 493674aecc4..01761a6 100644 --- a/extensions/common/extension_api.h +++ b/extensions/common/extension_api.h
@@ -142,7 +142,7 @@ // Gets a feature from any dependency provider registered with ExtensionAPI. // Returns NULL if the feature could not be found. - Feature* GetFeatureDependency(const std::string& dependency_name); + const Feature* GetFeatureDependency(const std::string& dependency_name); private: FRIEND_TEST_ALL_PREFIXES(ExtensionAPITest, DefaultConfigurationFeatures); @@ -157,7 +157,7 @@ // Checks if |full_name| is available to provided context and extension under // associated API's alias name. Feature::Availability IsAliasAvailable(const std::string& full_name, - Feature* feature, + const Feature& feature, const Extension* extension, Feature::Context context, const GURL& url);
diff --git a/extensions/common/features/feature_provider.cc b/extensions/common/features/feature_provider.cc index 2d75f82..51a697cd 100644 --- a/extensions/common/features/feature_provider.cc +++ b/extensions/common/features/feature_provider.cc
@@ -127,7 +127,7 @@ return GetFeatureFromProviderByName("behavior", name); } -Feature* FeatureProvider::GetFeature(const std::string& name) const { +const Feature* FeatureProvider::GetFeature(const std::string& name) const { FeatureMap::const_iterator iter = features_.find(name); if (iter != features_.end()) return iter->second.get(); @@ -149,7 +149,7 @@ // Children of a given API are named starting with parent.name()+".", which // means they'll be contiguous in the features_ std::map. -std::vector<Feature*> FeatureProvider::GetChildren( +std::vector<const Feature*> FeatureProvider::GetChildren( const Feature& parent) const { std::string prefix = parent.name() + "."; const FeatureMap::const_iterator first_child = features_.lower_bound(prefix); @@ -159,7 +159,7 @@ const FeatureMap::const_iterator after_children = features_.lower_bound(prefix); - std::vector<Feature*> result; + std::vector<const Feature*> result; result.reserve(std::distance(first_child, after_children)); for (FeatureMap::const_iterator it = first_child; it != after_children; ++it) {
diff --git a/extensions/common/features/feature_provider.h b/extensions/common/features/feature_provider.h index c5cde10..0576dc7c 100644 --- a/extensions/common/features/feature_provider.h +++ b/extensions/common/features/feature_provider.h
@@ -18,7 +18,7 @@ // Note: Binding code (specifically native_extension_bindings_system.cc) relies // on this being a sorted map. -using FeatureMap = std::map<std::string, std::unique_ptr<Feature>>; +using FeatureMap = std::map<std::string, std::unique_ptr<const Feature>>; // Implemented by classes that can vend features. class FeatureProvider { @@ -46,13 +46,13 @@ static const Feature* GetBehaviorFeature(const std::string& name); // Returns the feature with the specified name. - Feature* GetFeature(const std::string& name) const; + const Feature* GetFeature(const std::string& name) const; // Returns the parent feature of |feature|, or null if there isn't one. const Feature* GetParent(const Feature& feature) const; // Returns the features inside the |parent| namespace, recursively. - std::vector<Feature*> GetChildren(const Feature& parent) const; + std::vector<const Feature*> GetChildren(const Feature& parent) const; // Returns a map containing all features described by this instance. // TODO(devlin): Rename this to be features().
diff --git a/extensions/common/features/feature_provider_unittest.cc b/extensions/common/features/feature_provider_unittest.cc index 2bf161f..1af86f9 100644 --- a/extensions/common/features/feature_provider_unittest.cc +++ b/extensions/common/features/feature_provider_unittest.cc
@@ -56,7 +56,7 @@ .Build(); ASSERT_TRUE(extension.get()); - Feature* feature = provider->GetFeature("description"); + const Feature* feature = provider->GetFeature("description"); EXPECT_EQ(Feature::IS_AVAILABLE, feature ->IsAvailableToContext(extension.get(), @@ -125,7 +125,7 @@ ASSERT_TRUE(app->is_platform_app()); // A permission requested in the manifest is available. - Feature* feature = provider->GetFeature("power"); + const Feature* feature = provider->GetFeature("power"); EXPECT_EQ(Feature::IS_AVAILABLE, feature ->IsAvailableToContext(app.get(), Feature::UNSPECIFIED_CONTEXT, @@ -169,9 +169,9 @@ add_feature("parent.other_child.other_grandchild"); add_feature("parent.unparented_child", true); - Feature* parent = provider.GetFeature("parent"); + const Feature* parent = provider.GetFeature("parent"); ASSERT_TRUE(parent); - std::vector<Feature*> children = provider.GetChildren(*parent); + std::vector<const Feature*> children = provider.GetChildren(*parent); std::set<std::string> children_names; for (const Feature* child : children) children_names.insert(child->name());
diff --git a/extensions/common/features/simple_feature.cc b/extensions/common/features/simple_feature.cc index 4e68be6..55b5da0 100644 --- a/extensions/common/features/simple_feature.cc +++ b/extensions/common/features/simple_feature.cc
@@ -469,7 +469,7 @@ Feature::Availability SimpleFeature::CheckDependencies( const base::Callback<Availability(const Feature*)>& checker) const { for (const auto& dep_name : dependencies_) { - Feature* dependency = + const Feature* dependency = ExtensionAPI::GetSharedInstance()->GetFeatureDependency(dep_name); if (!dependency) return CreateAvailability(NOT_PRESENT);
diff --git a/extensions/common/manifest.cc b/extensions/common/manifest.cc index c2e608f..0aef218 100644 --- a/extensions/common/manifest.cc +++ b/extensions/common/manifest.cc
@@ -247,7 +247,8 @@ } bool Manifest::CanAccessKey(const std::string& key) const { - Feature* feature = FeatureProvider::GetManifestFeatures()->GetFeature(key); + const Feature* feature = + FeatureProvider::GetManifestFeatures()->GetFeature(key); if (!feature) return true;
diff --git a/extensions/common/manifest_handlers/permissions_parser.cc b/extensions/common/manifest_handlers/permissions_parser.cc index af8ba0c..5cbe8bc 100644 --- a/extensions/common/manifest_handlers/permissions_parser.cc +++ b/extensions/common/manifest_handlers/permissions_parser.cc
@@ -117,7 +117,7 @@ for (APIPermissionSet::const_iterator iter = api_permissions->begin(); iter != api_permissions->end(); ++iter) { - Feature* feature = permission_features->GetFeature(iter->name()); + const Feature* feature = permission_features->GetFeature(iter->name()); // The feature should exist since we just got an APIPermission for it. The // two systems should be updated together whenever a permission is added.
diff --git a/extensions/components/native_app_window/native_app_window_views.cc b/extensions/components/native_app_window/native_app_window_views.cc index 4081af9..0104b55 100644 --- a/extensions/components/native_app_window/native_app_window_views.cc +++ b/extensions/components/native_app_window/native_app_window_views.cc
@@ -372,7 +372,7 @@ return draggable_region_.get(); } -void NativeAppWindowViews::UpdateShape(std::unique_ptr<SkRegion> region) { +void NativeAppWindowViews::UpdateShape(std::unique_ptr<ShapeRects> rects) { // Stub implementation. See also ChromeNativeAppWindowViews. }
diff --git a/extensions/components/native_app_window/native_app_window_views.h b/extensions/components/native_app_window/native_app_window_views.h index f89c263..a782d40 100644 --- a/extensions/components/native_app_window/native_app_window_views.h +++ b/extensions/components/native_app_window/native_app_window_views.h
@@ -130,7 +130,7 @@ void UpdateDraggableRegions( const std::vector<extensions::DraggableRegion>& regions) override; SkRegion* GetDraggableRegion() override; - void UpdateShape(std::unique_ptr<SkRegion> region) override; + void UpdateShape(std::unique_ptr<ShapeRects> rects) override; void HandleKeyboardEvent( const content::NativeWebKeyboardEvent& event) override; bool IsFrameless() const override;
diff --git a/extensions/renderer/bindings/argument_spec.cc b/extensions/renderer/bindings/argument_spec.cc index d97263da..b7929cf0 100644 --- a/extensions/renderer/bindings/argument_spec.cc +++ b/extensions/renderer/bindings/argument_spec.cc
@@ -214,7 +214,10 @@ switch (type_) { case ArgumentType::INTEGER: - is_valid_type = value->IsInt32(); + // -0 is treated internally as a double, but we classify it as an integer. + is_valid_type = + value->IsInt32() || + (value->IsNumber() && value.As<v8::Number>()->Value() == 0.0); break; case ArgumentType::DOUBLE: is_valid_type = value->IsNumber(); @@ -383,8 +386,15 @@ std::string* error) const { switch (type_) { case ArgumentType::INTEGER: { - DCHECK(value->IsInt32()); - int int_val = value.As<v8::Int32>()->Value(); + DCHECK(value->IsNumber()); + int int_val = 0; + if (value->IsInt32()) { + int_val = value.As<v8::Int32>()->Value(); + } else { + // See comment in IsCorrectType(). + DCHECK_EQ(0.0, value.As<v8::Number>()->Value()); + int_val = 0; + } if (!CheckFundamentalBounds(int_val, minimum_, maximum_, error)) return false; if (out_value)
diff --git a/extensions/renderer/bindings/argument_spec_unittest.cc b/extensions/renderer/bindings/argument_spec_unittest.cc index a12b487..1ebabea 100644 --- a/extensions/renderer/bindings/argument_spec_unittest.cc +++ b/extensions/renderer/bindings/argument_spec_unittest.cc
@@ -154,6 +154,10 @@ ExpectSuccess(spec, "-1", "-1"); ExpectSuccess(spec, "0", "0"); ExpectSuccess(spec, "0.0", "0"); + ExpectSuccess(spec, "-0.0", "0"); + ExpectSuccess(spec, "-0.", "0"); + ExpectSuccess(spec, "-.0", "0"); + ExpectSuccess(spec, "-0", "0"); ExpectFailure(spec, "undefined", InvalidType(kTypeInteger, kTypeUndefined)); ExpectFailure(spec, "null", InvalidType(kTypeInteger, kTypeNull)); ExpectFailure(spec, "1.1", InvalidType(kTypeInteger, kTypeDouble));
diff --git a/extensions/renderer/feature_cache.cc b/extensions/renderer/feature_cache.cc index df10bd2..11e28d7 100644 --- a/extensions/renderer/feature_cache.cc +++ b/extensions/renderer/feature_cache.cc
@@ -61,7 +61,7 @@ GURL empty_url; const Extension* extension = context->extension(); for (const auto& map_entry : api_feature_provider->GetAllFeatures()) { - Feature* feature = map_entry.second.get(); + const Feature* feature = map_entry.second.get(); // Exclude internal APIs. if (feature->IsInternal()) continue;
diff --git a/extensions/shell/BUILD.gn b/extensions/shell/BUILD.gn index 495aa1c..d821baf 100644 --- a/extensions/shell/BUILD.gn +++ b/extensions/shell/BUILD.gn
@@ -174,6 +174,8 @@ if (use_aura) { sources += [ + "browser/root_window_controller.cc", + "browser/root_window_controller.h", "browser/shell_app_window_client_aura.cc", "browser/shell_desktop_controller_aura.cc", "browser/shell_desktop_controller_aura.h", @@ -309,6 +311,7 @@ if (use_aura) { sources += [ + "browser/root_window_controller_unittest.cc", "browser/shell_desktop_controller_aura_unittest.cc", "browser/shell_native_app_window_aura_unittest.cc", "browser/shell_screen_unittest.cc",
diff --git a/extensions/shell/browser/default_shell_browser_main_delegate.cc b/extensions/shell/browser/default_shell_browser_main_delegate.cc index 1275f32..c81eb702 100644 --- a/extensions/shell/browser/default_shell_browser_main_delegate.cc +++ b/extensions/shell/browser/default_shell_browser_main_delegate.cc
@@ -101,9 +101,10 @@ void DefaultShellBrowserMainDelegate::Shutdown() { } -DesktopController* DefaultShellBrowserMainDelegate::CreateDesktopController() { +DesktopController* DefaultShellBrowserMainDelegate::CreateDesktopController( + content::BrowserContext* context) { #if defined(USE_AURA) - return new ShellDesktopControllerAura(); + return new ShellDesktopControllerAura(context); #elif defined(OS_MACOSX) return new ShellDesktopControllerMac(); #else
diff --git a/extensions/shell/browser/default_shell_browser_main_delegate.h b/extensions/shell/browser/default_shell_browser_main_delegate.h index 05ce558f..64a132ca 100644 --- a/extensions/shell/browser/default_shell_browser_main_delegate.h +++ b/extensions/shell/browser/default_shell_browser_main_delegate.h
@@ -21,7 +21,8 @@ // ShellBrowserMainDelegate: void Start(content::BrowserContext* context) override; void Shutdown() override; - DesktopController* CreateDesktopController() override; + DesktopController* CreateDesktopController( + content::BrowserContext* context) override; private: DISALLOW_COPY_AND_ASSIGN(DefaultShellBrowserMainDelegate);
diff --git a/extensions/shell/browser/root_window_controller.cc b/extensions/shell/browser/root_window_controller.cc new file mode 100644 index 0000000..4988082 --- /dev/null +++ b/extensions/shell/browser/root_window_controller.cc
@@ -0,0 +1,169 @@ +// 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 "extensions/shell/browser/root_window_controller.h" + +#include "extensions/browser/app_window/app_window.h" +#include "extensions/browser/app_window/native_app_window.h" +#include "extensions/shell/browser/shell_app_delegate.h" +#include "extensions/shell/browser/shell_screen.h" +#include "ui/aura/layout_manager.h" +#include "ui/aura/window.h" +#include "ui/aura/window_tracker.h" +#include "ui/aura/window_tree_host.h" +#include "ui/gfx/geometry/rect.h" +#include "ui/gfx/geometry/size.h" + +namespace extensions { + +namespace { + +// A simple layout manager that makes each new window fill its parent. +class FillLayout : public aura::LayoutManager { + public: + FillLayout(aura::Window* owner) : owner_(owner) { DCHECK(owner_); } + ~FillLayout() override = default; + + private: + // aura::LayoutManager: + void OnWindowResized() override { + // Size the owner's immediate child windows. + aura::WindowTracker children_tracker(owner_->children()); + while (!children_tracker.windows().empty()) { + aura::Window* child = children_tracker.Pop(); + child->SetBounds(gfx::Rect(owner_->bounds().size())); + } + } + + void OnWindowAddedToLayout(aura::Window* child) override { + DCHECK_EQ(owner_, child->parent()); + + // Create a rect at 0,0 with the size of the parent. + gfx::Size parent_size = child->parent()->bounds().size(); + child->SetBounds(gfx::Rect(parent_size)); + } + + void OnWillRemoveWindowFromLayout(aura::Window* child) override {} + + void OnWindowRemovedFromLayout(aura::Window* child) override {} + + void OnChildWindowVisibilityChanged(aura::Window* child, + bool visible) override {} + + void SetChildBounds(aura::Window* child, + const gfx::Rect& requested_bounds) override { + SetChildBoundsDirect(child, requested_bounds); + } + + aura::Window* owner_; // Not owned. + + DISALLOW_COPY_AND_ASSIGN(FillLayout); +}; + +} // namespace + +RootWindowController::RootWindowController( + DesktopDelegate* desktop_delegate, + ShellScreen* screen, + const gfx::Rect& bounds, + content::BrowserContext* browser_context) + : desktop_delegate_(desktop_delegate), + screen_(screen), + browser_context_(browser_context) { + DCHECK(desktop_delegate_); + DCHECK(screen_); + DCHECK(browser_context_); + host_.reset(aura::WindowTreeHost::Create( + gfx::Rect(screen_->GetPrimaryDisplay().GetSizeInPixel()))); + + // The ShellScreen will resize the primary display when the WindowTreeHost is + // resized, so the display is always the size of the WindowTreeHost. + host_->AddObserver(screen_); + + host_->InitHost(); + host_->window()->Show(); + + aura::client::SetWindowParentingClient(host_->window(), this); + + // Ensure the window fills the display. + host_->window()->SetLayoutManager(new FillLayout(host_->window())); + + host_->AddObserver(this); + host_->Show(); +} + +RootWindowController::~RootWindowController() { + CloseAppWindows(); + DestroyWindowTreeHost(); +} + +AppWindow* RootWindowController::CreateAppWindow( + content::BrowserContext* browser_context, + const Extension* extension) { + // Only one BrowserContext should ever be used with this class. + DCHECK_EQ(browser_context_, browser_context); + + if (app_windows_.empty()) { + // Start observing for OnAppWindowRemoved. + AppWindowRegistry* registry = AppWindowRegistry::Get(browser_context_); + registry->AddObserver(this); + } + + app_windows_.push_back( + new AppWindow(browser_context, new ShellAppDelegate, extension)); + return app_windows_.back(); +} + +void RootWindowController::AddAppWindow(gfx::NativeWindow window) { + aura::Window* root_window = host_->window(); + root_window->AddChild(window); +} + +void RootWindowController::CloseAppWindows() { + if (app_windows_.empty()) + return; + + // Remove the observer before closing windows to avoid triggering + // OnAppWindowRemoved, which would mutate |app_windows_|. + AppWindowRegistry::Get(browser_context_)->RemoveObserver(this); + for (AppWindow* app_window : app_windows_) + app_window->GetBaseWindow()->Close(); // Close() deletes |app_window|. + app_windows_.clear(); +} + +void RootWindowController::UpdateSize(const gfx::Size& size) { + host_->UpdateRootWindowSizeInPixels(size); +} + +aura::Window* RootWindowController::GetDefaultParent(aura::Window* window, + const gfx::Rect& bounds) { + return host_->window(); +} + +void RootWindowController::OnHostCloseRequested(aura::WindowTreeHost* host) { + DCHECK_EQ(host_.get(), host); + CloseAppWindows(); + + // The ShellDesktopControllerAura will delete us. + desktop_delegate_->CloseRootWindowController(this); +} + +void RootWindowController::OnAppWindowRemoved(AppWindow* window) { + if (app_windows_.empty()) + return; + + // If we created this AppWindow, remove it from our list so we don't try to + // close it again later. + app_windows_.remove(window); + if (app_windows_.empty()) + AppWindowRegistry::Get(browser_context_)->RemoveObserver(this); +} + +void RootWindowController::DestroyWindowTreeHost() { + host_->RemoveObserver(screen_); + host_->RemoveObserver(this); + host_.reset(); +} + +} // namespace extensions
diff --git a/extensions/shell/browser/root_window_controller.h b/extensions/shell/browser/root_window_controller.h new file mode 100644 index 0000000..92bf969 --- /dev/null +++ b/extensions/shell/browser/root_window_controller.h
@@ -0,0 +1,109 @@ +// 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 EXTENSIONS_SHELL_BROWSER_ROOT_WINDOW_CONTROLLER_H_ +#define EXTENSIONS_SHELL_BROWSER_ROOT_WINDOW_CONTROLLER_H_ + +#include <list> +#include <memory> + +#include "base/macros.h" +#include "extensions/browser/app_window/app_window_registry.h" +#include "ui/aura/client/window_parenting_client.h" +#include "ui/aura/window_tree_host_observer.h" +#include "ui/gfx/native_widget_types.h" + +namespace aura { +class WindowTreeHost; +} // namespace aura + +namespace content { +class BrowserContext; +} // namespace content + +namespace gfx { +class Rect; +class Size; +} // namespace gfx + +namespace extensions { +class AppWindow; +class Extension; +class ShellScreen; + +// Owns and manages a WindowTreeHost for a display. New AppWindows will fill +// the entire root window. Any additional AppWindows are simply drawn over the +// existing AppWindow(s) and cannot be resized except by resizing the +// WindowTreeHost. +class RootWindowController : public aura::client::WindowParentingClient, + public aura::WindowTreeHostObserver, + public AppWindowRegistry::Observer { + public: + class DesktopDelegate { + public: + virtual ~DesktopDelegate() = default; + + // Called when the root window requests to be closed. This should eventually + // destroy |root_window_controller|. + virtual void CloseRootWindowController( + RootWindowController* root_window_controller) = 0; + }; + + // RootWindowController initializes and displays a WindowTreeHost within + // |bounds|. |desktop_delegate| must outlive the RootWindowController. + RootWindowController(DesktopDelegate* desktop_delegate, + ShellScreen* screen, + const gfx::Rect& bounds, + content::BrowserContext* browser_context); + ~RootWindowController() override; + + // Creates a new app window and adds it to the desktop. The AppWindow deletes + // itself when its native window closes. + AppWindow* CreateAppWindow(content::BrowserContext* context, + const Extension* extension); + + // Attaches a NativeAppWindow's window to our root window. + void AddAppWindow(gfx::NativeWindow window); + + // Closes the root window's AppWindows, resulting in their destruction. + void CloseAppWindows(); + + // Updates the size of the root window. + void UpdateSize(const gfx::Size& size); + + aura::WindowTreeHost* host() { return host_.get(); } + + // aura::client::WindowParentingClient: + aura::Window* GetDefaultParent(aura::Window* window, + const gfx::Rect& bounds) override; + + // aura::WindowTreeHostObserver: + void OnHostCloseRequested(aura::WindowTreeHost* host) override; + + // AppWindowRegistry::Observer: + void OnAppWindowRemoved(AppWindow* app_window) override; + + private: + void DestroyWindowTreeHost(); + + DesktopDelegate* const desktop_delegate_; + ShellScreen* const screen_; + + // The BrowserContext used to create AppWindows. + content::BrowserContext* const browser_context_; + + // The host we create. + std::unique_ptr<aura::WindowTreeHost> host_; + + // List of AppWindows we've created. Used to close any remaining app windows + // when |host_| is closed or |this| is destroyed. + // Note: Pointers are unowned. NativeAppWindow::Close() will delete them. + std::list<AppWindow*> app_windows_; + + DISALLOW_COPY_AND_ASSIGN(RootWindowController); +}; + +} // namespace extensions + +#endif // EXTENSIONS_SHELL_BROWSER_ROOT_WINDOW_CONTROLLER_H_
diff --git a/extensions/shell/browser/root_window_controller_unittest.cc b/extensions/shell/browser/root_window_controller_unittest.cc new file mode 100644 index 0000000..1455c7b8 --- /dev/null +++ b/extensions/shell/browser/root_window_controller_unittest.cc
@@ -0,0 +1,236 @@ +// 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 "extensions/shell/browser/root_window_controller.h" + +#include <algorithm> +#include <list> +#include <memory> + +#include "base/memory/ptr_util.h" +#include "content/public/browser/browser_context.h" +#include "extensions/browser/app_window/app_window.h" +#include "extensions/browser/app_window/native_app_window.h" +#include "extensions/common/test_util.h" +#include "extensions/shell/browser/root_window_controller.h" +#include "extensions/shell/browser/shell_app_window_client.h" +#include "extensions/shell/browser/shell_native_app_window_aura.h" +#include "extensions/shell/browser/shell_screen.h" +#include "extensions/shell/test/shell_test_base_aura.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/aura/window.h" +#include "ui/aura/window_tree_host.h" +#include "ui/display/screen.h" +#include "ui/gfx/geometry/rect.h" +#include "ui/gfx/geometry/size.h" + +namespace extensions { + +namespace { + +// A fake that creates and exposes RootWindowControllers. +class FakeDesktopDelegate : public RootWindowController::DesktopDelegate { + public: + explicit FakeDesktopDelegate(content::BrowserContext* browser_context, + ShellScreen* screen, + const gfx::Rect& bounds) + : browser_context_(browser_context), screen_(screen), bounds_(bounds) {} + ~FakeDesktopDelegate() override = default; + + RootWindowController* CreateRootWindowController() { + root_window_controllers_.emplace_back( + base::MakeUnique<RootWindowController>(this, screen_, bounds_, + browser_context_)); + return root_window_controllers_.back().get(); + } + + // RootWindowController::DesktopDelegate: + void CloseRootWindowController( + RootWindowController* root_window_controller) override { + auto it = std::find_if(root_window_controllers_.begin(), + root_window_controllers_.end(), + [&](const auto& candidate) { + return candidate.get() == root_window_controller; + }); + DCHECK(it != root_window_controllers_.end()); + root_window_controllers_.erase(it); + } + + auto root_window_controller_count() { + return root_window_controllers_.size(); + } + + private: + content::BrowserContext* browser_context_; + ShellScreen* screen_; + const gfx::Rect bounds_; + std::list<std::unique_ptr<RootWindowController>> root_window_controllers_; + + DISALLOW_COPY_AND_ASSIGN(FakeDesktopDelegate); +}; + +// An AppWindowClient for use without a DesktopController. +class TestAppWindowClient : public ShellAppWindowClient { + public: + TestAppWindowClient() = default; + ~TestAppWindowClient() override = default; + + NativeAppWindow* CreateNativeAppWindow( + AppWindow* window, + AppWindow::CreateParams* params) override { + return new ShellNativeAppWindowAura(window, *params); + } +}; + +constexpr gfx::Rect kScreenBounds = gfx::Rect(0, 0, 800, 600); + +} // namespace + +class RootWindowControllerTest : public ShellTestBaseAura { + public: + RootWindowControllerTest() = default; + ~RootWindowControllerTest() override = default; + + void SetUp() override { + ShellTestBaseAura::SetUp(); + + AppWindowClient::Set(&app_window_client_); + screen_ = base::MakeUnique<ShellScreen>(nullptr, kScreenBounds.size()); + display::Screen::SetScreenInstance(screen_.get()); + extension_ = test_util::CreateEmptyExtension(); + + desktop_delegate_ = base::MakeUnique<FakeDesktopDelegate>( + browser_context(), screen_.get(), kScreenBounds); + } + + void TearDown() override { + desktop_delegate_.reset(); + display::Screen::SetScreenInstance(nullptr); + screen_.reset(); + AppWindowClient::Set(nullptr); + ShellTestBaseAura::TearDown(); + } + + protected: + // Creates and returns an AppWindow using the RootWindowController. + AppWindow* CreateAppWindow(RootWindowController* root) { + AppWindow* app_window = + root->CreateAppWindow(browser_context(), extension()); + InitAppWindow(app_window); + root->AddAppWindow(app_window->GetNativeWindow()); + return app_window; + } + + // Checks that there are |num_expected| AppWindows open. + void ExpectNumAppWindows(RootWindowController* root, size_t expected) { + EXPECT_EQ(expected, root->host()->window()->children().size()); + EXPECT_EQ(expected, + AppWindowRegistry::Get(browser_context())->app_windows().size()); + } + + FakeDesktopDelegate* desktop_delegate() { return desktop_delegate_.get(); } + const Extension* extension() { return extension_.get(); } + + ShellScreen* screen() { return screen_.get(); } + + private: + TestAppWindowClient app_window_client_; + + scoped_refptr<Extension> extension_; + std::unique_ptr<ShellScreen> screen_; + std::unique_ptr<FakeDesktopDelegate> desktop_delegate_; + + DISALLOW_COPY_AND_ASSIGN(RootWindowControllerTest); +}; + +// Tests RootWindowController's basic setup and teardown. +TEST_F(RootWindowControllerTest, Basic) { + RootWindowController* root_window_controller = + desktop_delegate()->CreateRootWindowController(); + EXPECT_TRUE(root_window_controller->host()); + + // The RootWindowController destroys itself when the root window closes. + root_window_controller->OnHostCloseRequested(root_window_controller->host()); + EXPECT_EQ(0u, desktop_delegate()->root_window_controller_count()); +} + +// Tests the window layout. +TEST_F(RootWindowControllerTest, FillLayout) { + RootWindowController* root_window_controller = + desktop_delegate()->CreateRootWindowController(); + + root_window_controller->host()->SetBoundsInPixels(gfx::Rect(0, 0, 500, 700)); + + AppWindow* app_window = + root_window_controller->CreateAppWindow(browser_context(), extension()); + InitAppWindow(app_window); + root_window_controller->AddAppWindow(app_window->GetNativeWindow()); + + ExpectNumAppWindows(root_window_controller, 1u); + + // Test that reshaping the host window also resizes the child window, and + // moving the host doesn't affect the child's position relative to the host. + root_window_controller->host()->SetBoundsInPixels( + gfx::Rect(100, 200, 300, 400)); + + const aura::Window* root_window = root_window_controller->host()->window(); + EXPECT_EQ(gfx::Rect(0, 0, 300, 400), root_window->bounds()); + EXPECT_EQ(gfx::Rect(0, 0, 300, 400), root_window->children()[0]->bounds()); + + // The AppWindow will close on shutdown. +} + +// Tests creating and removing AppWindows. +TEST_F(RootWindowControllerTest, AppWindows) { + RootWindowController* root_window_controller = + desktop_delegate()->CreateRootWindowController(); + + { + // Create some AppWindows. + CreateAppWindow(root_window_controller); + AppWindow* middle_window = CreateAppWindow(root_window_controller); + CreateAppWindow(root_window_controller); + + ExpectNumAppWindows(root_window_controller, 3u); + + // Close one window, which deletes |middle_window|. + middle_window->GetBaseWindow()->Close(); + } + + ExpectNumAppWindows(root_window_controller, 2u); + + // Close all remaining windows. + root_window_controller->CloseAppWindows(); + ExpectNumAppWindows(root_window_controller, 0u); +} + +// Tests that a second RootWindowController can be used independently of the +// first. +TEST_F(RootWindowControllerTest, Multiple) { + // Create the longer-lived RootWindowController before the shorter-lived one + // is deleted. Otherwise it may be created at the same address, preventing + // the test from failing on use-after-free. + RootWindowController* longer_lived = + desktop_delegate()->CreateRootWindowController(); + { + RootWindowController* shorter_lived = + desktop_delegate()->CreateRootWindowController(); + { + AppWindow* app_window = CreateAppWindow(shorter_lived); + ExpectNumAppWindows(shorter_lived, 1u); + app_window->GetBaseWindow()->Close(); // Deletes the AppWindow. + } + ExpectNumAppWindows(shorter_lived, 0u); + + // Simulate a close request to delete the controller. + shorter_lived->OnHostCloseRequested(shorter_lived->host()); + } + + // The still-living RootWindowController can still be used. + AppWindow* app_window = CreateAppWindow(longer_lived); + ExpectNumAppWindows(longer_lived, 1u); + app_window->GetBaseWindow()->Close(); +} + +} // namespace extensions
diff --git a/extensions/shell/browser/shell_browser_main_delegate.h b/extensions/shell/browser/shell_browser_main_delegate.h index a3ddf7f..67d2d7c7 100644 --- a/extensions/shell/browser/shell_browser_main_delegate.h +++ b/extensions/shell/browser/shell_browser_main_delegate.h
@@ -28,7 +28,8 @@ // Creates the ShellDesktopControllerAura instance to initialize the root // window and window manager. Subclass may return its subclass to customize // the window manager. - virtual DesktopController* CreateDesktopController() = 0; + virtual DesktopController* CreateDesktopController( + content::BrowserContext* context) = 0; }; } // namespace extensions
diff --git a/extensions/shell/browser/shell_browser_main_parts.cc b/extensions/shell/browser/shell_browser_main_parts.cc index ea8076a1..b772850a 100644 --- a/extensions/shell/browser/shell_browser_main_parts.cc +++ b/extensions/shell/browser/shell_browser_main_parts.cc
@@ -179,7 +179,8 @@ storage_monitor::StorageMonitor::Create(); - desktop_controller_.reset(browser_main_delegate_->CreateDesktopController()); + desktop_controller_.reset( + browser_main_delegate_->CreateDesktopController(browser_context_.get())); // TODO(jamescook): Initialize user_manager::UserManager.
diff --git a/extensions/shell/browser/shell_desktop_controller_aura.cc b/extensions/shell/browser/shell_desktop_controller_aura.cc index 5ecf36f..c563510 100644 --- a/extensions/shell/browser/shell_desktop_controller_aura.cc +++ b/extensions/shell/browser/shell_desktop_controller_aura.cc
@@ -4,36 +4,28 @@ #include "extensions/shell/browser/shell_desktop_controller_aura.h" -#include <algorithm> #include <string> #include "base/command_line.h" #include "base/location.h" #include "base/logging.h" -#include "base/macros.h" #include "base/memory/ptr_util.h" #include "base/run_loop.h" #include "base/single_thread_task_runner.h" #include "base/threading/thread_task_runner_handle.h" -#include "build/build_config.h" -#include "extensions/browser/app_window/app_window.h" -#include "extensions/browser/app_window/native_app_window.h" -#include "extensions/shell/browser/shell_app_delegate.h" #include "extensions/shell/browser/shell_app_window_client.h" #include "extensions/shell/browser/shell_screen.h" #include "extensions/shell/common/switches.h" #include "ui/aura/client/cursor_client.h" #include "ui/aura/client/default_capture_client.h" -#include "ui/aura/layout_manager.h" #include "ui/aura/window.h" -#include "ui/aura/window_tracker.h" #include "ui/aura/window_tree_host.h" #include "ui/base/cursor/cursor.h" #include "ui/base/cursor/image_cursors.h" #include "ui/base/ime/input_method.h" +#include "ui/base/ime/input_method_factory.h" #include "ui/base/user_activity/user_activity_detector.h" #include "ui/display/screen.h" -#include "ui/events/event_sink.h" #include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/size.h" #include "ui/gfx/native_widget_types.h" @@ -58,55 +50,14 @@ namespace extensions { namespace { -// A simple layout manager that makes each new window fill the root window. -class FillLayout : public aura::LayoutManager { - public: - FillLayout(aura::Window* owner) : owner_(owner) { DCHECK(owner_); } - - ~FillLayout() override {} - - private: - // aura::LayoutManager: - void OnWindowResized() override { - // Size the owner's immediate child windows. - aura::WindowTracker children_tracker(owner_->children()); - while (!children_tracker.windows().empty()) { - aura::Window* child = children_tracker.Pop(); - child->SetBounds(gfx::Rect(owner_->bounds().size())); - } - } - - void OnWindowAddedToLayout(aura::Window* child) override { - DCHECK_EQ(owner_, child->parent()); - - // Create a rect at 0,0 with the size of the parent. - gfx::Size parent_size = child->parent()->bounds().size(); - child->SetBounds(gfx::Rect(parent_size)); - } - - void OnWillRemoveWindowFromLayout(aura::Window* child) override {} - - void OnWindowRemovedFromLayout(aura::Window* child) override {} - - void OnChildWindowVisibilityChanged(aura::Window* child, - bool visible) override {} - - void SetChildBounds(aura::Window* child, - const gfx::Rect& requested_bounds) override { - SetChildBoundsDirect(child, requested_bounds); - } - - aura::Window* owner_; // Not owned. - - DISALLOW_COPY_AND_ASSIGN(FillLayout); -}; - // A class that bridges the gap between CursorManager and Aura. It borrows // heavily from NativeCursorManagerAsh. class ShellNativeCursorManager : public wm::NativeCursorManager { public: - explicit ShellNativeCursorManager(aura::WindowTreeHost* host) - : host_(host), image_cursors_(new ui::ImageCursors) {} + explicit ShellNativeCursorManager( + ShellDesktopControllerAura* desktop_controller) + : desktop_controller_(desktop_controller), + image_cursors_(new ui::ImageCursors) {} ~ShellNativeCursorManager() override {} // wm::NativeCursorManager overrides. @@ -123,7 +74,7 @@ delegate->CommitCursor(cursor); if (delegate->IsCursorVisible()) - ApplyCursor(cursor); + SetCursorOnAllRootWindows(cursor); } void SetVisibility(bool visible, @@ -135,7 +86,7 @@ } else { gfx::NativeCursor invisible_cursor(ui::CursorType::kNone); image_cursors_->SetPlatformCursor(&invisible_cursor); - ApplyCursor(invisible_cursor); + SetCursorOnAllRootWindows(invisible_cursor); } } @@ -156,9 +107,12 @@ private: // Sets |cursor| as the active cursor within Aura. - void ApplyCursor(gfx::NativeCursor cursor) { host_->SetCursor(cursor); } + void SetCursorOnAllRootWindows(gfx::NativeCursor cursor) { + if (desktop_controller_->GetPrimaryHost()) + desktop_controller_->GetPrimaryHost()->SetCursor(cursor); + } - aura::WindowTreeHost* host_; // Not owned. + ShellDesktopControllerAura* desktop_controller_; // Not owned. std::unique_ptr<ui::ImageCursors> image_cursors_; @@ -180,8 +134,10 @@ } // namespace -ShellDesktopControllerAura::ShellDesktopControllerAura() - : app_window_client_(new ShellAppWindowClient) { +ShellDesktopControllerAura::ShellDesktopControllerAura( + content::BrowserContext* browser_context) + : browser_context_(browser_context), + app_window_client_(new ShellAppWindowClient) { extensions::AppWindowClient::Set(app_window_client_.get()); #if defined(OS_CHROMEOS) @@ -193,12 +149,12 @@ display_configurator_->ForceInitialConfigure(); display_configurator_->AddObserver(this); #endif - CreateRootWindow(); + + InitWindowManager(); } ShellDesktopControllerAura::~ShellDesktopControllerAura() { - CloseAppWindows(); - DestroyRootWindow(); + TearDownWindowManager(); #if defined(OS_CHROMEOS) chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->RemoveObserver( this); @@ -216,41 +172,26 @@ AppWindow* ShellDesktopControllerAura::CreateAppWindow( content::BrowserContext* context, const Extension* extension) { - // Start observing for OnAppWindowClosed. Note: We can't remove this observer - // later because this class expects to outlive the AppWindowRegistry. - AppWindowRegistry* registry = AppWindowRegistry::Get(context); - if (!registry->HasObserver(this)) - registry->AddObserver(this); - - app_windows_.push_back( - new AppWindow(context, new ShellAppDelegate, extension)); - return app_windows_.back(); + return root_window_controller_->CreateAppWindow(context, extension); } void ShellDesktopControllerAura::AddAppWindow(gfx::NativeWindow window) { - aura::Window* root_window = host_->window(); - root_window->AddChild(window); + root_window_controller_->AddAppWindow(window); } void ShellDesktopControllerAura::CloseAppWindows() { - // Move the original list into a temporary one: Closing the windows will - // trigger OnAppWindowRemoved, which would invalidate iterators into the - // original list. - std::list<AppWindow*> app_windows = std::move(app_windows_); - for (AppWindow* app_window : app_windows) - app_window->GetBaseWindow()->Close(); // Close() deletes |app_window|. + root_window_controller_->CloseAppWindows(); } -void ShellDesktopControllerAura::OnAppWindowRemoved(AppWindow* window) { - // If we created this AppWindow, remove it from our list so we don't try to - // close it again later. - app_windows_.remove(window); -} +void ShellDesktopControllerAura::CloseRootWindowController( + RootWindowController* root_window_controller) { + DCHECK_EQ(root_window_controller_.get(), root_window_controller); -aura::Window* ShellDesktopControllerAura::GetDefaultParent( - aura::Window* window, - const gfx::Rect& bounds) { - return host_->window(); + // Just quit. The RootWindowController must stay alive until we begin + // TearDownWindowManager(). + // run_loop_ may be null in tests. + if (run_loop_) + run_loop_->QuitWhenIdle(); } #if defined(OS_CHROMEOS) @@ -268,56 +209,103 @@ const display::DisplayConfigurator::DisplayStateList& displays) { gfx::Size size = GetPrimaryDisplaySize(); if (!size.IsEmpty()) - host_->UpdateRootWindowSizeInPixels(size); + root_window_controller_->UpdateSize(size); } #endif -void ShellDesktopControllerAura::OnHostCloseRequested( - aura::WindowTreeHost* host) { - DCHECK_EQ(host_.get(), host); - CloseAppWindows(); - - // run_loop_ may be null in tests. - if (run_loop_) - run_loop_->QuitWhenIdle(); -} - ui::EventDispatchDetails ShellDesktopControllerAura::DispatchKeyEventPostIME( ui::KeyEvent* key_event) { - return host_->DispatchKeyEventPostIME(key_event); + DCHECK(root_window_controller_); + + // TODO(michaelpg): With multiple windows, determine which root window + // triggered the event. See ash::WindowTreeHostManager for example. + return GetPrimaryHost()->DispatchKeyEventPostIME(key_event); +} + +aura::WindowTreeHost* ShellDesktopControllerAura::GetPrimaryHost() { + if (!root_window_controller_) + return nullptr; + return root_window_controller_->host(); } void ShellDesktopControllerAura::InitWindowManager() { - wm::FocusController* focus_controller = - new wm::FocusController(new AppsFocusRules()); - aura::client::SetFocusClient(host_->window(), focus_controller); - host_->window()->AddPreTargetHandler(focus_controller); - wm::SetActivationClient(host_->window(), focus_controller); - focus_client_.reset(focus_controller); + root_window_event_filter_ = base::MakeUnique<wm::CompoundEventFilter>(); - capture_client_.reset( - new aura::client::DefaultCaptureClient(host_->window())); + // Set up basic pieces of ui::wm. + screen_ = base::MakeUnique<ShellScreen>(this, GetStartingWindowSize()); + display::Screen::SetScreenInstance(screen_.get()); - // Ensure new windows fill the display. - host_->window()->SetLayoutManager(new FillLayout(host_->window())); + focus_controller_ = + base::MakeUnique<wm::FocusController>(new AppsFocusRules()); - cursor_manager_.reset( - new wm::CursorManager(std::unique_ptr<wm::NativeCursorManager>( - new ShellNativeCursorManager(host_.get())))); - cursor_manager_->SetDisplay( - display::Screen::GetScreen()->GetPrimaryDisplay()); - cursor_manager_->SetCursor(ui::CursorType::kPointer); - aura::client::SetCursorClient(host_->window(), cursor_manager_.get()); + cursor_manager_ = base::MakeUnique<wm::CursorManager>( + base::MakeUnique<ShellNativeCursorManager>(this)); - user_activity_detector_.reset(new ui::UserActivityDetector); + user_activity_detector_ = base::MakeUnique<ui::UserActivityDetector>(); #if defined(OS_CHROMEOS) - user_activity_notifier_.reset( - new ui::UserActivityPowerManagerNotifier(user_activity_detector_.get())); + user_activity_notifier_ = + base::MakeUnique<ui::UserActivityPowerManagerNotifier>( + user_activity_detector_.get()); #endif + + // Create the root window, then set it up as our primary window. + CreateRootWindowController(); + FinalizeWindowManager(); } -void ShellDesktopControllerAura::CreateRootWindow() { - // Set up basic pieces of ui::wm. +void ShellDesktopControllerAura::CreateRootWindowController() { + // TODO(michaelpg): Support creating a host for a secondary display. + root_window_controller_ = base::MakeUnique<RootWindowController>( + this, screen_.get(), + gfx::Rect(screen_->GetPrimaryDisplay().GetSizeInPixel()), + browser_context_); + + // Initialize the root window with our clients. + aura::Window* root_window = root_window_controller_->host()->window(); + root_window->AddPreTargetHandler(root_window_event_filter_.get()); + aura::client::SetFocusClient(root_window, focus_controller_.get()); + root_window->AddPreTargetHandler(focus_controller_.get()); + wm::SetActivationClient(root_window, focus_controller_.get()); + aura::client::SetCursorClient(root_window, cursor_manager_.get()); +} + +void ShellDesktopControllerAura::FinalizeWindowManager() { + // Create an input method and become its delegate. + input_method_ = + ui::CreateInputMethod(this, GetPrimaryHost()->GetAcceleratedWidget()); + + cursor_manager_->SetDisplay(screen_->GetPrimaryDisplay()); + cursor_manager_->SetCursor(ui::CursorType::kPointer); + + // TODO(michaelpg): Replace with a capture client supporting multiple + // WindowTreeHosts. + capture_client_ = base::MakeUnique<aura::client::DefaultCaptureClient>( + GetPrimaryHost()->window()); +} + +void ShellDesktopControllerAura::TearDownWindowManager() { + GetPrimaryHost()->window()->RemovePreTargetHandler( + root_window_event_filter_.get()); + root_window_event_filter_.reset(); + + // The DefaultCaptureClient must be destroyed before the root window. + capture_client_.reset(); + + GetPrimaryHost()->window()->RemovePreTargetHandler(focus_controller_.get()); + wm::SetActivationClient(GetPrimaryHost()->window(), nullptr); + root_window_controller_.reset(); + + focus_controller_.reset(); + cursor_manager_.reset(); +#if defined(OS_CHROMEOS) + user_activity_notifier_.reset(); +#endif + user_activity_detector_.reset(); + display::Screen::SetScreenInstance(nullptr); + screen_.reset(); +} + +gfx::Size ShellDesktopControllerAura::GetStartingWindowSize() { gfx::Size size; base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); if (command_line->HasSwitch(switches::kAppShellHostWindowSize)) { @@ -331,49 +319,7 @@ } if (size.IsEmpty()) size = gfx::Size(1920, 1080); - - screen_.reset(new ShellScreen(size)); - display::Screen::SetScreenInstance(screen_.get()); - - host_.reset(screen_->CreateHostForPrimaryDisplay()); - aura::client::SetWindowParentingClient(host_->window(), this); - root_window_event_filter_.reset(new wm::CompoundEventFilter); - host_->window()->AddPreTargetHandler(root_window_event_filter_.get()); - - // Trigger creation of an input method and become its delegate. - ui::InputMethod* input_method = host_->GetInputMethod(); - input_method->SetDelegate(this); - - InitWindowManager(); - - host_->AddObserver(this); - - // Ensure the X window gets mapped. - host_->Show(); -} - -void ShellDesktopControllerAura::DestroyRootWindow() { - host_->RemoveObserver(this); - wm::FocusController* focus_controller = - static_cast<wm::FocusController*>(focus_client_.get()); - if (focus_controller) { - host_->window()->RemovePreTargetHandler(focus_controller); - wm::SetActivationClient(host_->window(), NULL); - } - - host_->window()->RemovePreTargetHandler(root_window_event_filter_.get()); - root_window_event_filter_.reset(); - - capture_client_.reset(); - focus_client_.reset(); - cursor_manager_.reset(); -#if defined(OS_CHROMEOS) - user_activity_notifier_.reset(); -#endif - user_activity_detector_.reset(); - host_.reset(); - display::Screen::SetScreenInstance(nullptr); - screen_.reset(); + return size; } gfx::Size ShellDesktopControllerAura::GetPrimaryDisplaySize() {
diff --git a/extensions/shell/browser/shell_desktop_controller_aura.h b/extensions/shell/browser/shell_desktop_controller_aura.h index 4dae572..d18a1b4 100644 --- a/extensions/shell/browser/shell_desktop_controller_aura.h +++ b/extensions/shell/browser/shell_desktop_controller_aura.h
@@ -5,16 +5,13 @@ #ifndef EXTENSIONS_SHELL_BROWSER_SHELL_DESKTOP_CONTROLLER_AURA_H_ #define EXTENSIONS_SHELL_BROWSER_SHELL_DESKTOP_CONTROLLER_AURA_H_ -#include <list> #include <memory> #include "base/compiler_specific.h" #include "base/macros.h" #include "build/build_config.h" -#include "extensions/browser/app_window/app_window_registry.h" #include "extensions/shell/browser/desktop_controller.h" -#include "ui/aura/client/window_parenting_client.h" -#include "ui/aura/window_tree_host_observer.h" +#include "extensions/shell/browser/root_window_controller.h" #include "ui/base/ime/input_method_delegate.h" #if defined(OS_CHROMEOS) @@ -23,57 +20,56 @@ #endif namespace aura { -class Window; class WindowTreeHost; namespace client { class DefaultCaptureClient; -class FocusClient; -} -} +} // namespace client +} // namespace aura namespace base { class RunLoop; -} +} // namespace base + +namespace content { +class BrowserContext; +} // namespace content namespace gfx { class Size; -} +} // namespace gfx namespace ui { +class InputMethod; class UserActivityDetector; #if defined(OS_CHROMEOS) class UserActivityPowerManagerNotifier; #endif -} +} // namespace ui namespace wm { class CompoundEventFilter; class CursorManager; -} +class FocusController; +} // namespace wm namespace extensions { class AppWindowClient; -class Extension; class ShellScreen; // Simple desktop controller for app_shell. Sets up a root Aura window for the // primary display. class ShellDesktopControllerAura : public DesktopController, - public AppWindowRegistry::Observer, - public aura::client::WindowParentingClient, + public RootWindowController::DesktopDelegate, #if defined(OS_CHROMEOS) public chromeos::PowerManagerClient::Observer, public display::DisplayConfigurator::Observer, #endif - public aura::WindowTreeHostObserver, public ui::internal::InputMethodDelegate { public: - ShellDesktopControllerAura(); + explicit ShellDesktopControllerAura(content::BrowserContext* browser_context); ~ShellDesktopControllerAura() override; - aura::WindowTreeHost* host() { return host_.get(); } - // DesktopController: void Run() override; AppWindow* CreateAppWindow(content::BrowserContext* context, @@ -81,12 +77,9 @@ void AddAppWindow(gfx::NativeWindow window) override; void CloseAppWindows() override; - // AppWindowRegistry::Observer overrides: - void OnAppWindowRemoved(AppWindow* app_window) override; - - // aura::client::WindowParentingClient overrides: - aura::Window* GetDefaultParent(aura::Window* window, - const gfx::Rect& bounds) override; + // RootWindowController::DesktopDelegate: + void CloseRootWindowController( + RootWindowController* root_window_controller) override; #if defined(OS_CHROMEOS) // chromeos::PowerManagerClient::Observer overrides: @@ -98,42 +91,58 @@ const display::DisplayConfigurator::DisplayStateList& displays) override; #endif - // aura::WindowTreeHostObserver overrides: - void OnHostCloseRequested(aura::WindowTreeHost* host) override; - // ui::internal::InputMethodDelegate overrides: ui::EventDispatchDetails DispatchKeyEventPostIME( ui::KeyEvent* key_event) override; + // Returns the RootWindowController's WindowTreeHost. + aura::WindowTreeHost* GetPrimaryHost(); + + RootWindowController* root_window_controller() { + return root_window_controller_.get(); + } + protected: // Creates and sets the aura clients and window manager stuff. Subclass may // initialize different sets of the clients. virtual void InitWindowManager(); - private: - // Creates the window that hosts the app. - void CreateRootWindow(); + // Tears down the window manager stuff set up in InitWindowManager(). + virtual void TearDownWindowManager(); - // Closes and destroys the root window hosting the app. - void DestroyRootWindow(); + private: + // Creates the RootWindowController that hosts the app. + void CreateRootWindowController(); + + // Finishes set-up using the RootWindowController. + void FinalizeWindowManager(); + + // Returns the desired dimensions of the RootWindowController from the command + // line, or falls back to a default size. + gfx::Size GetStartingWindowSize(); // Returns the dimensions (in pixels) of the primary display, or an empty size // if the dimensions can't be determined or no display is connected. gfx::Size GetPrimaryDisplaySize(); + content::BrowserContext* const browser_context_; + #if defined(OS_CHROMEOS) std::unique_ptr<display::DisplayConfigurator> display_configurator_; #endif std::unique_ptr<ShellScreen> screen_; - std::unique_ptr<aura::WindowTreeHost> host_; - std::unique_ptr<wm::CompoundEventFilter> root_window_event_filter_; + // TODO(michaelpg): Support one RootWindowController per display. + std::unique_ptr<RootWindowController> root_window_controller_; + + std::unique_ptr<ui::InputMethod> input_method_; + std::unique_ptr<aura::client::DefaultCaptureClient> capture_client_; - std::unique_ptr<aura::client::FocusClient> focus_client_; + std::unique_ptr<wm::FocusController> focus_controller_; std::unique_ptr<wm::CursorManager> cursor_manager_;
diff --git a/extensions/shell/browser/shell_desktop_controller_aura_unittest.cc b/extensions/shell/browser/shell_desktop_controller_aura_unittest.cc index 4590aff8..af55714b 100644 --- a/extensions/shell/browser/shell_desktop_controller_aura_unittest.cc +++ b/extensions/shell/browser/shell_desktop_controller_aura_unittest.cc
@@ -56,12 +56,7 @@ #endif ShellTestBaseAura::SetUp(); - - // The input method will be used for the next CreateInputMethod call, - // causing the host to take ownership. - ui::SetUpInputMethodForTesting(new ui::InputMethodMinimal(nullptr)); - - controller_.reset(new ShellDesktopControllerAura()); + controller_.reset(new ShellDesktopControllerAura(browser_context())); } void TearDown() override { @@ -73,30 +68,6 @@ } protected: - // Creates an AppWindow, which should delete itself when closed. - AppWindow* CreateAppWindow(Extension* extension) { - AppWindow* app_window = - controller_->CreateAppWindow(browser_context(), extension); - - std::unique_ptr<content::WebContents> web_contents( - content::WebContents::Create( - content::WebContents::CreateParams(browser_context()))); - std::unique_ptr<TestAppWindowContents> app_window_contents = - base::MakeUnique<TestAppWindowContents>(std::move(web_contents)); - - // Init the ShellExtensionsWebContentsObserver. - app_window->app_delegate()->InitWebContents( - app_window_contents->GetWebContents()); - - content::RenderFrameHost* main_frame = - app_window_contents->GetWebContents()->GetMainFrame(); - EXPECT_TRUE(main_frame); - - app_window->Init(GURL(std::string()), app_window_contents.release(), - main_frame, AppWindow::CreateParams()); - return app_window; - } - std::unique_ptr<ShellDesktopControllerAura> controller_; #if defined(OS_CHROMEOS) @@ -126,7 +97,8 @@ // Tests that basic input events are handled and forwarded to the host. // TODO(michaelpg): Test other types of input. TEST_F(ShellDesktopControllerAuraTest, InputEvents) { - ui::InputMethod* input_method = controller_->host()->GetInputMethod(); + ui::InputMethod* input_method = + controller_->GetPrimaryHost()->GetInputMethod(); ASSERT_TRUE(input_method); // Set up a focused text input to receive the keypress event. @@ -137,8 +109,8 @@ // Dispatch a keypress on the window tree host to verify it is processed. ui::KeyEvent key_press(base::char16(97), ui::VKEY_A, ui::EF_NONE); ui::EventDispatchDetails details = - controller_->host()->dispatcher()->DispatchEvent( - controller_->host()->window(), &key_press); + controller_->GetPrimaryHost()->dispatcher()->DispatchEvent( + controller_->GetPrimaryHost()->window(), &key_press); EXPECT_FALSE(details.dispatcher_destroyed); EXPECT_FALSE(details.target_destroyed); EXPECT_TRUE(key_press.handled()); @@ -148,58 +120,35 @@ input_method->DetachTextInputClient(&client); } -// Tests the basic window layout. -TEST_F(ShellDesktopControllerAuraTest, FillLayout) { - controller_->host()->SetBoundsInPixels(gfx::Rect(0, 0, 500, 700)); - - scoped_refptr<Extension> extension = test_util::CreateEmptyExtension(); - CreateAppWindow(extension.get()); - - aura::Window* root_window = controller_->host()->window(); - EXPECT_EQ(1u, root_window->children().size()); - - // Test that reshaping the host window also resizes the child window. - controller_->host()->SetBoundsInPixels(gfx::Rect(0, 0, 400, 300)); - - EXPECT_EQ(400, root_window->bounds().width()); - EXPECT_EQ(400, root_window->children()[0]->bounds().width()); - - // The AppWindow will close on shutdown. -} - -// Tests that the AppWindows are removed when closed. -TEST_F(ShellDesktopControllerAuraTest, OnAppWindowClose) { - scoped_refptr<Extension> extension = test_util::CreateEmptyExtension(); - AppWindow* app_window1 = CreateAppWindow(extension.get()); - - aura::Window* root_window = controller_->host()->window(); - EXPECT_EQ(1u, root_window->children().size()); - - AppWindow* app_window2 = CreateAppWindow(extension.get()); - EXPECT_EQ(2u, root_window->children().size()); - - app_window1->GetBaseWindow()->Close(); - app_window1 = nullptr; // Close() deletes the AppWindow. - // The second window is still open. - EXPECT_EQ(1u, root_window->children().size()); - - app_window2->GetBaseWindow()->Close(); - app_window2 = nullptr; // Close() deletes the AppWindow. - EXPECT_EQ(0u, root_window->children().size()); -} - // Tests closing all AppWindows. TEST_F(ShellDesktopControllerAuraTest, CloseAppWindows) { + const AppWindowRegistry* app_window_registry = + AppWindowRegistry::Get(browser_context()); scoped_refptr<Extension> extension = test_util::CreateEmptyExtension(); - CreateAppWindow(extension.get()); - CreateAppWindow(extension.get()); - CreateAppWindow(extension.get()); - - aura::Window* root_window = controller_->host()->window(); - EXPECT_EQ(3u, root_window->children().size()); + for (int i = 0; i < 3; i++) { + InitAppWindow( + controller_->CreateAppWindow(browser_context(), extension.get())); + } + EXPECT_EQ(3u, app_window_registry->app_windows().size()); controller_->CloseAppWindows(); - EXPECT_EQ(0u, root_window->children().size()); + EXPECT_EQ(0u, app_window_registry->app_windows().size()); +} + +// Tests that the AppWindows are removed when the desktop controller goes away. +TEST_F(ShellDesktopControllerAuraTest, OnAppWindowClose) { + const AppWindowRegistry* app_window_registry = + AppWindowRegistry::Get(browser_context()); + scoped_refptr<Extension> extension = test_util::CreateEmptyExtension(); + for (int i = 0; i < 3; i++) { + InitAppWindow( + controller_->CreateAppWindow(browser_context(), extension.get())); + } + EXPECT_EQ(3u, app_window_registry->app_windows().size()); + + // Deleting the controller closes all app windows. + controller_.reset(); + EXPECT_EQ(0u, app_window_registry->app_windows().size()); } } // namespace extensions
diff --git a/extensions/shell/browser/shell_extensions_api_client.cc b/extensions/shell/browser/shell_extensions_api_client.cc index d1fa28e..2471ef4 100644 --- a/extensions/shell/browser/shell_extensions_api_client.cc +++ b/extensions/shell/browser/shell_extensions_api_client.cc
@@ -51,4 +51,10 @@ return messaging_delegate_.get(); } +FeedbackPrivateDelegate* +ShellExtensionsAPIClient::GetFeedbackPrivateDelegate() { + NOTIMPLEMENTED(); + return nullptr; +} + } // namespace extensions
diff --git a/extensions/shell/browser/shell_extensions_api_client.h b/extensions/shell/browser/shell_extensions_api_client.h index 9db406fe..66154af 100644 --- a/extensions/shell/browser/shell_extensions_api_client.h +++ b/extensions/shell/browser/shell_extensions_api_client.h
@@ -9,6 +9,7 @@ #include "extensions/browser/api/extensions_api_client.h" +#include "base/macros.h" #include "build/build_config.h" namespace extensions { @@ -31,6 +32,7 @@ FileSystemDelegate* GetFileSystemDelegate() override; #endif MessagingDelegate* GetMessagingDelegate() override; + FeedbackPrivateDelegate* GetFeedbackPrivateDelegate() override; private: #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
diff --git a/extensions/shell/browser/shell_native_app_window.cc b/extensions/shell/browser/shell_native_app_window.cc index 02c137d..676e20a 100644 --- a/extensions/shell/browser/shell_native_app_window.cc +++ b/extensions/shell/browser/shell_native_app_window.cc
@@ -131,7 +131,7 @@ return NULL; } -void ShellNativeAppWindow::UpdateShape(std::unique_ptr<SkRegion> region) { +void ShellNativeAppWindow::UpdateShape(std::unique_ptr<ShapeRects> rects) { NOTIMPLEMENTED(); }
diff --git a/extensions/shell/browser/shell_native_app_window.h b/extensions/shell/browser/shell_native_app_window.h index fcc3f6e..a282a41 100644 --- a/extensions/shell/browser/shell_native_app_window.h +++ b/extensions/shell/browser/shell_native_app_window.h
@@ -52,7 +52,7 @@ void UpdateDraggableRegions( const std::vector<DraggableRegion>& regions) override; SkRegion* GetDraggableRegion() override; - void UpdateShape(std::unique_ptr<SkRegion> region) override; + void UpdateShape(std::unique_ptr<ShapeRects> rects) override; void HandleKeyboardEvent( const content::NativeWebKeyboardEvent& event) override; bool IsFrameless() const override;
diff --git a/extensions/shell/browser/shell_screen.cc b/extensions/shell/browser/shell_screen.cc index 3881f0d0..1be0067c 100644 --- a/extensions/shell/browser/shell_screen.cc +++ b/extensions/shell/browser/shell_screen.cc
@@ -8,9 +8,12 @@ #include <vector> #include "base/logging.h" +#include "extensions/shell/browser/root_window_controller.h" +#include "extensions/shell/browser/shell_desktop_controller_aura.h" #include "ui/aura/env.h" #include "ui/aura/window.h" #include "ui/aura/window_tree_host.h" +#include "ui/display/display.h" #include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/size.h" #include "ui/gfx/native_widget_types.h" @@ -22,8 +25,11 @@ } // namespace -ShellScreen::ShellScreen(const gfx::Size& size) : host_(nullptr) { +ShellScreen::ShellScreen(ShellDesktopControllerAura* desktop_controller, + const gfx::Size& size) + : desktop_controller_(desktop_controller) { DCHECK(!size.IsEmpty()); + // Screen is positioned at (0,0). display::Display display(kDisplayId); gfx::Rect bounds(size); @@ -32,38 +38,17 @@ } ShellScreen::~ShellScreen() { - DCHECK(!host_) << "Window not closed before destroying ShellScreen"; + DCHECK(!desktop_controller_ || !desktop_controller_->root_window_controller()) + << "WindowTreeHost not closed before destroying ShellScreen"; } -aura::WindowTreeHost* ShellScreen::CreateHostForPrimaryDisplay() { - DCHECK(!host_); - host_ = aura::WindowTreeHost::Create( - gfx::Rect(GetPrimaryDisplay().GetSizeInPixel())); - host_->window()->AddObserver(this); - host_->InitHost(); - host_->window()->Show(); - return host_; -} - -// aura::WindowObserver overrides: - -void ShellScreen::OnWindowBoundsChanged(aura::Window* window, - const gfx::Rect& old_bounds, - const gfx::Rect& new_bounds) { - DCHECK_EQ(host_->window(), window); - display::Display display(GetPrimaryDisplay()); - display.SetSize(new_bounds.size()); +void ShellScreen::OnHostResized(aura::WindowTreeHost* host) { + // Based on ash::WindowTreeHostManager. + display::Display display = GetDisplayNearestWindow(host->window()); + display.SetSize(host->GetBoundsInPixels().size()); display_list().UpdateDisplay(display); } -void ShellScreen::OnWindowDestroying(aura::Window* window) { - DCHECK_EQ(host_->window(), window); - host_->window()->RemoveObserver(this); - host_ = nullptr; -} - -// display::Screen overrides: - gfx::Point ShellScreen::GetCursorScreenPoint() { return aura::Env::GetInstance()->last_mouse_location(); } @@ -73,7 +58,9 @@ } gfx::NativeWindow ShellScreen::GetWindowAtScreenPoint(const gfx::Point& point) { - return host_->window()->GetEventHandlerForPoint(point); + return desktop_controller_->GetPrimaryHost() + ->window() + ->GetEventHandlerForPoint(point); } display::Display ShellScreen::GetDisplayNearestWindow(
diff --git a/extensions/shell/browser/shell_screen.h b/extensions/shell/browser/shell_screen.h index 9746212..6d4cb55 100644 --- a/extensions/shell/browser/shell_screen.h +++ b/extensions/shell/browser/shell_screen.h
@@ -6,7 +6,7 @@ #define EXTENSIONS_SHELL_BROWSER_SHELL_SCREEN_H_ #include "base/macros.h" -#include "ui/aura/window_observer.h" +#include "ui/aura/window_tree_host_observer.h" #include "ui/display/display.h" #include "ui/display/screen_base.h" @@ -19,23 +19,21 @@ } namespace extensions { +class ShellDesktopControllerAura; // A minimal Aura implementation of a screen. Scale factor is locked at 1.0. // When running on a Linux desktop resizing the main window resizes the screen. -class ShellScreen : public display::ScreenBase, public aura::WindowObserver { +class ShellScreen : public display::ScreenBase, + public aura::WindowTreeHostObserver { public: - // Creates a screen occupying |size| physical pixels. - explicit ShellScreen(const gfx::Size& size); + // Creates a screen occupying |size| physical pixels. |desktop_controller| + // can be null in tests. + ShellScreen(ShellDesktopControllerAura* desktop_controller, + const gfx::Size& size); ~ShellScreen() override; - // Caller owns the returned object. - aura::WindowTreeHost* CreateHostForPrimaryDisplay(); - - // WindowObserver overrides: - void OnWindowBoundsChanged(aura::Window* window, - const gfx::Rect& old_bounds, - const gfx::Rect& new_bounds) override; - void OnWindowDestroying(aura::Window* window) override; + // aura::WindowTreeHostObserver overrides: + void OnHostResized(aura::WindowTreeHost* host) override; // display::Screen overrides: gfx::Point GetCursorScreenPoint() override; @@ -45,7 +43,7 @@ gfx::NativeWindow window) const override; private: - aura::WindowTreeHost* host_; // Not owned. + ShellDesktopControllerAura* const desktop_controller_; DISALLOW_COPY_AND_ASSIGN(ShellScreen); };
diff --git a/extensions/shell/browser/shell_screen_unittest.cc b/extensions/shell/browser/shell_screen_unittest.cc index 75a5cd16..b3f31bd 100644 --- a/extensions/shell/browser/shell_screen_unittest.cc +++ b/extensions/shell/browser/shell_screen_unittest.cc
@@ -6,8 +6,8 @@ #include <memory> +#include "extensions/shell/test/shell_test_base_aura.h" #include "testing/gtest/include/gtest/gtest.h" -#include "ui/aura/test/aura_test_base.h" #include "ui/aura/window.h" #include "ui/aura/window_tree_host.h" #include "ui/display/display.h" @@ -16,11 +16,11 @@ namespace extensions { -using ShellScreenTest = aura::test::AuraTestBase; +using ShellScreenTest = ShellTestBaseAura; // Basic sanity tests for ShellScreen. TEST_F(ShellScreenTest, ShellScreen) { - ShellScreen screen(gfx::Size(640, 480)); + ShellScreen screen(nullptr, gfx::Size(640, 480)); // There is only one display. EXPECT_EQ(1, screen.GetNumDisplays()); @@ -30,13 +30,16 @@ EXPECT_EQ("640x480", screen.GetPrimaryDisplay().size().ToString()); // Tests that reshaping the host window reshapes the display. - // NOTE: AuraTestBase already has its own WindowTreeHost. This is creating a - // second one. - std::unique_ptr<aura::WindowTreeHost> host( - screen.CreateHostForPrimaryDisplay()); + std::unique_ptr<aura::WindowTreeHost> host(aura::WindowTreeHost::Create( + gfx::Rect(screen.GetPrimaryDisplay().GetSizeInPixel()))); + host->AddObserver(&screen); + host->InitHost(); EXPECT_TRUE(host->window()); - host->window()->SetBounds(gfx::Rect(0, 0, 800, 600)); + + host->SetBoundsInPixels(gfx::Rect(0, 0, 800, 600)); EXPECT_EQ("800x600", screen.GetPrimaryDisplay().size().ToString()); + + host->RemoveObserver(&screen); } } // namespace extensions
diff --git a/extensions/shell/test/shell_test_base_aura.cc b/extensions/shell/test/shell_test_base_aura.cc index 20912c5..74e033a 100644 --- a/extensions/shell/test/shell_test_base_aura.cc +++ b/extensions/shell/test/shell_test_base_aura.cc
@@ -5,9 +5,14 @@ #include "extensions/shell/test/shell_test_base_aura.h" #include "base/memory/ptr_util.h" +#include "content/public/browser/web_contents.h" #include "content/public/test/test_browser_thread_bundle.h" +#include "extensions/browser/app_window/app_window.h" +#include "extensions/browser/app_window/test_app_window_contents.h" +#include "extensions/shell/browser/shell_app_delegate.h" #include "extensions/shell/test/shell_test_extensions_browser_client.h" #include "extensions/shell/test/shell_test_helper_aura.h" +#include "url/gurl.h" namespace extensions { @@ -30,4 +35,25 @@ helper_->TearDown(); } +void ShellTestBaseAura::InitAppWindow(AppWindow* app_window) { + // Create a TestAppWindowContents for the ShellAppDelegate to initialize the + // ShellExtensionWebContentsObserver with. + std::unique_ptr<content::WebContents> web_contents( + content::WebContents::Create( + content::WebContents::CreateParams(browser_context()))); + std::unique_ptr<TestAppWindowContents> app_window_contents = + base::MakeUnique<TestAppWindowContents>(std::move(web_contents)); + + // Initialize the web contents and AppWindow. + app_window->app_delegate()->InitWebContents( + app_window_contents->GetWebContents()); + + content::RenderFrameHost* main_frame = + app_window_contents->GetWebContents()->GetMainFrame(); + DCHECK(main_frame); + + app_window->Init(GURL(), app_window_contents.release(), main_frame, + AppWindow::CreateParams()); +} + } // namespace extensions
diff --git a/extensions/shell/test/shell_test_base_aura.h b/extensions/shell/test/shell_test_base_aura.h index 65d7ef2f..5e9d8e6 100644 --- a/extensions/shell/test/shell_test_base_aura.h +++ b/extensions/shell/test/shell_test_base_aura.h
@@ -12,6 +12,7 @@ #include "extensions/browser/extensions_test.h" namespace extensions { +class AppWindow; class ShellTestHelperAura; class ShellTestBaseAura : public ExtensionsTest { @@ -23,6 +24,9 @@ void SetUp() override; void TearDown() override; + // Initializes |app_window| for testing. + void InitAppWindow(AppWindow* app_window); + private: std::unique_ptr<ShellTestHelperAura> helper_;
diff --git a/extensions/utility/utility_handler.cc b/extensions/utility/utility_handler.cc index 250330f..320e1fba 100644 --- a/extensions/utility/utility_handler.cc +++ b/extensions/utility/utility_handler.cc
@@ -4,8 +4,14 @@ #include "extensions/utility/utility_handler.h" +#include <memory> +#include <string> +#include <utility> + #include "base/command_line.h" #include "base/files/file_path.h" +#include "base/location.h" +#include "base/task_scheduler/post_task.h" #include "content/public/utility/utility_thread.h" #include "extensions/common/constants.h" #include "extensions/common/extension_l10n_util.h" @@ -27,6 +33,33 @@ namespace { +struct UnpackResult { + std::unique_ptr<base::DictionaryValue> parsed_manifest; + base::string16 error; +}; + +// Unpacks the extension on background task runner. +// On success, returns UnpackResult with |parsed_manifest| set to the parsed +// extension manifest. +// On failure returns UnpackResult with |error| set to the encountered error +// message. +UnpackResult UnpackOnBackgroundTaskRunner(const base::FilePath& path, + const std::string& extension_id, + Manifest::Location location, + int32_t creation_flags) { + Unpacker unpacker(path.DirName(), path, extension_id, location, + creation_flags); + + UnpackResult result; + if (unpacker.Run()) { + result.parsed_manifest = unpacker.TakeParsedManifest(); + } else { + result.error = unpacker.error_message(); + } + + return result; +} + class ExtensionUnpackerImpl : public extensions::mojom::ExtensionUnpacker { public: ExtensionUnpackerImpl() = default; @@ -42,13 +75,19 @@ void Unzip(const base::FilePath& file, const base::FilePath& path, UnzipCallback callback) override { - std::unique_ptr<base::DictionaryValue> manifest; - if (UnzipFileManifestIntoPath(file, path, &manifest)) { - std::move(callback).Run( - UnzipFileIntoPath(file, path, std::move(manifest))); - } else { - std::move(callback).Run(false); - } + // Move unzip operation to background thread to avoid blocking the main + // utility thread for extended amont of time. For example, this prevents + // extension unzipping block receipt of the connection complete + // notification for the utility process channel to the browser process, + // which could cause the utility process to terminate itself due to browser + // process being considered unreachable. + base::PostTaskWithTraitsAndReplyWithResult( + FROM_HERE, + {base::TaskPriority::USER_BLOCKING, base::MayBlock(), + base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}, + base::BindOnce(&ExtensionUnpackerImpl::UnzipOnBackgroundTaskRunner, + file, path), + std::move(callback)); } void Unpack(version_info::Channel channel, @@ -68,13 +107,20 @@ SetCurrentChannel(channel); SetCurrentFeatureSessionType(type); - Unpacker unpacker(path.DirName(), path, extension_id, location, - creation_flags); - if (unpacker.Run()) { - std::move(callback).Run(base::string16(), unpacker.TakeParsedManifest()); - } else { - std::move(callback).Run(unpacker.error_message(), nullptr); - } + // Move unpack operation to background thread to prevent it from blocking + // the utility process thread for extended amount of time. + base::PostTaskWithTraitsAndReplyWithResult( + FROM_HERE, + {base::TaskPriority::USER_BLOCKING, base::MayBlock(), + base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}, + base::BindOnce(&UnpackOnBackgroundTaskRunner, path, extension_id, + location, creation_flags), + base::BindOnce( + [](UnpackCallback callback, UnpackResult result) { + std::move(callback).Run(result.error, + std::move(result.parsed_manifest)); + }, + std::move(callback))); } static bool UnzipFileManifestIntoPath( @@ -104,6 +150,17 @@ true /* log_skipped_files */); } + // Unzips the extension from |file| to |path|. + // Returns whether the unzip operation succeeded. + static bool UnzipOnBackgroundTaskRunner(const base::FilePath& file, + const base::FilePath& path) { + std::unique_ptr<base::DictionaryValue> manifest; + if (!UnzipFileManifestIntoPath(file, path, &manifest)) + return false; + + return UnzipFileIntoPath(file, path, std::move(manifest)); + } + DISALLOW_COPY_AND_ASSIGN(ExtensionUnpackerImpl); };
diff --git a/gpu/ipc/client/gpu_memory_buffer_impl_io_surface.cc b/gpu/ipc/client/gpu_memory_buffer_impl_io_surface.cc index a87bd304..0f40e912 100644 --- a/gpu/ipc/client/gpu_memory_buffer_impl_io_surface.cc +++ b/gpu/ipc/client/gpu_memory_buffer_impl_io_surface.cc
@@ -22,6 +22,7 @@ case gfx::BufferUsage::GPU_READ: case gfx::BufferUsage::SCANOUT: case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE: + case gfx::BufferUsage::SCANOUT_VDA_WRITE: case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT: return 0; }
diff --git a/gpu/ipc/client/gpu_memory_buffer_impl_shared_memory.cc b/gpu/ipc/client/gpu_memory_buffer_impl_shared_memory.cc index d138b1d..3deb043 100644 --- a/gpu/ipc/client/gpu_memory_buffer_impl_shared_memory.cc +++ b/gpu/ipc/client/gpu_memory_buffer_impl_shared_memory.cc
@@ -102,6 +102,7 @@ case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE: return true; case gfx::BufferUsage::SCANOUT: + case gfx::BufferUsage::SCANOUT_VDA_WRITE: return false; } NOTREACHED();
diff --git a/gpu/ipc/client/gpu_memory_buffer_impl_test_template.h b/gpu/ipc/client/gpu_memory_buffer_impl_test_template.h index af67695c..fb7b8911 100644 --- a/gpu/ipc/client/gpu_memory_buffer_impl_test_template.h +++ b/gpu/ipc/client/gpu_memory_buffer_impl_test_template.h
@@ -52,8 +52,10 @@ for (auto format : gfx::GetBufferFormatsForTesting()) { gfx::BufferUsage usages[] = { - gfx::BufferUsage::GPU_READ, gfx::BufferUsage::SCANOUT, + gfx::BufferUsage::GPU_READ, + gfx::BufferUsage::SCANOUT, gfx::BufferUsage::SCANOUT_CPU_READ_WRITE, + gfx::BufferUsage::SCANOUT_VDA_WRITE, gfx::BufferUsage::GPU_READ_CPU_READ_WRITE, gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT}; for (auto usage : usages) {
diff --git a/gpu/ipc/common/gpu_memory_buffer_support.cc b/gpu/ipc/common/gpu_memory_buffer_support.cc index 77f98359..c673968 100644 --- a/gpu/ipc/common/gpu_memory_buffer_support.cc +++ b/gpu/ipc/common/gpu_memory_buffer_support.cc
@@ -42,6 +42,8 @@ format == gfx::BufferFormat::RGBA_F16 || format == gfx::BufferFormat::UYVY_422 || format == gfx::BufferFormat::YUV_420_BIPLANAR; + case gfx::BufferUsage::SCANOUT_VDA_WRITE: + return false; } NOTREACHED(); return false;
diff --git a/gpu/ipc/host/gpu_memory_buffer_support.cc b/gpu/ipc/host/gpu_memory_buffer_support.cc index 813f339..989f92f 100644 --- a/gpu/ipc/host/gpu_memory_buffer_support.cc +++ b/gpu/ipc/host/gpu_memory_buffer_support.cc
@@ -74,7 +74,8 @@ gfx::BufferFormat::YVU_420, gfx::BufferFormat::YUV_420_BIPLANAR}; const gfx::BufferUsage kGPUReadWriteUsages[] = { gfx::BufferUsage::GPU_READ, gfx::BufferUsage::SCANOUT, - gfx::BufferUsage::SCANOUT_CPU_READ_WRITE}; + gfx::BufferUsage::SCANOUT_CPU_READ_WRITE, + gfx::BufferUsage::SCANOUT_VDA_WRITE}; for (auto format : kGPUReadWriteFormats) { for (auto usage : kGPUReadWriteUsages) { if (IsNativeGpuMemoryBufferConfigurationSupported(format, usage))
diff --git a/gpu/ipc/service/gpu_memory_buffer_factory_test_template.h b/gpu/ipc/service/gpu_memory_buffer_factory_test_template.h index 4d0ed2d..4e1095c 100644 --- a/gpu/ipc/service/gpu_memory_buffer_factory_test_template.h +++ b/gpu/ipc/service/gpu_memory_buffer_factory_test_template.h
@@ -31,8 +31,10 @@ for (auto format : gfx::GetBufferFormatsForTesting()) { gfx::BufferUsage usages[] = { - gfx::BufferUsage::GPU_READ, gfx::BufferUsage::SCANOUT, + gfx::BufferUsage::GPU_READ, + gfx::BufferUsage::SCANOUT, gfx::BufferUsage::SCANOUT_CPU_READ_WRITE, + gfx::BufferUsage::SCANOUT_VDA_WRITE, gfx::BufferUsage::GPU_READ_CPU_READ_WRITE, gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT}; for (auto usage : usages) {
diff --git a/headless/BUILD.gn b/headless/BUILD.gn index 91987a4..d2a644d 100644 --- a/headless/BUILD.gn +++ b/headless/BUILD.gn
@@ -223,7 +223,7 @@ extra_deps = [ ":gen_devtools_client_api" ] } -if (headless_fontconfig_utils) { +if (headless_fontconfig_utils && !is_fuchsia) { static_library("headless_fontconfig_utils") { sources = [ "public/util/fontconfig.cc", @@ -280,8 +280,6 @@ "lib/browser/headless_window_tree_host.h", "lib/headless_content_client.cc", "lib/headless_content_client.h", - "lib/headless_crash_reporter_client.cc", - "lib/headless_crash_reporter_client.h", "public/headless_browser.cc", "public/headless_browser.h", "public/headless_browser_context.h", @@ -323,6 +321,13 @@ "public/util/user_agent.h", ] + if (!is_fuchsia) { + sources += [ + "lib/headless_crash_reporter_client.cc", + "lib/headless_crash_reporter_client.h", + ] + } + sources += generated_devtools_api if (use_aura) { @@ -391,11 +396,14 @@ ] deps += [ - "//components/crash/content/browser", "//components/security_state/content", "//third_party/WebKit/public:blink_headers", ] + if (!is_fuchsia) { + deps += [ "//components/crash/content/browser" ] + } + if (enable_basic_printing) { deps += [ "//components/printing/browser", @@ -404,13 +412,6 @@ } } - if (is_fuchsia) { - sources -= [ - "lib/headless_crash_reporter_client.cc", - "lib/headless_crash_reporter_client.h", - ] - } - if (is_mac) { deps += [ ":mac_helpers" ] } else { @@ -431,7 +432,7 @@ deps += [ "//ui/ozone" ] } - if (headless_fontconfig_utils) { + if (headless_fontconfig_utils && !is_fuchsia) { deps += [ ":headless_fontconfig_utils" ] } @@ -510,7 +511,6 @@ ":headless_renderer", "//base/test:run_all_unittests", "//base/test:test_support", - "//components/crash/content/browser", "//components/security_state/content", "//content/public/app:both", "//content/public/child:child", @@ -519,14 +519,14 @@ "//testing/gtest", ] + if (!is_fuchsia) { + deps += [ "//components/crash/content/browser" ] + } + if (enable_basic_printing) { sources += [ "lib/browser/headless_printing_unittest.cc" ] deps += [ "//components/printing/browser" ] } - - if (is_fuchsia) { - deps -= [ "//components/crash/content/browser" ] - } } if (is_mac) { @@ -655,13 +655,16 @@ deps = [ ":headless_renderer", "//base", - "//components/crash/content/browser", "//components/security_state/content", "//content/test:test_support", "//testing/gmock", "//testing/gtest", ] + if (!is_fuchsia) { + deps += [ "//components/crash/content/browser" ] + } + # Only include this if we built the js_binary if (is_linux) { data += [ "$root_out_dir/headless_browser_tests.pak" ] @@ -675,10 +678,6 @@ "//pdf", ] } - - if (is_fuchsia) { - deps -= [ "//components/crash/content/browser" ] - } } if (is_win) { @@ -774,7 +773,6 @@ deps = [ ":headless_renderer", - "//components/crash/content/browser", "//components/security_state/content", "//content/public/app:both", "//content/public/browser", @@ -782,6 +780,10 @@ "//content/public/common", ] + if (!is_fuchsia) { + deps += [ "//components/crash/content/browser" ] + } + if (enable_basic_printing) { deps += [ "//components/printing/browser", @@ -798,10 +800,6 @@ "//sandbox", ] } - - if (is_fuchsia) { - deps -= [ "//components/crash/content/browser" ] - } } if (is_fuchsia) {
diff --git a/infra/config/cq.cfg b/infra/config/cq.cfg index eec7f9105..70f103d 100644 --- a/infra/config/cq.cfg +++ b/infra/config/cq.cfg
@@ -50,7 +50,7 @@ builders { name: "chromium_presubmit" } builders { name: "fuchsia_compile" - experiment_percentage: 10 + experiment_percentage: 100 } builders { name: "linux_chromium_asan_rel_ng" } builders { name: "linux_chromium_chromeos_rel_ng" }
diff --git a/ios/OWNERS b/ios/OWNERS index a5fae73..839f864 100644 --- a/ios/OWNERS +++ b/ios/OWNERS
@@ -11,3 +11,6 @@ # These are for the common case of adding or renaming files. If you're doing # structural changes, please get a review from a reviewer in this file. per-file BUILD.gn=* + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/build/OWNERS b/ios/build/OWNERS index ae82009..ba9c65db 100644 --- a/ios/build/OWNERS +++ b/ios/build/OWNERS
@@ -1,2 +1,5 @@ rohitrao@chromium.org sdefresne@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/build/bots/OWNERS b/ios/build/bots/OWNERS index 7466a7b..bab986314 100644 --- a/ios/build/bots/OWNERS +++ b/ios/build/bots/OWNERS
@@ -3,3 +3,6 @@ rohitrao@chromium.org sdefresne@chromium.org smut@google.com + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/build/bots/chromium.fyi/ClangToTiOS.json b/ios/build/bots/chromium.fyi/ClangToTiOS.json index 2b5ab01..d8b662f8 100644 --- a/ios/build/bots/chromium.fyi/ClangToTiOS.json +++ b/ios/build/bots/chromium.fyi/ClangToTiOS.json
@@ -8,6 +8,7 @@ "is_component_build=false", "is_debug=false", "llvm_force_head_revision=true", + "additional_target_cpus=[\"arm64\",\"x64\",\"x86\"]", "target_cpu=\"arm\"", "target_os=\"ios\"" ],
diff --git a/ios/build/bots/scripts/OWNERS b/ios/build/bots/scripts/OWNERS index 1faa6041..eacf766 100644 --- a/ios/build/bots/scripts/OWNERS +++ b/ios/build/bots/scripts/OWNERS
@@ -2,3 +2,6 @@ baxley@chromium.org sergeyberezin@chromium.org smut@google.com + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/OWNERS b/ios/chrome/OWNERS index df13981..1a9f1a2 100644 --- a/ios/chrome/OWNERS +++ b/ios/chrome/OWNERS
@@ -12,3 +12,6 @@ per-file ios_share_extension_resources.gyp=* per-file ios_today_extension_resources.gyp=* per-file ios_today_extension_resources_bundle.gypi=* + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/app/BUILD.gn b/ios/chrome/app/BUILD.gn index 567b08f..96ab0ee2 100644 --- a/ios/chrome/app/BUILD.gn +++ b/ios/chrome/app/BUILD.gn
@@ -153,6 +153,7 @@ "//components/keyed_service/ios", "//components/metrics", "//components/ntp_snippets", + "//components/payments/core", "//components/prefs", "//components/proxy_config", "//components/signin/core/browser", @@ -189,6 +190,7 @@ "//ios/chrome/browser/net", "//ios/chrome/browser/ntp_snippets", "//ios/chrome/browser/omaha", + "//ios/chrome/browser/payments", "//ios/chrome/browser/prefs", "//ios/chrome/browser/reading_list", "//ios/chrome/browser/search_engines",
diff --git a/ios/chrome/app/DEPS b/ios/chrome/app/DEPS index 522a5e99..e52ccc7 100644 --- a/ios/chrome/app/DEPS +++ b/ios/chrome/app/DEPS
@@ -14,6 +14,7 @@ "+components/history/core/browser", "+components/metrics", "+components/ntp_snippets", + "+components/payments/core", "+components/prefs", "+components/reading_list/core", "+components/signin/core/browser",
diff --git a/ios/chrome/app/OWNERS b/ios/chrome/app/OWNERS index 9e2503a..cb182dd 100644 --- a/ios/chrome/app/OWNERS +++ b/ios/chrome/app/OWNERS
@@ -1,2 +1,5 @@ marq@chromium.org rohitrao@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/app/application_delegate/BUILD.gn b/ios/chrome/app/application_delegate/BUILD.gn index d984b504..6f346ea 100644 --- a/ios/chrome/app/application_delegate/BUILD.gn +++ b/ios/chrome/app/application_delegate/BUILD.gn
@@ -100,6 +100,7 @@ "//components/feature_engagement", "//components/handoff", "//components/metrics", + "//components/payments/core", "//components/prefs", "//ios/chrome/app", "//ios/chrome/app/safe_mode", @@ -114,6 +115,7 @@ "//ios/chrome/browser/metrics", "//ios/chrome/browser/metrics:metrics_internal", "//ios/chrome/browser/net", + "//ios/chrome/browser/payments", "//ios/chrome/browser/tabs", "//ios/chrome/browser/u2f", "//ios/chrome/browser/ui",
diff --git a/ios/chrome/app/application_delegate/OWNERS b/ios/chrome/app/application_delegate/OWNERS index f49ed38..01e8c98 100644 --- a/ios/chrome/app/application_delegate/OWNERS +++ b/ios/chrome/app/application_delegate/OWNERS
@@ -1 +1,4 @@ marq@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/app/application_delegate/app_state.mm b/ios/chrome/app/application_delegate/app_state.mm index 17c365a6..2072d63 100644 --- a/ios/chrome/app/application_delegate/app_state.mm +++ b/ios/chrome/app/application_delegate/app_state.mm
@@ -357,13 +357,18 @@ startupInformation:_startupInformation browserViewInformation:[_browserLauncher browserViewInformation]]; - } else if (_shouldOpenNTPTabOnActive && - ![tabSwitcher openNewTabFromTabSwitcher]) { - BrowserViewController* bvc = - [[_browserLauncher browserViewInformation] currentBVC]; - BOOL incognito = bvc == [[_browserLauncher browserViewInformation] otrBVC]; - [bvc.dispatcher - openNewTab:[OpenNewTabCommand commandWithIncognito:incognito]]; + } else if (_shouldOpenNTPTabOnActive) { + if (![tabSwitcher openNewTabFromTabSwitcher]) { + BrowserViewController* bvc = + [[_browserLauncher browserViewInformation] currentBVC]; + BOOL incognito = + bvc == [[_browserLauncher browserViewInformation] otrBVC]; + [bvc.dispatcher + openNewTab:[OpenNewTabCommand commandWithIncognito:incognito]]; + } + } else { + [[[_browserLauncher browserViewInformation] currentBVC] + presentBubblesIfEligible]; } _shouldOpenNTPTabOnActive = NO;
diff --git a/ios/chrome/app/application_delegate/mock_tab_opener.mm b/ios/chrome/app/application_delegate/mock_tab_opener.mm index e41a08d..ca19a67 100644 --- a/ios/chrome/app/application_delegate/mock_tab_opener.mm +++ b/ios/chrome/app/application_delegate/mock_tab_opener.mm
@@ -50,4 +50,10 @@ return nil; } +- (BOOL)shouldCompletePaymentRequestOnCurrentTab: + (id<StartupInformation>)startupInformation { + // Stub. + return NO; +} + @end
diff --git a/ios/chrome/app/application_delegate/tab_opening.h b/ios/chrome/app/application_delegate/tab_opening.h index ff5ae8d..2d83df9 100644 --- a/ios/chrome/app/application_delegate/tab_opening.h +++ b/ios/chrome/app/application_delegate/tab_opening.h
@@ -41,6 +41,11 @@ - (ProceduralBlock)completionBlockForTriggeringAction: (NTPTabOpeningPostOpeningAction)action; +// Attempts to complete a Payment Request flow with a payment response from a +// a third party app. Returns whether or not this operation was successful. +- (BOOL)shouldCompletePaymentRequestOnCurrentTab: + (id<StartupInformation>)startupInformation; + @end #endif // IOS_CHROME_APP_APPLICATION_DELEGATE_TAB_OPENING_H_
diff --git a/ios/chrome/app/application_delegate/user_activity_handler.mm b/ios/chrome/app/application_delegate/user_activity_handler.mm index 3dcee1f..784ee54 100644 --- a/ios/chrome/app/application_delegate/user_activity_handler.mm +++ b/ios/chrome/app/application_delegate/user_activity_handler.mm
@@ -17,6 +17,7 @@ #import "ios/chrome/app/application_delegate/startup_information.h" #import "ios/chrome/app/application_delegate/tab_opening.h" #include "ios/chrome/app/application_mode.h" +#include "ios/chrome/app/chrome_app_startup_parameters.h" #import "ios/chrome/app/spotlight/actions_spotlight_manager.h" #import "ios/chrome/app/spotlight/spotlight_util.h" #include "ios/chrome/browser/app_startup_parameters.h" @@ -42,6 +43,7 @@ NSString* const kShortcutNewIncognitoTab = @"OpenIncognitoTab"; NSString* const kShortcutVoiceSearch = @"OpenVoiceSearch"; NSString* const kShortcutQRScanner = @"OpenQRScanner"; + } // namespace @interface UserActivityHandler () @@ -73,15 +75,21 @@ handoff::ORIGIN_COUNT); } else if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) { - // App was launched as the result of a Universal Link navigation. The value - // of userActivity.webpageURL is not used. The only supported action - // at this time is opening a New Tab Page. - GURL newTabURL(kChromeUINewTabURL); - webpageURL = net::NSURLWithGURL(newTabURL); + // App was launched as the result of a Universal Link navigation. + GURL gurl = net::GURLWithNSURL(webpageURL); AppStartupParameters* startupParams = - [[AppStartupParameters alloc] initWithExternalURL:newTabURL]; + [[AppStartupParameters alloc] initWithUniversalLink:gurl]; [startupInformation setStartupParameters:startupParams]; base::RecordAction(base::UserMetricsAction("IOSLaunchedByUniversalLink")); + + if (startupParams) + webpageURL = net::NSURLWithGURL([startupParams externalURL]); + + // Don't call continueUserActivityURL if the completePaymentRequest flag + // is set since the startup parameters need to be handled in + // -handleStartupParametersWithTabOpener: + if (startupParams && startupParams.completePaymentRequest) + return YES; } else if (spotlight::IsSpotlightAvailable() && [userActivity.activityType isEqualToString:CSSearchableItemActionType]) { @@ -226,6 +234,13 @@ // synchronously. [startupInformation setStartupParameters:nil]; } else { + // Depending on the startup parameters the user may need to stay on the + // current tab rather than open a new one in order to complete a Payment + // Request. This attempts to complete any Payment Request instances on + // the current tab, and returns if successful. + if ([tabOpener shouldCompletePaymentRequestOnCurrentTab:startupInformation]) + return; + // The app is already active so the applicationDidBecomeActive: method // will never be called. Open the requested URL after all modal UIs have // been dismissed. |_startupParameters| must be retained until all deferred
diff --git a/ios/chrome/app/main_controller.mm b/ios/chrome/app/main_controller.mm index 546e267..5c080ae2 100644 --- a/ios/chrome/app/main_controller.mm +++ b/ios/chrome/app/main_controller.mm
@@ -13,6 +13,7 @@ #include "base/bind.h" #include "base/callback_helpers.h" +#include "base/feature_list.h" #include "base/files/file_path.h" #include "base/ios/block_types.h" #import "base/mac/bind_objc_block.h" @@ -29,6 +30,7 @@ #include "components/feature_engagement/public/tracker.h" #include "components/metrics/metrics_pref_names.h" #include "components/metrics/metrics_service.h" +#include "components/payments/core/features.h" #include "components/prefs/pref_change_registrar.h" #include "components/signin/core/browser/signin_manager.h" #include "components/url_formatter/url_formatter.h" @@ -83,6 +85,8 @@ #import "ios/chrome/browser/metrics/previous_session_info.h" #import "ios/chrome/browser/net/cookie_util.h" #include "ios/chrome/browser/net/crl_set_fetcher.h" +#include "ios/chrome/browser/payments/ios_payment_instrument_launcher.h" +#include "ios/chrome/browser/payments/ios_payment_instrument_launcher_factory.h" #include "ios/chrome/browser/pref_names.h" #include "ios/chrome/browser/prefs/pref_observer_bridge.h" #import "ios/chrome/browser/reading_list/reading_list_download_service.h" @@ -141,6 +145,7 @@ #include "ios/web/net/request_tracker_impl.h" #include "ios/web/net/web_http_protocol_handler_delegate.h" #import "ios/web/public/navigation_manager.h" +#include "ios/web/public/payments/payment_request.h" #include "ios/web/public/web_capabilities.h" #include "ios/web/public/web_state/web_state.h" #import "ios/web/public/web_view_creation_util.h" @@ -2375,6 +2380,40 @@ } } +- (BOOL)shouldCompletePaymentRequestOnCurrentTab: + (id<StartupInformation>)startupInformation { + if (!startupInformation.startupParameters) + return NO; + + if (!startupInformation.startupParameters.completePaymentRequest) + return NO; + + if (!base::FeatureList::IsEnabled(payments::features::kWebPaymentsNativeApps)) + return NO; + + payments::IOSPaymentInstrumentLauncher* paymentAppLauncher = + payments::IOSPaymentInstrumentLauncherFactory::GetInstance() + ->GetForBrowserState(_mainBrowserState); + + if (!paymentAppLauncher->delegate()) + return NO; + + std::string payment_id = + startupInformation.startupParameters.externalURLParams + .find(web::kPaymentRequestIDExternal) + ->second; + if (paymentAppLauncher->payment_request_id() != payment_id) + return NO; + + std::string payment_response = + startupInformation.startupParameters.externalURLParams + .find(web::kPaymentRequestDataExternal) + ->second; + paymentAppLauncher->ReceiveResponseFromIOSPaymentInstrument(payment_response); + [startupInformation setStartupParameters:nil]; + return YES; +} + #pragma mark - SettingsNavigationControllerDelegate - (void)closeSettings {
diff --git a/ios/chrome/app/spotlight/OWNERS b/ios/chrome/app/spotlight/OWNERS index 3ebff38d..56360bb 100644 --- a/ios/chrome/app/spotlight/OWNERS +++ b/ios/chrome/app/spotlight/OWNERS
@@ -1 +1,4 @@ olivierrobin@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/app/strings/OWNERS b/ios/chrome/app/strings/OWNERS index 69a98a6..8c38e91 100644 --- a/ios/chrome/app/strings/OWNERS +++ b/ios/chrome/app/strings/OWNERS
@@ -1,2 +1,5 @@ per-file *.grd=* per-file *.xtb=* + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd index eb48d60..439ffa0 100644 --- a/ios/chrome/app/strings/ios_strings.grd +++ b/ios/chrome/app/strings/ios_strings.grd
@@ -737,6 +737,9 @@ <message name="IDS_IOS_NET_EXPORT_NO_EMAIL_ACCOUNTS_ALERT_TITLE" desc="The title of the alert informing a user with no email accounts that they need to configure an email account to send net-export data. [Length: 20em]"> No Email Accounts </message> + <message name="IDS_IOS_NEW_INCOGNITO_TAB_IPH_PROMOTION_TEXT" desc="Text for the New Incognito Tab Tip in-product help promotion, explaining that incognito tabs can be used to browse privately. [iOS only]" meaning="The user has never created an incognito tab before. A bubble is displayed pointing to the tools menu button and informing users about how to use incognito mode."> + To browse privately, open an incognito tab + </message> <message name="IDS_IOS_NEW_TAB_BOOKMARKS_PAGE_TITLE_MOBILE" desc="The 'Bookmarks' title on the new tab page [Length: 10em]"> Bookmarks </message>
diff --git a/ios/chrome/app/theme/OWNERS b/ios/chrome/app/theme/OWNERS index 40a68c7..b127701 100644 --- a/ios/chrome/app/theme/OWNERS +++ b/ios/chrome/app/theme/OWNERS
@@ -1 +1,4 @@ rohitrao@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/BUILD.gn b/ios/chrome/browser/BUILD.gn index 6fefea52..397f9e28 100644 --- a/ios/chrome/browser/BUILD.gn +++ b/ios/chrome/browser/BUILD.gn
@@ -217,6 +217,7 @@ configs += [ "//build/config/compiler:enable_arc" ] testonly = true sources = [ + "app_startup_parameters_unittest.mm", "callback_counter_unittest.mm", "chrome_browser_provider_observer_bridge_unittest.mm", "chrome_url_util_unittest.mm",
diff --git a/ios/chrome/browser/OWNERS b/ios/chrome/browser/OWNERS index def1e2a..0adc841 100644 --- a/ios/chrome/browser/OWNERS +++ b/ios/chrome/browser/OWNERS
@@ -4,3 +4,6 @@ per-file ios_chrome_io_thread*=rsleevi@chromium.org per-file ios_chrome_flag_descriptions.*=* + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/app_startup_parameters.h b/ios/chrome/browser/app_startup_parameters.h index 547a79ea..165fdef4 100644 --- a/ios/chrome/browser/app_startup_parameters.h +++ b/ios/chrome/browser/app_startup_parameters.h
@@ -7,6 +7,8 @@ #import <Foundation/Foundation.h> +#include <map> + enum NTPTabOpeningPostOpeningAction { // No action should be done NO_ACTION = 0, @@ -22,9 +24,18 @@ // of launch from another app. @interface AppStartupParameters : NSObject -// The URL received that should be opened. +// The URL that should be opened. This may not always be the same URL as the one +// that was receieved. The reason for this is in the case of Universal Link +// navigation where we may want to open up a fallback URL e.g., the New Tab +// Page instead of the actual universal link. @property(nonatomic, readonly, assign) const GURL& externalURL; +// The URL query string parameters in the case that the app was launched as a +// result of Universal Link navigation. The map associates query string +// parameters with their corresponding value. +@property(nonatomic, assign) std::map<std::string, std::string> + externalURLParams; + //// Boolean to track if a voice search is requested at startup. //@property(nonatomic, readwrite, assign) BOOL launchVoiceSearch; // Boolean to track if the app should launch in incognito mode. @@ -35,12 +46,16 @@ //@property(nonatomic, readwrite, assign) BOOL launchQRScanner; @property(nonatomic, readwrite, assign) NTPTabOpeningPostOpeningAction postOpeningAction; +// Boolean to track if a Payment Request response is requested at startup. +@property(nonatomic, readwrite, assign) BOOL completePaymentRequest; - (instancetype)init NS_UNAVAILABLE; - (instancetype)initWithExternalURL:(const GURL&)externalURL NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithUniversalLink:(const GURL&)universalLink; + @end #endif // IOS_CHROME_BROWSER_APP_STARTUP_PARAMETERS_H_
diff --git a/ios/chrome/browser/app_startup_parameters.mm b/ios/chrome/browser/app_startup_parameters.mm index 742ca53..1e20047 100644 --- a/ios/chrome/browser/app_startup_parameters.mm +++ b/ios/chrome/browser/app_startup_parameters.mm
@@ -4,6 +4,11 @@ #import "ios/chrome/browser/app_startup_parameters.h" +#include "base/stl_util.h" +#include "ios/chrome/browser/chrome_url_constants.h" +#include "ios/web/public/payments/payment_request.h" +#import "net/base/mac/url_conversions.h" +#include "net/base/url_util.h" #include "url/gurl.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -14,8 +19,10 @@ GURL _externalURL; } +@synthesize externalURLParams = _externalURLParams; @synthesize postOpeningAction = _postOpeningAction; @synthesize launchInIncognito = _launchInIncognito; +@synthesize completePaymentRequest = _completePaymentRequest; - (const GURL&)externalURL { return _externalURL; @@ -29,6 +36,32 @@ return self; } +- (instancetype)initWithUniversalLink:(const GURL&)universalLink { + // If a new tab with |_externalURL| needs to be opened after the App + // was launched as the result of a Universal Link navigation, the only + // supported possibility at this time is the New Tab Page. + self = [self initWithExternalURL:GURL(kChromeUINewTabURL)]; + + if (self) { + std::map<std::string, std::string> parameters; + net::QueryIterator query_iterator(universalLink); + while (!query_iterator.IsAtEnd()) { + parameters.insert(std::make_pair(query_iterator.GetKey(), + query_iterator.GetUnescapedValue())); + query_iterator.Advance(); + } + + // Currently only Payment Request parameters are supported. + if (base::ContainsKey(parameters, web::kPaymentRequestIDExternal) && + base::ContainsKey(parameters, web::kPaymentRequestDataExternal)) { + _externalURLParams = parameters; + _completePaymentRequest = YES; + } + } + + return self; +} + - (NSString*)description { NSMutableString* description = [NSMutableString stringWithFormat:@"AppStartupParameters: %s", @@ -51,6 +84,10 @@ break; } + if (self.completePaymentRequest) { + [description appendString:@", should complete payment request"]; + } + return description; }
diff --git a/ios/chrome/browser/app_startup_parameters_unittest.mm b/ios/chrome/browser/app_startup_parameters_unittest.mm new file mode 100644 index 0000000..953fe04 --- /dev/null +++ b/ios/chrome/browser/app_startup_parameters_unittest.mm
@@ -0,0 +1,61 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ios/chrome/browser/app_startup_parameters.h" + +#include "testing/gtest/include/gtest/gtest.h" +#include "url/gurl.h" + +namespace { + +struct UniversalLinkDecodeTestCase { + GURL universal_link; + std::map<std::string, std::string> expected_external_url_params; + bool expected_complete_payment_request; +}; + +TEST(AppStartupParameters, QueryParametersPaymentRequest) { + const UniversalLinkDecodeTestCase test_cases[] = { + { + GURL("https://goo.gl/ioschrome/"), {}, false, + }, + { + GURL("https://goo.gl/ioschrome?payment-request-id"), {}, false, + }, + { + GURL("https://goo.gl/ioschrome?payment-request-id=092831-af18l-324" + "&payment-request-data="), + {{"payment-request-id", "092831-af18l-324"}, + {"payment-request-data", ""}}, + true, + }, + { + GURL("https://goo.gl/ioschrome?payment-request-id=092831-af18l-324" + "&payment-request-data=JNLSKFknrlwe80dkzrnLEWR"), + {{"payment-request-id", "092831-af18l-324"}, + {"payment-request-data", "JNLSKFknrlwe80dkzrnLEWR"}}, + true, + }, + { + GURL("https://goo.gl/ioschrome?payment-request-id=092831-af18l-324" + "&payment-request-data=JNLSKFknrlwe80dkzrnLEWR" + "&unecessary-parameter=0"), + {{"payment-request-id", "092831-af18l-324"}, + {"payment-request-data", "JNLSKFknrlwe80dkzrnLEWR"}, + {"unecessary-parameter", "0"}}, + true, + }, + }; + + for (size_t i = 0; i < arraysize(test_cases); ++i) { + const UniversalLinkDecodeTestCase& test_case = test_cases[i]; + AppStartupParameters* params = [[AppStartupParameters alloc] + initWithUniversalLink:test_case.universal_link]; + EXPECT_EQ(test_case.expected_external_url_params, params.externalURLParams); + EXPECT_EQ(test_case.expected_complete_payment_request, + params.completePaymentRequest); + } +} + +} // namespace
diff --git a/ios/chrome/browser/autofill/OWNERS b/ios/chrome/browser/autofill/OWNERS index 6a806bd..adccd5d 100644 --- a/ios/chrome/browser/autofill/OWNERS +++ b/ios/chrome/browser/autofill/OWNERS
@@ -1 +1,4 @@ mahmadi@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/browser_state/BUILD.gn b/ios/chrome/browser/browser_state/BUILD.gn index 677e58d..a5b7139e 100644 --- a/ios/chrome/browser/browser_state/BUILD.gn +++ b/ios/chrome/browser/browser_state/BUILD.gn
@@ -105,11 +105,11 @@ "//ios/chrome/browser/sync", "//ios/chrome/browser/sync/glue", "//ios/chrome/browser/translate", + "//ios/chrome/browser/ui/browser_list", "//ios/chrome/browser/undo", "//ios/net", "//ios/public/provider/chrome/browser", "//ios/public/provider/chrome/browser/signin", - "//ios/shared/chrome/browser/ui/browser_list", "//ios/web", "//net", "//net:extras",
diff --git a/ios/chrome/browser/browser_state/OWNERS b/ios/chrome/browser/browser_state/OWNERS index c5cd5cb..39066e1 100644 --- a/ios/chrome/browser/browser_state/OWNERS +++ b/ios/chrome/browser/browser_state/OWNERS
@@ -1 +1,4 @@ sdefresne@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/browser_state/browser_state_keyed_service_factories.mm b/ios/chrome/browser/browser_state/browser_state_keyed_service_factories.mm index 4f472d4..c91071c 100644 --- a/ios/chrome/browser/browser_state/browser_state_keyed_service_factories.mm +++ b/ios/chrome/browser/browser_state/browser_state_keyed_service_factories.mm
@@ -47,9 +47,9 @@ #include "ios/chrome/browser/sync/ios_user_event_service_factory.h" #include "ios/chrome/browser/sync/sync_setup_service_factory.h" #include "ios/chrome/browser/translate/translate_accept_languages_factory.h" +#include "ios/chrome/browser/ui/browser_list/browser_list_session_service_factory.h" #include "ios/chrome/browser/undo/bookmark_undo_service_factory.h" #include "ios/chrome/browser/web_data_service_factory.h" -#include "ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_factory.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support."
diff --git a/ios/chrome/browser/browser_state_metrics/OWNERS b/ios/chrome/browser/browser_state_metrics/OWNERS index eccc04a..62cd9921 100644 --- a/ios/chrome/browser/browser_state_metrics/OWNERS +++ b/ios/chrome/browser/browser_state_metrics/OWNERS
@@ -2,3 +2,6 @@ erg@chromium.org # COMPONENT: UI>Browser>Profiles + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/content_suggestions/OWNERS b/ios/chrome/browser/content_suggestions/OWNERS index 2d35f0a5..f192143 100644 --- a/ios/chrome/browser/content_suggestions/OWNERS +++ b/ios/chrome/browser/content_suggestions/OWNERS
@@ -1 +1,4 @@ gambard@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/content_suggestions/content_suggestions_mediator.mm b/ios/chrome/browser/content_suggestions/content_suggestions_mediator.mm index 9391c7d..80e518b 100644 --- a/ios/chrome/browser/content_suggestions/content_suggestions_mediator.mm +++ b/ios/chrome/browser/content_suggestions/content_suggestions_mediator.mm
@@ -196,11 +196,7 @@ if (!self.sectionInformationByCategory[categoryWrapper]) { [self addSectionInformationForCategory:category]; } - if (IsCategoryStatusAvailable( - self.contentService->GetCategoryStatus(category))) { - [sectionsInfo - addObject:self.sectionInformationByCategory[categoryWrapper]]; - } + [sectionsInfo addObject:self.sectionInformationByCategory[categoryWrapper]]; } [sectionsInfo addObject:self.learnMoreSectionInfo]; @@ -344,21 +340,15 @@ (ntp_snippets::ContentSuggestionsService*)suggestionsService category:(ntp_snippets::Category)category statusChangedTo:(ntp_snippets::CategoryStatus)status { - ContentSuggestionsCategoryWrapper* wrapper = - [[ContentSuggestionsCategoryWrapper alloc] initWithCategory:category]; if (!ntp_snippets::IsCategoryStatusInitOrAvailable(status)) { // Remove the category from the UI if it is not available. + ContentSuggestionsCategoryWrapper* wrapper = + [[ContentSuggestionsCategoryWrapper alloc] initWithCategory:category]; ContentSuggestionsSectionInformation* sectionInfo = self.sectionInformationByCategory[wrapper]; [self.dataSink clearSection:sectionInfo]; [self.sectionInformationByCategory removeObjectForKey:wrapper]; - } else { - if (!self.sectionInformationByCategory[wrapper]) { - [self addSectionInformationForCategory:category]; - } - [self.dataSink - dataAvailableForSection:self.sectionInformationByCategory[wrapper]]; } }
diff --git a/ios/chrome/browser/context_menu/OWNERS b/ios/chrome/browser/context_menu/OWNERS index bf1620f..ab525656 100644 --- a/ios/chrome/browser/context_menu/OWNERS +++ b/ios/chrome/browser/context_menu/OWNERS
@@ -1 +1,4 @@ noyau@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/device_sharing/OWNERS b/ios/chrome/browser/device_sharing/OWNERS index 987c0c88..7030015a3 100644 --- a/ios/chrome/browser/device_sharing/OWNERS +++ b/ios/chrome/browser/device_sharing/OWNERS
@@ -1 +1,4 @@ erikchen@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/dom_distiller/OWNERS b/ios/chrome/browser/dom_distiller/OWNERS index bf1620f..ab525656 100644 --- a/ios/chrome/browser/dom_distiller/OWNERS +++ b/ios/chrome/browser/dom_distiller/OWNERS
@@ -1 +1,4 @@ noyau@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/feature_engagement/OWNERS b/ios/chrome/browser/feature_engagement/OWNERS index b5a2453..782b0c3 100644 --- a/ios/chrome/browser/feature_engagement/OWNERS +++ b/ios/chrome/browser/feature_engagement/OWNERS
@@ -1,2 +1,5 @@ edchin@chromium.org gchatz@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/find_in_page/OWNERS b/ios/chrome/browser/find_in_page/OWNERS index 40a68c7..b127701 100644 --- a/ios/chrome/browser/find_in_page/OWNERS +++ b/ios/chrome/browser/find_in_page/OWNERS
@@ -1 +1,4 @@ rohitrao@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/first_run/OWNERS b/ios/chrome/browser/first_run/OWNERS index 4905815..169936c8 100644 --- a/ios/chrome/browser/first_run/OWNERS +++ b/ios/chrome/browser/first_run/OWNERS
@@ -2,3 +2,6 @@ msarda@chromium.org # COMPONENT: UI>Browser>FirstRun + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/history/OWNERS b/ios/chrome/browser/history/OWNERS index 1085212..1c26985 100644 --- a/ios/chrome/browser/history/OWNERS +++ b/ios/chrome/browser/history/OWNERS
@@ -1,2 +1,5 @@ lpromero@chromium.org sczs@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/infobars/OWNERS b/ios/chrome/browser/infobars/OWNERS index d2e1add..c85e66a 100644 --- a/ios/chrome/browser/infobars/OWNERS +++ b/ios/chrome/browser/infobars/OWNERS
@@ -1 +1,4 @@ jif@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/invalidation/OWNERS b/ios/chrome/browser/invalidation/OWNERS index 7f08e5f..2cdcafd2 100644 --- a/ios/chrome/browser/invalidation/OWNERS +++ b/ios/chrome/browser/invalidation/OWNERS
@@ -3,3 +3,6 @@ pavely@chromium.org # COMPONENT: Services>Invalidation + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/itunes_links/OWNERS b/ios/chrome/browser/itunes_links/OWNERS index d2e1add..c85e66a 100644 --- a/ios/chrome/browser/itunes_links/OWNERS +++ b/ios/chrome/browser/itunes_links/OWNERS
@@ -1 +1,4 @@ jif@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/language/OWNERS b/ios/chrome/browser/language/OWNERS index f1e82d5..bc263cd 100644 --- a/ios/chrome/browser/language/OWNERS +++ b/ios/chrome/browser/language/OWNERS
@@ -1 +1,4 @@ file://components/language/OWNERS + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/metrics/OWNERS b/ios/chrome/browser/metrics/OWNERS index 17a1cc1..e2a5d55 100644 --- a/ios/chrome/browser/metrics/OWNERS +++ b/ios/chrome/browser/metrics/OWNERS
@@ -1,2 +1,5 @@ lpromero@chromium.org olivierrobin@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/net/OWNERS b/ios/chrome/browser/net/OWNERS index ed94051..22d5a1c 100644 --- a/ios/chrome/browser/net/OWNERS +++ b/ios/chrome/browser/net/OWNERS
@@ -1 +1,4 @@ droger@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ntp_snippets/OWNERS b/ios/chrome/browser/ntp_snippets/OWNERS index 7f58514..94af0b0 100644 --- a/ios/chrome/browser/ntp_snippets/OWNERS +++ b/ios/chrome/browser/ntp_snippets/OWNERS
@@ -1,2 +1,5 @@ noyau@chromium.org gambard@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ntp_tiles/OWNERS b/ios/chrome/browser/ntp_tiles/OWNERS index b622730..96f8a26 100644 --- a/ios/chrome/browser/ntp_tiles/OWNERS +++ b/ios/chrome/browser/ntp_tiles/OWNERS
@@ -1,2 +1,5 @@ sfiera@chromium.org file://components/ntp_tiles/OWNERS + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/omaha/OWNERS b/ios/chrome/browser/omaha/OWNERS index 40a68c7..b127701 100644 --- a/ios/chrome/browser/omaha/OWNERS +++ b/ios/chrome/browser/omaha/OWNERS
@@ -1 +1,4 @@ rohitrao@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/passwords/OWNERS b/ios/chrome/browser/passwords/OWNERS index adc8d4b..83fe1582 100644 --- a/ios/chrome/browser/passwords/OWNERS +++ b/ios/chrome/browser/passwords/OWNERS
@@ -1,3 +1,6 @@ melandory@chromium.org vabr@chromium.org vasilii@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/payments/BUILD.gn b/ios/chrome/browser/payments/BUILD.gn index 5463f9a..84f2e85 100644 --- a/ios/chrome/browser/payments/BUILD.gn +++ b/ios/chrome/browser/payments/BUILD.gn
@@ -13,6 +13,10 @@ "ios_payment_instrument.mm", "ios_payment_instrument_finder.h", "ios_payment_instrument_finder.mm", + "ios_payment_instrument_launcher.h", + "ios_payment_instrument_launcher.mm", + "ios_payment_instrument_launcher_factory.h", + "ios_payment_instrument_launcher_factory.mm", "ios_payment_request_cache_factory.h", "ios_payment_request_cache_factory.mm", "origin_security_checker.h", @@ -53,6 +57,7 @@ testonly = true sources = [ "ios_payment_instrument_finder_unittest.mm", + "ios_payment_instrument_launcher_unittest.mm", "payment_request_unittest.mm", "payment_response_helper_unittest.mm", ]
diff --git a/ios/chrome/browser/payments/OWNERS b/ios/chrome/browser/payments/OWNERS index 4cfb56d..2a262cc2 100644 --- a/ios/chrome/browser/payments/OWNERS +++ b/ios/chrome/browser/payments/OWNERS
@@ -1,2 +1,5 @@ lpromero@chromium.org mahmadi@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/payments/ios_payment_instrument.h b/ios/chrome/browser/payments/ios_payment_instrument.h index 417e49d0..7adde13 100644 --- a/ios/chrome/browser/payments/ios_payment_instrument.h +++ b/ios/chrome/browser/payments/ios_payment_instrument.h
@@ -15,6 +15,7 @@ #include "base/strings/string16.h" #include "components/payments/core/payment_instrument.h" #include "ios/chrome/browser/payments/payment_request.h" +#include "url/gurl.h" @class PaymentRequestUIDelegate; @@ -40,7 +41,7 @@ // the native payment app from Chrome. IOSPaymentInstrument( const std::string& method_name, - const std::string& universal_link, + const GURL& universal_link, const std::string& app_name, UIImage* icon_image, id<PaymentRequestUIDelegate> payment_request_ui_delegate); @@ -69,7 +70,7 @@ private: std::string method_name_; - std::string universal_link_; + GURL universal_link_; std::string app_name_; base::scoped_nsobject<UIImage> icon_image_;
diff --git a/ios/chrome/browser/payments/ios_payment_instrument.mm b/ios/chrome/browser/payments/ios_payment_instrument.mm index 29522f6..fa19e48 100644 --- a/ios/chrome/browser/payments/ios_payment_instrument.mm +++ b/ios/chrome/browser/payments/ios_payment_instrument.mm
@@ -5,7 +5,6 @@ #include "ios/chrome/browser/payments/ios_payment_instrument.h" #include "base/strings/utf_string_conversions.h" -#include "url/gurl.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -32,7 +31,7 @@ IOSPaymentInstrument::IOSPaymentInstrument( const std::string& method_name, - const std::string& universal_link, + const GURL& universal_link, const std::string& app_name, UIImage* icon_image, id<PaymentRequestUIDelegate> payment_request_ui_delegate)
diff --git a/ios/chrome/browser/payments/ios_payment_instrument_finder.mm b/ios/chrome/browser/payments/ios_payment_instrument_finder.mm index ad9cf41..6578fba67 100644 --- a/ios/chrome/browser/payments/ios_payment_instrument_finder.mm +++ b/ios/chrome/browser/payments/ios_payment_instrument_finder.mm
@@ -343,8 +343,8 @@ UIImage* icon = [UIImage imageWithData:data scale:[UIScreen mainScreen].scale]; instruments_found_.push_back(base::MakeUnique<IOSPaymentInstrument>( - local_method_name.spec(), local_universal_link.spec(), - local_app_name, icon, payment_request_ui_delegate_)); + local_method_name.spec(), local_universal_link, local_app_name, + icon, payment_request_ui_delegate_)); } OnPaymentInstrumentProcessed(); };
diff --git a/ios/chrome/browser/payments/ios_payment_instrument_launcher.h b/ios/chrome/browser/payments/ios_payment_instrument_launcher.h new file mode 100644 index 0000000..bab3a95a --- /dev/null +++ b/ios/chrome/browser/payments/ios_payment_instrument_launcher.h
@@ -0,0 +1,111 @@ +// 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 IOS_CHROME_BROWSER_PAYMENTS_IOS_PAYMENT_INSTRUMENT_LAUNCHER_H_ +#define IOS_CHROME_BROWSER_PAYMENTS_IOS_PAYMENT_INSTRUMENT_LAUNCHER_H_ + +#include "components/keyed_service/core/keyed_service.h" +#include "ios/chrome/browser/payments/payment_request.h" + +namespace base { +class DictionaryValue; +} // namespace base + +namespace web { +class NavigationItem; +} // namespace web + +namespace payments { + +// Launches a native iOS third party payment app and handles the response +// returned from that payment app. Only one instance of this object can exist +// per browser state. This launcher can only handle one request at a time, +// so any calls this class while another request is processing will fail and +// will cause the in-flight request to fail. +class IOSPaymentInstrumentLauncher : public KeyedService { + public: + IOSPaymentInstrumentLauncher(); + ~IOSPaymentInstrumentLauncher() override; + + // Attempts to launch a third party iOS payment app. Uses |payment_request| + // and |acitive_web_state| to build numerous parameters that get seraliazed + // into a JSON string and then encoded into base-64. |universal_link| is then + // invoked with the built parameters passed in as a query string. If the class + // fails to open the universal link the error callback of |delegate| will + // be invoked. If the class is successful in opening the universal link + // the success callback will be invoked when the payment app calls back into + // Chrome with a payment response. Finally, the class returns a boolean + // indicating if it made an attempt to launch the IOSPaymentInstrument. The + // only instance when the launcher will not attempt a launch is when there is + // another in-flight request already happening. + bool LaunchIOSPaymentInstrument( + payments::PaymentRequest* payment_request, + web::WebState* active_web_state, + GURL& universal_link, + payments::PaymentInstrument::Delegate* delegate); + + // Callback for when an iOS payment app sends a response back to Chrome. + // |response| is a base-64 encodeded string. When decoded, |response| is + // is expected to contain the method name of the payment instrument used, + // whether or not the payment app was able to successfully complete its part + // of the transaction, and details that contain information for the merchant + // website to complete the transaction. The details are only parsed if + // the payment app claims to have successfully completed its part of the + // transaction. + void ReceiveResponseFromIOSPaymentInstrument( + const std::string& base_64_response); + + // Before invoking ReceieveResponseFromIOSPaymentInstrument, callers can + // use delegate() to ensure that the delegate property is valid. + payments::PaymentInstrument::Delegate* delegate() { return delegate_; } + + // Sets the delegate for the current IOSPaymentInstrumentLauncher request. + void set_delegate(payments::PaymentInstrument::Delegate* delegate) { + delegate_ = delegate; + } + + // The payment request ID is exposed in order validate responses from + // third party payment apps. + std::string payment_request_id() { return payment_request_id_; } + + private: + friend class IOSPaymentInstrumentLauncherTest; + + // Returns the JSON-serialized dictionary from each method name the merchant + // requested to the corresponding method data. |stringified_method_data| is + // a mapping of the payment method names to the corresponding JSON-stringified + // payment method specific data. This function converts that map into a JSON + // readable object. + std::unique_ptr<base::DictionaryValue> SerializeMethodData( + const std::map<std::string, std::set<std::string>>& + stringified_method_data); + + // Returns the JSON-serialized top-level certificate chain of the browsing + // context. |item| has information on the browsing state, including the + // SSL certificate needed to build the certificate chain. + std::unique_ptr<base::ListValue> SerializeCertificateChain( + web::NavigationItem* item); + + // Returns the JSON-serialized array of web::PaymentDetailsModifier objects. + // |details| is the object that represents the details of a PaymentRequest + // object and contains the vector of web::PaymentDetailsModifier objects to + // serialize. + std::unique_ptr<base::ListValue> SerializeModifiers( + web::PaymentDetails details); + + // Invokes the payment instrument delegate with the appropriate function. + // If |method_name| or |details| are empty then |delegate_| calls + // OnInstrumentDetailsError, otherwise |delegate_| calls + // OnInstrumentDetailsReady. After invoking the delegate function this method + // will also reset |delegate_| and |payment_request_id_|. + void CompleteLaunchRequest(const std::string& method_name, + const std::string& details); + + payments::PaymentInstrument::Delegate* delegate_; + std::string payment_request_id_; +}; + +} // namespace payments + +#endif // IOS_CHROME_BROWSER_PAYMENTS_IOS_PAYMENT_INSTRUMENT_LAUNCHER_H_
diff --git a/ios/chrome/browser/payments/ios_payment_instrument_launcher.mm b/ios/chrome/browser/payments/ios_payment_instrument_launcher.mm new file mode 100644 index 0000000..ea3bd41 --- /dev/null +++ b/ios/chrome/browser/payments/ios_payment_instrument_launcher.mm
@@ -0,0 +1,268 @@ +// 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. + +#import "ios/chrome/browser/payments/ios_payment_instrument_launcher.h" + +#include <map> + +#include "base/base64.h" +#include "base/ios/ios_util.h" +#include "base/json/json_reader.h" +#include "base/json/json_writer.h" +#include "base/memory/ptr_util.h" +#include "base/strings/sys_string_conversions.h" +#include "base/strings/utf_string_conversions.h" +#include "base/values.h" +#include "components/payments/core/payment_instrument.h" +#include "ios/web/public/navigation_item.h" +#include "ios/web/public/navigation_manager.h" +#include "ios/web/public/payments/payment_request.h" +#include "ios/web/public/ssl_status.h" +#include "ios/web/public/web_state/web_state.h" +#include "net/base/mac/url_conversions.mm" +#include "net/base/url_util.h" +#include "net/cert/x509_certificate.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace { + +// Parameters sent to a payment app. +static const char kMethodNames[] = "methodNames"; +static const char kMethodData[] = "methodData"; +static const char kMerchantName[] = "merchantName"; +static const char kTopLevelOrigin[] = "topLevelOrigin"; +static const char kTopLevelCertificateChain[] = "topLevelCertificateChain"; +static const char kCertificate[] = "cert"; +static const char kTotal[] = "total"; +static const char kModifiers[] = "modifiers"; + +// Parameters received from a payment app. +static const char kSuccess[] = "success"; +static const char kMethodName[] = "methodName"; +static const char kDetails[] = "details"; + +} // namespace + +namespace payments { + +IOSPaymentInstrumentLauncher::IOSPaymentInstrumentLauncher() + : delegate_(nullptr), payment_request_id_("") {} + +IOSPaymentInstrumentLauncher::~IOSPaymentInstrumentLauncher() {} + +bool IOSPaymentInstrumentLauncher::LaunchIOSPaymentInstrument( + payments::PaymentRequest* payment_request, + web::WebState* active_web_state, + GURL& universal_link, + payments::PaymentInstrument::Delegate* delegate) { + DCHECK(delegate); + + // Only one request can be handled at a time. + if (delegate_ || !payment_request_id_.empty()) { + return false; + } + + delegate_ = delegate; + + std::unique_ptr<base::DictionaryValue> params_to_payment_app = + base::MakeUnique<base::DictionaryValue>(); + + // TODO(crbug.com/748556): Filter the following list to only show method names + // that we know the payment app supports. For now, sending all the requested + // method names i.e., 'basic-card' and 'https://alice-pay.com" to the payment + // app works as the payment app provider can then decide what to do with that + // information, but this is not ideal nor is this consistent with Android + // implementation. + std::unique_ptr<base::ListValue> method_names = + base::MakeUnique<base::ListValue>(); + for (auto const& it : payment_request->stringified_method_data()) + method_names->GetList().emplace_back(it.first); + params_to_payment_app->SetList(kMethodNames, std::move(method_names)); + + params_to_payment_app->SetDictionary( + kMethodData, + SerializeMethodData(payment_request->stringified_method_data())); + + params_to_payment_app->SetString( + kMerchantName, base::UTF16ToASCII(active_web_state->GetTitle())); + + params_to_payment_app->SetKey( + kTopLevelOrigin, + base::Value(active_web_state->GetLastCommittedURL().host())); + + params_to_payment_app->SetList( + kTopLevelCertificateChain, + SerializeCertificateChain( + active_web_state->GetNavigationManager()->GetVisibleItem())); + + params_to_payment_app->SetDictionary( + kTotal, payment_request->web_payment_request() + .details.total.amount.ToDictionaryValue()); + + params_to_payment_app->SetList( + kModifiers, + SerializeModifiers(payment_request->web_payment_request().details)); + + // JSON stringify the object so that it can be encoded in base-64. + std::string stringified_parameters; + base::JSONWriter::Write(*params_to_payment_app, &stringified_parameters); + std::string base_64_params; + base::Base64Encode(stringified_parameters, &base_64_params); + + payment_request_id_ = + payment_request->web_payment_request().payment_request_id; + + universal_link = net::AppendQueryParameter( + universal_link, web::kPaymentRequestIDExternal, payment_request_id_); + universal_link = net::AppendQueryParameter( + universal_link, web::kPaymentRequestDataExternal, base_64_params); + NSURL* url = net::NSURLWithGURL(universal_link); + [[UIApplication sharedApplication] + openURL:url + options:(base::ios::IsRunningOnIOS10OrLater() + ? @{ UIApplicationOpenURLOptionUniversalLinksOnly : @YES } + : nil)completionHandler:^(BOOL success) { + if (!success) { + CompleteLaunchRequest("", ""); + } + }]; + + return true; +} + +void IOSPaymentInstrumentLauncher::ReceiveResponseFromIOSPaymentInstrument( + const std::string& base_64_response) { + DCHECK(delegate_); + + std::string stringified_parameters; + base::Base64Decode(base_64_response, &stringified_parameters); + + std::unique_ptr<base::Value> value = + base::JSONReader::Read(stringified_parameters); + if (!value) { + CompleteLaunchRequest("", ""); + return; + } + + std::unique_ptr<base::DictionaryValue> dict = + base::DictionaryValue::From(std::move(value)); + if (!dict) { + CompleteLaunchRequest("", ""); + return; + } + + int success; + if (!dict->GetInteger(kSuccess, &success) || success == 0) { + CompleteLaunchRequest("", ""); + return; + } + + std::string method_name; + if (!dict->GetString(kMethodName, &method_name) || method_name.empty()) { + CompleteLaunchRequest("", ""); + return; + } + + std::string stringified_details; + if (!dict->GetString(kDetails, &stringified_details) || + stringified_details.empty()) { + CompleteLaunchRequest("", ""); + return; + } + + CompleteLaunchRequest(method_name, stringified_details); +} + +std::unique_ptr<base::DictionaryValue> +IOSPaymentInstrumentLauncher::SerializeMethodData( + const std::map<std::string, std::set<std::string>>& + stringified_method_data) { + std::unique_ptr<base::DictionaryValue> method_data = + base::MakeUnique<base::DictionaryValue>(); + + std::unique_ptr<base::ListValue> data_list; + std::unique_ptr<base::Value> data; + for (auto const& map_it : stringified_method_data) { + data_list = base::MakeUnique<base::ListValue>(); + for (auto const& data_it : map_it.second) { + data = base::JSONReader().ReadToValue(data_it); + // We insert the stringified data, not the JSON object and only if the + // corresponding JSON object is valid. + if (data) + data_list->GetList().emplace_back(data_it); + } + + method_data->SetKey(map_it.first, *data_list); + } + + return method_data; +} + +std::unique_ptr<base::ListValue> +IOSPaymentInstrumentLauncher::SerializeCertificateChain( + web::NavigationItem* item) { + std::unique_ptr<base::ListValue> cert_chain_list = + base::MakeUnique<base::ListValue>(); + + if (!item) + return cert_chain_list; + + scoped_refptr<net::X509Certificate> cert = item->GetSSL().certificate; + std::vector<std::vector<const char>> cert_chain; + net::X509Certificate::OSCertHandles cert_handles = + cert->GetIntermediateCertificates(); + if (cert_handles.empty() || cert_handles[0] != cert->os_cert_handle()) + cert_handles.insert(cert_handles.begin(), cert->os_cert_handle()); + + cert_chain.reserve(cert_handles.size()); + for (auto* handle : cert_handles) { + std::string cert_bytes; + net::X509Certificate::GetDEREncoded(handle, &cert_bytes); + cert_chain.push_back( + std::vector<const char>(cert_bytes.begin(), cert_bytes.end())); + } + + std::unique_ptr<base::DictionaryValue> cert_chain_dict; + std::unique_ptr<base::ListValue> byte_array; + for (std::vector<const char> cert_string : cert_chain) { + byte_array = base::MakeUnique<base::ListValue>(); + cert_chain_dict = base::MakeUnique<base::DictionaryValue>(); + for (const char byte : cert_string) + byte_array->GetList().emplace_back(byte); + cert_chain_dict->Set(kCertificate, std::move(byte_array)); + cert_chain_list->GetList().push_back(*cert_chain_dict); + } + + return cert_chain_list; +} + +std::unique_ptr<base::ListValue> +IOSPaymentInstrumentLauncher::SerializeModifiers(web::PaymentDetails details) { + std::unique_ptr<base::ListValue> modifiers = + base::MakeUnique<base::ListValue>(); + size_t numModifiers = details.modifiers.size(); + for (size_t i = 0; i < numModifiers; ++i) { + const std::unique_ptr<base::DictionaryValue> modifier = + details.modifiers[i].ToDictionaryValue(); + modifiers->GetList().push_back(*modifier.get()); + } + + return modifiers; +} + +void IOSPaymentInstrumentLauncher::CompleteLaunchRequest( + const std::string& method_name, + const std::string& details) { + if (!method_name.empty() && !details.empty()) + delegate_->OnInstrumentDetailsReady(method_name, details); + else + delegate_->OnInstrumentDetailsError(); + delegate_ = nullptr; + payment_request_id_ = ""; +} + +} // namespace payments
diff --git a/ios/chrome/browser/payments/ios_payment_instrument_launcher_factory.h b/ios/chrome/browser/payments/ios_payment_instrument_launcher_factory.h new file mode 100644 index 0000000..401a6ce6 --- /dev/null +++ b/ios/chrome/browser/payments/ios_payment_instrument_launcher_factory.h
@@ -0,0 +1,50 @@ +// 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 IOS_CHROME_BROWSER_PAYMENTS_IOS_PAYMENT_INSTRUMENT_LAUNCHER_FACTORY_H_ +#define IOS_CHROME_BROWSER_PAYMENTS_IOS_PAYMENT_INSTRUMENT_LAUNCHER_FACTORY_H_ + +#include <memory> + +#include "base/macros.h" +#include "components/keyed_service/ios/browser_state_keyed_service_factory.h" + +namespace base { +template <typename T> +struct DefaultSingletonTraits; +} // namespace base + +namespace ios { +class ChromeBrowserState; +} // namespace ios + +namespace payments { +class IOSPaymentInstrumentLauncher; + +// Ensures that there's only one instance of +// payments::IOSPaymentInstrumentLauncher per browser state. +class IOSPaymentInstrumentLauncherFactory + : public BrowserStateKeyedServiceFactory { + public: + static IOSPaymentInstrumentLauncher* GetForBrowserState( + ios::ChromeBrowserState* browser_state); + static IOSPaymentInstrumentLauncherFactory* GetInstance(); + + private: + friend struct base::DefaultSingletonTraits< + IOSPaymentInstrumentLauncherFactory>; + + IOSPaymentInstrumentLauncherFactory(); + ~IOSPaymentInstrumentLauncherFactory() override; + + // BrowserStateKeyedServiceFactory implementation. + std::unique_ptr<KeyedService> BuildServiceInstanceFor( + web::BrowserState* context) const override; + + DISALLOW_COPY_AND_ASSIGN(IOSPaymentInstrumentLauncherFactory); +}; + +} // namespace payments + +#endif // IOS_CHROME_BROWSER_PAYMENTS_IOS_PAYMENT_INSTRUMENT_LAUNCHER_FACTORY_H_
diff --git a/ios/chrome/browser/payments/ios_payment_instrument_launcher_factory.mm b/ios/chrome/browser/payments/ios_payment_instrument_launcher_factory.mm new file mode 100644 index 0000000..a4e4ff38 --- /dev/null +++ b/ios/chrome/browser/payments/ios_payment_instrument_launcher_factory.mm
@@ -0,0 +1,43 @@ +// 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 "ios/chrome/browser/payments/ios_payment_instrument_launcher_factory.h" + +#include "base/memory/ptr_util.h" +#include "base/memory/singleton.h" +#include "components/keyed_service/ios/browser_state_dependency_manager.h" +#include "ios/chrome/browser/browser_state/chrome_browser_state.h" +#include "ios/chrome/browser/payments/ios_payment_instrument_launcher.h" +#include "ios/web/public/browser_state.h" + +namespace payments { + +// static +payments::IOSPaymentInstrumentLauncher* +IOSPaymentInstrumentLauncherFactory::GetForBrowserState( + ios::ChromeBrowserState* browser_state) { + return static_cast<payments::IOSPaymentInstrumentLauncher*>( + GetInstance()->GetServiceForBrowserState(browser_state, true)); +} + +// static +IOSPaymentInstrumentLauncherFactory* +IOSPaymentInstrumentLauncherFactory::GetInstance() { + return base::Singleton<IOSPaymentInstrumentLauncherFactory>::get(); +} + +IOSPaymentInstrumentLauncherFactory::IOSPaymentInstrumentLauncherFactory() + : BrowserStateKeyedServiceFactory( + "IOSPaymentInstrumentLauncher", + BrowserStateDependencyManager::GetInstance()) {} + +IOSPaymentInstrumentLauncherFactory::~IOSPaymentInstrumentLauncherFactory() {} + +std::unique_ptr<KeyedService> +IOSPaymentInstrumentLauncherFactory::BuildServiceInstanceFor( + web::BrowserState* context) const { + return base::WrapUnique(new payments::IOSPaymentInstrumentLauncher); +} + +} // namespace payments
diff --git a/ios/chrome/browser/payments/ios_payment_instrument_launcher_unittest.mm b/ios/chrome/browser/payments/ios_payment_instrument_launcher_unittest.mm new file mode 100644 index 0000000..26a33eb4 --- /dev/null +++ b/ios/chrome/browser/payments/ios_payment_instrument_launcher_unittest.mm
@@ -0,0 +1,330 @@ +// 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 "ios/chrome/browser/payments/ios_payment_instrument_launcher.h" + +#include <map> +#include <memory> + +#include "base/base64.h" +#include "base/ios/ios_util.h" +#include "base/json/json_writer.h" +#include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" +#include "base/values.h" +#include "components/autofill/core/browser/test_personal_data_manager.h" +#include "components/payments/core/payment_instrument.h" +#include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" +#include "ios/chrome/browser/payments/test_payment_request.h" +#include "ios/web/public/payments/payment_request.h" +#include "ios/web/public/test/fakes/test_navigation_manager.h" +#import "ios/web/public/test/fakes/test_web_state.h" +#include "testing/gtest/include/gtest/gtest.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace payments { + +namespace { + +class FakePaymentInstrumentDelegate : public PaymentInstrument::Delegate { + public: + FakePaymentInstrumentDelegate() {} + + void OnInstrumentDetailsReady( + const std::string& method_name, + const std::string& stringified_details) override { + if (run_loop_) + run_loop_->Quit(); + on_instrument_details_ready_called_ = true; + } + + void OnInstrumentDetailsError() override { + if (run_loop_) + run_loop_->Quit(); + on_instrument_details_error_called_ = true; + } + + bool WasOnInstrumentDetailsReadyCalled() { + return on_instrument_details_ready_called_; + } + + bool WasOnInstrumentDetailsErrorCalled() { + return on_instrument_details_error_called_; + } + + void RunLoop() { + run_loop_.reset(new base::RunLoop()); + run_loop_->Run(); + } + + private: + bool on_instrument_details_ready_called_ = false; + bool on_instrument_details_error_called_ = false; + + std::unique_ptr<base::RunLoop> run_loop_; +}; + +} // namespace + +class IOSPaymentInstrumentLauncherTest : public testing::Test { + protected: + IOSPaymentInstrumentLauncherTest() + : chrome_browser_state_(TestChromeBrowserState::Builder().Build()) {} + + std::unique_ptr<base::DictionaryValue> SerializeMethodDataWrapper( + const std::map<std::string, std::set<std::string>>& + stringified_method_data) { + IOSPaymentInstrumentLauncher launcher; + return launcher.SerializeMethodData(stringified_method_data); + } + + void SetPaymentRequestID(IOSPaymentInstrumentLauncher& launcher) { + launcher.payment_request_id_ = "some-payment-request-id"; + } + + base::test::ScopedTaskEnvironment scoped_task_environment_; + + web::TestWebState web_state_; + std::unique_ptr<TestChromeBrowserState> chrome_browser_state_; +}; + +// Tests that serializing empty stringified method data yields the expected +// result. +TEST_F(IOSPaymentInstrumentLauncherTest, EmptyStringifiedMethodDataDictionary) { + web::PaymentRequest web_payment_request; + autofill::TestPersonalDataManager personal_data_manager; + TestPaymentRequest payment_request(web_payment_request, + chrome_browser_state_.get(), &web_state_, + &personal_data_manager); + + base::DictionaryValue expected_dict; + + EXPECT_TRUE(expected_dict.Equals( + SerializeMethodDataWrapper(payment_request.stringified_method_data()) + .get())); +} + +// Tests that serializing populated stringified method data yields the expected +// result. +TEST_F(IOSPaymentInstrumentLauncherTest, + PopulatedStringifiedMethodDataDictionary) { + web::PaymentRequest web_payment_request; + PaymentMethodData method_datum1; + method_datum1.supported_methods.push_back("https://jefpay.com"); + method_datum1.supported_methods.push_back("https://bobpay.com"); + std::unique_ptr<base::DictionaryValue> data = + base::MakeUnique<base::DictionaryValue>(); + data->SetString("Some data", "Some stringified data"); + std::string stringified_data; + base::JSONWriter::Write(*data, &stringified_data); + method_datum1.data = stringified_data; + web_payment_request.method_data.push_back(method_datum1); + PaymentMethodData method_datum2; + method_datum2.supported_methods.push_back("https://alicepay.com"); + web_payment_request.method_data.push_back(method_datum2); + PaymentMethodData method_datum3; + method_datum3.supported_methods.push_back("https://jefpay.com"); + web_payment_request.method_data.push_back(method_datum3); + PaymentMethodData method_datum4; + method_datum4.supported_methods.push_back("https://alicepay.com"); + method_datum4.supported_methods.push_back("https://bobpay.com"); + web_payment_request.method_data.push_back(method_datum4); + + autofill::TestPersonalDataManager personal_data_manager; + TestPaymentRequest payment_request(web_payment_request, + chrome_browser_state_.get(), &web_state_, + &personal_data_manager); + + base::DictionaryValue expected_dict; + std::unique_ptr<base::ListValue> jef_data_list = + base::MakeUnique<base::ListValue>(); + std::unique_ptr<base::DictionaryValue> jef_data = + base::MakeUnique<base::DictionaryValue>(); + jef_data->SetString("Some data", "Some stringified data"); + std::string jef_stringified_data; + base::JSONWriter::Write(*jef_data, &jef_stringified_data); + jef_data_list->GetList().emplace_back(jef_stringified_data); + expected_dict.SetKey("https://jefpay.com", *jef_data_list); + std::unique_ptr<base::ListValue> bob_data_list = + base::MakeUnique<base::ListValue>(); + std::unique_ptr<base::DictionaryValue> bob_data = + base::MakeUnique<base::DictionaryValue>(); + bob_data->SetString("Some data", "Some stringified data"); + std::string bob_stringified_data; + base::JSONWriter::Write(*bob_data, &bob_stringified_data); + bob_data_list->GetList().emplace_back(bob_stringified_data); + expected_dict.SetListWithoutPathExpansion("https://bobpay.com", + std::move(bob_data_list)); + std::unique_ptr<base::ListValue> alice_data_list = + base::MakeUnique<base::ListValue>(); + expected_dict.SetKey("https://alicepay.com", *alice_data_list); + + EXPECT_TRUE(expected_dict.Equals( + SerializeMethodDataWrapper(payment_request.stringified_method_data()) + .get())); +} + +// Tests that attempting to open an invalid universal link calls the +// OnInstrumentDetailsError() function of the delegate. +TEST_F(IOSPaymentInstrumentLauncherTest, + LaunchIOSPaymentInstrument_MalformedUniversalLink) { + if (base::ios::IsRunningOnIOS10OrLater()) { + std::unique_ptr<web::TestNavigationManager> navigation_manager = + base::MakeUnique<web::TestNavigationManager>(); + web_state_.SetNavigationManager(std::move(navigation_manager)); + + web::PaymentRequest web_payment_request; + autofill::TestPersonalDataManager personal_data_manager; + TestPaymentRequest payment_request(web_payment_request, + chrome_browser_state_.get(), &web_state_, + &personal_data_manager); + + FakePaymentInstrumentDelegate instrument_delegate; + IOSPaymentInstrumentLauncher launcher; + + EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsReadyCalled()); + EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsErrorCalled()); + + GURL malformed_link = GURL("http://bad-link.com"); + launcher.LaunchIOSPaymentInstrument(&payment_request, &web_state_, + malformed_link, &instrument_delegate); + instrument_delegate.RunLoop(); + + EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsReadyCalled()); + EXPECT_TRUE(instrument_delegate.WasOnInstrumentDetailsErrorCalled()); + } +} + +// Tests that if the response from the payment app is not a valid JSON +// dictionary then the OnInstrumentDetailsError() function of the delegate +// is called. +TEST_F(IOSPaymentInstrumentLauncherTest, + ReceiveResponseFromIOSPaymentInstrument_ResponseNotDictionary) { + FakePaymentInstrumentDelegate instrument_delegate; + IOSPaymentInstrumentLauncher launcher; + + EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsReadyCalled()); + EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsErrorCalled()); + + std::string stringified_response = "\"JSON\""; + std::string base_64_params; + base::Base64Encode(stringified_response, &base_64_params); + + launcher.set_delegate(&instrument_delegate); + launcher.ReceiveResponseFromIOSPaymentInstrument(base_64_params); + + EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsReadyCalled()); + EXPECT_TRUE(instrument_delegate.WasOnInstrumentDetailsErrorCalled()); +} + +// Tests that if a payment app claims to have not been successful in +// fulfilling its side of the transaction then OnInstrumentDetailsError() +// is called. +TEST_F(IOSPaymentInstrumentLauncherTest, + ReceiveResponseFromIOSPaymentInstrument_PaymentAppFailed) { + FakePaymentInstrumentDelegate instrument_delegate; + IOSPaymentInstrumentLauncher launcher; + + EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsReadyCalled()); + EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsErrorCalled()); + + base::DictionaryValue response; + response.SetInteger("success", 0); + response.SetString("methodName", "visa"); + response.SetString("details", "Some details"); + std::string stringified_response; + base::JSONWriter::Write(response, &stringified_response); + std::string base_64_params; + base::Base64Encode(stringified_response, &base_64_params); + + launcher.set_delegate(&instrument_delegate); + launcher.ReceiveResponseFromIOSPaymentInstrument(base_64_params); + + EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsReadyCalled()); + EXPECT_TRUE(instrument_delegate.WasOnInstrumentDetailsErrorCalled()); +} + +// Tests that if the response from the payment app does not contain a +// method name then OnInstrumentDetailsError() of the delegate is +// called. +TEST_F(IOSPaymentInstrumentLauncherTest, + ReceiveResponseFromIOSPaymentInstrument_NoMethodName) { + FakePaymentInstrumentDelegate instrument_delegate; + IOSPaymentInstrumentLauncher launcher; + + EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsReadyCalled()); + EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsErrorCalled()); + + base::DictionaryValue response; + response.SetInteger("success", 1); + response.SetString("details", "Some details"); + std::string stringified_response; + base::JSONWriter::Write(response, &stringified_response); + std::string base_64_params; + base::Base64Encode(stringified_response, &base_64_params); + + launcher.set_delegate(&instrument_delegate); + launcher.ReceiveResponseFromIOSPaymentInstrument(base_64_params); + + EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsReadyCalled()); + EXPECT_TRUE(instrument_delegate.WasOnInstrumentDetailsErrorCalled()); +} + +// Tests that if the response from the payment app does not contain any +// stringified details then OnInstrumentDetailsError() of the delegate is +// called. +TEST_F(IOSPaymentInstrumentLauncherTest, + ReceiveResponseFromIOSPaymentInstrument_NoDetails) { + FakePaymentInstrumentDelegate instrument_delegate; + IOSPaymentInstrumentLauncher launcher; + + EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsReadyCalled()); + EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsErrorCalled()); + + base::DictionaryValue response; + response.SetInteger("success", 1); + response.SetString("methodName", "visa"); + std::string stringified_response; + base::JSONWriter::Write(response, &stringified_response); + std::string base_64_params; + base::Base64Encode(stringified_response, &base_64_params); + + launcher.set_delegate(&instrument_delegate); + launcher.ReceiveResponseFromIOSPaymentInstrument(base_64_params); + + EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsReadyCalled()); + EXPECT_TRUE(instrument_delegate.WasOnInstrumentDetailsErrorCalled()); +} + +// Tests that if the response from the payment app has all necessary +// parameters with valid values then OnInstrumentDetailsReady() of the +// delegate is called. +TEST_F(IOSPaymentInstrumentLauncherTest, + ReceiveResponseFromIOSPaymentInstrument_WellFormedResponse) { + FakePaymentInstrumentDelegate instrument_delegate; + IOSPaymentInstrumentLauncher launcher; + + EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsReadyCalled()); + EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsErrorCalled()); + + base::DictionaryValue response; + response.SetInteger("success", 1); + response.SetString("methodName", "visa"); + response.SetString("details", "Some details"); + std::string stringified_response; + base::JSONWriter::Write(response, &stringified_response); + std::string base_64_params; + base::Base64Encode(stringified_response, &base_64_params); + + launcher.set_delegate(&instrument_delegate); + launcher.ReceiveResponseFromIOSPaymentInstrument(base_64_params); + + EXPECT_TRUE(instrument_delegate.WasOnInstrumentDetailsReadyCalled()); + EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsErrorCalled()); +} + +} // namespace payments
diff --git a/ios/chrome/browser/payments/payment_request.h b/ios/chrome/browser/payments/payment_request.h index 75215f9..42323eac 100644 --- a/ios/chrome/browser/payments/payment_request.h +++ b/ios/chrome/browser/payments/payment_request.h
@@ -63,7 +63,7 @@ // Called when a native iOS payment app should be launched. - (void)paymentInstrument:(payments::IOSPaymentInstrument*)paymentInstrument - launchAppWithUniversalLink:(std::string)universalLink + launchAppWithUniversalLink:(GURL)universalLink instrumentDelegate:(payments::PaymentInstrument::Delegate*)delegate; @end
diff --git a/ios/chrome/browser/payments/payment_response_helper.h b/ios/chrome/browser/payments/payment_response_helper.h index 42d87b4..5434272 100644 --- a/ios/chrome/browser/payments/payment_response_helper.h +++ b/ios/chrome/browser/payments/payment_response_helper.h
@@ -20,6 +20,9 @@ // Called when the payment method details have been successfully received. - (void)paymentResponseHelperDidReceivePaymentMethodDetails; +// Called if an error occured when attempting to receive payment method details. +- (void)paymentResponseHelperDidFailToReceivePaymentMethodDetails; + // Called when the payment method details have been successfully received and // the shipping address and the contact info are normalized, if applicable. - (void)paymentResponseHelperDidCompleteWithPaymentResponse: @@ -44,7 +47,7 @@ void OnInstrumentDetailsReady( const std::string& method_name, const std::string& stringified_details) override; - void OnInstrumentDetailsError() override {} + void OnInstrumentDetailsError() override; private: // Called when the AddressNormalizationManager is done, whether any autofill
diff --git a/ios/chrome/browser/payments/payment_response_helper.mm b/ios/chrome/browser/payments/payment_response_helper.mm index 9535010..4801802 100644 --- a/ios/chrome/browser/payments/payment_response_helper.mm +++ b/ios/chrome/browser/payments/payment_response_helper.mm
@@ -59,6 +59,10 @@ &PaymentResponseHelper::AddressNormalizationCompleted, AsWeakPtr())); } +void PaymentResponseHelper::OnInstrumentDetailsError() { + [consumer_ paymentResponseHelperDidFailToReceivePaymentMethodDetails]; +} + void PaymentResponseHelper::AddressNormalizationCompleted() { web::PaymentResponse response;
diff --git a/ios/chrome/browser/payments/payment_response_helper_unittest.mm b/ios/chrome/browser/payments/payment_response_helper_unittest.mm index 1cc2d814..41eeac4f 100644 --- a/ios/chrome/browser/payments/payment_response_helper_unittest.mm +++ b/ios/chrome/browser/payments/payment_response_helper_unittest.mm
@@ -46,6 +46,9 @@ - (void)paymentResponseHelperDidReceivePaymentMethodDetails { } +- (void)paymentResponseHelperDidFailToReceivePaymentMethodDetails { +} + - (void)paymentResponseHelperDidCompleteWithPaymentResponse: (const web::PaymentResponse&)paymentResponse { return static_cast<
diff --git a/ios/chrome/browser/reading_list/OWNERS b/ios/chrome/browser/reading_list/OWNERS index c6815f7..ccd8b4f 100644 --- a/ios/chrome/browser/reading_list/OWNERS +++ b/ios/chrome/browser/reading_list/OWNERS
@@ -1,2 +1,5 @@ noyau@chromium.org olivierrobin@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/services/OWNERS b/ios/chrome/browser/services/OWNERS index b380428a..f0db296d 100644 --- a/ios/chrome/browser/services/OWNERS +++ b/ios/chrome/browser/services/OWNERS
@@ -1,3 +1,6 @@ zea@chromium.org # COMPONENT: Services>CloudMessaging + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/services/gcm/OWNERS b/ios/chrome/browser/services/gcm/OWNERS index 295d996..2271273 100644 --- a/ios/chrome/browser/services/gcm/OWNERS +++ b/ios/chrome/browser/services/gcm/OWNERS
@@ -4,3 +4,6 @@ zea@chromium.org # COMPONENT: Services>CloudMessaging + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/sessions/OWNERS b/ios/chrome/browser/sessions/OWNERS index 40a68c7..b127701 100644 --- a/ios/chrome/browser/sessions/OWNERS +++ b/ios/chrome/browser/sessions/OWNERS
@@ -1 +1,4 @@ rohitrao@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/share_extension/OWNERS b/ios/chrome/browser/share_extension/OWNERS index 4a03091..6a63c2b3 100644 --- a/ios/chrome/browser/share_extension/OWNERS +++ b/ios/chrome/browser/share_extension/OWNERS
@@ -1,2 +1,5 @@ gambard@chromium.org olivierrobin@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/signin/OWNERS b/ios/chrome/browser/signin/OWNERS index bdb69b2..a8f0801c 100644 --- a/ios/chrome/browser/signin/OWNERS +++ b/ios/chrome/browser/signin/OWNERS
@@ -3,3 +3,6 @@ msarda@chromium.org # COMPONENT: Services>SignIn + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/snapshots/OWNERS b/ios/chrome/browser/snapshots/OWNERS index d13827d..f4823b16 100644 --- a/ios/chrome/browser/snapshots/OWNERS +++ b/ios/chrome/browser/snapshots/OWNERS
@@ -1,2 +1,5 @@ jif@chromium.org justincohen@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ssl/OWNERS b/ios/chrome/browser/ssl/OWNERS index 115e3a7..b9da33cc 100644 --- a/ios/chrome/browser/ssl/OWNERS +++ b/ios/chrome/browser/ssl/OWNERS
@@ -2,3 +2,6 @@ felt@chromium.org # COMPONENT: Security>UX + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/store_kit/OWNERS b/ios/chrome/browser/store_kit/OWNERS index d2e1add..c85e66a 100644 --- a/ios/chrome/browser/store_kit/OWNERS +++ b/ios/chrome/browser/store_kit/OWNERS
@@ -1 +1,4 @@ jif@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/suggestions/OWNERS b/ios/chrome/browser/suggestions/OWNERS index 1986f2f0..2c6e9e7 100644 --- a/ios/chrome/browser/suggestions/OWNERS +++ b/ios/chrome/browser/suggestions/OWNERS
@@ -4,3 +4,4 @@ # TEAM: ntp-dev@chromium.org # COMPONENT: UI>Browser>NewTabPage +# OS: iOS
diff --git a/ios/chrome/browser/sync/OWNERS b/ios/chrome/browser/sync/OWNERS index 261ab18..c1575f5 100644 --- a/ios/chrome/browser/sync/OWNERS +++ b/ios/chrome/browser/sync/OWNERS
@@ -1 +1,4 @@ file://components/sync/OWNERS + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/tabs/OWNERS b/ios/chrome/browser/tabs/OWNERS index 40a68c7..b127701 100644 --- a/ios/chrome/browser/tabs/OWNERS +++ b/ios/chrome/browser/tabs/OWNERS
@@ -1 +1,4 @@ rohitrao@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/tabs/tab.mm b/ios/chrome/browser/tabs/tab.mm index 044b7bd..6c12045 100644 --- a/ios/chrome/browser/tabs/tab.mm +++ b/ios/chrome/browser/tabs/tab.mm
@@ -102,6 +102,7 @@ #import "ios/chrome/browser/web/auto_reload_bridge.h" #import "ios/chrome/browser/web/external_app_launcher.h" #import "ios/chrome/browser/web/navigation_manager_util.h" +#import "ios/chrome/browser/web/page_placeholder_tab_helper.h" #import "ios/chrome/browser/web/passkit_dialog_provider.h" #include "ios/chrome/browser/web/print_observer.h" #import "ios/chrome/browser/web/tab_id_tab_helper.h" @@ -231,6 +232,9 @@ // YES if the Tab needs to be reloaded after the app becomes active. BOOL _requireReloadAfterBecomingActive; + // YES if the Tab needs to be reloaded after displaying. + BOOL _requireReloadOnDisplay; + // Last visited timestamp. double _lastVisitedTimestamp; @@ -1227,7 +1231,7 @@ self.navigationManager->Reload(web::ReloadType::NORMAL, false /* check_for_repost */); } else { - [self.webController requirePageReload]; + _requireReloadOnDisplay = YES; } _requireReloadAfterBecomingActive = NO; } @@ -1719,13 +1723,10 @@ if (!applicationIsNotActive) [_fullScreenController disableFullScreen]; } else { - [self.webController requirePageReload]; + _requireReloadOnDisplay = YES; } // Returning to the app (after the renderer crashed in the background) and // having the page reload is much less confusing for the user. - // Note: Given that the tab is visible, calling |requirePageReload| will not - // work when the app becomes active because there is nothing to trigger - // a view redisplay in that scenario. _requireReloadAfterBecomingActive = _visible && applicationIsNotActive; [self.dialogDelegate cancelDialogForTab:self]; } @@ -1813,6 +1814,13 @@ if (self.webState) self.webState->WasShown(); [_inputAccessoryViewController wasShown]; + + if (_requireReloadOnDisplay) { + PagePlaceholderTabHelper::FromWebState(self.webState) + ->AddPlaceholderForNextNavigation(); + [self.webController loadCurrentURL]; + _requireReloadOnDisplay = NO; + } } - (void)wasHidden {
diff --git a/ios/chrome/browser/translate/OWNERS b/ios/chrome/browser/translate/OWNERS index ca1bcb6a..51f79e89 100644 --- a/ios/chrome/browser/translate/OWNERS +++ b/ios/chrome/browser/translate/OWNERS
@@ -1,2 +1,5 @@ file://components/translate/OWNERS droger@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/u2f/OWNERS b/ios/chrome/browser/u2f/OWNERS index ea2dcf4..bd6fe7d6 100644 --- a/ios/chrome/browser/u2f/OWNERS +++ b/ios/chrome/browser/u2f/OWNERS
@@ -1 +1,4 @@ eugenebut@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/OWNERS b/ios/chrome/browser/ui/OWNERS index 7e77d32..1ccf6c3c 100644 --- a/ios/chrome/browser/ui/OWNERS +++ b/ios/chrome/browser/ui/OWNERS
@@ -3,3 +3,6 @@ # like it needs extra review, or is related to the Omnibox. marq@chromium.org rohitrao@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/activity_services/OWNERS b/ios/chrome/browser/ui/activity_services/OWNERS index d2e1add..c85e66a 100644 --- a/ios/chrome/browser/ui/activity_services/OWNERS +++ b/ios/chrome/browser/ui/activity_services/OWNERS
@@ -1 +1,4 @@ jif@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/alert_coordinator/OWNERS b/ios/chrome/browser/ui/alert_coordinator/OWNERS index 0f2892e..8b593c3 100644 --- a/ios/chrome/browser/ui/alert_coordinator/OWNERS +++ b/ios/chrome/browser/ui/alert_coordinator/OWNERS
@@ -1,2 +1,5 @@ gambard@chromium.org michaeldo@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/authentication/BUILD.gn b/ios/chrome/browser/ui/authentication/BUILD.gn index b0e8632..5d7f181 100644 --- a/ios/chrome/browser/ui/authentication/BUILD.gn +++ b/ios/chrome/browser/ui/authentication/BUILD.gn
@@ -188,7 +188,6 @@ "//ios/chrome/browser", "//ios/chrome/browser/signin", "//ios/chrome/browser/ui", - "//ios/chrome/browser/ui/authentication:authentication_ui", "//ios/chrome/browser/ui/commands", "//ios/chrome/browser/ui/ntp:ntp_controller", "//ios/chrome/browser/ui/settings",
diff --git a/ios/chrome/browser/ui/authentication/OWNERS b/ios/chrome/browser/ui/authentication/OWNERS index bdb69b2..a8f0801c 100644 --- a/ios/chrome/browser/ui/authentication/OWNERS +++ b/ios/chrome/browser/ui/authentication/OWNERS
@@ -3,3 +3,6 @@ msarda@chromium.org # COMPONENT: Services>SignIn + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/authentication/signin_interaction_controller_egtest.mm b/ios/chrome/browser/ui/authentication/signin_interaction_controller_egtest.mm index a4470ba..64a0a75 100644 --- a/ios/chrome/browser/ui/authentication/signin_interaction_controller_egtest.mm +++ b/ios/chrome/browser/ui/authentication/signin_interaction_controller_egtest.mm
@@ -10,14 +10,9 @@ #include "components/signin/core/browser/signin_manager.h" #include "ios/chrome/browser/experimental_flags.h" #include "ios/chrome/browser/signin/signin_manager_factory.h" -#import "ios/chrome/browser/ui/authentication/signin_promo_view.h" #import "ios/chrome/browser/ui/commands/open_url_command.h" #import "ios/chrome/browser/ui/ntp/new_tab_page_controller.h" -#import "ios/chrome/browser/ui/settings/accounts_collection_view_controller.h" -#import "ios/chrome/browser/ui/settings/import_data_collection_view_controller.h" -#import "ios/chrome/browser/ui/settings/settings_collection_view_controller.h" #include "ios/chrome/browser/ui/tools_menu/tools_menu_constants.h" -#import "ios/chrome/browser/ui/tools_menu/tools_popup_controller.h" #include "ios/chrome/browser/ui/ui_util.h" #include "ios/chrome/grit/ios_strings.h" #import "ios/chrome/test/app/chrome_test_util.h" @@ -63,21 +58,6 @@ forConfigKey:kGREYConfigKeySynchronizationEnabled]; } -// Taps the view with accessibility matcher |accessibility_matcher|. -void TapViewWithMatcher(id<GREYMatcher> accessibility_matcher) { - // grey_sufficientlyVisible() is necessary because reloading a cell in a - // collection view might duplicate it (with the old one being hidden but - // EarlGrey can find it). - id<GREYMatcher> matcher = - grey_allOf(accessibility_matcher, grey_sufficientlyVisible(), nil); - [[EarlGrey selectElementWithMatcher:matcher] performAction:grey_tap()]; -} - -// Taps the view with acessibility identifier |accessibility_id|. -void TapViewWithAccessibilityId(NSString* accessiblity_id) { - TapViewWithMatcher(grey_accessibilityID(accessiblity_id)); -} - // Taps the button with accessibility label |label|. void TapButtonWithAccessibilityLabel(NSString* label) { id<GREYMatcher> matcher = @@ -164,13 +144,16 @@ AssertAuthenticatedIdentityInActiveProfile(identity1); // Open accounts settings, then sync settings. - TapViewWithAccessibilityId(kSettingsAccountCellId); - TapViewWithAccessibilityId(kSettingsAccountsSyncCellId); + [[EarlGrey selectElementWithMatcher:chrome_test_util::SettingsAccountButton()] + performAction:grey_tap()]; + [[EarlGrey selectElementWithMatcher:chrome_test_util::AccountsSyncButton()] + performAction:grey_tap()]; // Switch Sync account to |identity2|. TapButtonWithAccessibilityLabel(identity2.userEmail); - - TapViewWithAccessibilityId(kImportDataKeepSeparateCellId); + [[EarlGrey selectElementWithMatcher: + chrome_test_util::SettingsImportDataKeepSeparateButton()] + performAction:grey_tap()]; TapButtonWithLabelId(IDS_IOS_OPTIONS_IMPORT_DATA_CONTINUE_BUTTON); // Check the signed-in user did change. @@ -199,13 +182,16 @@ AssertAuthenticatedIdentityInActiveProfile(identity1); // Open accounts settings, then sync settings. - TapViewWithAccessibilityId(kSettingsAccountCellId); - TapViewWithAccessibilityId(kSettingsAccountsSyncCellId); + [[EarlGrey selectElementWithMatcher:chrome_test_util::SettingsAccountButton()] + performAction:grey_tap()]; + [[EarlGrey selectElementWithMatcher:chrome_test_util::AccountsSyncButton()] + performAction:grey_tap()]; // Switch Sync account to |identity2|. TapButtonWithAccessibilityLabel(identity2.userEmail); - - TapViewWithAccessibilityId(kImportDataImportCellId); + [[EarlGrey selectElementWithMatcher:chrome_test_util:: + SettingsImportDataImportButton()] + performAction:grey_tap()]; TapButtonWithLabelId(IDS_IOS_OPTIONS_IMPORT_DATA_CONTINUE_BUTTON); // Check the signed-in user did change. @@ -246,8 +232,11 @@ AssertAuthenticatedIdentityInActiveProfile(managed_identity); // Switch Sync account to |identity|. - TapViewWithAccessibilityId(kSettingsAccountCellId); - TapViewWithAccessibilityId(kSettingsAccountsSyncCellId); + [[EarlGrey selectElementWithMatcher:chrome_test_util::SettingsAccountButton()] + performAction:grey_tap()]; + [[EarlGrey selectElementWithMatcher:chrome_test_util::AccountsSyncButton()] + performAction:grey_tap()]; + TapButtonWithAccessibilityLabel(identity.userEmail); SetEarlGreySynchronizationEnabled(NO); @@ -276,16 +265,19 @@ AssertAuthenticatedIdentityInActiveProfile(identity); // Go to Accounts Settings and tap the sign out button. - TapViewWithAccessibilityId(kSettingsAccountCellId); + [[EarlGrey selectElementWithMatcher:chrome_test_util::SettingsAccountButton()] + performAction:grey_tap()]; + const CGFloat scroll_displacement = 100.0; - [[[EarlGrey selectElementWithMatcher:grey_accessibilityID( - kSettingsAccountsSignoutCellId)] + [[[EarlGrey + selectElementWithMatcher:grey_allOf( + chrome_test_util::SignOutAccountsButton(), + grey_interactable(), nil)] usingSearchAction:grey_scrollInDirection(kGREYDirectionDown, scroll_displacement) - onElementWithMatcher:grey_accessibilityID(kSettingsAccountsId)] + onElementWithMatcher:chrome_test_util::SettingsAccountsCollectionView()] performAction:grey_tap()]; TapButtonWithLabelId(IDS_IOS_DISCONNECT_DIALOG_CONTINUE_BUTTON_MOBILE); - [[EarlGrey selectElementWithMatcher:NavigationBarDoneButton()] performAction:grey_tap()]; @@ -319,16 +311,19 @@ AssertAuthenticatedIdentityInActiveProfile(identity); // Go to Accounts Settings and tap the sign out button. - TapViewWithAccessibilityId(kSettingsAccountCellId); + [[EarlGrey selectElementWithMatcher:chrome_test_util::SettingsAccountButton()] + performAction:grey_tap()]; + const CGFloat scroll_displacement = 100.0; - [[[EarlGrey selectElementWithMatcher:grey_accessibilityID( - kSettingsAccountsSignoutCellId)] + [[[EarlGrey + selectElementWithMatcher:grey_allOf( + chrome_test_util::SignOutAccountsButton(), + grey_interactable(), nil)] usingSearchAction:grey_scrollInDirection(kGREYDirectionDown, scroll_displacement) - onElementWithMatcher:grey_accessibilityID(kSettingsAccountsId)] + onElementWithMatcher:chrome_test_util::SettingsAccountsCollectionView()] performAction:grey_tap()]; TapButtonWithLabelId(IDS_IOS_MANAGED_DISCONNECT_DIALOG_ACCEPT); - [[EarlGrey selectElementWithMatcher:NavigationBarDoneButton()] performAction:grey_tap()]; @@ -463,18 +458,22 @@ AssertAuthenticatedIdentityInActiveProfile(identity2); // Go to Accounts Settings and tap the sign out button. - TapViewWithAccessibilityId(kSettingsAccountCellId); + [[EarlGrey selectElementWithMatcher:chrome_test_util::SettingsAccountButton()] + performAction:grey_tap()]; + const CGFloat scroll_displacement = 100.0; - [[[EarlGrey selectElementWithMatcher:grey_accessibilityID( - kSettingsAccountsSignoutCellId)] + [[[EarlGrey + selectElementWithMatcher:grey_allOf( + chrome_test_util::SignOutAccountsButton(), + grey_interactable(), nil)] usingSearchAction:grey_scrollInDirection(kGREYDirectionDown, scroll_displacement) - onElementWithMatcher:grey_accessibilityID(kSettingsAccountsId)] + onElementWithMatcher:chrome_test_util::SettingsAccountsCollectionView()] performAction:grey_tap()]; TapButtonWithLabelId(IDS_IOS_DISCONNECT_DIALOG_CONTINUE_BUTTON_MOBILE); AssertAuthenticatedIdentityInActiveProfile(nil); - - TapViewWithMatcher(chrome_test_util::SignInMenuButton()); + [[EarlGrey selectElementWithMatcher:chrome_test_util::SignInMenuButton()] + performAction:grey_tap()]; [ChromeEarlGreyUI signInToIdentityByEmail:identity1.userEmail]; // Open new tab to cancel sign-in. @@ -514,7 +513,7 @@ selectElementWithMatcher:grey_accessibilityID(kToolsMenuBookmarksId)] usingSearchAction:grey_scrollInDirection(kGREYDirectionDown, scroll_displacement) - onElementWithMatcher:grey_accessibilityID(kToolsMenuTableViewId)] + onElementWithMatcher:chrome_test_util::ToolsMenuView()] performAction:grey_tap()]; if (!IsIPadIdiom()) { @@ -530,8 +529,7 @@ grey_descendant(grey_text(topLevelFolderTitle)), nil); [[EarlGrey selectElementWithMatcher:all_bookmarks_matcher] performAction:grey_tap()]; - - TapViewWithAccessibilityId(kSigninPromoSecondaryButtonId); + TapButtonWithLabelId(IDS_IOS_BOOKMARK_PROMO_SIGN_IN_BUTTON); // Assert sign-in screen was shown. id<GREYMatcher> signin_matcher = @@ -552,7 +550,7 @@ selectElementWithMatcher:grey_accessibilityID(kToolsMenuBookmarksId)] usingSearchAction:grey_scrollInDirection(kGREYDirectionDown, scroll_displacement) - onElementWithMatcher:grey_accessibilityID(kToolsMenuTableViewId)] + onElementWithMatcher:chrome_test_util::ToolsMenuView()] performAction:grey_tap()]; if (!IsIPadIdiom()) { [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Menu")] @@ -560,7 +558,7 @@ } [[EarlGrey selectElementWithMatcher:all_bookmarks_matcher] performAction:grey_tap()]; - TapViewWithAccessibilityId(kSigninPromoSecondaryButtonId); + TapButtonWithLabelId(IDS_IOS_BOOKMARK_PROMO_SIGN_IN_BUTTON); [[EarlGrey selectElementWithMatcher:signin_matcher] assertWithMatcher:grey_sufficientlyVisible()];
diff --git a/ios/chrome/browser/ui/authentication/signin_promo_view.h b/ios/chrome/browser/ui/authentication/signin_promo_view.h index fda056f..d9eaa275 100644 --- a/ios/chrome/browser/ui/authentication/signin_promo_view.h +++ b/ios/chrome/browser/ui/authentication/signin_promo_view.h
@@ -20,11 +20,6 @@ SigninPromoViewModeWarmState, }; -extern NSString* const kSigninPromoViewId; -extern NSString* const kSigninPromoPrimaryButtonId; -extern NSString* const kSigninPromoSecondaryButtonId; -extern NSString* const kSigninPromoCloseButtonId; - // This class creates an image view, a label and 2 buttons. This view can be // configured with 2 modes : "Cold State" and "Warm State". // + "Cold State" mode displays the chomium icon in the image view, and only
diff --git a/ios/chrome/browser/ui/authentication/signin_promo_view.mm b/ios/chrome/browser/ui/authentication/signin_promo_view.mm index b67421d..31bb7b38 100644 --- a/ios/chrome/browser/ui/authentication/signin_promo_view.mm +++ b/ios/chrome/browser/ui/authentication/signin_promo_view.mm
@@ -32,12 +32,6 @@ const CGFloat kButtonHeight = 36; } -NSString* const kSigninPromoViewId = @"kSigninPromoViewId"; -NSString* const kSigninPromoPrimaryButtonId = @"kSigninPromoPrimaryButtonId"; -NSString* const kSigninPromoSecondaryButtonId = - @"kSigninPromoSecondaryButtonId"; -NSString* const kSigninPromoCloseButtonId = @"kSigninPromoCloseButtonId"; - @implementation SigninPromoView { NSArray<NSLayoutConstraint*>* _coldStateConstraints; NSArray<NSLayoutConstraint*>* _warmStateConstraints; @@ -56,7 +50,6 @@ self = [super initWithFrame:frame]; if (self) { self.isAccessibilityElement = YES; - self.accessibilityIdentifier = kSigninPromoViewId; // Adding subviews. self.clipsToBounds = YES; @@ -70,7 +63,7 @@ _primaryButton = [[MDCFlatButton alloc] init]; _primaryButton.translatesAutoresizingMaskIntoConstraints = NO; - _primaryButton.accessibilityIdentifier = kSigninPromoPrimaryButtonId; + _primaryButton.accessibilityIdentifier = @"signin_promo_primary_button"; _primaryButton.titleLabel.lineBreakMode = NSLineBreakByTruncatingTail; [_primaryButton addTarget:self action:@selector(onPrimaryButtonAction:) @@ -79,7 +72,7 @@ _secondaryButton = [[MDCFlatButton alloc] init]; _secondaryButton.translatesAutoresizingMaskIntoConstraints = NO; - _secondaryButton.accessibilityIdentifier = kSigninPromoSecondaryButtonId; + _secondaryButton.accessibilityIdentifier = @"signin_promo_secondary_button"; [_secondaryButton addTarget:self action:@selector(onSecondaryButtonAction:) forControlEvents:UIControlEventTouchUpInside]; @@ -87,7 +80,7 @@ _closeButton = [[UIButton alloc] init]; _closeButton.translatesAutoresizingMaskIntoConstraints = NO; - _closeButton.accessibilityIdentifier = kSigninPromoCloseButtonId; + _closeButton.accessibilityIdentifier = @"signin_promo_close_button"; [self addSubview:_closeButton]; // Adding style.
diff --git a/ios/chrome/browser/ui/autofill/OWNERS b/ios/chrome/browser/ui/autofill/OWNERS index 6a806bd..adccd5d 100644 --- a/ios/chrome/browser/ui/autofill/OWNERS +++ b/ios/chrome/browser/ui/autofill/OWNERS
@@ -1 +1,4 @@ mahmadi@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/autofill/card_unmask_prompt_view_bridge.mm b/ios/chrome/browser/ui/autofill/card_unmask_prompt_view_bridge.mm index 5ee028e..daf24718 100644 --- a/ios/chrome/browser/ui/autofill/card_unmask_prompt_view_bridge.mm +++ b/ios/chrome/browser/ui/autofill/card_unmask_prompt_view_bridge.mm
@@ -100,9 +100,9 @@ } else { if (allow_retry) { [view_controller_ - showCVCInputFormWithError:SysUTF16ToNSString(error_message)]; + showCVCInputFormWithError:base::SysUTF16ToNSString(error_message)]; } else { - [view_controller_ showError:SysUTF16ToNSString(error_message)]; + [view_controller_ showError:base::SysUTF16ToNSString(error_message)]; } } } @@ -151,7 +151,8 @@ [super initWithLayout:layout style:CollectionViewControllerStyleAppBar]; if (self) { _bridge = bridge; - self.title = SysUTF16ToNSString(_bridge->GetController()->GetWindowTitle()); + self.title = + base::SysUTF16ToNSString(_bridge->GetController()->GetWindowTitle()); } return self; } @@ -175,7 +176,7 @@ self.navigationItem.leftBarButtonItem = _cancelButton; NSString* verifyButtonText = - SysUTF16ToNSString(_bridge->GetController()->GetOkButtonLabel()); + base::SysUTF16ToNSString(_bridge->GetController()->GetOkButtonLabel()); _verifyButton = [[UIBarButtonItem alloc] initWithTitle:verifyButtonText style:UIBarButtonItemStylePlain @@ -215,7 +216,7 @@ autofill::CardUnmaskPromptController* controller = _bridge->GetController(); NSString* instructions = - SysUTF16ToNSString(controller->GetInstructionsMessage()); + base::SysUTF16ToNSString(controller->GetInstructionsMessage()); int CVCImageResourceID = controller->GetCvcImageRid(); _CVCItem = [[CVCItem alloc] initWithType:ItemTypeCVC]; _CVCItem.instructionsText = instructions; @@ -473,8 +474,8 @@ - (void)onNewCardLinkTapped:(UIButton*)button { _bridge->GetController()->NewCardLinkClicked(); - _CVCItem.instructionsText = - SysUTF16ToNSString(_bridge->GetController()->GetInstructionsMessage()); + _CVCItem.instructionsText = base::SysUTF16ToNSString( + _bridge->GetController()->GetInstructionsMessage()); _CVCItem.monthText = @""; _CVCItem.yearText = @""; _CVCItem.CVCText = @"";
diff --git a/ios/chrome/browser/ui/bookmarks/BUILD.gn b/ios/chrome/browser/ui/bookmarks/BUILD.gn index 8d4f289..91ce5d6 100644 --- a/ios/chrome/browser/ui/bookmarks/BUILD.gn +++ b/ios/chrome/browser/ui/bookmarks/BUILD.gn
@@ -187,7 +187,6 @@ "//ios/chrome/browser/bookmarks:bookmarks_utils", "//ios/chrome/browser/browser_state", "//ios/chrome/browser/ui", - "//ios/chrome/browser/ui/authentication:authentication_ui", "//ios/chrome/browser/ui/commands", "//ios/chrome/browser/ui/toolbar", "//ios/chrome/browser/ui/tools_menu",
diff --git a/ios/chrome/browser/ui/bookmarks/OWNERS b/ios/chrome/browser/ui/bookmarks/OWNERS index 3b99155..f6480c4 100644 --- a/ios/chrome/browser/ui/bookmarks/OWNERS +++ b/ios/chrome/browser/ui/bookmarks/OWNERS
@@ -1,3 +1,6 @@ noyau@chromium.org lpromero@chromium.org ramyasharma@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm b/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm index 785d4e4..bb64711 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm
@@ -18,7 +18,6 @@ #include "ios/chrome/browser/browser_state/chrome_browser_state.h" #include "ios/chrome/browser/experimental_flags.h" #include "ios/chrome/browser/pref_names.h" -#import "ios/chrome/browser/ui/authentication/signin_promo_view.h" #import "ios/chrome/browser/ui/commands/generic_chrome_command.h" #include "ios/chrome/browser/ui/commands/ios_command_ids.h" #import "ios/chrome/browser/ui/toolbar/toolbar_controller.h" @@ -637,28 +636,12 @@ // Tap the edit action. [[EarlGrey selectElementWithMatcher:ActionSheet(ActionEdit)] performAction:grey_tap()]; - - // Replace the title field with new text. - // TODO(crbug.com/644730): Use grey_replaceText instead of - // grey_clearText/grey_typeText when EarlGrey's issue is fixed: - // https://github.com/google/EarlGrey/issues/253 [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Title Field_textField")] - performAction:grey_clearText()]; - [[EarlGrey - selectElementWithMatcher:grey_accessibilityID(@"Title Field_textField")] - performAction:grey_typeText(@"n5")]; - - // Replace the url field with new text. - // TODO(crbug.com/644730): Use grey_replaceText instead of - // grey_clearText/grey_typeText when EarlGrey's issue is fixed: - // https://github.com/google/EarlGrey/issues/253 + performAction:grey_replaceText(@"n5")]; [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"URL Field_textField")] - performAction:grey_clearText()]; - [[EarlGrey - selectElementWithMatcher:grey_accessibilityID(@"URL Field_textField")] - performAction:grey_typeText(@"www.a.fr")]; + performAction:grey_replaceText(@"www.a.fr")]; // Dismiss editor. [[EarlGrey selectElementWithMatcher:BookmarksDoneButton()] @@ -687,28 +670,12 @@ // Tap the edit action. [[EarlGrey selectElementWithMatcher:ActionSheet(ActionEdit)] performAction:grey_tap()]; - - // Replace the title field with new text. - // TODO(crbug.com/644730): Use grey_replaceText instead of - // grey_clearText/grey_typeText when EarlGrey's issue is fixed: - // https://github.com/google/EarlGrey/issues/253 [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Title Field_textField")] - performAction:grey_clearText()]; - [[EarlGrey - selectElementWithMatcher:grey_accessibilityID(@"Title Field_textField")] - performAction:grey_typeText(@"n5")]; - - // Replace the url field with new text. - // TODO(crbug.com/644730): Use grey_replaceText instead of - // grey_clearText/grey_typeText when EarlGrey's issue is fixed: - // https://github.com/google/EarlGrey/issues/253 + performAction:grey_replaceText(@"n5")]; [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"URL Field_textField")] - performAction:grey_clearText()]; - [[EarlGrey - selectElementWithMatcher:grey_accessibilityID(@"URL Field_textField")] - performAction:grey_typeText(@"www.a.fr")]; + performAction:grey_replaceText(@"www.a.fr")]; // Dismiss editor with Cancel button. [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Cancel")] @@ -763,15 +730,8 @@ [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Edit_navigation_bar")] performAction:grey_tap()]; - - // Change the title. - // TODO(crbug.com/644730): Use grey_replaceText instead of - // grey_clearText/grey_typeText when EarlGrey's issue is fixed: - // https://github.com/google/EarlGrey/issues/253 [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Title_textField")] - performAction:grey_clearText()]; - [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Title_textField")] - performAction:grey_typeText(@"Renamed Folder")]; + performAction:grey_replaceText(@"Renamed Folder")]; // Cancel without saving. [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Cancel")] @@ -785,15 +745,8 @@ [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Edit_navigation_bar")] performAction:grey_tap()]; - - // Change the title. - // TODO(crbug.com/644730): Use grey_replaceText instead of - // grey_clearText/grey_typeText when EarlGrey's issue is fixed: - // https://github.com/google/EarlGrey/issues/253 [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Title_textField")] - performAction:grey_clearText()]; - [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Title_textField")] - performAction:grey_typeText(@"Renamed Folder")]; + performAction:grey_replaceText(@"Renamed Folder")]; // Save. [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Save")] @@ -1096,16 +1049,16 @@ }]; // Check that promo is visible. [BookmarksTestCase verifyPromoAlreadySeen:NO]; - [[EarlGrey selectElementWithMatcher:chrome_test_util::SignInPromoView()] - assertWithMatcher:grey_sufficientlyVisible()]; + [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"promo_view")] + assertWithMatcher:grey_notNil()]; // Tap the dismiss button. [[EarlGrey - selectElementWithMatcher:grey_accessibilityID(kSigninPromoCloseButtonId)] + selectElementWithMatcher:grey_accessibilityID(@"promo_no_thanks_button")] performAction:grey_tap()]; // Wait until promo is gone. - [[EarlGrey selectElementWithMatcher:chrome_test_util::SignInPromoView()] + [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"promo_view")] assertWithMatcher:grey_notVisible()]; // Check that the promo already seen state is updated. @@ -1127,16 +1080,12 @@ // Check that promo is visible. [BookmarksTestCase verifyPromoAlreadySeen:NO]; - [[EarlGrey - selectElementWithMatcher:grey_allOf(chrome_test_util::SignInPromoView(), - grey_sufficientlyVisible(), nil)] + [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"promo_view")] assertWithMatcher:grey_notNil()]; // Tap the Sign in button. [[EarlGrey - selectElementWithMatcher:grey_allOf(grey_accessibilityID( - kSigninPromoSecondaryButtonId), - grey_sufficientlyVisible(), nil)] + selectElementWithMatcher:grey_accessibilityID(@"promo_sign_in_button")] performAction:grey_tap()]; // Tap the CANCEL button. @@ -1146,9 +1095,7 @@ uppercaseString])] performAction:grey_tap()]; // Check that the bookmarks UI reappeared and the cell is still here. - [[EarlGrey - selectElementWithMatcher:grey_allOf(chrome_test_util::SignInPromoView(), - grey_sufficientlyVisible(), nil)] + [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"promo_view")] assertWithMatcher:grey_notNil()]; [BookmarksTestCase verifyPromoAlreadySeen:NO]; @@ -1351,25 +1298,8 @@ // Rename folder title to |folderTitle|. Must be in edit folder UI. + (void)renameBookmarkFolderWithFolderTitle:(NSString*)folderTitle { NSString* titleIdentifier = @"Title_textField"; - - // Edit the title field. [[EarlGrey selectElementWithMatcher:grey_accessibilityID(titleIdentifier)] - performAction:grey_tap()]; - // TODO(crbug.com/748748): Getting the clear button from the text field since - // the clear button has no accessibility label on iOS11/XCode9 betas thus we - // can't access it directly. EarlGray team believes that this could be a bug - // and might be fixed later on. - id<GREYMatcher> clearTextButton = - grey_allOf(grey_ancestor(grey_accessibilityID(titleIdentifier)), - grey_kindOfClass([UIButton class]), nil); - [[EarlGrey selectElementWithMatcher:clearTextButton] - performAction:grey_tap()]; - - // Type in the new title and use '\n' to dismiss the keyboard. - NSString* folderTitleWithNewLine = - [NSString stringWithFormat:@"%@\n", folderTitle]; - [[EarlGrey selectElementWithMatcher:grey_accessibilityID(titleIdentifier)] - performAction:grey_typeText(folderTitleWithNewLine)]; + performAction:grey_replaceText(folderTitle)]; } // Tap on the star to bookmark a page, then edit the bookmark to change the @@ -1384,21 +1314,7 @@ performAction:grey_tap()]; NSString* titleIdentifier = @"Title Field_textField"; [[EarlGrey selectElementWithMatcher:grey_accessibilityID(titleIdentifier)] - performAction:grey_tap()]; - // TODO(crbug.com/748748): Getting the clear button from the text field since - // the clear button has no accessibility label on iOS11/XCode9 betas thus we - // can't access it directly. EarlGray team believes that this could be a bug - // and might be fixed later on. - id<GREYMatcher> clearTextButton = - grey_allOf(grey_ancestor(grey_accessibilityID(titleIdentifier)), - grey_kindOfClass([UIButton class]), nil); - [[EarlGrey selectElementWithMatcher:clearTextButton] - performAction:grey_tap()]; - - // Use '\n' to tap Done and dismiss the keyboard. - NSString* bookmarkTitle = [NSString stringWithFormat:@"%@\n", title]; - [[EarlGrey selectElementWithMatcher:grey_accessibilityID(titleIdentifier)] - performAction:grey_typeText(bookmarkTitle)]; + performAction:grey_replaceText(title)]; // Dismiss the window. [[EarlGrey selectElementWithMatcher:BookmarksDoneButton()] @@ -1525,15 +1441,9 @@ // Change the name of the folder. if (name.length > 0) { - // TODO(crbug.com/644730): Use grey_replaceText instead of - // grey_clearText/grey_typeText when EarlGrey's issue is fixed: - // https://github.com/google/EarlGrey/issues/253 [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Title_textField")] - performAction:grey_clearText()]; - [[EarlGrey - selectElementWithMatcher:grey_accessibilityID(@"Title_textField")] - performAction:grey_typeText(name)]; + performAction:grey_replaceText(name)]; } // Tap the Save button.
diff --git a/ios/shared/chrome/browser/ui/browser_list/BUILD.gn b/ios/chrome/browser/ui/browser_list/BUILD.gn similarity index 100% rename from ios/shared/chrome/browser/ui/browser_list/BUILD.gn rename to ios/chrome/browser/ui/browser_list/BUILD.gn
diff --git a/ios/shared/chrome/browser/ui/browser_list/DEPS b/ios/chrome/browser/ui/browser_list/DEPS similarity index 100% rename from ios/shared/chrome/browser/ui/browser_list/DEPS rename to ios/chrome/browser/ui/browser_list/DEPS
diff --git a/ios/shared/chrome/browser/ui/browser_list/browser.h b/ios/chrome/browser/ui/browser_list/browser.h similarity index 87% rename from ios/shared/chrome/browser/ui/browser_list/browser.h rename to ios/chrome/browser/ui/browser_list/browser.h index 213f8d1..665e031 100644 --- a/ios/shared/chrome/browser/ui/browser_list/browser.h +++ b/ios/chrome/browser/ui/browser_list/browser.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_H_ -#define IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_H_ +#ifndef IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_H_ +#define IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_H_ #include <memory> @@ -46,4 +46,4 @@ DISALLOW_COPY_AND_ASSIGN(Browser); }; -#endif // IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_H_ +#endif // IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_H_
diff --git a/ios/shared/chrome/browser/ui/browser_list/browser.mm b/ios/chrome/browser/ui/browser_list/browser.mm similarity index 86% rename from ios/shared/chrome/browser/ui/browser_list/browser.mm rename to ios/chrome/browser/ui/browser_list/browser.mm index b80b383..c4f8b380 100644 --- a/ios/shared/chrome/browser/ui/browser_list/browser.mm +++ b/ios/chrome/browser/ui/browser_list/browser.mm
@@ -2,14 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import "ios/shared/chrome/browser/ui/browser_list/browser.h" +#import "ios/chrome/browser/ui/browser_list/browser.h" #include "base/logging.h" #include "base/memory/ptr_util.h" +#import "ios/chrome/browser/ui/browser_list/browser_web_state_list_delegate.h" #import "ios/chrome/browser/web_state_list/web_state_list.h" #import "ios/shared/chrome/browser/ui/broadcaster/chrome_broadcaster.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser_web_state_list_delegate.h" #import "ios/shared/chrome/browser/ui/commands/command_dispatcher.h" #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/shared/chrome/browser/ui/browser_list/browser_list.h b/ios/chrome/browser/ui/browser_list/browser_list.h similarity index 86% rename from ios/shared/chrome/browser/ui/browser_list/browser_list.h rename to ios/chrome/browser/ui/browser_list/browser_list.h index 11edf98f..a2a71e5 100644 --- a/ios/shared/chrome/browser/ui/browser_list/browser_list.h +++ b/ios/chrome/browser/ui/browser_list/browser_list.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_H_ -#define IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_H_ +#ifndef IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_H_ +#define IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_H_ #include <memory> #include <vector> @@ -11,7 +11,7 @@ #include "base/macros.h" #include "base/observer_list.h" #include "base/supports_user_data.h" -#include "ios/shared/chrome/browser/ui/browser_list/browser.h" +#include "ios/chrome/browser/ui/browser_list/browser.h" class BrowserListObserver; @@ -60,4 +60,4 @@ DISALLOW_COPY_AND_ASSIGN(BrowserList); }; -#endif // IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_H_ +#endif // IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_H_
diff --git a/ios/shared/chrome/browser/ui/browser_list/browser_list.mm b/ios/chrome/browser/ui/browser_list/browser_list.mm similarity index 93% rename from ios/shared/chrome/browser/ui/browser_list/browser_list.mm rename to ios/chrome/browser/ui/browser_list/browser_list.mm index 94a039f4..1bac1c2b 100644 --- a/ios/shared/chrome/browser/ui/browser_list/browser_list.mm +++ b/ios/chrome/browser/ui/browser_list/browser_list.mm
@@ -2,14 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import "ios/shared/chrome/browser/ui/browser_list/browser_list.h" +#import "ios/chrome/browser/ui/browser_list/browser_list.h" #include <stdint.h> #include "base/logging.h" #include "base/memory/ptr_util.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser_list_observer.h" +#import "ios/chrome/browser/ui/browser_list/browser_list_observer.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support."
diff --git a/ios/shared/chrome/browser/ui/browser_list/browser_list_observer.h b/ios/chrome/browser/ui/browser_list/browser_list_observer.h similarity index 76% rename from ios/shared/chrome/browser/ui/browser_list/browser_list_observer.h rename to ios/chrome/browser/ui/browser_list/browser_list_observer.h index 6afc61e..dc13323 100644 --- a/ios/shared/chrome/browser/ui/browser_list/browser_list_observer.h +++ b/ios/chrome/browser/ui/browser_list/browser_list_observer.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_OBSERVER_H_ -#define IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_OBSERVER_H_ +#ifndef IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_OBSERVER_H_ +#define IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_OBSERVER_H_ #include "base/macros.h" @@ -26,4 +26,4 @@ DISALLOW_COPY_AND_ASSIGN(BrowserListObserver); }; -#endif // IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_OBSERVER_H_ +#endif // IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_OBSERVER_H_
diff --git a/ios/shared/chrome/browser/ui/browser_list/browser_list_observer.mm b/ios/chrome/browser/ui/browser_list/browser_list_observer.mm similarity index 89% rename from ios/shared/chrome/browser/ui/browser_list/browser_list_observer.mm rename to ios/chrome/browser/ui/browser_list/browser_list_observer.mm index ac6a9e4..f9a80a2 100644 --- a/ios/shared/chrome/browser/ui/browser_list/browser_list_observer.mm +++ b/ios/chrome/browser/ui/browser_list/browser_list_observer.mm
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import "ios/shared/chrome/browser/ui/browser_list/browser_list_observer.h" +#import "ios/chrome/browser/ui/browser_list/browser_list_observer.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support."
diff --git a/ios/shared/chrome/browser/ui/browser_list/browser_list_session_service.h b/ios/chrome/browser/ui/browser_list/browser_list_session_service.h similarity index 81% rename from ios/shared/chrome/browser/ui/browser_list/browser_list_session_service.h rename to ios/chrome/browser/ui/browser_list/browser_list_session_service.h index c4803b2..061e05f 100644 --- a/ios/shared/chrome/browser/ui/browser_list/browser_list_session_service.h +++ b/ios/chrome/browser/ui/browser_list/browser_list_session_service.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_H_ -#define IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_H_ +#ifndef IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_H_ +#define IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_H_ #include "base/macros.h" #include "components/keyed_service/core/keyed_service.h" @@ -31,4 +31,4 @@ DISALLOW_COPY_AND_ASSIGN(BrowserListSessionService); }; -#endif // IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_H_ +#endif // IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_H_
diff --git a/ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_factory.h b/ios/chrome/browser/ui/browser_list/browser_list_session_service_factory.h similarity index 82% rename from ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_factory.h rename to ios/chrome/browser/ui/browser_list/browser_list_session_service_factory.h index f2d20de..3e8f058 100644 --- a/ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_factory.h +++ b/ios/chrome/browser/ui/browser_list/browser_list_session_service_factory.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_FACTORY_H_ -#define IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_FACTORY_H_ +#ifndef IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_FACTORY_H_ +#define IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_FACTORY_H_ #include "base/macros.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" @@ -44,4 +44,4 @@ DISALLOW_COPY_AND_ASSIGN(BrowserListSessionServiceFactory); }; -#endif // IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_FACTORY_H_ +#endif // IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_FACTORY_H_
diff --git a/ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_factory.mm b/ios/chrome/browser/ui/browser_list/browser_list_session_service_factory.mm similarity index 93% rename from ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_factory.mm rename to ios/chrome/browser/ui/browser_list/browser_list_session_service_factory.mm index 32768142..877c95a 100644 --- a/ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_factory.mm +++ b/ios/chrome/browser/ui/browser_list/browser_list_session_service_factory.mm
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import "ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_factory.h" +#import "ios/chrome/browser/ui/browser_list/browser_list_session_service_factory.h" #include <memory> @@ -16,8 +16,8 @@ #include "ios/chrome/browser/browser_state/browser_state_otr_helper.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/sessions/session_service_ios.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser_list.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_impl.h" +#import "ios/chrome/browser/ui/browser_list/browser_list.h" +#import "ios/chrome/browser/ui/browser_list/browser_list_session_service_impl.h" #import "ios/web/public/certificate_policy_cache.h" #import "ios/web/public/web_state/session_certificate_policy_cache.h"
diff --git a/ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_impl.h b/ios/chrome/browser/ui/browser_list/browser_list_session_service_impl.h similarity index 85% rename from ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_impl.h rename to ios/chrome/browser/ui/browser_list/browser_list_session_service_impl.h index 6a0cb29..cf32fae4 100644 --- a/ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_impl.h +++ b/ios/chrome/browser/ui/browser_list/browser_list_session_service_impl.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_IMPL_H_ -#define IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_IMPL_H_ +#ifndef IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_IMPL_H_ +#define IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_IMPL_H_ #import <Foundation/Foundation.h> @@ -12,7 +12,7 @@ #include "base/callback.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser_list_session_service.h" +#import "ios/chrome/browser/ui/browser_list/browser_list_session_service.h" #import "ios/web/public/web_state/web_state.h" class BrowserList; @@ -62,4 +62,4 @@ DISALLOW_COPY_AND_ASSIGN(BrowserListSessionServiceImpl); }; -#endif // IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_IMPL_H_ +#endif // IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_IMPL_H_
diff --git a/ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_impl.mm b/ios/chrome/browser/ui/browser_list/browser_list_session_service_impl.mm similarity index 97% rename from ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_impl.mm rename to ios/chrome/browser/ui/browser_list/browser_list_session_service_impl.mm index b1e164d..f6841c1 100644 --- a/ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_impl.mm +++ b/ios/chrome/browser/ui/browser_list/browser_list_session_service_impl.mm
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import "ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_impl.h" +#import "ios/chrome/browser/ui/browser_list/browser_list_session_service_impl.h" #include <map> @@ -14,12 +14,12 @@ #import "ios/chrome/browser/sessions/session_ios.h" #import "ios/chrome/browser/sessions/session_service_ios.h" #import "ios/chrome/browser/sessions/session_window_ios.h" +#import "ios/chrome/browser/ui/browser_list/browser.h" +#import "ios/chrome/browser/ui/browser_list/browser_list.h" +#import "ios/chrome/browser/ui/browser_list/browser_list_observer.h" #import "ios/chrome/browser/web_state_list/web_state_list.h" #import "ios/chrome/browser/web_state_list/web_state_list_observer.h" #import "ios/chrome/browser/web_state_list/web_state_list_serialization.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser_list.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser_list_observer.h" #import "ios/web/public/navigation_item.h" #import "ios/web/public/navigation_manager.h" #import "ios/web/public/web_state/web_state.h"
diff --git a/ios/shared/chrome/browser/ui/browser_list/browser_list_unittest.mm b/ios/chrome/browser/ui/browser_list/browser_list_unittest.mm similarity index 96% rename from ios/shared/chrome/browser/ui/browser_list/browser_list_unittest.mm rename to ios/chrome/browser/ui/browser_list/browser_list_unittest.mm index ece8ca1..fc1e633 100644 --- a/ios/shared/chrome/browser/ui/browser_list/browser_list_unittest.mm +++ b/ios/chrome/browser/ui/browser_list/browser_list_unittest.mm
@@ -2,14 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import "ios/shared/chrome/browser/ui/browser_list/browser_list.h" +#import "ios/chrome/browser/ui/browser_list/browser_list.h" #include <memory> #include "base/macros.h" #include "base/scoped_observer.h" #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser_list_observer.h" +#import "ios/chrome/browser/ui/browser_list/browser_list_observer.h" #include "testing/gtest/include/gtest/gtest.h" #include "testing/platform_test.h"
diff --git a/ios/shared/chrome/browser/ui/browser_list/browser_user_data.h b/ios/chrome/browser/ui/browser_list/browser_user_data.h similarity index 89% rename from ios/shared/chrome/browser/ui/browser_list/browser_user_data.h rename to ios/chrome/browser/ui/browser_list/browser_user_data.h index 15562a3..337956be 100644 --- a/ios/shared/chrome/browser/ui/browser_list/browser_user_data.h +++ b/ios/chrome/browser/ui/browser_list/browser_user_data.h
@@ -2,13 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_USER_DATA_H_ -#define IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_USER_DATA_H_ +#ifndef IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_USER_DATA_H_ +#define IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_USER_DATA_H_ #include "base/logging.h" #include "base/memory/ptr_util.h" #include "base/supports_user_data.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser.h" +#import "ios/chrome/browser/ui/browser_list/browser.h" // A base class for classes attached to, and scoped to, the lifetime of a // Browser. For example: @@ -71,4 +71,4 @@ template <> \ int BrowserUserData<TYPE>::kLocatorKey = 0 -#endif // IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_USER_DATA_H_ +#endif // IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_USER_DATA_H_
diff --git a/ios/shared/chrome/browser/ui/browser_list/browser_web_state_list_delegate.h b/ios/chrome/browser/ui/browser_list/browser_web_state_list_delegate.h similarity index 74% rename from ios/shared/chrome/browser/ui/browser_list/browser_web_state_list_delegate.h rename to ios/chrome/browser/ui/browser_list/browser_web_state_list_delegate.h index e09ba1d7..355468d 100644 --- a/ios/shared/chrome/browser/ui/browser_list/browser_web_state_list_delegate.h +++ b/ios/chrome/browser/ui/browser_list/browser_web_state_list_delegate.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_WEB_STATE_LIST_DELEGATE_H_ -#define IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_WEB_STATE_LIST_DELEGATE_H_ +#ifndef IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_WEB_STATE_LIST_DELEGATE_H_ +#define IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_WEB_STATE_LIST_DELEGATE_H_ #include "base/macros.h" #import "ios/chrome/browser/web_state_list/web_state_list_delegate.h" @@ -26,4 +26,4 @@ DISALLOW_COPY_AND_ASSIGN(BrowserWebStateListDelegate); }; -#endif // IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_WEB_STATE_LIST_DELEGATE_H_ +#endif // IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_WEB_STATE_LIST_DELEGATE_H_
diff --git a/ios/shared/chrome/browser/ui/browser_list/browser_web_state_list_delegate.mm b/ios/chrome/browser/ui/browser_list/browser_web_state_list_delegate.mm similarity index 92% rename from ios/shared/chrome/browser/ui/browser_list/browser_web_state_list_delegate.mm rename to ios/chrome/browser/ui/browser_list/browser_web_state_list_delegate.mm index b8c92f3..5ebff4d 100644 --- a/ios/shared/chrome/browser/ui/browser_list/browser_web_state_list_delegate.mm +++ b/ios/chrome/browser/ui/browser_list/browser_web_state_list_delegate.mm
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import "ios/shared/chrome/browser/ui/browser_list/browser_web_state_list_delegate.h" +#import "ios/chrome/browser/ui/browser_list/browser_web_state_list_delegate.h" #include "base/logging.h" #import "ios/chrome/browser/find_in_page/find_tab_helper.h"
diff --git a/ios/chrome/browser/ui/browser_view_controller.h b/ios/chrome/browser/ui/browser_view_controller.h index 6d87b4a..88a7947 100644 --- a/ios/chrome/browser/ui/browser_view_controller.h +++ b/ios/chrome/browser/ui/browser_view_controller.h
@@ -107,6 +107,12 @@ // Called when the user explicitly opens the tab switcher. - (void)userEnteredTabSwitcher; +// Presents either the new tab tip or incognito tab tip in-product help bubbles +// if the the user is in a valid state to see one of them. At most one bubble +// will be shown. If the feature engagement tracker determines it is not valid +// to see one of the bubbles, that bubble will not be shown. +- (void)presentBubblesIfEligible; + // Called when the browser state provided to this instance is being destroyed. // At this point the browser will no longer ever be active, and will likely be // deallocated soon.
diff --git a/ios/chrome/browser/ui/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view_controller.mm index 0a40ac3..87a25ba 100644 --- a/ios/chrome/browser/ui/browser_view_controller.mm +++ b/ios/chrome/browser/ui/browser_view_controller.mm
@@ -581,6 +581,10 @@ @property(nonatomic, strong) BubbleViewControllerPresenter* tabTipBubblePresenter; +// Used to display the new incognito tab tip in-product help promotion bubble. +@property(nonatomic, strong) + BubbleViewControllerPresenter* incognitoTabTipBubblePresenter; + // BVC initialization: // If the BVC is initialized with a valid browser state & tab model immediately, // the path is straightforward: functionality is enabled, and the UI is built @@ -694,10 +698,22 @@ // promotion until the feature engagement tracker database is fully initialized. // Does not present the bubble if |tabTipBubblePresenter.userEngaged| is |YES| // to prevent resetting |tabTipBubblePresenter| and affecting the value of -// |userEngaged|. +// |userEngaged|. Does not present the bubble if the feature engagement tracker +// determines it is not valid to present it. - (void)presentNewTabTipBubbleOnInitialized; -// Presents a bubble associated with the new tab tip in-product help promotion. +// Optionally presents a bubble associated with the new tab tip in-product help +// promotion. If the feature engagement tracker determines it is valid to show +// the new tab tip, then it initializes |tabTipBubblePresenter| and presents +// the bubble. If it is not valid to show the new tab tip, +// |tabTipBubblePresenter| is set to |nil| and no bubble is shown. - (void)presentNewTabTipBubble; +// Waits to present a bubble associated with the new incognito tab tip +// in-product help promotion until the feature engagement tracker database is +// fully initialized. +- (void)presentNewIncognitoTabTipBubbleOnInitialized; +// Presents a bubble associated with the new incognito tab tip in-product help +// promotion. +- (void)presentNewIncognitoTabTipBubble; // Create and show the find bar. - (void)initFindBarForTab; @@ -947,7 +963,8 @@ @synthesize presenting = _presenting; @synthesize foregroundTabWasAddedCompletionBlock = _foregroundTabWasAddedCompletionBlock; -@synthesize tabTipBubblePresenter = tabTipBubblePresenter; +@synthesize tabTipBubblePresenter = _tabTipBubblePresenter; +@synthesize incognitoTabTipBubblePresenter = _incognitoTabTipBubblePresenter; #pragma mark - Object lifecycle @@ -1217,6 +1234,11 @@ } } +- (void)presentBubblesIfEligible { + [self presentNewTabTipBubbleOnInitialized]; + [self presentNewIncognitoTabTipBubble]; +} + #pragma mark - UIViewController methods // Perform additional set up after loading the view, typically from a nib. @@ -1263,7 +1285,7 @@ [super viewDidAppear:animated]; self.viewVisible = YES; [self updateDialogPresenterActiveState]; - [self presentNewTabTipBubbleOnInitialized]; + [self presentBubblesIfEligible]; } - (void)viewWillAppear:(BOOL)animated { @@ -2073,6 +2095,9 @@ tabSwitcherAnchor = [self.toolbarController anchorPointForTabSwitcherButton:BubbleArrowDirectionUp]; } + // If the feature engagement tracker does not consider it valid to display + // the new tab tip, then |bubblePresenterForFeature| returns |nil| and the + // call to |presentInViewController| is a no-op. self.tabTipBubblePresenter = [self bubblePresenterForFeature:feature_engagement::kIPHNewTabTipFeature direction:BubbleArrowDirectionUp @@ -2083,6 +2108,46 @@ anchorPoint:tabSwitcherAnchor]; } +- (void)presentNewIncognitoTabTipBubbleOnInitialized { + // Do not override |incognitoTabtipBubblePresenter| or set it to nil if the + // user is still considered engaged. + if (!self.incognitoTabTipBubblePresenter.isUserEngaged) { + __weak BrowserViewController* weakSelf = self; + void (^onInitializedBlock)(bool) = ^(bool successfullyLoaded) { + [weakSelf presentNewIncognitoTabTipBubble]; + }; + + // Use a callback in case the new incognito tab tip should be shown on + // startup. This ensures that the tracker's database will be fully loaded + // before checking if the promotion should be displayed. + feature_engagement::TrackerFactory::GetForBrowserState(self.browserState) + ->AddOnInitializedCallback(base::BindBlockArc(onInitializedBlock)); + } +} + +- (void)presentNewIncognitoTabTipBubble { + DCHECK([self.toolbarController + respondsToSelector:@selector(anchorPointForToolsMenuButton:)]); + NSString* text = l10n_util::GetNSStringWithFixup( + IDS_IOS_NEW_INCOGNITO_TAB_IPH_PROMOTION_TEXT); + CGPoint toolsButtonAnchor = [self.toolbarController + anchorPointForToolsMenuButton:BubbleArrowDirectionUp]; + self.incognitoTabTipBubblePresenter = + [self bubblePresenterForFeature:feature_engagement:: + kIPHNewIncognitoTabTipFeature + direction:BubbleArrowDirectionUp + alignment:BubbleAlignmentTrailing + text:text]; + [self.incognitoTabTipBubblePresenter + presentInViewController:self + view:self.view + anchorPoint:toolsButtonAnchor]; + // Only trigger the tools menu button animation if the bubble is shown. + if (self.incognitoTabTipBubblePresenter) { + [self.toolbarController triggerToolsMenuButtonAnimation]; + } +} + #pragma mark - Tap handling - (void)setLastTapPoint:(OpenNewTabCommand*)command { @@ -3166,7 +3231,12 @@ url, ReadingListModelFactory::GetForBrowserState(_browserState)); } - return host == kChromeUINewTabHost || host == kChromeUIBookmarksHost; + if (host == kChromeUIBookmarksHost) { + // Only allow bookmark URL on iPad. + return IsIPadIdiom(); + } + + return host == kChromeUINewTabHost; } - (id<CRWNativeContent>)controllerForURL:(const GURL&)url @@ -4097,6 +4167,15 @@ [configuration setUserAgentType:self.userAgentType]; + if (self.incognitoTabTipBubblePresenter.triggerFollowUpAction) { + [configuration setHighlightNewIncognitoTabCell:YES]; + [self.incognitoTabTipBubblePresenter setTriggerFollowUpAction:NO]; + } + + if (self.incognitoTabTipBubblePresenter.isUserEngaged) { + base::RecordAction(UserMetricsAction("NewIncognitoTabTipTargetSelected")); + } + [_toolbarController showToolsMenuPopupWithConfiguration:configuration]; ToolsPopupController* toolsPopupController =
diff --git a/ios/chrome/browser/ui/bubble/OWNERS b/ios/chrome/browser/ui/bubble/OWNERS index d122690d..2c40cf4 100644 --- a/ios/chrome/browser/ui/bubble/OWNERS +++ b/ios/chrome/browser/ui/bubble/OWNERS
@@ -1,2 +1,4 @@ edchin@chromium.org -gchatz@chromium.org \ No newline at end of file +gchatz@chromium.org +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/bubble/bubble_util_unittest.mm b/ios/chrome/browser/ui/bubble/bubble_util_unittest.mm index bed713c..2cb7c9b 100644 --- a/ios/chrome/browser/ui/bubble/bubble_util_unittest.mm +++ b/ios/chrome/browser/ui/bubble/bubble_util_unittest.mm
@@ -14,7 +14,7 @@ #endif namespace { -const CGFloat kTestBubbleAlignmentOffset = 40.0f; +const CGFloat kTestBubbleAlignmentOffset = 25.0f; } // namespace namespace bubble_util {
diff --git a/ios/chrome/browser/ui/bubble/bubble_view.mm b/ios/chrome/browser/ui/bubble/bubble_view.mm index 5c4f211..b2b8b3c2 100644 --- a/ios/chrome/browser/ui/bubble/bubble_view.mm +++ b/ios/chrome/browser/ui/bubble/bubble_view.mm
@@ -12,7 +12,7 @@ #error "This file requires ARC support." #endif -const CGFloat kBubbleAlignmentOffset = 40.0f; +const CGFloat kBubbleAlignmentOffset = 25.0f; namespace { // The color of the bubble (both circular background and arrow).
diff --git a/ios/chrome/browser/ui/bubble/bubble_view_controller_presenter.h b/ios/chrome/browser/ui/bubble/bubble_view_controller_presenter.h index 4db25936..911f1c6 100644 --- a/ios/chrome/browser/ui/bubble/bubble_view_controller_presenter.h +++ b/ios/chrome/browser/ui/bubble/bubble_view_controller_presenter.h
@@ -30,6 +30,13 @@ // the bubble had an effect on the user's action. @property(nonatomic, assign, readonly, getter=isUserEngaged) BOOL userEngaged; +// Determines whether a follow-up action, such as highlighting a UI element, +// should be triggered. This depends on |userEngaged|, since a follow-up action +// should only occur if the user is engaged with the bubble. Defaults to |YES|, +// and is set to |NO| once |userEngaged| is set to |NO| or after the user has +// triggered the follow-up action. +@property(nonatomic, assign) BOOL triggerFollowUpAction; + // Initializes the presenter. |text| is the text displayed by the bubble. // |arrowDirection| is the direction the bubble's arrow is pointing. |alignment| // is the position of the arrow on the bubble. |dismissalCallback| is a block
diff --git a/ios/chrome/browser/ui/bubble/bubble_view_controller_presenter.mm b/ios/chrome/browser/ui/bubble/bubble_view_controller_presenter.mm index cb298b0..21dd759f 100644 --- a/ios/chrome/browser/ui/bubble/bubble_view_controller_presenter.mm +++ b/ios/chrome/browser/ui/bubble/bubble_view_controller_presenter.mm
@@ -71,6 +71,7 @@ @synthesize bubbleDismissalTimer = _bubbleDismissalTimer; @synthesize engagementTimer = _engagementTimer; @synthesize userEngaged = _userEngaged; +@synthesize triggerFollowUpAction = _triggerFollowUpAction; @synthesize arrowDirection = _arrowDirection; @synthesize alignment = _alignment; @synthesize dismissalCallback = _dismissalCallback; @@ -96,6 +97,7 @@ _insideBubbleTapRecognizer.delegate = self; _insideBubbleTapRecognizer.cancelsTouchesInView = NO; _userEngaged = NO; + _triggerFollowUpAction = NO; _arrowDirection = arrowDirection; _alignment = alignment; _dismissalCallback = dismissalCallback; @@ -132,6 +134,7 @@ repeats:NO]; self.userEngaged = YES; + self.triggerFollowUpAction = YES; self.engagementTimer = [NSTimer scheduledTimerWithTimeInterval:kBubbleEngagementDuration target:self @@ -206,6 +209,7 @@ // Marks the user as not engaged when |engagementTimer| fires. - (void)engagementTimerFired:(id)sender { self.userEngaged = NO; + self.triggerFollowUpAction = NO; self.engagementTimer = nil; }
diff --git a/ios/chrome/browser/ui/bubble/bubble_view_unittest.mm b/ios/chrome/browser/ui/bubble/bubble_view_unittest.mm index c9c64d71..6842465 100644 --- a/ios/chrome/browser/ui/bubble/bubble_view_unittest.mm +++ b/ios/chrome/browser/ui/bubble/bubble_view_unittest.mm
@@ -46,7 +46,7 @@ CGSize bubbleSize = [bubble sizeThatFits:maxSize_]; // Since the label is shorter than the minimum line width, expect the bubble // to be the minimum width and accommodate one line of text. - EXPECT_NEAR(80.0f, bubbleSize.width, 1.0f); + EXPECT_NEAR(56.0f, bubbleSize.width, 1.0f); EXPECT_NEAR(61.5f, bubbleSize.height, 1.0f); }
diff --git a/ios/chrome/browser/ui/collection_view/OWNERS b/ios/chrome/browser/ui/collection_view/OWNERS index 077a06e..c984591 100644 --- a/ios/chrome/browser/ui/collection_view/OWNERS +++ b/ios/chrome/browser/ui/collection_view/OWNERS
@@ -1,2 +1,5 @@ lpromero@chromium.org rohitrao@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/colors/OWNERS b/ios/chrome/browser/ui/colors/OWNERS index 4bb62eb..a188a478 100644 --- a/ios/chrome/browser/ui/colors/OWNERS +++ b/ios/chrome/browser/ui/colors/OWNERS
@@ -1 +1,4 @@ lpromero@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/content_suggestions/OWNERS b/ios/chrome/browser/ui/content_suggestions/OWNERS index 2d35f0a5..f192143 100644 --- a/ios/chrome/browser/ui/content_suggestions/OWNERS +++ b/ios/chrome/browser/ui/content_suggestions/OWNERS
@@ -1 +1,4 @@ gambard@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.mm index 5aa5a63..967abb0 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.mm +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.mm
@@ -343,8 +343,6 @@ NSInteger sectionIdentifier = SectionIdentifierForInfo(sectionInfo); if (suggestions.count == 0) { - // No suggestions for this section. Add the item signaling this section is - // empty if there is currently no item in it. if ([model hasSectionForSectionIdentifier:sectionIdentifier] && [model numberOfItemsInSection:[model sectionForSectionIdentifier: sectionIdentifier]] == 0) { @@ -358,35 +356,6 @@ return indexPaths; } - if (sectionIdentifier == SectionIdentifierLearnMore) { - // The "Learn more" items should only be displayed if there is at least one - // ContentSuggestions section. - if ((![model hasSectionForSectionIdentifier:SectionIdentifierArticles] && - ! - [model hasSectionForSectionIdentifier:SectionIdentifierReadingList]) || - [model itemsInSectionWithIdentifier:sectionIdentifier].count > 0) { - return @[]; - } - } else if (IsFromContentSuggestions(sectionIdentifier)) { - // If the section is a ContentSuggestions section, add the "Learn more" - // items if they are not already present. - if ([model hasSectionForSectionIdentifier:SectionIdentifierLearnMore] && - [model itemsInSectionWithIdentifier:SectionIdentifierLearnMore].count == - 0) { - ContentSuggestionsSectionInformation* learnMoreSectionInfo = - self.sectionInfoBySectionIdentifier[@(SectionIdentifierLearnMore)]; - for (CSCollectionViewItem* item in - [self.dataSource itemsForSectionInfo:learnMoreSectionInfo]) { - item.type = ItemTypeForInfo(learnMoreSectionInfo); - NSIndexPath* addedIndexPath = [self addItem:item - toSectionWithIdentifier:SectionIdentifierLearnMore]; - - [indexPaths addObject:addedIndexPath]; - } - } - } - - // Add the items from this section. [suggestions enumerateObjectsUsingBlock:^(CSCollectionViewItem* item, NSUInteger index, BOOL* stop) { NSInteger section = [model sectionForSectionIdentifier:sectionIdentifier];
diff --git a/ios/chrome/browser/ui/context_menu/OWNERS b/ios/chrome/browser/ui/context_menu/OWNERS index 49ba79e..07726cf 100644 --- a/ios/chrome/browser/ui/context_menu/OWNERS +++ b/ios/chrome/browser/ui/context_menu/OWNERS
@@ -1 +1,4 @@ michaeldo@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/contextual_search/OWNERS b/ios/chrome/browser/ui/contextual_search/OWNERS index 3141303..17f2da6 100644 --- a/ios/chrome/browser/ui/contextual_search/OWNERS +++ b/ios/chrome/browser/ui/contextual_search/OWNERS
@@ -1,2 +1,5 @@ marq@chromium.org olivierrobin@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/contextual_search/contextual_search_delegate.cc b/ios/chrome/browser/ui/contextual_search/contextual_search_delegate.cc index 624a048..c468bfa 100644 --- a/ios/chrome/browser/ui/contextual_search/contextual_search_delegate.cc +++ b/ios/chrome/browser/ui/contextual_search/contextual_search_delegate.cc
@@ -317,8 +317,8 @@ media->set_mime_type(context.encoding); discourse_context::Selection* selection = display->mutable_selection(); - selection->set_content( - net::EscapeQueryParamValue(UTF16ToUTF8(context.surrounding_text), true)); + selection->set_content(net::EscapeQueryParamValue( + base::UTF16ToUTF8(context.surrounding_text), true)); selection->set_start(context.start_offset); selection->set_end(context.end_offset);
diff --git a/ios/chrome/browser/ui/dialogs/OWNERS b/ios/chrome/browser/ui/dialogs/OWNERS index 48efb49e..bd85dcf2 100644 --- a/ios/chrome/browser/ui/dialogs/OWNERS +++ b/ios/chrome/browser/ui/dialogs/OWNERS
@@ -1 +1,4 @@ kkhorimoto@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/elements/OWNERS b/ios/chrome/browser/ui/elements/OWNERS index f49ed38..01e8c98 100644 --- a/ios/chrome/browser/ui/elements/OWNERS +++ b/ios/chrome/browser/ui/elements/OWNERS
@@ -1 +1,4 @@ marq@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/fancy_ui/OWNERS b/ios/chrome/browser/ui/fancy_ui/OWNERS index 40a68c7..b127701 100644 --- a/ios/chrome/browser/ui/fancy_ui/OWNERS +++ b/ios/chrome/browser/ui/fancy_ui/OWNERS
@@ -1 +1,4 @@ rohitrao@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/favicon/OWNERS b/ios/chrome/browser/ui/favicon/OWNERS index 2d35f0a5..f192143 100644 --- a/ios/chrome/browser/ui/favicon/OWNERS +++ b/ios/chrome/browser/ui/favicon/OWNERS
@@ -1 +1,4 @@ gambard@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/find_bar/BUILD.gn b/ios/chrome/browser/ui/find_bar/BUILD.gn index ad487457..9ca15b2 100644 --- a/ios/chrome/browser/ui/find_bar/BUILD.gn +++ b/ios/chrome/browser/ui/find_bar/BUILD.gn
@@ -55,7 +55,6 @@ "//components/strings", "//ios/chrome/app/strings", "//ios/chrome/browser/find_in_page", - "//ios/chrome/browser/ui:ui", "//ios/chrome/browser/ui/tools_menu", "//ios/chrome/test/app:test_support", "//ios/chrome/test/earl_grey:test_support",
diff --git a/ios/chrome/browser/ui/find_bar/OWNERS b/ios/chrome/browser/ui/find_bar/OWNERS index 8298f43..479c250 100644 --- a/ios/chrome/browser/ui/find_bar/OWNERS +++ b/ios/chrome/browser/ui/find_bar/OWNERS
@@ -1,2 +1,5 @@ justincohen@chromium.org stkhapugin@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/find_bar/find_in_page_egtest.mm b/ios/chrome/browser/ui/find_bar/find_in_page_egtest.mm index 36bb7af..ef3dfcd 100644 --- a/ios/chrome/browser/ui/find_bar/find_in_page_egtest.mm +++ b/ios/chrome/browser/ui/find_bar/find_in_page_egtest.mm
@@ -4,14 +4,12 @@ #import <XCTest/XCTest.h> -#include "base/ios/ios_util.h" #include "base/strings/string_number_conversions.h" #include "components/strings/grit/components_strings.h" #import "ios/chrome/browser/find_in_page/find_in_page_controller.h" #import "ios/chrome/browser/ui/find_bar/find_bar_controller_ios.h" #import "ios/chrome/browser/ui/find_bar/find_bar_view.h" #include "ios/chrome/browser/ui/tools_menu/tools_menu_constants.h" -#include "ios/chrome/browser/ui/ui_util.h" #import "ios/chrome/test/app/tab_test_util.h" #import "ios/chrome/test/earl_grey/accessibility_util.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" @@ -96,12 +94,6 @@ // Tests that find in page allows iteration between search results and displays // correct number of results. - (void)testFindInPage { - // TODO(crbug.com/753098): Re-enable this test on iOS 11 iPad once - // grey_typeText works on iOS 11. - if (base::ios::IsRunningOnIOS11OrLater() && IsIPadIdiom()) { - EARL_GREY_TEST_DISABLED(@"Test disabled on iOS 11."); - } - // Type "find". [self typeFindInPageText:@"find"]; // Should be highlighting result 1 of 2. @@ -184,7 +176,7 @@ - (void)typeFindInPageText:(NSString*)text { [[EarlGrey selectElementWithMatcher:[self findInPageInputField]] - performAction:grey_typeText(text)]; + performAction:grey_replaceText(text)]; } - (id<GREYMatcher>)findInPageInputField {
diff --git a/ios/chrome/browser/ui/first_run/OWNERS b/ios/chrome/browser/ui/first_run/OWNERS index 3281fe5b..e29ab3e 100644 --- a/ios/chrome/browser/ui/first_run/OWNERS +++ b/ios/chrome/browser/ui/first_run/OWNERS
@@ -1,2 +1,5 @@ bzanotti@chromium.org kkhorimoto@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/history/BUILD.gn b/ios/chrome/browser/ui/history/BUILD.gn index 10674d96..ed52dc65c 100644 --- a/ios/chrome/browser/ui/history/BUILD.gn +++ b/ios/chrome/browser/ui/history/BUILD.gn
@@ -207,7 +207,6 @@ "//ios/chrome/app/strings", "//ios/chrome/browser", "//ios/chrome/browser/browser_state", - "//ios/chrome/browser/ui/authentication:authentication_ui", "//ios/chrome/browser/ui/settings", "//ios/chrome/browser/ui/tools_menu", "//ios/chrome/browser/ui/util",
diff --git a/ios/chrome/browser/ui/history/OWNERS b/ios/chrome/browser/ui/history/OWNERS index 1085212..1c26985 100644 --- a/ios/chrome/browser/ui/history/OWNERS +++ b/ios/chrome/browser/ui/history/OWNERS
@@ -1,2 +1,5 @@ lpromero@chromium.org sczs@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/history/history_ui_egtest.mm b/ios/chrome/browser/ui/history/history_ui_egtest.mm index 590f142f..51b4feed 100644 --- a/ios/chrome/browser/ui/history/history_ui_egtest.mm +++ b/ios/chrome/browser/ui/history/history_ui_egtest.mm
@@ -14,7 +14,6 @@ #include "components/strings/grit/components_strings.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" #include "ios/chrome/browser/chrome_url_constants.h" -#import "ios/chrome/browser/ui/authentication/signin_promo_view.h" #import "ios/chrome/browser/ui/history/history_entry_item.h" #import "ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller.h" #import "ios/chrome/browser/ui/settings/settings_collection_view_controller.h"
diff --git a/ios/chrome/browser/ui/infobars/OWNERS b/ios/chrome/browser/ui/infobars/OWNERS index d2e1add..c85e66a 100644 --- a/ios/chrome/browser/ui/infobars/OWNERS +++ b/ios/chrome/browser/ui/infobars/OWNERS
@@ -1 +1,4 @@ jif@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/keyboard/OWNERS b/ios/chrome/browser/ui/keyboard/OWNERS index 4bb62eb..a188a478 100644 --- a/ios/chrome/browser/ui/keyboard/OWNERS +++ b/ios/chrome/browser/ui/keyboard/OWNERS
@@ -1 +1,4 @@ lpromero@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/keyboard_commands_egtest.mm b/ios/chrome/browser/ui/keyboard_commands_egtest.mm index 2b72f680..db85067 100644 --- a/ios/chrome/browser/ui/keyboard_commands_egtest.mm +++ b/ios/chrome/browser/ui/keyboard_commands_egtest.mm
@@ -115,8 +115,7 @@ - (void)selectToolsMenuItem:(id<GREYMatcher>)toolsMenuItem { [ChromeEarlGreyUI openToolsMenu]; - id<GREYMatcher> toolsMenuTableView = - grey_accessibilityID(kToolsMenuTableViewId); + id<GREYMatcher> toolsMenuTableView = chrome_test_util::ToolsMenuView(); [[[EarlGrey selectElementWithMatcher:toolsMenuItem] usingSearchAction:grey_scrollInDirection(kGREYDirectionDown, kScrollDisplacement)
diff --git a/ios/chrome/browser/ui/main/OWNERS b/ios/chrome/browser/ui/main/OWNERS index f49ed38..01e8c98 100644 --- a/ios/chrome/browser/ui/main/OWNERS +++ b/ios/chrome/browser/ui/main/OWNERS
@@ -1 +1,4 @@ marq@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/ntp/OWNERS b/ios/chrome/browser/ui/ntp/OWNERS index 3306281..9b78e8b 100644 --- a/ios/chrome/browser/ui/ntp/OWNERS +++ b/ios/chrome/browser/ui/ntp/OWNERS
@@ -1,2 +1,5 @@ rohitrao@chromium.org justincohen@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/ntp/recent_tabs/OWNERS b/ios/chrome/browser/ui/ntp/recent_tabs/OWNERS index d2e1add..c85e66a 100644 --- a/ios/chrome/browser/ui/ntp/recent_tabs/OWNERS +++ b/ios/chrome/browser/ui/ntp/recent_tabs/OWNERS
@@ -1 +1,4 @@ jif@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/ntp/recent_tabs/views/session_section_header_view.mm b/ios/chrome/browser/ui/ntp/recent_tabs/views/session_section_header_view.mm index b243aac5..5334d2a9 100644 --- a/ios/chrome/browser/ui/ntp/recent_tabs/views/session_section_header_view.mm +++ b/ios/chrome/browser/ui/ntp/recent_tabs/views/session_section_header_view.mm
@@ -156,7 +156,7 @@ if (last_used_delta.ToInternalValue() < base::Time::kMicrosecondsPerMinute) return l10n_util::GetNSString(IDS_IOS_OPEN_TABS_RECENTLY_SYNCED); if (last_used_delta.InHours() < kRelativeTimeMaxHours) { - return SysUTF16ToNSString( + return base::SysUTF16ToNSString( ui::TimeFormat::Simple(ui::TimeFormat::FORMAT_ELAPSED, ui::TimeFormat::LENGTH_SHORT, last_used_delta)); }
diff --git a/ios/chrome/browser/ui/ntp/recent_tabs/views/session_tab_data_view.mm b/ios/chrome/browser/ui/ntp/recent_tabs/views/session_tab_data_view.mm index a5634b0..5b1f54a 100644 --- a/ios/chrome/browser/ui/ntp/recent_tabs/views/session_tab_data_view.mm +++ b/ios/chrome/browser/ui/ntp/recent_tabs/views/session_tab_data_view.mm
@@ -93,7 +93,7 @@ browserState:(ios::ChromeBrowserState*)browserState { DCHECK(distantTab); DCHECK(browserState); - NSString* text = SysUTF16ToNSString(distantTab->title); + NSString* text = base::SysUTF16ToNSString(distantTab->title); GURL url = distantTab->virtual_url; [self setText:text url:url browserState:browserState]; }
diff --git a/ios/chrome/browser/ui/omnibox/OWNERS b/ios/chrome/browser/ui/omnibox/OWNERS index 03b0059..5e5e932a 100644 --- a/ios/chrome/browser/ui/omnibox/OWNERS +++ b/ios/chrome/browser/ui/omnibox/OWNERS
@@ -2,3 +2,6 @@ rohitrao@chromium.org # COMPONENT: UI>Browser>Omnibox + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_view_ios.mm b/ios/chrome/browser/ui/omnibox/omnibox_view_ios.mm index cc9423ec..ba1219b1 100644 --- a/ios/chrome/browser/ui/omnibox/omnibox_view_ios.mm +++ b/ios/chrome/browser/ui/omnibox/omnibox_view_ios.mm
@@ -493,7 +493,7 @@ base::string16 pastedText = base::SysNSStringToUTF16([field_ text]); base::string16 newText = OmniboxView::SanitizeTextForPaste(pastedText); if (pastedText != newText) { - [field_ setText:SysUTF16ToNSString(newText)]; + [field_ setText:base::SysUTF16ToNSString(newText)]; } }
diff --git a/ios/chrome/browser/ui/overscroll_actions/OWNERS b/ios/chrome/browser/ui/overscroll_actions/OWNERS index d2e1add..c85e66a 100644 --- a/ios/chrome/browser/ui/overscroll_actions/OWNERS +++ b/ios/chrome/browser/ui/overscroll_actions/OWNERS
@@ -1 +1,4 @@ jif@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/payments/BUILD.gn b/ios/chrome/browser/ui/payments/BUILD.gn index 21910e76..63eb3cc 100644 --- a/ios/chrome/browser/ui/payments/BUILD.gn +++ b/ios/chrome/browser/ui/payments/BUILD.gn
@@ -158,6 +158,7 @@ "contact_info_selection_mediator_unittest.mm", "country_selection_coordinator_unittest.mm", "credit_card_edit_coordinator_unittest.mm", + "credit_card_edit_mediator_unittest.mm", "full_card_requester_unittest.mm", "payment_items_display_coordinator_unittest.mm", "payment_items_display_view_controller_unittest.mm",
diff --git a/ios/chrome/browser/ui/payments/OWNERS b/ios/chrome/browser/ui/payments/OWNERS index 4cfb56d..2a262cc2 100644 --- a/ios/chrome/browser/ui/payments/OWNERS +++ b/ios/chrome/browser/ui/payments/OWNERS
@@ -1,2 +1,5 @@ lpromero@chromium.org mahmadi@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/payments/credit_card_edit_mediator.mm b/ios/chrome/browser/ui/payments/credit_card_edit_mediator.mm index 1113cd3..2ca6c574 100644 --- a/ios/chrome/browser/ui/payments/credit_card_edit_mediator.mm +++ b/ios/chrome/browser/ui/payments/credit_card_edit_mediator.mm
@@ -9,6 +9,7 @@ #include "components/autofill/core/browser/autofill_profile.h" #include "components/autofill/core/browser/credit_card.h" #include "components/autofill/core/browser/personal_data_manager.h" +#include "components/autofill/core/browser/validation.h" #import "components/autofill/ios/browser/credit_card_util.h" #include "components/payments/core/payment_request_data_util.h" #include "components/payments/core/strings_util.h" @@ -104,9 +105,14 @@ #pragma mark - PaymentRequestEditViewControllerDataSource - (NSString*)title { - // TODO(crbug.com/602666): Title varies depending on the missing fields. - return _creditCard ? l10n_util::GetNSString(IDS_PAYMENTS_EDIT_CARD) - : l10n_util::GetNSString(IDS_PAYMENTS_ADD_CARD_LABEL); + if (!self.creditCard) + return l10n_util::GetNSString(IDS_PAYMENTS_ADD_CARD_LABEL); + + const autofill::CreditCardCompletionStatus status = + autofill::GetCompletionStatusForCard( + *self.creditCard, self.paymentRequest->GetApplicationLocale(), + self.paymentRequest->billing_profiles()); + return base::SysUTF16ToNSString(autofill::GetEditDialogTitleForCard(status)); } - (CollectionViewItem*)headerItem {
diff --git a/ios/chrome/browser/ui/payments/credit_card_edit_mediator_unittest.mm b/ios/chrome/browser/ui/payments/credit_card_edit_mediator_unittest.mm new file mode 100644 index 0000000..96bbcc3 --- /dev/null +++ b/ios/chrome/browser/ui/payments/credit_card_edit_mediator_unittest.mm
@@ -0,0 +1,73 @@ +// 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. + +#import "ios/chrome/browser/ui/payments/credit_card_edit_mediator.h" + +#include "components/autofill/core/browser/autofill_test_utils.h" +#include "components/strings/grit/components_strings.h" +#import "ios/chrome/browser/ui/payments/payment_request_unittest_base.h" +#include "testing/platform_test.h" +#include "third_party/ocmock/gtest_support.h" +#include "ui/base/l10n/l10n_util.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +class PaymentRequestCreditCardEditMediatorTest + : public PaymentRequestUnitTestBase, + public PlatformTest { + protected: + void SetUp() override { + PaymentRequestUnitTestBase::SetUp(); + AddAutofillProfile(autofill::test::GetFullProfile()); + CreateTestPaymentRequest(); + } + + void TearDown() override { PaymentRequestUnitTestBase::TearDown(); } +}; + +// Tests that the editor's title is correct in various situations. +TEST_F(PaymentRequestCreditCardEditMediatorTest, Title) { + // No card, so the title should ask to add a card. + CreditCardEditViewControllerMediator* mediator = + [[CreditCardEditViewControllerMediator alloc] + initWithPaymentRequest:payment_request() + creditCard:nil]; + EXPECT_TRUE([mediator.title + isEqualToString:l10n_util::GetNSString(IDS_PAYMENTS_ADD_CARD_LABEL)]); + + const autofill::AutofillProfile& billing_address = *profiles()[0]; + + // Complete card, to title should prompt to edit the card. + autofill::CreditCard credit_card = autofill::test::GetCreditCard(); + autofill::test::SetCreditCardInfo(&credit_card, nullptr, nullptr, nullptr, + nullptr, billing_address.guid()); + mediator = [[CreditCardEditViewControllerMediator alloc] + initWithPaymentRequest:payment_request() + creditCard:&credit_card]; + EXPECT_TRUE([mediator.title + isEqualToString:l10n_util::GetNSString(IDS_PAYMENTS_EDIT_CARD)]); + + // The card's name is missing, so the title should prompt to add the name. + autofill::test::SetCreditCardInfo(&credit_card, /* name_on_card= */ "", + nullptr, nullptr, nullptr, + billing_address.guid()); + mediator = [[CreditCardEditViewControllerMediator alloc] + initWithPaymentRequest:payment_request() + creditCard:&credit_card]; + EXPECT_TRUE([mediator.title + isEqualToString:l10n_util::GetNSString(IDS_PAYMENTS_ADD_NAME_ON_CARD)]); + + // Billing address is also missing, so the title should be generic. + autofill::test::SetCreditCardInfo(&credit_card, /* name_on_card= */ "", + nullptr, nullptr, nullptr, + /* billing_address_id= */ ""); + mediator = [[CreditCardEditViewControllerMediator alloc] + initWithPaymentRequest:payment_request() + creditCard:&credit_card]; + EXPECT_TRUE( + [mediator.title isEqualToString:l10n_util::GetNSString( + IDS_PAYMENTS_ADD_MORE_INFORMATION)]); +}
diff --git a/ios/chrome/browser/ui/payments/payment_items_display_mediator.mm b/ios/chrome/browser/ui/payments/payment_items_display_mediator.mm index 8c7e081e..c7af79f4 100644 --- a/ios/chrome/browser/ui/payments/payment_items_display_mediator.mm +++ b/ios/chrome/browser/ui/payments/payment_items_display_mediator.mm
@@ -49,7 +49,7 @@ base::SysUTF16ToNSString(_paymentRequest->payment_details().total.label); payments::CurrencyFormatter* currencyFormatter = _paymentRequest->GetOrCreateCurrencyFormatter(); - totalItem.price = SysUTF16ToNSString(l10n_util::GetStringFUTF16( + totalItem.price = base::SysUTF16ToNSString(l10n_util::GetStringFUTF16( IDS_PAYMENT_REQUEST_ORDER_SUMMARY_SHEET_TOTAL_FORMAT, base::UTF8ToUTF16(currencyFormatter->formatted_currency_code()), currencyFormatter->Format(base::UTF16ToASCII( @@ -68,7 +68,7 @@ item.item = base::SysUTF16ToNSString(paymentItem.label); payments::CurrencyFormatter* currencyFormatter = _paymentRequest->GetOrCreateCurrencyFormatter(); - item.price = SysUTF16ToNSString(currencyFormatter->Format( + item.price = base::SysUTF16ToNSString(currencyFormatter->Format( base::UTF16ToASCII(paymentItem.amount.value))); [lineItems addObject:item];
diff --git a/ios/chrome/browser/ui/payments/payment_request_manager.mm b/ios/chrome/browser/ui/payments/payment_request_manager.mm index 36ff598d..dddb360 100644 --- a/ios/chrome/browser/ui/payments/payment_request_manager.mm +++ b/ios/chrome/browser/ui/payments/payment_request_manager.mm
@@ -39,6 +39,8 @@ #include "ios/chrome/browser/autofill/validation_rules_storage_factory.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" #include "ios/chrome/browser/payments/ios_can_make_payment_query_factory.h" +#include "ios/chrome/browser/payments/ios_payment_instrument_launcher.h" +#include "ios/chrome/browser/payments/ios_payment_instrument_launcher_factory.h" #include "ios/chrome/browser/payments/ios_payment_request_cache_factory.h" #include "ios/chrome/browser/payments/origin_security_checker.h" #include "ios/chrome/browser/payments/payment_request.h" @@ -308,12 +310,21 @@ (ProceduralBlockWithBool)callback { DCHECK(_pendingPaymentRequest); _pendingPaymentRequest = nullptr; + [self resetIOSPaymentInstrumentLauncherDelegate]; [self dismissUI]; [_paymentRequestJsManager rejectRequestPromiseWithErrorName:kAbortErrorName errorMessage:errorMessage completionHandler:callback]; } +- (void)resetIOSPaymentInstrumentLauncherDelegate { + payments::IOSPaymentInstrumentLauncher* paymentAppLauncher = + payments::IOSPaymentInstrumentLauncherFactory::GetInstance() + ->GetForBrowserState(_browserState); + DCHECK(paymentAppLauncher); + paymentAppLauncher->set_delegate(nullptr); +} + - (void)close { [self setActiveWebState:nullptr]; } @@ -474,6 +485,30 @@ paymentRequest->request_payer_phone(), paymentRequest->request_payer_name()); + // Log metrics around which payment methods are requested by the merchant. + const GURL kGooglePayUrl("https://google.com/pay"); + const GURL kAndroidPayUrl("https://android.com/pay"); + // Looking for payment methods that are NOT Google-related as well as the + // Google-related ones. + bool requestedMethodGoogle = false; + bool requestedMethodOther = false; + for (const GURL& url_payment_method : + paymentRequest->url_payment_method_identifiers()) { + if (url_payment_method == kGooglePayUrl || + url_payment_method == kAndroidPayUrl) { + requestedMethodGoogle = true; + } else { + requestedMethodOther = true; + } + } + + paymentRequest->journey_logger().SetRequestedPaymentMethodTypes( + /*requested_basic_card=*/!paymentRequest->supported_card_networks() + .empty(), + /*requested_method_google=*/ + requestedMethodGoogle, + /*requested_method_other=*/requestedMethodOther); + UIImage* pageFavicon = nil; web::NavigationItem* navigationItem = _activeWebState->GetNavigationManager()->GetVisibleItem(); @@ -756,12 +791,24 @@ } - (void)paymentInstrument:(payments::IOSPaymentInstrument*)paymentInstrument - launchAppWithUniversalLink:(std::string)universalLink + launchAppWithUniversalLink:(GURL)universalLink instrumentDelegate: (payments::PaymentInstrument::Delegate*)delegate { - // TODO(crbug.com/748556): Implement this function to use a native app's - // universal link to open it from Chrome with several arguments supplied - // from the Payment Request object. + DCHECK(_pendingPaymentRequest); + DCHECK(_activeWebState); + + [_paymentRequestCoordinator setPending:YES]; + [_paymentRequestCoordinator setCancellable:YES]; + + payments::IOSPaymentInstrumentLauncher* paymentAppLauncher = + payments::IOSPaymentInstrumentLauncherFactory::GetInstance() + ->GetForBrowserState(_browserState); + DCHECK(paymentAppLauncher); + if (!paymentAppLauncher->LaunchIOSPaymentInstrument( + _pendingPaymentRequest, _activeWebState, universalLink, delegate)) { + [_paymentRequestCoordinator setPending:NO]; + [_paymentRequestCoordinator setCancellable:YES]; + } } #pragma mark - PaymentRequestCoordinatorDelegate methods @@ -840,6 +887,11 @@ [_paymentRequestCoordinator setCancellable:NO]; } +- (void)paymentResponseHelperDidFailToReceivePaymentMethodDetails { + [_paymentRequestCoordinator setPending:NO]; + [_paymentRequestCoordinator setCancellable:YES]; +} + - (void)paymentResponseHelperDidCompleteWithPaymentResponse: (const web::PaymentResponse&)paymentResponse { [_paymentRequestJsManager @@ -859,6 +911,7 @@ _pendingPaymentRequest->journey_logger().SetAborted( payments::JourneyLogger::ABORT_REASON_MERCHANT_NAVIGATION); _pendingPaymentRequest = nullptr; + [self resetIOSPaymentInstrumentLauncherDelegate]; } [self dismissUI];
diff --git a/ios/chrome/browser/ui/payments/payment_request_mediator.mm b/ios/chrome/browser/ui/payments/payment_request_mediator.mm index c4dbfb6..960b4e3e 100644 --- a/ios/chrome/browser/ui/payments/payment_request_mediator.mm +++ b/ios/chrome/browser/ui/payments/payment_request_mediator.mm
@@ -110,7 +110,7 @@ self.paymentRequest->payment_details().total.label); payments::CurrencyFormatter* currencyFormatter = self.paymentRequest->GetOrCreateCurrencyFormatter(); - item.price = SysUTF16ToNSString(l10n_util::GetStringFUTF16( + item.price = base::SysUTF16ToNSString(l10n_util::GetStringFUTF16( IDS_PAYMENT_REQUEST_ORDER_SUMMARY_SHEET_TOTAL_FORMAT, base::UTF8ToUTF16(currencyFormatter->formatted_currency_code()), currencyFormatter->Format(base::UTF16ToASCII( @@ -144,7 +144,7 @@ } CollectionViewDetailItem* item = [[CollectionViewDetailItem alloc] init]; - item.text = SysUTF16ToNSString( + item.text = base::SysUTF16ToNSString( GetShippingAddressSectionString(self.paymentRequest->shipping_type())); if (self.paymentRequest->shipping_profiles().empty()) { item.detailText = [l10n_util::GetNSString(IDS_ADD) @@ -163,7 +163,7 @@ item.text = base::SysUTF16ToNSString(option->label); payments::CurrencyFormatter* currencyFormatter = self.paymentRequest->GetOrCreateCurrencyFormatter(); - item.detailText = SysUTF16ToNSString( + item.detailText = base::SysUTF16ToNSString( currencyFormatter->Format(base::UTF16ToASCII(option->amount.value))); item.accessoryType = MDCCollectionViewCellAccessoryDisclosureIndicator; return item;
diff --git a/ios/chrome/browser/ui/payments/shipping_option_selection_mediator.mm b/ios/chrome/browser/ui/payments/shipping_option_selection_mediator.mm index cd59363..46e80af 100644 --- a/ios/chrome/browser/ui/payments/shipping_option_selection_mediator.mm +++ b/ios/chrome/browser/ui/payments/shipping_option_selection_mediator.mm
@@ -101,7 +101,7 @@ item.text = base::SysUTF16ToNSString(shippingOption->label); payments::CurrencyFormatter* currencyFormatter = _paymentRequest->GetOrCreateCurrencyFormatter(); - item.detailText = SysUTF16ToNSString(currencyFormatter->Format( + item.detailText = base::SysUTF16ToNSString(currencyFormatter->Format( base::UTF16ToASCII(shippingOption->amount.value))); if (_paymentRequest->selected_shipping_option() == shippingOption) _selectedItemIndex = index;
diff --git a/ios/chrome/browser/ui/product_tour/OWNERS b/ios/chrome/browser/ui/product_tour/OWNERS index 48efb49e..bd85dcf2 100644 --- a/ios/chrome/browser/ui/product_tour/OWNERS +++ b/ios/chrome/browser/ui/product_tour/OWNERS
@@ -1 +1,4 @@ kkhorimoto@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/promos/OWNERS b/ios/chrome/browser/ui/promos/OWNERS index f49ed38..01e8c98 100644 --- a/ios/chrome/browser/ui/promos/OWNERS +++ b/ios/chrome/browser/ui/promos/OWNERS
@@ -1 +1,4 @@ marq@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/qr_scanner/OWNERS b/ios/chrome/browser/ui/qr_scanner/OWNERS index d2e1add..c85e66a 100644 --- a/ios/chrome/browser/ui/qr_scanner/OWNERS +++ b/ios/chrome/browser/ui/qr_scanner/OWNERS
@@ -1 +1,4 @@ jif@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/reader_mode/OWNERS b/ios/chrome/browser/ui/reader_mode/OWNERS index bf1620f..ab525656 100644 --- a/ios/chrome/browser/ui/reader_mode/OWNERS +++ b/ios/chrome/browser/ui/reader_mode/OWNERS
@@ -1 +1,4 @@ noyau@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/reading_list/OWNERS b/ios/chrome/browser/ui/reading_list/OWNERS index ad2440ad..8f4d804 100644 --- a/ios/chrome/browser/ui/reading_list/OWNERS +++ b/ios/chrome/browser/ui/reading_list/OWNERS
@@ -4,3 +4,6 @@ per-file *badge_view*=edchin@chromium.org per-file *badge_view*=gchatz@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/sad_tab/OWNERS b/ios/chrome/browser/ui/sad_tab/OWNERS index 48efb49e..bd85dcf2 100644 --- a/ios/chrome/browser/ui/sad_tab/OWNERS +++ b/ios/chrome/browser/ui/sad_tab/OWNERS
@@ -1 +1,4 @@ kkhorimoto@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/settings/BUILD.gn b/ios/chrome/browser/ui/settings/BUILD.gn index 96bcdce..bb4f70b 100644 --- a/ios/chrome/browser/ui/settings/BUILD.gn +++ b/ios/chrome/browser/ui/settings/BUILD.gn
@@ -350,7 +350,6 @@ "//ios/chrome/browser/search_engines", "//ios/chrome/browser/signin", "//ios/chrome/browser/ui:ui_internal", - "//ios/chrome/browser/ui/authentication:authentication_ui", "//ios/chrome/browser/ui/settings:test_support", "//ios/chrome/browser/ui/tools_menu", "//ios/chrome/browser/ui/util:util",
diff --git a/ios/chrome/browser/ui/settings/OWNERS b/ios/chrome/browser/ui/settings/OWNERS index ccddf8d..126713c7 100644 --- a/ios/chrome/browser/ui/settings/OWNERS +++ b/ios/chrome/browser/ui/settings/OWNERS
@@ -1,2 +1,5 @@ lpromero@chromium.org sdefresne@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/settings/accounts_collection_egtest.mm b/ios/chrome/browser/ui/settings/accounts_collection_egtest.mm index 432b587a..9efe103 100644 --- a/ios/chrome/browser/ui/settings/accounts_collection_egtest.mm +++ b/ios/chrome/browser/ui/settings/accounts_collection_egtest.mm
@@ -9,7 +9,6 @@ #include "components/signin/core/browser/signin_manager.h" #include "components/strings/grit/components_strings.h" #include "ios/chrome/browser/signin/signin_manager_factory.h" -#import "ios/chrome/browser/ui/settings/accounts_collection_view_controller.h" #include "ios/chrome/browser/ui/tools_menu/tools_menu_constants.h" #import "ios/chrome/browser/ui/tools_menu/tools_popup_controller.h" #include "ios/chrome/grit/ios_strings.h" @@ -32,7 +31,6 @@ using chrome_test_util::SettingsAccountButton; using chrome_test_util::SignOutAccountsButton; using chrome_test_util::SignInMenuButton; -using chrome_test_util::SignInPromoView; namespace { @@ -122,7 +120,7 @@ ios::FakeChromeIdentityService::GetInstanceFromChromeProvider() ->ForgetIdentity(identity, nil); - [[EarlGrey selectElementWithMatcher:SignInPromoView()] + [[EarlGrey selectElementWithMatcher:SignInMenuButton()] assertWithMatcher:grey_sufficientlyVisible()]; AssertAuthenticatedIdentityInActiveProfile(nil); @@ -152,7 +150,7 @@ ios::FakeChromeIdentityService::GetInstanceFromChromeProvider() ->ForgetIdentity(identity, nil); - [[EarlGrey selectElementWithMatcher:SignInPromoView()] + [[EarlGrey selectElementWithMatcher:SignInMenuButton()] assertWithMatcher:grey_sufficientlyVisible()]; AssertAuthenticatedIdentityInActiveProfile(nil); @@ -266,7 +264,7 @@ performAction:grey_tap()]; // Check that the user is signed out and the Main Settings screen is shown. - [[EarlGrey selectElementWithMatcher:SignInPromoView()] + [[EarlGrey selectElementWithMatcher:SignInMenuButton()] assertWithMatcher:grey_sufficientlyVisible()]; AssertAuthenticatedIdentityInActiveProfile(nil); @@ -300,7 +298,8 @@ performAction:grey_tap()]; // Check that Account Settings screen is open and |identity| is signed in. - [[EarlGrey selectElementWithMatcher:grey_accessibilityID(kSettingsAccountsId)] + [[EarlGrey selectElementWithMatcher:chrome_test_util:: + SettingsAccountsCollectionView()] assertWithMatcher:grey_sufficientlyVisible()]; AssertAuthenticatedIdentityInActiveProfile(identity);
diff --git a/ios/chrome/browser/ui/settings/settings_egtest.mm b/ios/chrome/browser/ui/settings/settings_egtest.mm index 6d5ae00..2f1a430ac 100644 --- a/ios/chrome/browser/ui/settings/settings_egtest.mm +++ b/ios/chrome/browser/ui/settings/settings_egtest.mm
@@ -21,7 +21,6 @@ #include "ios/chrome/browser/browser_state/chrome_browser_state.h" #include "ios/chrome/browser/content_settings/host_content_settings_map_factory.h" #include "ios/chrome/browser/pref_names.h" -#import "ios/chrome/browser/ui/authentication/signin_promo_view.h" #import "ios/chrome/browser/ui/browser_view_controller.h" #import "ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller.h" #import "ios/chrome/browser/ui/settings/settings_collection_view_controller.h" @@ -777,9 +776,8 @@ @"Settings should register key commands when presented."); // Present the Sign-in UI. - id<GREYMatcher> matcher = - grey_allOf(grey_accessibilityID(kSigninPromoPrimaryButtonId), - grey_sufficientlyVisible(), nil); + id<GREYMatcher> matcher = grey_allOf(chrome_test_util::SignInMenuButton(), + grey_sufficientlyVisible(), nil); [[EarlGrey selectElementWithMatcher:matcher] performAction:grey_tap()]; // Wait for UI to finish loading the Sign-in screen. [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
diff --git a/ios/chrome/browser/ui/side_swipe/OWNERS b/ios/chrome/browser/ui/side_swipe/OWNERS index 330cb31..867f7564 100644 --- a/ios/chrome/browser/ui/side_swipe/OWNERS +++ b/ios/chrome/browser/ui/side_swipe/OWNERS
@@ -1 +1,4 @@ justincohen@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/stack_view/OWNERS b/ios/chrome/browser/ui/stack_view/OWNERS index 48efb49e..bd85dcf2 100644 --- a/ios/chrome/browser/ui/stack_view/OWNERS +++ b/ios/chrome/browser/ui/stack_view/OWNERS
@@ -1 +1,4 @@ kkhorimoto@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/sync/BUILD.gn b/ios/chrome/browser/ui/sync/BUILD.gn index de187ce..164c8669 100644 --- a/ios/chrome/browser/ui/sync/BUILD.gn +++ b/ios/chrome/browser/ui/sync/BUILD.gn
@@ -52,7 +52,6 @@ "//ios/chrome/browser/bookmarks:bookmarks_utils", "//ios/chrome/browser/signin", "//ios/chrome/browser/sync", - "//ios/chrome/browser/ui/authentication:authentication_ui", "//ios/chrome/browser/ui/settings", "//ios/chrome/browser/ui/tools_menu", "//ios/chrome/test/app:test_support",
diff --git a/ios/chrome/browser/ui/sync/OWNERS b/ios/chrome/browser/ui/sync/OWNERS index 3431e1a..3f08195 100644 --- a/ios/chrome/browser/ui/sync/OWNERS +++ b/ios/chrome/browser/ui/sync/OWNERS
@@ -1,3 +1,6 @@ msarda@chromium.org # COMPONENT: Services>Sync + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/sync/sync_fake_server_egtest.mm b/ios/chrome/browser/ui/sync/sync_fake_server_egtest.mm index 278d2c5..0c0f325e 100644 --- a/ios/chrome/browser/ui/sync/sync_fake_server_egtest.mm +++ b/ios/chrome/browser/ui/sync/sync_fake_server_egtest.mm
@@ -16,7 +16,6 @@ #include "ios/chrome/browser/signin/authentication_service.h" #include "ios/chrome/browser/signin/authentication_service_factory.h" #include "ios/chrome/browser/sync/ios_chrome_profile_sync_service_factory.h" -#import "ios/chrome/browser/ui/authentication/signin_promo_view.h" #import "ios/chrome/browser/ui/settings/settings_collection_view_controller.h" #include "ios/chrome/browser/ui/tools_menu/tools_menu_constants.h" #import "ios/chrome/browser/ui/tools_menu/tools_popup_controller.h"
diff --git a/ios/chrome/browser/ui/tab_switcher/OWNERS b/ios/chrome/browser/ui/tab_switcher/OWNERS index f16c1db1..e2b64c4 100644 --- a/ios/chrome/browser/ui/tab_switcher/OWNERS +++ b/ios/chrome/browser/ui/tab_switcher/OWNERS
@@ -1,2 +1,5 @@ edchin@chromium.org jif@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_switcher_panel_controller.mm b/ios/chrome/browser/ui/tab_switcher/tab_switcher_panel_controller.mm index a2cd683..2be9016 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_switcher_panel_controller.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_switcher_panel_controller.mm
@@ -244,7 +244,7 @@ << " _distantSession->tabs.size() == " << distantSessionTabCount; synced_sessions::DistantTab* tab = _distantSession->tabs[tabIndex].get(); CHECK(tab); - [panelCell setTitle:SysUTF16ToNSString(tab->title)]; + [panelCell setTitle:base::SysUTF16ToNSString(tab->title)]; [panelCell setSessionGURL:tab->virtual_url withBrowserState:[_model browserState]]; [panelCell setDelegate:self];
diff --git a/ios/chrome/browser/ui/tabs/OWNERS b/ios/chrome/browser/ui/tabs/OWNERS index 40a68c7..b127701 100644 --- a/ios/chrome/browser/ui/tabs/OWNERS +++ b/ios/chrome/browser/ui/tabs/OWNERS
@@ -1 +1,4 @@ rohitrao@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/toolbar/OWNERS b/ios/chrome/browser/ui/toolbar/OWNERS index 3306281..9b78e8b 100644 --- a/ios/chrome/browser/ui/toolbar/OWNERS +++ b/ios/chrome/browser/ui/toolbar/OWNERS
@@ -1,2 +1,5 @@ rohitrao@chromium.org justincohen@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/toolbar/keyboard_assist/OWNERS b/ios/chrome/browser/ui/toolbar/keyboard_assist/OWNERS index d2e1add..c85e66a 100644 --- a/ios/chrome/browser/ui/toolbar/keyboard_assist/OWNERS +++ b/ios/chrome/browser/ui/toolbar/keyboard_assist/OWNERS
@@ -1 +1,4 @@ jif@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/toolbar/toolbar_controller.h b/ios/chrome/browser/ui/toolbar/toolbar_controller.h index 01b2b6f..412e40a 100644 --- a/ios/chrome/browser/ui/toolbar/toolbar_controller.h +++ b/ios/chrome/browser/ui/toolbar/toolbar_controller.h
@@ -294,6 +294,9 @@ // Shows/hides iPhone toolbar views for when the new tab page is displayed. - (void)hideViewsForNewTabPage:(BOOL)hide; +// Triggers an animation on the tools menu button to draw the user's attention. +- (void)triggerToolsMenuButtonAnimation; + @end #endif // IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/toolbar/toolbar_controller.mm b/ios/chrome/browser/ui/toolbar/toolbar_controller.mm index 5fbf638a9..ba069b311 100644 --- a/ios/chrome/browser/ui/toolbar/toolbar_controller.mm +++ b/ios/chrome/browser/ui/toolbar/toolbar_controller.mm
@@ -1040,6 +1040,10 @@ return hash; } +- (void)triggerToolsMenuButtonAnimation { + [toolsMenuButton_ triggerAnimation]; +} + #pragma mark - #pragma mark PopupMenuDelegate methods.
diff --git a/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm b/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm index bd0d13e..519caa69 100644 --- a/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm +++ b/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm
@@ -173,6 +173,12 @@ EARL_GREY_TEST_SKIPPED(@"Test not support on iPhone"); } + // TODO(crbug.com/753098): Re-enable this test on iOS 11 iPad once + // grey_typeText works on iOS 11. + if (base::ios::IsRunningOnIOS11OrLater()) { + EARL_GREY_TEST_DISABLED(@"Test disabled on iOS 11."); + } + const GURL URL = web::test::HttpServer::MakeUrl("http://origin"); [ChromeEarlGrey loadURL:URL]; @@ -282,11 +288,11 @@ EARL_GREY_TEST_DISABLED(@"Disabled on iOS 9."); } - // TODO(crbug.com/747622): re-enable this test on iOS 11 once earl grey can - // interact with the share menu. - if (base::ios::IsRunningOnIOS11OrLater()) { - EARL_GREY_TEST_DISABLED(@"Disabled on iOS 11."); - } + // Clear generalPasteboard before and after the test. + [UIPasteboard generalPasteboard].string = @""; + [self setTearDownHandler:^{ + [UIPasteboard generalPasteboard].string = @""; + }]; std::map<GURL, std::string> responses; const GURL URL = web::test::HttpServer::MakeUrl("http://testPage"); @@ -297,11 +303,25 @@ [[EarlGrey selectElementWithMatcher:chrome_test_util::Omnibox()] assertWithMatcher:chrome_test_util::OmniboxText(URL.GetContent())]; - [ChromeEarlGreyUI openShareMenu]; - - [[EarlGrey - selectElementWithMatcher:chrome_test_util::ButtonWithAccessibilityLabel( - @"Copy")] performAction:grey_tap()]; + if (base::ios::IsRunningOnIOS11OrLater()) { + // Can't access share menu from xctest on iOS 11+, so use the text field + // callout bar instead. + [[EarlGrey selectElementWithMatcher:chrome_test_util::Omnibox()] + performAction:grey_longPress()]; + [[[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(@"Select All")] + inRoot:grey_kindOfClass(NSClassFromString(@"UICalloutBarButton"))] + performAction:grey_tap()]; + [[[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(@"Copy")] + inRoot:grey_kindOfClass(NSClassFromString(@"UICalloutBarButton"))] + performAction:grey_tap()]; + [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Typing Shield")] + performAction:grey_tap()]; + } else { + [ChromeEarlGreyUI openShareMenu]; + [[EarlGrey + selectElementWithMatcher:chrome_test_util::ButtonWithAccessibilityLabel( + @"Copy")] performAction:grey_tap()]; + } [ChromeEarlGrey loadURL:secondURL]; @@ -320,6 +340,12 @@ // Verifies that the clear text button clears any text in the omnibox. - (void)testOmniboxClearTextButton { + // TODO(crbug.com/753098): Re-enable this test on iOS 11 iPad once + // grey_typeText works on iOS 11. + if (base::ios::IsRunningOnIOS11OrLater() && IsIPadIdiom()) { + EARL_GREY_TEST_DISABLED(@"Test disabled on iOS 11."); + } + const GURL URL = web::test::HttpServer::MakeUrl("http://origin"); [ChromeEarlGrey loadURL:URL];
diff --git a/ios/chrome/browser/ui/tools_menu/OWNERS b/ios/chrome/browser/ui/tools_menu/OWNERS index 67c824d2..403665e 100644 --- a/ios/chrome/browser/ui/tools_menu/OWNERS +++ b/ios/chrome/browser/ui/tools_menu/OWNERS
@@ -1,2 +1,5 @@ rohitrao@chromium.org jif@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/tools_menu/tools_menu_configuration.h b/ios/chrome/browser/ui/tools_menu/tools_menu_configuration.h index 66e1049..41aaaa8 100644 --- a/ios/chrome/browser/ui/tools_menu/tools_menu_configuration.h +++ b/ios/chrome/browser/ui/tools_menu/tools_menu_configuration.h
@@ -32,6 +32,8 @@ @property(nonatomic, getter=isInNewTabPage) BOOL inNewTabPage; // Indicates that the menu should show a "NEW" badge on the reading list item. @property(nonatomic, assign) BOOL showReadingListNewBadge; +// Indicates that the New Incognito Tab cell should be highlighted in blue. +@property(nonatomic, assign) BOOL highlightNewIncognitoTabCell; // Indicates that the menu is being shown while user agent is |userAgentType|. // If NONE, shows "Request Desktop Site" in disabled state.
diff --git a/ios/chrome/browser/ui/tools_menu/tools_menu_configuration.mm b/ios/chrome/browser/ui/tools_menu/tools_menu_configuration.mm index 441b491..fdd6309 100644 --- a/ios/chrome/browser/ui/tools_menu/tools_menu_configuration.mm +++ b/ios/chrome/browser/ui/tools_menu/tools_menu_configuration.mm
@@ -18,6 +18,7 @@ @synthesize noOpenedTabs = _noOpenedTabs; @synthesize inIncognito = _inIncognito; @synthesize showReadingListNewBadge = _showReadingListNewBadge; +@synthesize highlightNewIncognitoTabCell = _highlightNewIncognitoTabCell; @synthesize userAgentType = _userAgentType; @synthesize requestStartTime = _requestStartTime; @synthesize inNewTabPage = _inNewTabPage;
diff --git a/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.h b/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.h index 8e7ff99..fbd9762 100644 --- a/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.h +++ b/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.h
@@ -98,6 +98,10 @@ - (void)hideContent; +// Highlight the New Incognito Tab cell in blue. The highlight fades in, pulses +// once, and fades out. +- (void)triggerNewIncognitoTabCellHighlight; + @end #endif // IOS_CHROME_BROWSER_UI_TOOLS_MENU_TOOLS_MENU_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.mm b/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.mm index 920ff87..0a2db26 100644 --- a/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.mm +++ b/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.mm
@@ -15,6 +15,7 @@ #include "components/strings/grit/components_strings.h" #include "ios/chrome/browser/experimental_flags.h" #import "ios/chrome/browser/ui/animation_util.h" +#import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h" #import "ios/chrome/browser/ui/commands/UIKit+ChromeExecuteCommand.h" #import "ios/chrome/browser/ui/commands/browser_commands.h" #include "ios/chrome/browser/ui/commands/ios_command_ids.h" @@ -120,6 +121,9 @@ // Determines if the reading list should display a new feature badge. Defaults // to |NO|. @property(nonatomic, assign) BOOL showReadingListNewBadge; +// Indicates whether the New Incognito Tab cell should be highlighted. Defaults +// to |NO|. +@property(nonatomic, assign) BOOL highlightNewIncognitoTabCell; // Tracks events for the purpose of in-product help. Does not take ownership of // tracker. Tracker must not be destroyed during lifetime of // ToolsMenuViewController. Defaults to |NULL|. @@ -139,6 +143,7 @@ @implementation ToolsMenuViewController @synthesize showReadingListNewBadge = _showReadingListNewBadge; +@synthesize highlightNewIncognitoTabCell = _highlightNewIncognitoTabCell; @synthesize engagementTracker = _engagementTracker; @synthesize menuView = _menuView; @synthesize isCurrentPageBookmarked = _isCurrentPageBookmarked; @@ -232,6 +237,8 @@ self.requestStartTime = configuration.requestStartTime; self.showReadingListNewBadge = configuration.showReadingListNewBadge; self.engagementTracker = configuration.engagementTracker; + self.highlightNewIncognitoTabCell = + configuration.highlightNewIncognitoTabCell; if (configuration.readingListMenuNotifier) { _readingListMenuNotifier = configuration.readingListMenuNotifier; @@ -473,6 +480,9 @@ [[self readingListCell] updateSeenState:_readingListMenuNotifier.readingListUnseenItemsExist animated:YES]; + if (self.highlightNewIncognitoTabCell) { + [self triggerNewIncognitoTabCellHighlight]; + } } - (void)hideContent { @@ -678,4 +688,33 @@ [[self readingListCell] updateSeenState:unseenItemsExist animated:YES]; } +#pragma mark - New Incognito Tab in-product help promotion + +- (void)triggerNewIncognitoTabCellHighlight { + for (ToolsMenuViewCell* visibleCell in [_menuView visibleCells]) { + if ([visibleCell.accessibilityIdentifier + isEqualToString:kToolsMenuNewIncognitoTabId]) { + // Set the label's background color to be clear so that the highlight is + // is not covered by the label. + visibleCell.title.backgroundColor = [UIColor clearColor]; + [UIView animateWithDuration:ios::material::kDuration5 + delay:0.0 + options:UIViewAnimationOptionAllowUserInteraction | + UIViewAnimationOptionRepeat | + UIViewAnimationOptionAutoreverse | + UIViewAnimationOptionCurveEaseInOut + animations:^{ + [UIView setAnimationRepeatCount:2]; + visibleCell.contentView.backgroundColor = + [[MDCPalette cr_bluePalette] tint100]; + } + completion:^(BOOL finished) { + visibleCell.contentView.backgroundColor = [UIColor whiteColor]; + }]; + self.highlightNewIncognitoTabCell = NO; + break; + } + } +} + @end
diff --git a/ios/chrome/browser/ui/tools_menu/tools_popup_menu_egtest.mm b/ios/chrome/browser/ui/tools_menu/tools_popup_menu_egtest.mm index ba37230..5c655c4 100644 --- a/ios/chrome/browser/ui/tools_menu/tools_popup_menu_egtest.mm +++ b/ios/chrome/browser/ui/tools_menu/tools_popup_menu_egtest.mm
@@ -53,8 +53,7 @@ performAction:grey_tap()]; } - [[EarlGrey - selectElementWithMatcher:grey_accessibilityID(kToolsMenuTableViewId)] + [[EarlGrey selectElementWithMatcher:chrome_test_util::ToolsMenuView()] assertWithMatcher:grey_notVisible()]; }
diff --git a/ios/chrome/browser/ui/util/OWNERS b/ios/chrome/browser/ui/util/OWNERS index 1f7a7b8..37eb1aa3 100644 --- a/ios/chrome/browser/ui/util/OWNERS +++ b/ios/chrome/browser/ui/util/OWNERS
@@ -1,2 +1,5 @@ kkhorimoto@chromium.org marq@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/voice/OWNERS b/ios/chrome/browser/ui/voice/OWNERS index 48efb49e..bd85dcf2 100644 --- a/ios/chrome/browser/ui/voice/OWNERS +++ b/ios/chrome/browser/ui/voice/OWNERS
@@ -1 +1,4 @@ kkhorimoto@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/webui/OWNERS b/ios/chrome/browser/ui/webui/OWNERS index be9def2..11231a36 100644 --- a/ios/chrome/browser/ui/webui/OWNERS +++ b/ios/chrome/browser/ui/webui/OWNERS
@@ -3,3 +3,6 @@ per-file ntp_tiles_internals_ui.*=file://components/ntp_tiles/OWNERS per-file popular_sites_internals_ui.*=file://components/ntp_tiles/OWNERS + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/webui/gcm/OWNERS b/ios/chrome/browser/ui/webui/gcm/OWNERS index 295d996..2271273 100644 --- a/ios/chrome/browser/ui/webui/gcm/OWNERS +++ b/ios/chrome/browser/ui/webui/gcm/OWNERS
@@ -4,3 +4,6 @@ zea@chromium.org # COMPONENT: Services>CloudMessaging + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/webui/net_export/OWNERS b/ios/chrome/browser/ui/webui/net_export/OWNERS index be796293..3d058981 100644 --- a/ios/chrome/browser/ui/webui/net_export/OWNERS +++ b/ios/chrome/browser/ui/webui/net_export/OWNERS
@@ -1,3 +1,6 @@ file://net/OWNERS # COMPONENT: Internals>Network>Logging + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/webui/sync_internals/OWNERS b/ios/chrome/browser/ui/webui/sync_internals/OWNERS index 261ab18..c1575f5 100644 --- a/ios/chrome/browser/ui/webui/sync_internals/OWNERS +++ b/ios/chrome/browser/ui/webui/sync_internals/OWNERS
@@ -1 +1,4 @@ file://components/sync/OWNERS + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/update_client/OWNERS b/ios/chrome/browser/update_client/OWNERS index 75e2f4d..8d0e8658 100644 --- a/ios/chrome/browser/update_client/OWNERS +++ b/ios/chrome/browser/update_client/OWNERS
@@ -4,3 +4,6 @@ waffles@chromium.org # COMPONENT: Internals>Installer>Components + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/voice/OWNERS b/ios/chrome/browser/voice/OWNERS index cc50037..2f0d436 100644 --- a/ios/chrome/browser/voice/OWNERS +++ b/ios/chrome/browser/voice/OWNERS
@@ -1,2 +1,5 @@ kkhorimoto@chromium.org rohitrao@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/web/OWNERS b/ios/chrome/browser/web/OWNERS index 5a2923e..1a6c73c5 100644 --- a/ios/chrome/browser/web/OWNERS +++ b/ios/chrome/browser/web/OWNERS
@@ -1,2 +1,5 @@ eugenebut@chromium.org # This directory needs to be carved into subdirs with more specific OWNERS. + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/web/resources/OWNERS b/ios/chrome/browser/web/resources/OWNERS index da255e6..7b2fb33 100644 --- a/ios/chrome/browser/web/resources/OWNERS +++ b/ios/chrome/browser/web/resources/OWNERS
@@ -1 +1,4 @@ per-file payment_request.js=mahmadi@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/web/sad_tab_tab_helper_unittest.mm b/ios/chrome/browser/web/sad_tab_tab_helper_unittest.mm index 487e670..fc30ccd3 100644 --- a/ios/chrome/browser/web/sad_tab_tab_helper_unittest.mm +++ b/ios/chrome/browser/web/sad_tab_tab_helper_unittest.mm
@@ -39,6 +39,7 @@ // Tests that SadTab is not presented for not shown web states. TEST_F(SadTabTabHelperTest, NotPresented) { OCMStub([application_ applicationState]).andReturn(UIApplicationStateActive); + web_state_.WasHidden(); // WebState should not have presented a transient content view. EXPECT_FALSE(web_state_.GetTransientContentView());
diff --git a/ios/chrome/browser/web_resource/OWNERS b/ios/chrome/browser/web_resource/OWNERS index 50c6bcd4..16d5d98c 100644 --- a/ios/chrome/browser/web_resource/OWNERS +++ b/ios/chrome/browser/web_resource/OWNERS
@@ -1,2 +1,5 @@ achuith@chromium.org rsesek@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/web_state_list/OWNERS b/ios/chrome/browser/web_state_list/OWNERS index c5cd5cb..39066e1 100644 --- a/ios/chrome/browser/web_state_list/OWNERS +++ b/ios/chrome/browser/web_state_list/OWNERS
@@ -1 +1,4 @@ sdefresne@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/common/physical_web/OWNERS b/ios/chrome/common/physical_web/OWNERS index 3ebff38d..56360bb 100644 --- a/ios/chrome/common/physical_web/OWNERS +++ b/ios/chrome/common/physical_web/OWNERS
@@ -1 +1,4 @@ olivierrobin@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/content_widget_extension/OWNERS b/ios/chrome/content_widget_extension/OWNERS index 55fb7e49..2b72d62 100644 --- a/ios/chrome/content_widget_extension/OWNERS +++ b/ios/chrome/content_widget_extension/OWNERS
@@ -1 +1,3 @@ -lod@chromium.org \ No newline at end of file +lod@chromium.org +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/search_widget_extension/OWNERS b/ios/chrome/search_widget_extension/OWNERS index 55fb7e49..2b72d62 100644 --- a/ios/chrome/search_widget_extension/OWNERS +++ b/ios/chrome/search_widget_extension/OWNERS
@@ -1 +1,3 @@ -lod@chromium.org \ No newline at end of file +lod@chromium.org +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/share_extension/OWNERS b/ios/chrome/share_extension/OWNERS index 3ebff38d..56360bb 100644 --- a/ios/chrome/share_extension/OWNERS +++ b/ios/chrome/share_extension/OWNERS
@@ -1 +1,4 @@ olivierrobin@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/test/BUILD.gn b/ios/chrome/test/BUILD.gn index 7a7cbe32..cce1532 100644 --- a/ios/chrome/test/BUILD.gn +++ b/ios/chrome/test/BUILD.gn
@@ -166,6 +166,7 @@ "//ios/chrome/browser/ui/autofill/cells:unit_tests", "//ios/chrome/browser/ui/bookmarks:unit_tests", "//ios/chrome/browser/ui/bookmarks/cells:unit_tests", + "//ios/chrome/browser/ui/browser_list:unit_tests", "//ios/chrome/browser/ui/bubble:unit_tests", "//ios/chrome/browser/ui/collection_view:unit_tests", "//ios/chrome/browser/ui/collection_view/cells:unit_tests", @@ -215,7 +216,6 @@ "//ios/chrome/search_widget_extension:unit_tests", "//ios/chrome/test/base:unit_tests", "//ios/shared/chrome/browser/ui/broadcaster:unit_tests", - "//ios/shared/chrome/browser/ui/browser_list:unit_tests", "//ios/shared/chrome/browser/ui/commands:unit_tests", "//ios/shared/chrome/browser/ui/coordinators:unit_tests", "//ios/shared/chrome/browser/ui/dialogs:unit_tests",
diff --git a/ios/chrome/test/OWNERS b/ios/chrome/test/OWNERS index 1df316e..6f764fe 100644 --- a/ios/chrome/test/OWNERS +++ b/ios/chrome/test/OWNERS
@@ -1 +1,4 @@ baxley@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/test/app/BUILD.gn b/ios/chrome/test/app/BUILD.gn index bdd90add..c689139e 100644 --- a/ios/chrome/test/app/BUILD.gn +++ b/ios/chrome/test/app/BUILD.gn
@@ -67,7 +67,6 @@ "//ios/chrome/browser/sync", "//ios/chrome/browser/tabs", "//ios/chrome/browser/ui:ui_internal", - "//ios/chrome/browser/ui/authentication:authentication_ui", "//ios/chrome/browser/ui/commands", "//ios/chrome/browser/ui/main", "//ios/chrome/browser/ui/ntp:ntp_controller",
diff --git a/ios/chrome/test/app/signin_test_util.h b/ios/chrome/test/app/signin_test_util.h index b60ada30..1f9fcfa3 100644 --- a/ios/chrome/test/app/signin_test_util.h +++ b/ios/chrome/test/app/signin_test_util.h
@@ -25,10 +25,6 @@ // the accounts were correctly removed from the keychain. bool SignOutAndClearAccounts(); -// Resets Sign-in promo impression preferences for bookmarks and settings view, -// and resets kIosBookmarkPromoAlreadySeen flag for bookmarks. -void ResetSigninPromoPreferences(); - } // namespace chrome_test_util #endif // IOS_CHROME_TEST_APP_SIGNIN_TEST_UTIL_H_
diff --git a/ios/chrome/test/app/signin_test_util.mm b/ios/chrome/test/app/signin_test_util.mm index 096390c..8fc529e4 100644 --- a/ios/chrome/test/app/signin_test_util.mm +++ b/ios/chrome/test/app/signin_test_util.mm
@@ -12,12 +12,10 @@ #include "components/signin/core/common/signin_pref_names.h" #include "google_apis/gaia/gaia_constants.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" -#include "ios/chrome/browser/pref_names.h" #include "ios/chrome/browser/signin/account_tracker_service_factory.h" #import "ios/chrome/browser/signin/authentication_service.h" #include "ios/chrome/browser/signin/authentication_service_factory.h" #include "ios/chrome/browser/signin/gaia_auth_fetcher_ios.h" -#import "ios/chrome/browser/ui/authentication/signin_promo_view.h" #import "ios/chrome/test/app/chrome_test_util.h" #import "ios/public/provider/chrome/browser/chrome_browser_provider.h" #import "ios/public/provider/chrome/browser/signin/fake_chrome_identity_service.h" @@ -174,12 +172,4 @@ return !identity_service->HasIdentities(); } -void ResetSigninPromoPreferences() { - ios::ChromeBrowserState* browser_state = GetOriginalBrowserState(); - PrefService* prefs = browser_state->GetPrefs(); - prefs->SetInteger(prefs::kIosBookmarkSigninPromoDisplayedCount, 0); - prefs->SetBoolean(prefs::kIosBookmarkPromoAlreadySeen, false); - prefs->SetInteger(prefs::kIosSettingsSigninPromoDisplayedCount, 0); -} - } // namespace chrome_test_util
diff --git a/ios/chrome/test/data/OWNERS b/ios/chrome/test/data/OWNERS index 72e8ffc..d03d28b 100644 --- a/ios/chrome/test/data/OWNERS +++ b/ios/chrome/test/data/OWNERS
@@ -1 +1,4 @@ * + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/test/earl_grey/BUILD.gn b/ios/chrome/test/earl_grey/BUILD.gn index ceb5f1e..bee6b5d 100644 --- a/ios/chrome/test/earl_grey/BUILD.gn +++ b/ios/chrome/test/earl_grey/BUILD.gn
@@ -179,12 +179,10 @@ deps = [ "//base", "//base/test:test_support", - "//components/signin/core/common", "//components/strings", "//ios/chrome/app/strings", "//ios/chrome/browser/ui", "//ios/chrome/browser/ui/authentication:authentication", - "//ios/chrome/browser/ui/authentication:authentication_ui", "//ios/chrome/browser/ui/collection_view/cells", "//ios/chrome/browser/ui/commands:commands", "//ios/chrome/browser/ui/omnibox:omnibox_internal",
diff --git a/ios/chrome/test/earl_grey/OWNERS b/ios/chrome/test/earl_grey/OWNERS index 86cd262..b69f0d0 100644 --- a/ios/chrome/test/earl_grey/OWNERS +++ b/ios/chrome/test/earl_grey/OWNERS
@@ -1,2 +1,5 @@ baxley@chromium.org liaoyuke@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/test/earl_grey/chrome_matchers.h b/ios/chrome/test/earl_grey/chrome_matchers.h index 0b4e542..adb7a10 100644 --- a/ios/chrome/test/earl_grey/chrome_matchers.h +++ b/ios/chrome/test/earl_grey/chrome_matchers.h
@@ -101,12 +101,12 @@ // Returns matcher for the settings button in the tools menu. id<GREYMatcher> SettingsMenuButton(); +// Returns matcher for the tools menu table view. +id<GREYMatcher> ToolsMenuView(); + // Returns matcher for the OK button. id<GREYMatcher> OKButton(); -// Returns matcher for the sign-in promo view in the settings menu. -id<GREYMatcher> SignInPromoView(); - // Returns matcher for the signin button in the settings menu. id<GREYMatcher> SignInMenuButton(); @@ -114,6 +114,15 @@ // settings menu. id<GREYMatcher> SettingsAccountButton(); +// Returns matcher for the accounts collection view. +id<GREYMatcher> SettingsAccountsCollectionView(); + +// Returns matcher for the Import Data cell in switch sync account view. +id<GREYMatcher> SettingsImportDataImportButton(); + +// Returns matcher for the Keep Data Separate cell in switch sync account view. +id<GREYMatcher> SettingsImportDataKeepSeparateButton(); + // Returns matcher for the menu button to sync accounts. id<GREYMatcher> AccountsSyncButton();
diff --git a/ios/chrome/test/earl_grey/chrome_matchers.mm b/ios/chrome/test/earl_grey/chrome_matchers.mm index addbce3..618018a1 100644 --- a/ios/chrome/test/earl_grey/chrome_matchers.mm +++ b/ios/chrome/test/earl_grey/chrome_matchers.mm
@@ -12,11 +12,11 @@ #include "base/strings/sys_string_conversions.h" #import "base/test/ios/wait_util.h" #include "components/strings/grit/components_strings.h" -#import "ios/chrome/browser/ui/authentication/signin_promo_view.h" #import "ios/chrome/browser/ui/collection_view/cells/collection_view_switch_item.h" #import "ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.h" #import "ios/chrome/browser/ui/settings/accounts_collection_view_controller.h" #import "ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller.h" +#import "ios/chrome/browser/ui/settings/import_data_collection_view_controller.h" #import "ios/chrome/browser/ui/settings/settings_collection_view_controller.h" #import "ios/chrome/browser/ui/static_content/static_html_view_controller.h" #import "ios/chrome/browser/ui/toolbar/toolbar_controller.h" @@ -190,22 +190,34 @@ return grey_accessibilityID(kToolsMenuSettingsId); } +id<GREYMatcher> ToolsMenuView() { + return grey_accessibilityID(kToolsMenuTableViewId); +} + id<GREYMatcher> OKButton() { return ButtonWithAccessibilityLabelId(IDS_OK); } -id<GREYMatcher> SignInPromoView() { - return grey_accessibilityID(kSigninPromoViewId); -} - id<GREYMatcher> SignInMenuButton() { - return grey_accessibilityID(kSigninPromoSecondaryButtonId); + return grey_accessibilityID(kSettingsSignInCellId); } id<GREYMatcher> SettingsAccountButton() { return grey_accessibilityID(kSettingsAccountCellId); } +id<GREYMatcher> SettingsAccountsCollectionView() { + return grey_accessibilityID(kSettingsAccountsId); +} + +id<GREYMatcher> SettingsImportDataImportButton() { + return grey_accessibilityID(kImportDataImportCellId); +} + +id<GREYMatcher> SettingsImportDataKeepSeparateButton() { + return grey_accessibilityID(kImportDataKeepSeparateCellId); +} + id<GREYMatcher> AccountsSyncButton() { return grey_accessibilityID(kSettingsAccountsSyncCellId); }
diff --git a/ios/chrome/test/earl_grey/chrome_test_case.mm b/ios/chrome/test/earl_grey/chrome_test_case.mm index 4aaf058..6da92b8 100644 --- a/ios/chrome/test/earl_grey/chrome_test_case.mm +++ b/ios/chrome/test/earl_grey/chrome_test_case.mm
@@ -8,10 +8,8 @@ #import <EarlGrey/EarlGrey.h> -#include "base/command_line.h" #include "base/mac/scoped_block.h" #include "base/strings/sys_string_conversions.h" -#include "components/signin/core/common/signin_switches.h" #import "ios/chrome/test/app/chrome_test_util.h" #include "ios/chrome/test/app/settings_test_util.h" #include "ios/chrome/test/app/signin_test_util.h" @@ -165,7 +163,6 @@ _isMockAuthenticationDisabled = NO; _tearDownHandler = nil; - chrome_test_util::ResetSigninPromoPreferences(); chrome_test_util::OpenNewTab(); [[GREYUIThreadExecutor sharedInstance] drainUntilIdle]; } @@ -250,11 +247,6 @@ } + (void)enableMockAuthentication { - // Enable sign-in promo for all tests. - // TODO(crbug.com/739910): Remove this line when the sign-in promo is enabled - // by default. - base::CommandLine::ForCurrentProcess()->AppendSwitch( - switches::kEnableSigninPromo); chrome_test_util::SetUpMockAuthentication(); chrome_test_util::SetUpMockAccountReconcilor(); chrome_test_util::SetUpFakeSyncServer();
diff --git a/ios/chrome/today_extension/OWNERS b/ios/chrome/today_extension/OWNERS index 3ebff38d..56360bb 100644 --- a/ios/chrome/today_extension/OWNERS +++ b/ios/chrome/today_extension/OWNERS
@@ -1 +1,4 @@ olivierrobin@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/clean/OWNERS b/ios/clean/OWNERS index 6d63668..d846ad4fa 100644 --- a/ios/clean/OWNERS +++ b/ios/clean/OWNERS
@@ -1,3 +1,6 @@ edchin@chromium.org lpromero@chromium.org marq@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/clean/chrome/app/steps/BUILD.gn b/ios/clean/chrome/app/steps/BUILD.gn index a9a6b5e..c6640336 100644 --- a/ios/clean/chrome/app/steps/BUILD.gn +++ b/ios/clean/chrome/app/steps/BUILD.gn
@@ -55,11 +55,11 @@ "//ios/chrome/browser/browser_state", "//ios/chrome/browser/browser_state:browser_state_impl", "//ios/chrome/browser/content_settings", + "//ios/chrome/browser/ui/browser_list", "//ios/chrome/browser/web:web_internal", "//ios/chrome/browser/web_state_list", "//ios/clean/chrome/browser/ui/root", "//ios/net", - "//ios/shared/chrome/browser/ui/browser_list", "//ios/shared/chrome/browser/ui/coordinators", "//ios/web:web_arc", ]
diff --git a/ios/clean/chrome/app/steps/root_coordinator+application_step.mm b/ios/clean/chrome/app/steps/root_coordinator+application_step.mm index ac306df..29ce9606 100644 --- a/ios/clean/chrome/app/steps/root_coordinator+application_step.mm +++ b/ios/clean/chrome/app/steps/root_coordinator+application_step.mm
@@ -7,13 +7,13 @@ #include "base/memory/ptr_util.h" #include "base/supports_user_data.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" +#import "ios/chrome/browser/ui/browser_list/browser.h" +#import "ios/chrome/browser/ui/browser_list/browser_list.h" +#import "ios/chrome/browser/ui/browser_list/browser_list_session_service.h" +#import "ios/chrome/browser/ui/browser_list/browser_list_session_service_factory.h" #import "ios/chrome/browser/web_state_list/web_state_list.h" #import "ios/chrome/browser/web_state_list/web_state_opener.h" #import "ios/clean/chrome/app/application_state.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser_list.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser_list_session_service.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_factory.h" #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h" #import "ios/web/public/navigation_manager.h" #include "ios/web/public/web_state/web_state.h"
diff --git a/ios/clean/chrome/app/steps/root_coordinator_initializer.mm b/ios/clean/chrome/app/steps/root_coordinator_initializer.mm index d098a546..0feba6b 100644 --- a/ios/clean/chrome/app/steps/root_coordinator_initializer.mm +++ b/ios/clean/chrome/app/steps/root_coordinator_initializer.mm
@@ -7,14 +7,14 @@ #import "ios/chrome/app/startup/provider_registration.h" #include "ios/chrome/browser/application_context.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" +#import "ios/chrome/browser/ui/browser_list/browser_list.h" +#import "ios/chrome/browser/ui/browser_list/browser_list_session_service.h" +#import "ios/chrome/browser/ui/browser_list/browser_list_session_service_factory.h" #import "ios/chrome/browser/web_state_list/web_state_list.h" #import "ios/chrome/browser/web_state_list/web_state_opener.h" #import "ios/clean/chrome/app/steps/step_context.h" #import "ios/clean/chrome/app/steps/step_features.h" #import "ios/clean/chrome/browser/ui/root/root_coordinator.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser_list.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser_list_session_service.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_factory.h" #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h" #include "ios/web/public/web_state/web_state.h"
diff --git a/ios/clean/chrome/browser/ui/bookmarks/BUILD.gn b/ios/clean/chrome/browser/ui/bookmarks/BUILD.gn index dec4e7694..591d83f 100644 --- a/ios/clean/chrome/browser/ui/bookmarks/BUILD.gn +++ b/ios/clean/chrome/browser/ui/bookmarks/BUILD.gn
@@ -13,7 +13,7 @@ deps = [ "//ios/chrome/browser/ui", "//ios/chrome/browser/ui/bookmarks", - "//ios/shared/chrome/browser/ui/browser_list", + "//ios/chrome/browser/ui/browser_list", "//ios/shared/chrome/browser/ui/coordinators", ] }
diff --git a/ios/clean/chrome/browser/ui/bookmarks/bookmarks_coordinator.mm b/ios/clean/chrome/browser/ui/bookmarks/bookmarks_coordinator.mm index 2a3a6f0..63b16bc 100644 --- a/ios/clean/chrome/browser/ui/bookmarks/bookmarks_coordinator.mm +++ b/ios/clean/chrome/browser/ui/bookmarks/bookmarks_coordinator.mm
@@ -7,8 +7,8 @@ #import "ios/chrome/browser/ui/bookmarks/bookmark_controller_factory.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_home_handset_view_controller.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_home_tablet_ntp_controller.h" +#import "ios/chrome/browser/ui/browser_list/browser.h" #include "ios/chrome/browser/ui/ui_util.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser.h" #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h" #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/clean/chrome/browser/ui/context_menu/BUILD.gn b/ios/clean/chrome/browser/ui/context_menu/BUILD.gn index 75ed85b0..ec87bff 100644 --- a/ios/clean/chrome/browser/ui/context_menu/BUILD.gn +++ b/ios/clean/chrome/browser/ui/context_menu/BUILD.gn
@@ -16,9 +16,9 @@ deps = [ ":context_menu_ui", + "//ios/chrome/browser/ui/browser_list", "//ios/chrome/browser/web_state_list:web_state_list", "//ios/clean/chrome/browser/ui/commands:commands", - "//ios/shared/chrome/browser/ui/browser_list", "//ios/shared/chrome/browser/ui/commands", "//ios/shared/chrome/browser/ui/coordinators", "//ios/web",
diff --git a/ios/clean/chrome/browser/ui/context_menu/context_menu_mediator.mm b/ios/clean/chrome/browser/ui/context_menu/context_menu_mediator.mm index fe17c57..2c5d24b 100644 --- a/ios/clean/chrome/browser/ui/context_menu/context_menu_mediator.mm +++ b/ios/clean/chrome/browser/ui/context_menu/context_menu_mediator.mm
@@ -4,10 +4,10 @@ #import "ios/clean/chrome/browser/ui/context_menu/context_menu_mediator.h" +#import "ios/chrome/browser/ui/browser_list/browser.h" #import "ios/clean/chrome/browser/ui/commands/context_menu_commands.h" #import "ios/clean/chrome/browser/ui/context_menu/context_menu_consumer.h" #import "ios/clean/chrome/browser/ui/context_menu/context_menu_context_impl.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser.h" #import "ios/web/public/url_scheme_util.h" #include "url/gurl.h"
diff --git a/ios/clean/chrome/browser/ui/context_menu/web_context_menu_coordinator.mm b/ios/clean/chrome/browser/ui/context_menu/web_context_menu_coordinator.mm index a86ea59..253777b 100644 --- a/ios/clean/chrome/browser/ui/context_menu/web_context_menu_coordinator.mm +++ b/ios/clean/chrome/browser/ui/context_menu/web_context_menu_coordinator.mm
@@ -5,11 +5,11 @@ #import "ios/clean/chrome/browser/ui/context_menu/web_context_menu_coordinator.h" #include "base/logging.h" +#import "ios/chrome/browser/ui/browser_list/browser.h" #import "ios/clean/chrome/browser/ui/commands/context_menu_commands.h" #import "ios/clean/chrome/browser/ui/context_menu/context_menu_context_impl.h" #import "ios/clean/chrome/browser/ui/context_menu/context_menu_mediator.h" #import "ios/clean/chrome/browser/ui/context_menu/context_menu_view_controller.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser.h" #import "ios/shared/chrome/browser/ui/commands/command_dispatcher.h" #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h"
diff --git a/ios/clean/chrome/browser/ui/find_in_page/BUILD.gn b/ios/clean/chrome/browser/ui/find_in_page/BUILD.gn index dccbfe0..918c16d 100644 --- a/ios/clean/chrome/browser/ui/find_in_page/BUILD.gn +++ b/ios/clean/chrome/browser/ui/find_in_page/BUILD.gn
@@ -16,11 +16,11 @@ ":find_in_page_ui", "//base", "//ios/chrome/browser/find_in_page", + "//ios/chrome/browser/ui/browser_list", "//ios/chrome/browser/web_state_list", "//ios/clean/chrome/browser", "//ios/clean/chrome/browser/ui/actions", "//ios/clean/chrome/browser/ui/commands", - "//ios/shared/chrome/browser/ui/browser_list", "//ios/shared/chrome/browser/ui/commands", "//ios/shared/chrome/browser/ui/coordinators", "//ios/web",
diff --git a/ios/clean/chrome/browser/ui/find_in_page/find_in_page_coordinator.mm b/ios/clean/chrome/browser/ui/find_in_page/find_in_page_coordinator.mm index 14acfc1..01ec12e 100644 --- a/ios/clean/chrome/browser/ui/find_in_page/find_in_page_coordinator.mm +++ b/ios/clean/chrome/browser/ui/find_in_page/find_in_page_coordinator.mm
@@ -8,11 +8,11 @@ #include "base/logging.h" #import "ios/chrome/browser/find_in_page/find_tab_helper.h" +#import "ios/chrome/browser/ui/browser_list/browser.h" #include "ios/chrome/browser/web_state_list/web_state_list.h" #import "ios/clean/chrome/browser/ui/commands/find_in_page_visibility_commands.h" #import "ios/clean/chrome/browser/ui/find_in_page/find_in_page_mediator.h" #import "ios/clean/chrome/browser/ui/find_in_page/find_in_page_view_controller.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser.h" #import "ios/shared/chrome/browser/ui/commands/command_dispatcher.h" #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h"
diff --git a/ios/clean/chrome/browser/ui/ntp/BUILD.gn b/ios/clean/chrome/browser/ui/ntp/BUILD.gn index a774196f..d1972ca 100644 --- a/ios/clean/chrome/browser/ui/ntp/BUILD.gn +++ b/ios/clean/chrome/browser/ui/ntp/BUILD.gn
@@ -32,6 +32,7 @@ "//ios/chrome/browser/reading_list", "//ios/chrome/browser/ui", "//ios/chrome/browser/ui/alert_coordinator", + "//ios/chrome/browser/ui/browser_list", "//ios/chrome/browser/ui/content_suggestions", "//ios/chrome/browser/ui/content_suggestions:content_suggestions_util", "//ios/chrome/browser/ui/content_suggestions/cells", @@ -42,7 +43,6 @@ "//ios/clean/chrome/browser/ui/bookmarks", "//ios/clean/chrome/browser/ui/commands", "//ios/clean/chrome/browser/ui/recent_tabs", - "//ios/shared/chrome/browser/ui/browser_list", "//ios/shared/chrome/browser/ui/commands", "//ios/shared/chrome/browser/ui/coordinators", "//ios/web:web_arc",
diff --git a/ios/clean/chrome/browser/ui/ntp/ntp_coordinator.mm b/ios/clean/chrome/browser/ui/ntp/ntp_coordinator.mm index 3380b4e..365ab19c 100644 --- a/ios/clean/chrome/browser/ui/ntp/ntp_coordinator.mm +++ b/ios/clean/chrome/browser/ui/ntp/ntp_coordinator.mm
@@ -5,6 +5,7 @@ #import "ios/clean/chrome/browser/ui/ntp/ntp_coordinator.h" #include "base/logging.h" +#import "ios/chrome/browser/ui/browser_list/browser.h" #include "ios/chrome/browser/ui/ui_util.h" #import "ios/clean/chrome/browser/ui/bookmarks/bookmarks_coordinator.h" #import "ios/clean/chrome/browser/ui/commands/ntp_commands.h" @@ -12,7 +13,6 @@ #import "ios/clean/chrome/browser/ui/ntp/ntp_mediator.h" #import "ios/clean/chrome/browser/ui/ntp/ntp_view_controller.h" #import "ios/clean/chrome/browser/ui/recent_tabs/recent_tabs_coordinator.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser.h" #import "ios/shared/chrome/browser/ui/commands/command_dispatcher.h" #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h"
diff --git a/ios/clean/chrome/browser/ui/ntp/ntp_home_coordinator.mm b/ios/clean/chrome/browser/ui/ntp/ntp_home_coordinator.mm index ce336ed..19a27c76 100644 --- a/ios/clean/chrome/browser/ui/ntp/ntp_home_coordinator.mm +++ b/ios/clean/chrome/browser/ui/ntp/ntp_home_coordinator.mm
@@ -20,6 +20,7 @@ #include "ios/chrome/browser/ntp_tiles/ios_most_visited_sites_factory.h" #include "ios/chrome/browser/reading_list/reading_list_model_factory.h" #import "ios/chrome/browser/ui/alert_coordinator/alert_coordinator.h" +#import "ios/chrome/browser/ui/browser_list/browser.h" #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_gesture_commands.h" #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_item.h" #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_item.h" @@ -38,7 +39,6 @@ #import "ios/chrome/browser/ui/uikit_ui_util.h" #include "ios/chrome/grit/ios_strings.h" #import "ios/clean/chrome/browser/ui/ntp/ntp_home_header_coordinator.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser.h" #import "ios/shared/chrome/browser/ui/commands/command_dispatcher.h" #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h" #import "ios/third_party/material_components_ios/src/components/Snackbar/src/MaterialSnackbar.h"
diff --git a/ios/clean/chrome/browser/ui/omnibox/BUILD.gn b/ios/clean/chrome/browser/ui/omnibox/BUILD.gn index 44ddf1a96..1b75b9f 100644 --- a/ios/clean/chrome/browser/ui/omnibox/BUILD.gn +++ b/ios/clean/chrome/browser/ui/omnibox/BUILD.gn
@@ -14,11 +14,11 @@ "//base", "//components/toolbar", "//ios/chrome/browser/ssl", + "//ios/chrome/browser/ui/browser_list", "//ios/chrome/browser/ui/omnibox:omnibox_internal", "//ios/chrome/browser/ui/toolbar", "//ios/chrome/browser/web_state_list", "//ios/clean/chrome/browser", - "//ios/shared/chrome/browser/ui/browser_list", "//ios/shared/chrome/browser/ui/coordinators", "//ios/shared/chrome/browser/ui/omnibox", "//ios/web",
diff --git a/ios/clean/chrome/browser/ui/omnibox/location_bar_coordinator.mm b/ios/clean/chrome/browser/ui/omnibox/location_bar_coordinator.mm index 2880d51..4e5ab50 100644 --- a/ios/clean/chrome/browser/ui/omnibox/location_bar_coordinator.mm +++ b/ios/clean/chrome/browser/ui/omnibox/location_bar_coordinator.mm
@@ -5,11 +5,11 @@ #import "ios/clean/chrome/browser/ui/omnibox/location_bar_coordinator.h" #include "base/memory/ptr_util.h" +#import "ios/chrome/browser/ui/browser_list/browser.h" #import "ios/chrome/browser/ui/omnibox/location_bar_controller_impl.h" #include "ios/chrome/browser/ui/toolbar/toolbar_model_ios.h" #import "ios/clean/chrome/browser/ui/omnibox/location_bar_mediator.h" #import "ios/clean/chrome/browser/ui/omnibox/location_bar_view_controller.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser.h" #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h" #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/clean/chrome/browser/ui/recent_tabs/BUILD.gn b/ios/clean/chrome/browser/ui/recent_tabs/BUILD.gn index 0ebc0e4..0fc25c9 100644 --- a/ios/clean/chrome/browser/ui/recent_tabs/BUILD.gn +++ b/ios/clean/chrome/browser/ui/recent_tabs/BUILD.gn
@@ -12,8 +12,8 @@ deps = [ "//ios/chrome/browser/ui", + "//ios/chrome/browser/ui/browser_list", "//ios/chrome/browser/ui/ntp/recent_tabs", - "//ios/shared/chrome/browser/ui/browser_list", "//ios/shared/chrome/browser/ui/coordinators", ] }
diff --git a/ios/clean/chrome/browser/ui/recent_tabs/recent_tabs_coordinator.mm b/ios/clean/chrome/browser/ui/recent_tabs/recent_tabs_coordinator.mm index 12ca148..d7bd8ceb 100644 --- a/ios/clean/chrome/browser/ui/recent_tabs/recent_tabs_coordinator.mm +++ b/ios/clean/chrome/browser/ui/recent_tabs/recent_tabs_coordinator.mm
@@ -4,10 +4,10 @@ #import "ios/clean/chrome/browser/ui/recent_tabs/recent_tabs_coordinator.h" +#import "ios/chrome/browser/ui/browser_list/browser.h" #import "ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_panel_controller.h" #import "ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_panel_view_controller.h" #include "ios/chrome/browser/ui/ui_util.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser.h" #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h" #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/clean/chrome/browser/ui/root/BUILD.gn b/ios/clean/chrome/browser/ui/root/BUILD.gn index d499ecd..c9c6460 100644 --- a/ios/clean/chrome/browser/ui/root/BUILD.gn +++ b/ios/clean/chrome/browser/ui/root/BUILD.gn
@@ -9,10 +9,10 @@ ] deps = [ ":root_ui", + "//ios/chrome/browser/ui/browser_list", "//ios/clean/chrome/browser", "//ios/clean/chrome/browser/ui/commands", "//ios/clean/chrome/browser/ui/tab_grid", - "//ios/shared/chrome/browser/ui/browser_list", "//ios/shared/chrome/browser/ui/commands", "//ios/shared/chrome/browser/ui/coordinators", ]
diff --git a/ios/clean/chrome/browser/ui/root/root_coordinator.mm b/ios/clean/chrome/browser/ui/root/root_coordinator.mm index 289e2700..12de61a 100644 --- a/ios/clean/chrome/browser/ui/root/root_coordinator.mm +++ b/ios/clean/chrome/browser/ui/root/root_coordinator.mm
@@ -8,9 +8,9 @@ #error "This file requires ARC support." #endif +#import "ios/chrome/browser/ui/browser_list/browser.h" #import "ios/clean/chrome/browser/ui/root/root_container_view_controller.h" #import "ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser.h" #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h" #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/clean/chrome/browser/ui/settings/BUILD.gn b/ios/clean/chrome/browser/ui/settings/BUILD.gn index fae4fa0..ddace90 100644 --- a/ios/clean/chrome/browser/ui/settings/BUILD.gn +++ b/ios/clean/chrome/browser/ui/settings/BUILD.gn
@@ -17,10 +17,10 @@ deps = [ "//base:base", "//ios/chrome/browser/browser_state", + "//ios/chrome/browser/ui/browser_list", "//ios/chrome/browser/ui/settings", "//ios/clean/chrome/browser/ui/actions", "//ios/clean/chrome/browser/ui/commands", - "//ios/shared/chrome/browser/ui/browser_list", "//ios/shared/chrome/browser/ui/commands", "//ios/shared/chrome/browser/ui/coordinators", ] @@ -37,8 +37,8 @@ deps = [ ":settings", "//ios/chrome/browser/browser_state:test_support", + "//ios/chrome/browser/ui/browser_list", "//ios/chrome/browser/ui/settings", - "//ios/shared/chrome/browser/ui/browser_list", "//ios/shared/chrome/browser/ui/coordinators:test_support", "//testing/gtest", ]
diff --git a/ios/clean/chrome/browser/ui/settings/settings_coordinator.mm b/ios/clean/chrome/browser/ui/settings/settings_coordinator.mm index 8194051..26958214 100644 --- a/ios/clean/chrome/browser/ui/settings/settings_coordinator.mm +++ b/ios/clean/chrome/browser/ui/settings/settings_coordinator.mm
@@ -6,10 +6,10 @@ #include "base/logging.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" +#import "ios/chrome/browser/ui/browser_list/browser.h" #import "ios/chrome/browser/ui/settings/settings_navigation_controller.h" #import "ios/clean/chrome/browser/ui/commands/settings_commands.h" #import "ios/clean/chrome/browser/ui/settings/settings_main_page_coordinator.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser.h" #import "ios/shared/chrome/browser/ui/commands/command_dispatcher.h" #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h"
diff --git a/ios/clean/chrome/browser/ui/settings/settings_main_page_coordinator.mm b/ios/clean/chrome/browser/ui/settings/settings_main_page_coordinator.mm index e89125d..f8cb709f 100644 --- a/ios/clean/chrome/browser/ui/settings/settings_main_page_coordinator.mm +++ b/ios/clean/chrome/browser/ui/settings/settings_main_page_coordinator.mm
@@ -6,9 +6,9 @@ #include "base/logging.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" +#import "ios/chrome/browser/ui/browser_list/browser.h" #import "ios/chrome/browser/ui/settings/settings_collection_view_controller.h" #import "ios/clean/chrome/browser/ui/settings/material_cell_catalog_coordinator.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser.h" #import "ios/shared/chrome/browser/ui/commands/command_dispatcher.h" #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h" #import "ios/shared/chrome/browser/ui/settings/settings_main_page_commands.h"
diff --git a/ios/clean/chrome/browser/ui/tab/BUILD.gn b/ios/clean/chrome/browser/ui/tab/BUILD.gn index 5bc2d72..d04dfb4 100644 --- a/ios/clean/chrome/browser/ui/tab/BUILD.gn +++ b/ios/clean/chrome/browser/ui/tab/BUILD.gn
@@ -16,6 +16,7 @@ ":tab_ui", "//base", "//ios/chrome/browser", + "//ios/chrome/browser/ui/browser_list", "//ios/chrome/browser/web_state_list", "//ios/clean/chrome/browser/ui/actions", "//ios/clean/chrome/browser/ui/commands", @@ -26,7 +27,6 @@ "//ios/clean/chrome/browser/ui/transitions", "//ios/clean/chrome/browser/ui/web_contents", "//ios/shared/chrome/browser/ui/broadcaster", - "//ios/shared/chrome/browser/ui/browser_list", "//ios/shared/chrome/browser/ui/commands", "//ios/shared/chrome/browser/ui/coordinators", "//ios/web", @@ -64,8 +64,8 @@ ":tab", ":tab_ui", "//base", + "//ios/chrome/browser/ui/browser_list", "//ios/chrome/browser/ui/toolbar/test", - "//ios/shared/chrome/browser/ui/browser_list", "//ios/shared/chrome/browser/ui/coordinators", "//ios/shared/chrome/browser/ui/coordinators:test_support", "//ios/shared/chrome/browser/ui/tab:test_support",
diff --git a/ios/clean/chrome/browser/ui/tab/tab_coordinator.mm b/ios/clean/chrome/browser/ui/tab/tab_coordinator.mm index a29ecb7b..01e9139c 100644 --- a/ios/clean/chrome/browser/ui/tab/tab_coordinator.mm +++ b/ios/clean/chrome/browser/ui/tab/tab_coordinator.mm
@@ -10,6 +10,7 @@ #include "base/memory/ptr_util.h" #include "base/scoped_observer.h" #include "ios/chrome/browser/chrome_url_constants.h" +#import "ios/chrome/browser/ui/browser_list/browser.h" #include "ios/chrome/browser/web_state_list/web_state_list.h" #include "ios/chrome/browser/web_state_list/web_state_list_observer_bridge.h" #import "ios/clean/chrome/browser/ui/commands/tab_commands.h" @@ -23,7 +24,6 @@ #import "ios/clean/chrome/browser/ui/transitions/zoom_transition_controller.h" #import "ios/clean/chrome/browser/ui/web_contents/web_coordinator.h" #import "ios/shared/chrome/browser/ui/broadcaster/chrome_broadcaster.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser.h" #import "ios/shared/chrome/browser/ui/commands/command_dispatcher.h" #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h" #import "ios/web/public/web_state/web_state.h"
diff --git a/ios/clean/chrome/browser/ui/tab/tab_coordinator_unittest.mm b/ios/clean/chrome/browser/ui/tab/tab_coordinator_unittest.mm index 5ac4ca8a..5b4f1fe 100644 --- a/ios/clean/chrome/browser/ui/tab/tab_coordinator_unittest.mm +++ b/ios/clean/chrome/browser/ui/tab/tab_coordinator_unittest.mm
@@ -7,9 +7,9 @@ #include "base/memory/ptr_util.h" #include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#import "ios/chrome/browser/ui/browser_list/browser.h" #import "ios/chrome/browser/ui/toolbar/test/toolbar_test_web_state.h" #import "ios/clean/chrome/browser/ui/tab/tab_container_view_controller.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser.h" #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h" #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator_test.h" #import "ios/shared/chrome/browser/ui/tab/tab_test_util.h"
diff --git a/ios/clean/chrome/browser/ui/tab_grid/BUILD.gn b/ios/clean/chrome/browser/ui/tab_grid/BUILD.gn index cb12b1a..9d2b93cf9 100644 --- a/ios/clean/chrome/browser/ui/tab_grid/BUILD.gn +++ b/ios/clean/chrome/browser/ui/tab_grid/BUILD.gn
@@ -17,6 +17,7 @@ "//base", "//ios/chrome/browser/browser_state", "//ios/chrome/browser/snapshots", + "//ios/chrome/browser/ui/browser_list", "//ios/chrome/browser/ui/tools_menu:configuration", "//ios/chrome/browser/web_state_list", "//ios/clean/chrome/browser", @@ -27,7 +28,6 @@ "//ios/clean/chrome/browser/ui/tab_collection", "//ios/clean/chrome/browser/ui/tab_collection:tab_collection_ui", "//ios/clean/chrome/browser/ui/tools", - "//ios/shared/chrome/browser/ui/browser_list", "//ios/shared/chrome/browser/ui/commands", "//ios/shared/chrome/browser/ui/coordinators", "//ios/web",
diff --git a/ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm b/ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm index fe0a209..cb9f9e77 100644 --- a/ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm +++ b/ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm
@@ -10,6 +10,7 @@ #include "base/strings/sys_string_conversions.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/snapshots/snapshot_cache_factory.h" +#import "ios/chrome/browser/ui/browser_list/browser.h" #import "ios/chrome/browser/ui/tools_menu/tools_menu_configuration.h" #import "ios/chrome/browser/web_state_list/web_state_list.h" #import "ios/chrome/browser/web_state_list/web_state_opener.h" @@ -23,7 +24,6 @@ #import "ios/clean/chrome/browser/ui/tab_grid/tab_grid_mediator.h" #import "ios/clean/chrome/browser/ui/tab_grid/tab_grid_view_controller.h" #import "ios/clean/chrome/browser/ui/tools/tools_coordinator.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser.h" #import "ios/shared/chrome/browser/ui/commands/command_dispatcher.h" #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h" #import "ios/web/public/navigation_manager.h"
diff --git a/ios/clean/chrome/browser/ui/tab_strip/BUILD.gn b/ios/clean/chrome/browser/ui/tab_strip/BUILD.gn index e75f5f6..074ebaf 100644 --- a/ios/clean/chrome/browser/ui/tab_strip/BUILD.gn +++ b/ios/clean/chrome/browser/ui/tab_strip/BUILD.gn
@@ -10,10 +10,10 @@ deps = [ ":tab_strip_ui", "//ios/chrome/browser/browser_state", + "//ios/chrome/browser/ui/browser_list", "//ios/chrome/browser/web_state_list", "//ios/clean/chrome/browser/ui/commands", "//ios/clean/chrome/browser/ui/tab_collection", - "//ios/shared/chrome/browser/ui/browser_list", "//ios/shared/chrome/browser/ui/commands", "//ios/shared/chrome/browser/ui/coordinators", "//ios/web",
diff --git a/ios/clean/chrome/browser/ui/tab_strip/tab_strip_coordinator.mm b/ios/clean/chrome/browser/ui/tab_strip/tab_strip_coordinator.mm index 8478ce5..0f7eb69 100644 --- a/ios/clean/chrome/browser/ui/tab_strip/tab_strip_coordinator.mm +++ b/ios/clean/chrome/browser/ui/tab_strip/tab_strip_coordinator.mm
@@ -4,12 +4,12 @@ #import "ios/clean/chrome/browser/ui/tab_strip/tab_strip_coordinator.h" +#import "ios/chrome/browser/ui/browser_list/browser.h" #import "ios/chrome/browser/web_state_list/web_state_list.h" #import "ios/clean/chrome/browser/ui/commands/tab_grid_commands.h" #import "ios/clean/chrome/browser/ui/commands/tab_strip_commands.h" #import "ios/clean/chrome/browser/ui/tab_collection/tab_collection_mediator.h" #import "ios/clean/chrome/browser/ui/tab_strip/tab_strip_view_controller.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser.h" #import "ios/shared/chrome/browser/ui/commands/command_dispatcher.h" #include "ios/web/public/web_state/web_state.h"
diff --git a/ios/clean/chrome/browser/ui/toolbar/BUILD.gn b/ios/clean/chrome/browser/ui/toolbar/BUILD.gn index 0184951..e517ef7 100644 --- a/ios/clean/chrome/browser/ui/toolbar/BUILD.gn +++ b/ios/clean/chrome/browser/ui/toolbar/BUILD.gn
@@ -16,13 +16,13 @@ ":toolbar_ui", "//base", "//ios/chrome/browser", + "//ios/chrome/browser/ui/browser_list", "//ios/chrome/browser/ui/tools_menu:configuration", "//ios/chrome/browser/web_state_list", "//ios/clean/chrome/browser/ui/commands", "//ios/clean/chrome/browser/ui/omnibox", "//ios/clean/chrome/browser/ui/tools", "//ios/shared/chrome/browser/ui/broadcaster", - "//ios/shared/chrome/browser/ui/browser_list", "//ios/shared/chrome/browser/ui/commands", "//ios/shared/chrome/browser/ui/coordinators", "//ios/web",
diff --git a/ios/clean/chrome/browser/ui/toolbar/toolbar_coordinator.mm b/ios/clean/chrome/browser/ui/toolbar/toolbar_coordinator.mm index e48a074..50079c6 100644 --- a/ios/clean/chrome/browser/ui/toolbar/toolbar_coordinator.mm +++ b/ios/clean/chrome/browser/ui/toolbar/toolbar_coordinator.mm
@@ -5,6 +5,7 @@ #import "ios/clean/chrome/browser/ui/toolbar/toolbar_coordinator.h" #include "ios/chrome/browser/chrome_url_constants.h" +#import "ios/chrome/browser/ui/browser_list/browser.h" #import "ios/chrome/browser/ui/tools_menu/tools_menu_configuration.h" #import "ios/clean/chrome/browser/ui/commands/tools_menu_commands.h" #import "ios/clean/chrome/browser/ui/omnibox/location_bar_coordinator.h" @@ -12,7 +13,6 @@ #import "ios/clean/chrome/browser/ui/toolbar/toolbar_view_controller.h" #import "ios/clean/chrome/browser/ui/tools/tools_coordinator.h" #import "ios/shared/chrome/browser/ui/broadcaster/chrome_broadcaster.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser.h" #import "ios/shared/chrome/browser/ui/commands/command_dispatcher.h" #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h" #import "ios/web/public/web_state/web_state.h"
diff --git a/ios/clean/chrome/browser/ui/tools/BUILD.gn b/ios/clean/chrome/browser/ui/tools/BUILD.gn index c9ddf772..d9c569bf 100644 --- a/ios/clean/chrome/browser/ui/tools/BUILD.gn +++ b/ios/clean/chrome/browser/ui/tools/BUILD.gn
@@ -16,10 +16,10 @@ deps = [ ":tools_ui", "//base", + "//ios/chrome/browser/ui/browser_list", "//ios/chrome/browser/ui/tools_menu:configuration", "//ios/clean/chrome/browser/ui/commands", "//ios/clean/chrome/browser/ui/transitions", - "//ios/shared/chrome/browser/ui/browser_list", "//ios/shared/chrome/browser/ui/coordinators", "//ios/web", "//ui/base",
diff --git a/ios/clean/chrome/browser/ui/tools/tools_coordinator.mm b/ios/clean/chrome/browser/ui/tools/tools_coordinator.mm index 0251ceba..7610df3 100644 --- a/ios/clean/chrome/browser/ui/tools/tools_coordinator.mm +++ b/ios/clean/chrome/browser/ui/tools/tools_coordinator.mm
@@ -4,10 +4,10 @@ #import "ios/clean/chrome/browser/ui/tools/tools_coordinator.h" +#import "ios/chrome/browser/ui/browser_list/browser.h" #import "ios/clean/chrome/browser/ui/tools/menu_view_controller.h" #import "ios/clean/chrome/browser/ui/tools/tools_mediator.h" #import "ios/clean/chrome/browser/ui/transitions/zooming_menu_transition_controller.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support."
diff --git a/ios/clean/chrome/browser/ui/web_contents/BUILD.gn b/ios/clean/chrome/browser/ui/web_contents/BUILD.gn index 7cc6f98..36ae90d 100644 --- a/ios/clean/chrome/browser/ui/web_contents/BUILD.gn +++ b/ios/clean/chrome/browser/ui/web_contents/BUILD.gn
@@ -15,9 +15,9 @@ deps = [ ":web_contents_ui", "//ios/chrome/browser", + "//ios/chrome/browser/ui/browser_list", "//ios/clean/chrome/browser/ui/commands", "//ios/clean/chrome/browser/ui/context_menu", - "//ios/shared/chrome/browser/ui/browser_list", "//ios/shared/chrome/browser/ui/commands", "//ios/shared/chrome/browser/ui/coordinators", "//ios/web", @@ -40,6 +40,7 @@ testonly = true sources = [ "web_contents_mediator_unittest.mm", + "web_coordinator_unittest.mm", ] configs += [ "//build/config/compiler:enable_arc" ] @@ -50,6 +51,7 @@ "//base", "//base/test:test_support", "//ios/chrome/test/base", + "//ios/shared/chrome/browser/ui/coordinators", "//ios/shared/chrome/browser/ui/tab:test_support", "//ios/web/public/test/fakes", "//testing/gtest",
diff --git a/ios/clean/chrome/browser/ui/web_contents/web_coordinator.mm b/ios/clean/chrome/browser/ui/web_contents/web_coordinator.mm index db3ac94a..a7ea49c 100644 --- a/ios/clean/chrome/browser/ui/web_contents/web_coordinator.mm +++ b/ios/clean/chrome/browser/ui/web_contents/web_coordinator.mm
@@ -6,12 +6,12 @@ #include "base/mac/foundation_util.h" #include "base/memory/ptr_util.h" +#import "ios/chrome/browser/ui/browser_list/browser.h" #import "ios/clean/chrome/browser/ui/commands/context_menu_commands.h" #import "ios/clean/chrome/browser/ui/context_menu/context_menu_context_impl.h" #import "ios/clean/chrome/browser/ui/context_menu/web_context_menu_coordinator.h" #import "ios/clean/chrome/browser/ui/web_contents/web_contents_mediator.h" #import "ios/clean/chrome/browser/ui/web_contents/web_contents_view_controller.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser.h" #import "ios/shared/chrome/browser/ui/commands/command_dispatcher.h" #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h" #include "ios/web/public/navigation_manager.h"
diff --git a/ios/clean/chrome/browser/ui/web_contents/web_coordinator_unittest.mm b/ios/clean/chrome/browser/ui/web_contents/web_coordinator_unittest.mm new file mode 100644 index 0000000..2abeebc --- /dev/null +++ b/ios/clean/chrome/browser/ui/web_contents/web_coordinator_unittest.mm
@@ -0,0 +1,63 @@ +// 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. + +#import "ios/clean/chrome/browser/ui/web_contents/web_coordinator.h" + +#include "base/memory/ptr_util.h" +#import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h" +#import "ios/shared/chrome/browser/ui/tab/tab_test_util.h" +#import "ios/web/public/test/fakes/test_web_state.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/gtest_mac.h" +#include "testing/platform_test.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace { + +class WebCoordinatorTest : public PlatformTest { + public: + WebCoordinatorTest() { + auto navigation_manager = base::MakeUnique<TabNavigationManager>(); + navigation_manager->SetItemCount(0); + test_web_state_.SetView([[UIView alloc] init]); + test_web_state_.SetNavigationManager(std::move(navigation_manager)); + + coordinator_ = [[WebCoordinator alloc] init]; + } + + protected: + WebCoordinator* coordinator_; + web::TestWebState test_web_state_; +}; + +// Tests that starting without the webstate still creates a view controller. +TEST_F(WebCoordinatorTest, TestStartWithoutWebState) { + EXPECT_EQ(coordinator_.viewController, nil); + [coordinator_ start]; + EXPECT_NE(coordinator_.viewController, nil); +} + +// Tests that starting with the webstate puts the webstate's view in the VC. +TEST_F(WebCoordinatorTest, TestStartWithWebState) { + coordinator_.webState = &test_web_state_; + [coordinator_ start]; + EXPECT_TRUE([test_web_state_.GetView() + isDescendantOfView:coordinator_.viewController.view]); +} + +// Tests that starting and then setting the webstate puts the webstate's view in +// the VC. +TEST_F(WebCoordinatorTest, TestStartThenSetWebState) { + [coordinator_ start]; + EXPECT_FALSE([test_web_state_.GetView() + isDescendantOfView:coordinator_.viewController.view]); + coordinator_.webState = &test_web_state_; + EXPECT_TRUE([test_web_state_.GetView() + isDescendantOfView:coordinator_.viewController.view]); +} + +} // namespace
diff --git a/ios/net/OWNERS b/ios/net/OWNERS index 13444820..706c5f3 100644 --- a/ios/net/OWNERS +++ b/ios/net/OWNERS
@@ -1,3 +1,6 @@ droger@chromium.org ellyjones@chromium.org marq@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/public/consumer/OWNERS b/ios/public/consumer/OWNERS index ae82009..ba9c65db 100644 --- a/ios/public/consumer/OWNERS +++ b/ios/public/consumer/OWNERS
@@ -1,2 +1,5 @@ rohitrao@chromium.org sdefresne@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/public/provider/OWNERS b/ios/public/provider/OWNERS index ae82009..ba9c65db 100644 --- a/ios/public/provider/OWNERS +++ b/ios/public/provider/OWNERS
@@ -1,2 +1,5 @@ rohitrao@chromium.org sdefresne@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/public/provider/chrome/browser/signin/OWNERS b/ios/public/provider/chrome/browser/signin/OWNERS index d45210b..6068057 100644 --- a/ios/public/provider/chrome/browser/signin/OWNERS +++ b/ios/public/provider/chrome/browser/signin/OWNERS
@@ -2,3 +2,6 @@ msarda@chromium.org # COMPONENT: Services>SignIn + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/shared/OWNERS b/ios/shared/OWNERS index b8d3d41f..290f78a 100644 --- a/ios/shared/OWNERS +++ b/ios/shared/OWNERS
@@ -1,3 +1,6 @@ lpromero@chromium.org marq@chromium.org sdefresne@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/shared/chrome/browser/ui/DEPS b/ios/shared/chrome/browser/ui/DEPS index eb4f1fa..661df6b 100644 --- a/ios/shared/chrome/browser/ui/DEPS +++ b/ios/shared/chrome/browser/ui/DEPS
@@ -1,7 +1,6 @@ include_rules = [ - # Allow ios/chrome/browser but not ios/chrome/browser/ui. + # Allow ios/chrome/browser. "+ios/chrome/browser", - "-ios/chrome/browser/ui", "+components/omnibox/browser", ]
diff --git a/ios/shared/chrome/browser/ui/coordinators/BUILD.gn b/ios/shared/chrome/browser/ui/coordinators/BUILD.gn index 01805bb..ad36878 100644 --- a/ios/shared/chrome/browser/ui/coordinators/BUILD.gn +++ b/ios/shared/chrome/browser/ui/coordinators/BUILD.gn
@@ -17,7 +17,7 @@ "//ios/chrome/browser", "//ios/chrome/browser/browser_state", "//ios/chrome/browser/tabs:tabs_internal", - "//ios/shared/chrome/browser/ui/browser_list", + "//ios/chrome/browser/ui/browser_list", ] } @@ -34,7 +34,7 @@ ":coordinators", "//base", "//ios/chrome/browser/browser_state:test_support", - "//ios/shared/chrome/browser/ui/browser_list", + "//ios/chrome/browser/ui/browser_list", "//testing/gtest", ] }
diff --git a/ios/shared/chrome/browser/ui/coordinators/browser_coordinator_test.mm b/ios/shared/chrome/browser/ui/coordinators/browser_coordinator_test.mm index 5f4cb62a..4d54d95 100644 --- a/ios/shared/chrome/browser/ui/coordinators/browser_coordinator_test.mm +++ b/ios/shared/chrome/browser/ui/coordinators/browser_coordinator_test.mm
@@ -6,7 +6,7 @@ #include "base/memory/ptr_util.h" #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" -#import "ios/shared/chrome/browser/ui/browser_list/browser.h" +#import "ios/chrome/browser/ui/browser_list/browser.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support."
diff --git a/ios/shared/chrome/browser/ui/dialogs/OWNERS b/ios/shared/chrome/browser/ui/dialogs/OWNERS index 48efb49e..bd85dcf2 100644 --- a/ios/shared/chrome/browser/ui/dialogs/OWNERS +++ b/ios/shared/chrome/browser/ui/dialogs/OWNERS
@@ -1 +1,4 @@ kkhorimoto@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/shared/chrome/browser/ui/settings/BUILD.gn b/ios/shared/chrome/browser/ui/settings/BUILD.gn index ac535bc..4d5db7a 100644 --- a/ios/shared/chrome/browser/ui/settings/BUILD.gn +++ b/ios/shared/chrome/browser/ui/settings/BUILD.gn
@@ -8,13 +8,4 @@ ] configs += [ "//build/config/compiler:enable_arc" ] - - deps = [ - # "//base", - # "//ios/chrome/app:tests_fake_hook", - # "//ios/chrome/browser", - # "//ios/chrome/browser/browser_state", - # "//ios/chrome/browser/tabs:tabs_internal", - # "//ios/shared/chrome/browser/ui/browser_list", - ] }
diff --git a/ios/showcase/OWNERS b/ios/showcase/OWNERS index 411d967..aa8e8548 100644 --- a/ios/showcase/OWNERS +++ b/ios/showcase/OWNERS
@@ -1,2 +1,5 @@ edchin@chromium.org lpromero@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/showcase/content_suggestions/OWNERS b/ios/showcase/content_suggestions/OWNERS index 2d35f0a5..f192143 100644 --- a/ios/showcase/content_suggestions/OWNERS +++ b/ios/showcase/content_suggestions/OWNERS
@@ -1 +1,4 @@ gambard@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/testing/earl_grey/OWNERS b/ios/testing/earl_grey/OWNERS index 1df316e..6f764fe 100644 --- a/ios/testing/earl_grey/OWNERS +++ b/ios/testing/earl_grey/OWNERS
@@ -1 +1,4 @@ baxley@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/third_party/blink/OWNERS b/ios/third_party/blink/OWNERS index 40a68c7..b127701 100644 --- a/ios/third_party/blink/OWNERS +++ b/ios/third_party/blink/OWNERS
@@ -1 +1,4 @@ rohitrao@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/third_party/earl_grey/OWNERS b/ios/third_party/earl_grey/OWNERS index 3bb1f30..f1cc9a03 100644 --- a/ios/third_party/earl_grey/OWNERS +++ b/ios/third_party/earl_grey/OWNERS
@@ -1,3 +1,6 @@ baxley@chromium.org justincohen@chromium.org rohitrao@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/third_party/fishhook/OWNERS b/ios/third_party/fishhook/OWNERS index 3bb1f30..f1cc9a03 100644 --- a/ios/third_party/fishhook/OWNERS +++ b/ios/third_party/fishhook/OWNERS
@@ -1,3 +1,6 @@ baxley@chromium.org justincohen@chromium.org rohitrao@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/third_party/material_components_ios/OWNERS b/ios/third_party/material_components_ios/OWNERS index 2b842fe..1e909408 100644 --- a/ios/third_party/material_components_ios/OWNERS +++ b/ios/third_party/material_components_ios/OWNERS
@@ -4,3 +4,6 @@ # These are for the common case of adding or renaming files. If you're doing # structural changes, please get a review from an OWNER. per-file BUILD.gn=* + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/third_party/material_components_ios/README.chromium b/ios/third_party/material_components_ios/README.chromium index 5c68a80..69d4294 100644 --- a/ios/third_party/material_components_ios/README.chromium +++ b/ios/third_party/material_components_ios/README.chromium
@@ -1,7 +1,7 @@ Name: Material Components for iOS URL: https://github.com/material-components/material-components-ios Version: 0 -Revision: c2a357fb67321e9660190c55b49836c51fe04821 +Revision: a0466df249c593ba65007440d7a84e4665ac2631 License: Apache 2.0 License File: LICENSE Security Critical: yes
diff --git a/ios/third_party/material_font_disk_loader_ios/OWNERS b/ios/third_party/material_font_disk_loader_ios/OWNERS index 077a06e..c984591 100644 --- a/ios/third_party/material_font_disk_loader_ios/OWNERS +++ b/ios/third_party/material_font_disk_loader_ios/OWNERS
@@ -1,2 +1,5 @@ lpromero@chromium.org rohitrao@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/third_party/material_roboto_font_loader_ios/OWNERS b/ios/third_party/material_roboto_font_loader_ios/OWNERS index 077a06e..c984591 100644 --- a/ios/third_party/material_roboto_font_loader_ios/OWNERS +++ b/ios/third_party/material_roboto_font_loader_ios/OWNERS
@@ -1,2 +1,5 @@ lpromero@chromium.org rohitrao@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/third_party/material_sprited_animation_view_ios/OWNERS b/ios/third_party/material_sprited_animation_view_ios/OWNERS index 077a06e..c984591 100644 --- a/ios/third_party/material_sprited_animation_view_ios/OWNERS +++ b/ios/third_party/material_sprited_animation_view_ios/OWNERS
@@ -1,2 +1,5 @@ lpromero@chromium.org rohitrao@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/third_party/material_text_accessibility_ios/OWNERS b/ios/third_party/material_text_accessibility_ios/OWNERS index 077a06e..c984591 100644 --- a/ios/third_party/material_text_accessibility_ios/OWNERS +++ b/ios/third_party/material_text_accessibility_ios/OWNERS
@@ -1,2 +1,5 @@ lpromero@chromium.org rohitrao@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/third_party/ochamcrest/OWNERS b/ios/third_party/ochamcrest/OWNERS index 3bb1f30..f1cc9a03 100644 --- a/ios/third_party/ochamcrest/OWNERS +++ b/ios/third_party/ochamcrest/OWNERS
@@ -1,3 +1,6 @@ baxley@chromium.org justincohen@chromium.org rohitrao@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/web/OWNERS b/ios/web/OWNERS index 2710e7a..a7206ed 100644 --- a/ios/web/OWNERS +++ b/ios/web/OWNERS
@@ -1,3 +1,6 @@ eugenebut@chromium.org kkhorimoto@chromium.org marq@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/web/payments/OWNERS b/ios/web/payments/OWNERS index f189e142..6e417fc 100644 --- a/ios/web/payments/OWNERS +++ b/ios/web/payments/OWNERS
@@ -1,2 +1,5 @@ mahmadi@chromium.org lpromero@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/web/payments/payment_request.cc b/ios/web/payments/payment_request.cc index c535f9d7..63ff82d 100644 --- a/ios/web/payments/payment_request.cc +++ b/ios/web/payments/payment_request.cc
@@ -59,6 +59,9 @@ namespace web { +const char kPaymentRequestIDExternal[] = "payment-request-id"; +const char kPaymentRequestDataExternal[] = "payment-request-data"; + PaymentCurrencyAmount::PaymentCurrencyAmount() // By default, the currency is defined by [ISO4217]. For example, USD for // US Dollars.
diff --git a/ios/web/public/OWNERS b/ios/web/public/OWNERS index 08850f4..75983fd 100644 --- a/ios/web/public/OWNERS +++ b/ios/web/public/OWNERS
@@ -1,2 +1,5 @@ per-file *.mojom=set noparent per-file *.mojom=file://ipc/SECURITY_OWNERS + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/web/public/app/mojo/OWNERS b/ios/web/public/app/mojo/OWNERS index 1c9493c3..77df058 100644 --- a/ios/web/public/app/mojo/OWNERS +++ b/ios/web/public/app/mojo/OWNERS
@@ -1,2 +1,5 @@ per-file *.json=set noparent per-file *.json=file://ipc/SECURITY_OWNERS + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/web/public/payments/OWNERS b/ios/web/public/payments/OWNERS index f189e142..6e417fc 100644 --- a/ios/web/public/payments/OWNERS +++ b/ios/web/public/payments/OWNERS
@@ -1,2 +1,5 @@ mahmadi@chromium.org lpromero@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/web/public/payments/payment_request.h b/ios/web/public/payments/payment_request.h index 62c3ab6..a5353b1c 100644 --- a/ios/web/public/payments/payment_request.h +++ b/ios/web/public/payments/payment_request.h
@@ -25,6 +25,11 @@ namespace web { +// These constants are for Univesral Link query parameters when receiving +// payment response data from an external application. +extern const char kPaymentRequestIDExternal[]; +extern const char kPaymentRequestDataExternal[]; + // Supplies monetary amounts. class PaymentCurrencyAmount { public:
diff --git a/ios/web/public/test/OWNERS b/ios/web/public/test/OWNERS index c3cd7d2..a4af3ca 100644 --- a/ios/web/public/test/OWNERS +++ b/ios/web/public/test/OWNERS
@@ -1,2 +1,5 @@ baxley@chromium.org eugenebut@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/web/public/user_agent.mm b/ios/web/public/user_agent.mm index 10b16fb..ac2a4dd 100644 --- a/ios/web/public/user_agent.mm +++ b/ios/web/public/user_agent.mm
@@ -45,6 +45,7 @@ // Safari version can't be, so a lookup table is used instead (for both, since // the reported versions should stay in sync). static const OSVersionMap version_map[] = { + {11, 0, {"604.1", "604.1.34"}}, {10, 3, {"602.1", "603.1.30"}}, {10, 0, {"602.1", "602.1.50"}}, {9, 0, {"601.1.46", "601.1"}},
diff --git a/ios/web/public/webui/OWNERS b/ios/web/public/webui/OWNERS index a01ab6c..f75309d 100644 --- a/ios/web/public/webui/OWNERS +++ b/ios/web/public/webui/OWNERS
@@ -1,2 +1,5 @@ eugenebut@chromium.org michaeldo@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/web/shell/OWNERS b/ios/web/shell/OWNERS index d0f3b7e..fd32f2c 100644 --- a/ios/web/shell/OWNERS +++ b/ios/web/shell/OWNERS
@@ -3,3 +3,6 @@ per-file *.mojom=set noparent per-file *.mojom=file://ipc/SECURITY_OWNERS + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/web/shell/test/OWNERS b/ios/web/shell/test/OWNERS index 1df316e..6f764fe 100644 --- a/ios/web/shell/test/OWNERS +++ b/ios/web/shell/test/OWNERS
@@ -1 +1,4 @@ baxley@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/web/web_state/ui/crw_web_controller.h b/ios/web/web_state/ui/crw_web_controller.h index 2493e20..8619a60 100644 --- a/ios/web/web_state/ui/crw_web_controller.h +++ b/ios/web/web_state/ui/crw_web_controller.h
@@ -196,12 +196,6 @@ // only checks on creation, such that the whole object needs to be rebuilt. - (void)requirePageReconstruction; -// Requires that the next display reload the page, using a placeholder while -// loading. This could be used, e.g., to handle a crash in a WebController that -// is not currently visible. -// TODO(stuartmorgan): When revisiting the methods above, revisit this as well. -- (void)requirePageReload; - // Show overlay, don't reload web page. Used when the view will be // visible only briefly (e.g., tablet side swipe). - (void)setOverlayPreviewMode:(BOOL)overlayPreviewMode;
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm index e9617da..19335f89 100644 --- a/ios/web/web_state/ui/crw_web_controller.mm +++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -320,9 +320,6 @@ base::scoped_nsobject<NSMutableArray> _webViewToolbars; // Flag to say if browsing is enabled. BOOL _webUsageEnabled; - // The next time the view is requested, reload the page (using the placeholder - // overlay until it's loaded). - BOOL _requireReloadOnDisplay; // Overlay view used instead of webView. base::scoped_nsobject<UIImageView> _placeholderOverlayView; // The touch tracking recognizer allowing us to decide if a navigation is @@ -1111,10 +1108,6 @@ [self removeWebView]; } -- (void)requirePageReload { - _requireReloadOnDisplay = YES; -} - - (void)resetContainerView { [_containerView removeFromSuperview]; _containerView.reset(); @@ -1967,10 +1960,6 @@ // then transition away. if (_overlayPreviewMode && !isChromeScheme) [self addPlaceholderOverlay]; - } else if (_requireReloadOnDisplay && _webView) { - _requireReloadOnDisplay = NO; - [self addPlaceholderOverlay]; - [self loadCurrentURL]; } }
diff --git a/ios/web/webui/web_ui_mojo_inttest.mm b/ios/web/webui/web_ui_mojo_inttest.mm index d90e2333..0c4dc8f 100644 --- a/ios/web/webui/web_ui_mojo_inttest.mm +++ b/ios/web/webui/web_ui_mojo_inttest.mm
@@ -174,13 +174,7 @@ // Tests that JS can send messages to the native code and vice versa. // TestUIHandler is used for communication and test succeeds only when // |TestUIHandler| successfully receives "ack" message from WebUI page. -#if TARGET_IPHONE_SIMULATOR -#define MAYBE_MessageExchange MessageExchange -#else -#define MAYBE_MessageExchange FLAKY_MessageExchange -#endif -// TODO(crbug.com/720098): Enable this test on device. -TEST_F(WebUIMojoTest, MAYBE_MessageExchange) { +TEST_F(WebUIMojoTest, MessageExchange) { @autoreleasepool { web_state()->SetWebUsageEnabled(true); web_state()->GetView(); // WebState won't load URL without view.
diff --git a/ios/web_view/OWNERS b/ios/web_view/OWNERS index d0087512..c3456e9 100644 --- a/ios/web_view/OWNERS +++ b/ios/web_view/OWNERS
@@ -7,4 +7,6 @@ # structural changes, please get a review from an OWNER. per-file BUILD.gn=* -# COMPONENT: Mobile>iOSWebView \ No newline at end of file +# COMPONENT: Mobile>iOSWebView +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ipc/ipc_mojo_bootstrap.cc b/ipc/ipc_mojo_bootstrap.cc index afd0e3c..4ea67bbd 100644 --- a/ipc/ipc_mojo_bootstrap.cc +++ b/ipc/ipc_mojo_bootstrap.cc
@@ -172,6 +172,15 @@ if (!mojo::IsValidInterfaceId(id)) return mojo::ScopedInterfaceEndpointHandle(); + // Unless it is the master ID, |id| is from the remote side and therefore + // its namespace bit is supposed to be different than the value that this + // router would use. + if (!mojo::IsMasterInterfaceId(id) && + set_interface_id_namespace_bit_ == + mojo::HasInterfaceIdNamespaceBitSet(id)) { + return mojo::ScopedInterfaceEndpointHandle(); + } + base::AutoLock locker(lock_); bool inserted = false; Endpoint* endpoint = FindOrInsertEndpoint(id, &inserted);
diff --git a/media/base/pipeline.h b/media/base/pipeline.h index 1423afae..b39ae20 100644 --- a/media/base/pipeline.h +++ b/media/base/pipeline.h
@@ -34,6 +34,7 @@ // Executed whenever an error occurs except when the error occurs during // Start/Seek/Resume or Suspend. Those errors are reported via |seek_cb| // and |suspend_cb| respectively. + // NOTE: The client is responsible for calling Pipeline::Stop(). virtual void OnError(PipelineStatus status) = 0; // Executed whenever the media reaches the end.
diff --git a/media/base/pipeline_impl.cc b/media/base/pipeline_impl.cc index ecf1574..2028019 100644 --- a/media/base/pipeline_impl.cc +++ b/media/base/pipeline_impl.cc
@@ -222,8 +222,8 @@ std::unique_ptr<TextRenderer> text_renderer, base::WeakPtr<PipelineImpl> weak_pipeline) { DCHECK(media_task_runner_->BelongsToCurrentThread()); - DCHECK_EQ(kCreated, state_) << "Received start in unexpected state: " - << state_; + DCHECK(state_ == kCreated || state_ == kStopped) + << "Received start in unexpected state: " << state_; SetState(kStarting); @@ -232,7 +232,6 @@ DCHECK(!text_renderer_); DCHECK(!renderer_ended_); DCHECK(!text_renderer_ended_); - DCHECK(!weak_pipeline_); demuxer_ = demuxer; { base::AutoLock auto_lock(shared_state_lock_); @@ -1275,18 +1274,16 @@ // Else report error via the client interface. if (!seek_cb_.is_null()) { base::ResetAndReturn(&seek_cb_).Run(error); - } else if (!suspend_cb_.is_null()) { - base::ResetAndReturn(&suspend_cb_).Run(error); - } else { - DCHECK(client_); - client_->OnError(error); + return; } - // Any kind of error stops the pipeline. - // - // TODO (tguilbert): Move this out to PipelineController to make the state - // changes more consistent. See crbug.com/695734. - Stop(); + if (!suspend_cb_.is_null()) { + base::ResetAndReturn(&suspend_cb_).Run(error); + return; + } + + DCHECK(client_); + client_->OnError(error); } void PipelineImpl::OnEnded() {
diff --git a/media/base/pipeline_impl.h b/media/base/pipeline_impl.h index e5c9de3..73ee91f 100644 --- a/media/base/pipeline_impl.h +++ b/media/base/pipeline_impl.h
@@ -29,7 +29,7 @@ // Here's a state diagram that describes the lifetime of this object. // // [ *Created ] [ Any State ] -// | Start() | Stop() / SetError() +// | Start() | Stop() // V V // [ Starting ] [ Stopping ] // | | @@ -55,9 +55,9 @@ // a chance to preroll. From then on the normal Seek() transitions are carried // out and we start playing the media. // -// If any error ever happens, this object will transition to the "Error" state -// from any state. If Stop() is ever called, this object will transition to -// "Stopped" state. +// If Stop() is ever called, this object will transition to "Stopped" state. +// Pipeline::Stop() is never called from withing PipelineImpl. It's |client_|'s +// responsibility to call stop when appropriate. // // TODO(sandersd): It should be possible to pass through Suspended when going // from InitDemuxer to InitRenderer, thereby eliminating the Resuming state.
diff --git a/media/base/pipeline_impl_unittest.cc b/media/base/pipeline_impl_unittest.cc index 8e81bd2d..9db941b9 100644 --- a/media/base/pipeline_impl_unittest.cc +++ b/media/base/pipeline_impl_unittest.cc
@@ -37,8 +37,6 @@ using ::testing::CreateFunctor; using ::testing::DeleteArg; using ::testing::DoAll; -// TODO(scherkus): Remove InSequence after refactoring Pipeline. -using ::testing::InSequence; using ::testing::Invoke; using ::testing::InvokeWithoutArgs; using ::testing::Mock; @@ -424,7 +422,6 @@ TEST_F(PipelineImplTest, NoStreams) { EXPECT_CALL(*demuxer_, Initialize(_, _, _)) .WillOnce(PostCallback<1>(PIPELINE_OK)); - EXPECT_CALL(*demuxer_, Stop()); EXPECT_CALL(callbacks_, OnMetadata(_)); StartPipelineAndExpect(PIPELINE_ERROR_COULD_NOT_RENDER); @@ -536,8 +533,9 @@ // Initialize then seek! StartPipelineAndExpect(PIPELINE_OK); + // Pipeline::Client is supposed to call Pipeline::Stop() after errors. + EXPECT_CALL(callbacks_, OnError(_)).WillOnce(Stop(pipeline_.get())); EXPECT_CALL(*demuxer_, Stop()); - EXPECT_CALL(callbacks_, OnError(_)); OnDemuxerError(); base::RunLoop().RunUntilIdle(); @@ -701,7 +699,8 @@ pipeline_->Seek(seek_time, base::Bind(&CallbackHelper::OnSeek, base::Unretained(&callbacks_))); - EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ)); + EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ)) + .WillOnce(Stop(pipeline_.get())); base::RunLoop().RunUntilIdle(); } @@ -754,7 +753,8 @@ pipeline_->Seek(seek_time, base::Bind(&CallbackHelper::OnSeek, base::Unretained(&callbacks_))); - EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ)); + EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ)) + .WillOnce(Stop(pipeline_.get())); base::RunLoop().RunUntilIdle(); } @@ -934,7 +934,8 @@ } else { EXPECT_CALL(*demuxer_, Initialize(_, _, _)) .WillOnce(PostCallback<1>(DEMUXER_ERROR_COULD_NOT_OPEN)); - EXPECT_CALL(callbacks_, OnStart(DEMUXER_ERROR_COULD_NOT_OPEN)); + EXPECT_CALL(callbacks_, OnStart(DEMUXER_ERROR_COULD_NOT_OPEN)) + .WillOnce(Stop(pipeline_.get())); } EXPECT_CALL(*demuxer_, Stop()); @@ -957,7 +958,8 @@ } else { EXPECT_CALL(*renderer_, Initialize(_, _, _)) .WillOnce(PostCallback<2>(PIPELINE_ERROR_INITIALIZATION_FAILED)); - EXPECT_CALL(callbacks_, OnStart(PIPELINE_ERROR_INITIALIZATION_FAILED)); + EXPECT_CALL(callbacks_, OnStart(PIPELINE_ERROR_INITIALIZATION_FAILED)) + .WillOnce(Stop(pipeline_.get())); } EXPECT_CALL(callbacks_, OnMetadata(_)); @@ -1008,7 +1010,8 @@ SetError(&renderer_client_, PIPELINE_ERROR_READ), RunClosure<0>())); EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)); - EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ)); + EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ)) + .WillOnce(Stop(pipeline_.get())); } return; } @@ -1028,7 +1031,8 @@ } else { EXPECT_CALL(*demuxer_, Seek(_, _)) .WillOnce(RunCallback<1>(PIPELINE_ERROR_READ)); - EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ)); + EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ)) + .WillOnce(Stop(pipeline_.get())); } return; } @@ -1068,7 +1072,8 @@ } else { EXPECT_CALL(*demuxer_, Seek(_, _)) .WillOnce(RunCallback<1>(PIPELINE_ERROR_READ)); - EXPECT_CALL(callbacks_, OnResume(PIPELINE_ERROR_READ)); + EXPECT_CALL(callbacks_, OnResume(PIPELINE_ERROR_READ)) + .WillOnce(Stop(pipeline_.get())); } } else if (state != kSuspended && state != kSuspending) { NOTREACHED() << "State not supported: " << state; @@ -1085,7 +1090,8 @@ case kError: if (expect_errors) { EXPECT_CALL(*demuxer_, Stop()); - EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_READ)); + EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_READ)) + .WillOnce(Stop(pipeline_.get())); } renderer_client_->OnError(PIPELINE_ERROR_READ); break;
diff --git a/media/blink/buffered_data_source_host_impl.cc b/media/blink/buffered_data_source_host_impl.cc index 8569558..1b4f872 100644 --- a/media/blink/buffered_data_source_host_impl.cc +++ b/media/blink/buffered_data_source_host_impl.cc
@@ -57,9 +57,12 @@ void BufferedDataSourceHostImpl::AddBufferedByteRange(int64_t start, int64_t end) { int64_t new_bytes = UnloadedBytesInInterval(Interval<int64_t>(start, end)); - if (new_bytes > 0) - did_loading_progress_ = true; + if (new_bytes == 0) { + // No change + return; + } buffered_byte_ranges_.SetInterval(start, end, 1); + did_loading_progress_ = true; base::TimeTicks now = tick_clock_->NowTicks(); int64_t bytes_so_far = 0;
diff --git a/media/blink/multibuffer_data_source.cc b/media/blink/multibuffer_data_source.cc index 3f29a1c..d793c69 100644 --- a/media/blink/multibuffer_data_source.cc +++ b/media/blink/multibuffer_data_source.cc
@@ -116,7 +116,7 @@ stop_signal_received_(false), media_has_played_(false), single_origin_(true), - cancel_on_defer_(true), + cancel_on_defer_(false), preload_(AUTO), bitrate_(0), playback_rate_(0.0), @@ -414,7 +414,6 @@ } void MultibufferDataSource::StopInternal_Locked() { - DVLOG(1) << __func__; lock_.AssertAcquired(); if (stop_signal_received_) return; @@ -444,7 +443,6 @@ ///////////////////////////////////////////////////////////////////////////// // BufferedResourceLoader callback methods. void MultibufferDataSource::StartCallback() { - DVLOG(1) << __func__; DCHECK(render_task_runner_->BelongsToCurrentThread()); if (init_cb_.is_null()) { @@ -495,8 +493,6 @@ media_log_->SetBooleanProperty("range_header_supported", url_data_->range_supported()); } - if (!url_data_->range_supported()) - cancel_on_defer_ = false; render_task_runner_->PostTask( FROM_HERE, base::Bind(base::ResetAndReturn(&init_cb_), success)); @@ -540,8 +536,7 @@ bool loading = is_loading || force_loading; if (!loading && cancel_on_defer_) { - DVLOG(2) << "Cancel on defer"; - if (read_op_ || !init_cb_.is_null()) { + if (read_op_) { // We can't destroy the reader if a read operation is pending. // UpdateLoadingState_Locked will be called again when the read // operation is done.
diff --git a/media/blink/multibuffer_data_source_unittest.cc b/media/blink/multibuffer_data_source_unittest.cc index a7c2b9c..b71b1f2 100644 --- a/media/blink/multibuffer_data_source_unittest.cc +++ b/media/blink/multibuffer_data_source_unittest.cc
@@ -390,21 +390,18 @@ } void CheckCapacityDefer() { - if (loader()) { - EXPECT_EQ(2 << 20, preload_low()); - EXPECT_EQ(3 << 20, preload_high()); - } else { - EXPECT_EQ(preload(), MultibufferDataSource::AUTO); - } + EXPECT_EQ(2 << 20, preload_low()); + EXPECT_EQ(3 << 20, preload_high()); } void CheckReadThenDefer() { - if (loader()) { - EXPECT_EQ(0, preload_low()); - EXPECT_EQ(0, preload_high()); - } else { - EXPECT_EQ(preload(), MultibufferDataSource::METADATA); - } + EXPECT_EQ(0, preload_low()); + EXPECT_EQ(0, preload_high()); + } + + void CheckNeverDefer() { + EXPECT_EQ(1LL << 40, preload_low()); + EXPECT_EQ(1LL << 40, preload_high()); } // Accessors for private variables on |data_source_|. @@ -1189,20 +1186,15 @@ set_preload(MultibufferDataSource::METADATA); InitializeWith206Response(); - data_source_->MediaIsPlaying(); - data_source_->SetPreload(MultibufferDataSource::METADATA); + EXPECT_EQ(MultibufferDataSource::METADATA, preload()); EXPECT_FALSE(is_local_source()); EXPECT_TRUE(data_source_->range_supported()); CheckReadThenDefer(); - // Read next block. (Needed to start up the loader again.) + // Read a bit from the beginning. EXPECT_CALL(*this, ReadCallback(kDataSize)); - ReadAt(kDataSize); - Respond(response_generator_->Generate206(kDataSize)); - EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize * 2)); - ReceiveData(kDataSize); + ReadAt(0); - // After reading, we should be in a deferred state. ASSERT_TRUE(active_loader()); EXPECT_TRUE(data_provider()->deferred()); }
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc index 68b41bce..545b5c7 100644 --- a/media/blink/webmediaplayer_impl.cc +++ b/media/blink/webmediaplayer_impl.cc
@@ -938,16 +938,6 @@ if (highest_ready_state_ >= ReadyState::kReadyStateHaveFutureData) return false; - // To suspend before we reach kReadyStateHaveCurrentData is only ok - // if we know we're going to get woken up when we get more data, which - // will only happen if the network is in the "Loading" state. - // This happens when the network is fast, but multiple videos are loading - // and multiplexing gets held up waiting for available threads. - if (highest_ready_state_ <= ReadyState::kReadyStateHaveMetadata && - network_state_ != WebMediaPlayer::kNetworkStateLoading) { - return true; - } - if (preroll_attempt_pending_) return true; @@ -1333,6 +1323,9 @@ SetNetworkState(PipelineErrorToNetworkState(status)); } + // PipelineController::Stop() is idempotent. + pipeline_controller_.Stop(); + UpdatePlayState(); }
diff --git a/media/blink/webmediaplayer_impl_unittest.cc b/media/blink/webmediaplayer_impl_unittest.cc index 014a2d3..116f8f1e 100644 --- a/media/blink/webmediaplayer_impl_unittest.cc +++ b/media/blink/webmediaplayer_impl_unittest.cc
@@ -270,9 +270,6 @@ } protected: - void SetNetworkState(blink::WebMediaPlayer::NetworkState state) { - wmpi_->SetNetworkState(state); - } void SetReadyState(blink::WebMediaPlayer::ReadyState state) { wmpi_->SetReadyState(state); } @@ -424,9 +421,11 @@ EXPECT_FALSE(IsSuspended()); } -TEST_F(WebMediaPlayerImplTest, IdleSuspendBeforeLoadingBegins) { +TEST_F(WebMediaPlayerImplTest, IdleSuspendIsEnabledBeforeLoadingBegins) { InitializeWebMediaPlayerImpl(); - EXPECT_FALSE(delegate_.ExpireForTesting()); + EXPECT_TRUE(delegate_.ExpireForTesting()); + base::RunLoop().RunUntilIdle(); + EXPECT_TRUE(IsSuspended()); } TEST_F(WebMediaPlayerImplTest, @@ -446,7 +445,6 @@ TEST_F(WebMediaPlayerImplTest, IdleSuspendIsEnabledIfLoadingHasStalled) { InitializeWebMediaPlayerImpl(); - SetNetworkState(blink::WebMediaPlayer::kNetworkStateLoading); base::SimpleTestTickClock* clock = new base::SimpleTestTickClock(); clock->Advance(base::TimeDelta::FromSeconds(1)); SetTickClock(clock); @@ -462,7 +460,6 @@ TEST_F(WebMediaPlayerImplTest, DidLoadingProgressTriggersResume) { // Same setup as IdleSuspendIsEnabledBeforeLoadingBegins. InitializeWebMediaPlayerImpl(); - SetNetworkState(blink::WebMediaPlayer::kNetworkStateLoading); EXPECT_TRUE(delegate_.ExpireForTesting()); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(IsSuspended());
diff --git a/media/capture/video/video_capture_system_impl.cc b/media/capture/video/video_capture_system_impl.cc index da8f119d..8e18420 100644 --- a/media/capture/video/video_capture_system_impl.cc +++ b/media/capture/video/video_capture_system_impl.cc
@@ -9,41 +9,36 @@ namespace { // Compares two VideoCaptureFormat by checking smallest frame_size area, then -// by _largest_ frame_rate. Used to order a VideoCaptureFormats vector so that -// the first entry for a given resolution has the largest frame rate, as needed -// by the ConsolidateCaptureFormats() method. +// by width, and then by _largest_ frame_rate. Used to order a +// VideoCaptureFormats vector so that the first entry for a given resolution has +// the largest frame rate. bool IsCaptureFormatSmaller(const media::VideoCaptureFormat& format1, const media::VideoCaptureFormat& format2) { DCHECK(format1.frame_size.GetCheckedArea().IsValid()); DCHECK(format2.frame_size.GetCheckedArea().IsValid()); if (format1.frame_size.GetCheckedArea().ValueOrDefault(0) == format2.frame_size.GetCheckedArea().ValueOrDefault(0)) { - return format1.frame_rate > format2.frame_rate; + if (format1.frame_size.width() == format2.frame_size.width()) { + return format1.frame_rate > format2.frame_rate; + } + return format1.frame_size.width() < format2.frame_size.width(); } return format1.frame_size.GetCheckedArea().ValueOrDefault(0) < format2.frame_size.GetCheckedArea().ValueOrDefault(0); } -bool IsCaptureFormatSizeEqual(const media::VideoCaptureFormat& format1, - const media::VideoCaptureFormat& format2) { - DCHECK(format1.frame_size.GetCheckedArea().IsValid()); - DCHECK(format2.frame_size.GetCheckedArea().IsValid()); - return format1.frame_size.GetCheckedArea().ValueOrDefault(0) == - format2.frame_size.GetCheckedArea().ValueOrDefault(0); +bool IsCaptureFormatEqual(const media::VideoCaptureFormat& format1, + const media::VideoCaptureFormat& format2) { + return format1.frame_size == format2.frame_size && + format1.frame_rate == format2.frame_rate && + format1.pixel_format == format2.pixel_format; } -// This function receives a list of capture formats, removes duplicated -// resolutions while keeping the highest frame rate for each, and forcing I420 -// pixel format. +// This function receives a list of capture formats, sets all of them to I420 +// (while keeping Y16 as is), and then removes duplicates. void ConsolidateCaptureFormats(media::VideoCaptureFormats* formats) { if (formats->empty()) return; - std::sort(formats->begin(), formats->end(), IsCaptureFormatSmaller); - // Due to the ordering imposed, the largest frame_rate is kept while removing - // duplicated resolutions. - media::VideoCaptureFormats::iterator last = - std::unique(formats->begin(), formats->end(), IsCaptureFormatSizeEqual); - formats->erase(last, formats->end()); // Mark all formats as I420, since this is what the renderer side will get // anyhow: the actual pixel format is decided at the device level. // Don't do this for Y16 format as it is handled separatelly. @@ -51,6 +46,11 @@ if (format.pixel_format != media::PIXEL_FORMAT_Y16) format.pixel_format = media::PIXEL_FORMAT_I420; } + std::sort(formats->begin(), formats->end(), IsCaptureFormatSmaller); + // Remove duplicates + media::VideoCaptureFormats::iterator last = + std::unique(formats->begin(), formats->end(), IsCaptureFormatEqual); + formats->erase(last, formats->end()); } } // anonymous namespace
diff --git a/media/capture/video/win/video_capture_device_factory_win.cc b/media/capture/video/win/video_capture_device_factory_win.cc index c044c52..18fa3681 100644 --- a/media/capture/video/win/video_capture_device_factory_win.cc +++ b/media/capture/video/win/video_capture_device_factory_win.cc
@@ -245,88 +245,13 @@ VideoCaptureFormats* formats) { DVLOG(1) << "GetDeviceSupportedFormatsDirectShow for " << descriptor.display_name; - ScopedComPtr<ICreateDevEnum> dev_enum; - HRESULT hr = ::CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, - IID_PPV_ARGS(&dev_enum)); - if (FAILED(hr)) - return; - - ScopedComPtr<IEnumMoniker> enum_moniker; - hr = dev_enum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, - enum_moniker.GetAddressOf(), 0); - // CreateClassEnumerator returns S_FALSE on some Windows OS when no camera - // exists. Therefore the FAILED macro can't be used. - if (hr != S_OK) - return; - - // Walk the capture devices. No need to check for device presence again since - // that is anyway needed in GetDeviceFilter(). "google camera adapter" and old - // VFW devices are already skipped previously in GetDeviceNames() enumeration. - base::win::ScopedComPtr<IBaseFilter> capture_filter; - hr = VideoCaptureDeviceWin::GetDeviceFilter(descriptor.device_id, - capture_filter.GetAddressOf()); - if (!capture_filter.Get()) { - DLOG(ERROR) << "Failed to create capture filter: " - << logging::SystemErrorCodeToString(hr); - return; - } - - base::win::ScopedComPtr<IPin> output_capture_pin( - VideoCaptureDeviceWin::GetPin(capture_filter.Get(), PINDIR_OUTPUT, - PIN_CATEGORY_CAPTURE, GUID_NULL)); - if (!output_capture_pin.Get()) { - DLOG(ERROR) << "Failed to get capture output pin"; - return; - } - - ScopedComPtr<IAMStreamConfig> stream_config; - hr = output_capture_pin.CopyTo(stream_config.GetAddressOf()); - if (FAILED(hr)) { - DLOG(ERROR) << "Failed to get IAMStreamConfig interface from " - "capture device: " << logging::SystemErrorCodeToString(hr); - return; - } - - int count = 0, size = 0; - hr = stream_config->GetNumberOfCapabilities(&count, &size); - if (FAILED(hr)) { - DLOG(ERROR) << "GetNumberOfCapabilities failed: " - << logging::SystemErrorCodeToString(hr); - return; - } - - std::unique_ptr<BYTE[]> caps(new BYTE[size]); - for (int i = 0; i < count; ++i) { - VideoCaptureDeviceWin::ScopedMediaType media_type; - hr = stream_config->GetStreamCaps(i, media_type.Receive(), caps.get()); - // GetStreamCaps() may return S_FALSE, so don't use FAILED() or SUCCEED() - // macros here since they'll trigger incorrectly. - if (hr != S_OK || !media_type.get()) { - DLOG(ERROR) << "GetStreamCaps failed: " - << logging::SystemErrorCodeToString(hr); - return; - } - - if (media_type->majortype == MEDIATYPE_Video && - media_type->formattype == FORMAT_VideoInfo) { - VideoCaptureFormat format; - format.pixel_format = - VideoCaptureDeviceWin::TranslateMediaSubtypeToPixelFormat( - media_type->subtype); - if (format.pixel_format == PIXEL_FORMAT_UNKNOWN) - continue; - VIDEOINFOHEADER* h = - reinterpret_cast<VIDEOINFOHEADER*>(media_type->pbFormat); - format.frame_size.SetSize(h->bmiHeader.biWidth, h->bmiHeader.biHeight); - // Trust the frame rate from the VIDEOINFOHEADER. - format.frame_rate = - (h->AvgTimePerFrame > 0) - ? kSecondsToReferenceTime / static_cast<float>(h->AvgTimePerFrame) - : 0.0f; - formats->push_back(format); - DVLOG(1) << descriptor.display_name << " " - << VideoCaptureFormat::ToString(format); - } + CapabilityList capability_list; + VideoCaptureDeviceWin::GetDeviceCapabilityList(descriptor.device_id, + &capability_list); + for (const auto& entry : capability_list) { + formats->emplace_back(entry.supported_format); + DVLOG(1) << descriptor.display_name << " " + << VideoCaptureFormat::ToString(entry.supported_format); } }
diff --git a/media/capture/video/win/video_capture_device_win.cc b/media/capture/video/win/video_capture_device_win.cc index b1c90bc..1c010fe 100644 --- a/media/capture/video/win/video_capture_device_win.cc +++ b/media/capture/video/win/video_capture_device_win.cc
@@ -101,6 +101,120 @@ return control_range; } +// static +void VideoCaptureDeviceWin::GetDeviceCapabilityList( + const std::string& device_id, + CapabilityList* out_capability_list) { + base::win::ScopedComPtr<IBaseFilter> capture_filter; + HRESULT hr = VideoCaptureDeviceWin::GetDeviceFilter( + device_id, capture_filter.GetAddressOf()); + if (!capture_filter.Get()) { + DLOG(ERROR) << "Failed to create capture filter: " + << logging::SystemErrorCodeToString(hr); + return; + } + + base::win::ScopedComPtr<IPin> output_capture_pin( + VideoCaptureDeviceWin::GetPin(capture_filter.Get(), PINDIR_OUTPUT, + PIN_CATEGORY_CAPTURE, GUID_NULL)); + if (!output_capture_pin.Get()) { + DLOG(ERROR) << "Failed to get capture output pin"; + return; + } + + GetPinCapabilityList(capture_filter, output_capture_pin, out_capability_list); +} + +// static +void VideoCaptureDeviceWin::GetPinCapabilityList( + base::win::ScopedComPtr<IBaseFilter> capture_filter, + base::win::ScopedComPtr<IPin> output_capture_pin, + CapabilityList* out_capability_list) { + ScopedComPtr<IAMStreamConfig> stream_config; + HRESULT hr = output_capture_pin.CopyTo(stream_config.GetAddressOf()); + if (FAILED(hr)) { + DLOG(ERROR) << "Failed to get IAMStreamConfig interface from " + "capture device: " + << logging::SystemErrorCodeToString(hr); + return; + } + + // Get interface used for getting the frame rate. + ScopedComPtr<IAMVideoControl> video_control; + hr = capture_filter.CopyTo(video_control.GetAddressOf()); + + int count = 0, size = 0; + hr = stream_config->GetNumberOfCapabilities(&count, &size); + if (FAILED(hr)) { + DLOG(ERROR) << "GetNumberOfCapabilities failed: " + << logging::SystemErrorCodeToString(hr); + return; + } + + std::unique_ptr<BYTE[]> caps(new BYTE[size]); + for (int i = 0; i < count; ++i) { + VideoCaptureDeviceWin::ScopedMediaType media_type; + hr = stream_config->GetStreamCaps(i, media_type.Receive(), caps.get()); + // GetStreamCaps() may return S_FALSE, so don't use FAILED() or SUCCEED() + // macros here since they'll trigger incorrectly. + if (hr != S_OK || !media_type.get()) { + DLOG(ERROR) << "GetStreamCaps failed: " + << logging::SystemErrorCodeToString(hr); + return; + } + + if (media_type->majortype == MEDIATYPE_Video && + media_type->formattype == FORMAT_VideoInfo) { + VideoCaptureFormat format; + format.pixel_format = + VideoCaptureDeviceWin::TranslateMediaSubtypeToPixelFormat( + media_type->subtype); + if (format.pixel_format == PIXEL_FORMAT_UNKNOWN) + continue; + VIDEOINFOHEADER* h = + reinterpret_cast<VIDEOINFOHEADER*>(media_type->pbFormat); + format.frame_size.SetSize(h->bmiHeader.biWidth, h->bmiHeader.biHeight); + + // Try to get a better |time_per_frame| from IAMVideoControl. If not, use + // the value from VIDEOINFOHEADER. + std::vector<float> frame_rates; + if (video_control.Get()) { + ScopedCoMem<LONGLONG> time_per_frame_list; + LONG list_size = 0; + const SIZE size = {format.frame_size.width(), + format.frame_size.height()}; + hr = video_control->GetFrameRateList(output_capture_pin.Get(), i, size, + &list_size, &time_per_frame_list); + // Sometimes |list_size| will be > 0, but time_per_frame_list will be + // NULL. Some drivers may return an HRESULT of S_FALSE which SUCCEEDED() + // translates into success, so explicitly check S_OK. + // See http://crbug.com/306237. + if (hr == S_OK && list_size > 0 && time_per_frame_list) { + for (int k = 0; k < list_size; k++) { + LONGLONG time_per_frame = *(time_per_frame_list + k); + if (time_per_frame <= 0) + continue; + frame_rates.push_back(kSecondsToReferenceTime / + static_cast<float>(time_per_frame)); + } + } + } + + if (frame_rates.empty() && h->AvgTimePerFrame > 0) { + frame_rates.push_back(kSecondsToReferenceTime / + static_cast<float>(h->AvgTimePerFrame)); + } + if (frame_rates.empty()) + frame_rates.push_back(0.0f); + + for (const auto& frame_rate : frame_rates) { + format.frame_rate = frame_rate; + out_capability_list->emplace_back(i, format, h->bmiHeader); + } + } + } +} + // Finds and creates a DirectShow Video Capture filter matching the |device_id|. // static HRESULT VideoCaptureDeviceWin::GetDeviceFilter(const std::string& device_id, @@ -746,77 +860,7 @@ bool VideoCaptureDeviceWin::CreateCapabilityMap() { DCHECK(thread_checker_.CalledOnValidThread()); - ScopedComPtr<IAMStreamConfig> stream_config; - HRESULT hr = output_capture_pin_.CopyTo(stream_config.GetAddressOf()); - DLOG_IF_FAILED_WITH_HRESULT( - "Failed to get IAMStreamConfig from capture device", hr); - if (FAILED(hr)) - return false; - - // Get interface used for getting the frame rate. - ScopedComPtr<IAMVideoControl> video_control; - hr = capture_filter_.CopyTo(video_control.GetAddressOf()); - - int count = 0, size = 0; - hr = stream_config->GetNumberOfCapabilities(&count, &size); - DLOG_IF_FAILED_WITH_HRESULT("Failed to GetNumberOfCapabilities", hr); - if (FAILED(hr)) - return false; - - std::unique_ptr<BYTE[]> caps(new BYTE[size]); - for (int stream_index = 0; stream_index < count; ++stream_index) { - ScopedMediaType media_type; - hr = stream_config->GetStreamCaps(stream_index, media_type.Receive(), - caps.get()); - // GetStreamCaps() may return S_FALSE, so don't use FAILED() or SUCCEED() - // macros here since they'll trigger incorrectly. - if (hr != S_OK) { - DLOG(ERROR) << "Failed to GetStreamCaps"; - return false; - } - - if (media_type->majortype == MEDIATYPE_Video && - media_type->formattype == FORMAT_VideoInfo) { - VideoCaptureFormat format; - format.pixel_format = - TranslateMediaSubtypeToPixelFormat(media_type->subtype); - if (format.pixel_format == PIXEL_FORMAT_UNKNOWN) - continue; - - VIDEOINFOHEADER* h = - reinterpret_cast<VIDEOINFOHEADER*>(media_type->pbFormat); - format.frame_size.SetSize(h->bmiHeader.biWidth, h->bmiHeader.biHeight); - - // Try to get a better |time_per_frame| from IAMVideoControl. If not, use - // the value from VIDEOINFOHEADER. - REFERENCE_TIME time_per_frame = h->AvgTimePerFrame; - if (video_control.Get()) { - ScopedCoMem<LONGLONG> max_fps; - LONG list_size = 0; - const SIZE size = {format.frame_size.width(), - format.frame_size.height()}; - hr = video_control->GetFrameRateList(output_capture_pin_.Get(), - stream_index, size, &list_size, - &max_fps); - // Can't assume the first value will return the max fps. - // Sometimes |list_size| will be > 0, but max_fps will be NULL. Some - // drivers may return an HRESULT of S_FALSE which SUCCEEDED() translates - // into success, so explicitly check S_OK. See http://crbug.com/306237. - if (hr == S_OK && list_size > 0 && max_fps) { - time_per_frame = - *std::min_element(max_fps.get(), max_fps.get() + list_size); - } - } - - format.frame_rate = - (time_per_frame > 0) - ? (kSecondsToReferenceTime / static_cast<float>(time_per_frame)) - : 0.0; - - capabilities_.emplace_back(stream_index, format, h->bmiHeader); - } - } - + GetPinCapabilityList(capture_filter_, output_capture_pin_, &capabilities_); return !capabilities_.empty(); }
diff --git a/media/capture/video/win/video_capture_device_win.h b/media/capture/video/win/video_capture_device_win.h index 7ae6a710..facee7e3 100644 --- a/media/capture/video/win/video_capture_device_win.h +++ b/media/capture/video/win/video_capture_device_win.h
@@ -56,6 +56,12 @@ AM_MEDIA_TYPE* media_type_; }; + static void GetDeviceCapabilityList(const std::string& device_id, + CapabilityList* out_capability_list); + static void GetPinCapabilityList( + base::win::ScopedComPtr<IBaseFilter> capture_filter, + base::win::ScopedComPtr<IPin> output_capture_pin, + CapabilityList* out_capability_list); static HRESULT GetDeviceFilter(const std::string& device_id, IBaseFilter** filter); static base::win::ScopedComPtr<IPin> GetPin(IBaseFilter* filter,
diff --git a/media/filters/pipeline_controller.cc b/media/filters/pipeline_controller.cc index e5d0245..aad3e4f9 100644 --- a/media/filters/pipeline_controller.cc +++ b/media/filters/pipeline_controller.cc
@@ -45,7 +45,7 @@ bool is_streaming, bool is_static) { DCHECK(thread_checker_.CalledOnValidThread()); - DCHECK(state_ == State::CREATED); + DCHECK_EQ(state_, State::STOPPED); DCHECK(demuxer); // Once the pipeline is started, we want to call the seeked callback but @@ -247,12 +247,18 @@ } void PipelineController::Stop() { - // For the moment, Stop() is only called on WMPI destruction, and updating the - // state of |this| is not relevant. Eventually, Start()/Stop() will be called - // in order to swap between demuxer types, and this will need to be adressed. - // - // TODO(tguilbert): Clarify the appropriate state changes when Stop() is - // called. See crbug.com/695734. + if (state_ == State::STOPPED) + return; + + demuxer_ = nullptr; + waiting_for_seek_ = false; + pending_seeked_cb_ = false; + pending_time_updated_ = false; + pending_seek_ = false; + pending_suspend_ = false; + pending_resume_ = false; + state_ = State::STOPPED; + pipeline_->Stop(); }
diff --git a/media/filters/pipeline_controller.h b/media/filters/pipeline_controller.h index 79cb14b..e8fce793 100644 --- a/media/filters/pipeline_controller.h +++ b/media/filters/pipeline_controller.h
@@ -30,7 +30,7 @@ class MEDIA_EXPORT PipelineController { public: enum class State { - CREATED, + STOPPED, STARTING, PLAYING, SEEKING, @@ -169,7 +169,7 @@ bool is_static_ = true; // Tracks the current state of |pipeline_|. - State state_ = State::CREATED; + State state_ = State::STOPPED; // Indicates that a seek has occurred. When set, a seeked callback will be // issued at the next stable state.
diff --git a/media/gpu/ipc/service/gpu_video_decode_accelerator.cc b/media/gpu/ipc/service/gpu_video_decode_accelerator.cc index 0394ce47..61c6b2e 100644 --- a/media/gpu/ipc/service/gpu_video_decode_accelerator.cc +++ b/media/gpu/ipc/service/gpu_video_decode_accelerator.cc
@@ -434,53 +434,58 @@ return; } for (size_t j = 0; j < textures_per_buffer_; j++) { - gpu::gles2::TextureRef* texture_ref = - texture_manager->GetTexture(buffer_texture_ids[j]); - if (!texture_ref) { + GLuint service_id = 0; + if (!command_decoder->GetServiceTextureId(buffer_texture_ids[j], + &service_id)) { DLOG(ERROR) << "Failed to find texture id " << buffer_texture_ids[j]; NotifyError(VideoDecodeAccelerator::INVALID_ARGUMENT); return; } - gpu::gles2::Texture* info = texture_ref->texture(); - if (info->target() != texture_target_) { - DLOG(ERROR) << "Texture target mismatch for texture id " - << buffer_texture_ids[j]; - NotifyError(VideoDecodeAccelerator::INVALID_ARGUMENT); - return; - } - if (texture_target_ == GL_TEXTURE_EXTERNAL_OES || - texture_target_ == GL_TEXTURE_RECTANGLE_ARB) { - // These textures have their dimensions defined by the underlying - // storage. - // Use |texture_dimensions_| for this size. - texture_manager->SetLevelInfo(texture_ref, texture_target_, 0, GL_RGBA, - texture_dimensions_.width(), - texture_dimensions_.height(), 1, 0, - GL_RGBA, GL_UNSIGNED_BYTE, gfx::Rect()); - } else { - // For other targets, texture dimensions should already be defined. - GLsizei width = 0, height = 0; - info->GetLevelSize(texture_target_, 0, &width, &height, nullptr); - if (width != texture_dimensions_.width() || - height != texture_dimensions_.height()) { - DLOG(ERROR) << "Size mismatch for texture id " + + gpu::gles2::TextureRef* texture_ref = + texture_manager->GetTexture(buffer_texture_ids[j]); + if (texture_ref) { + gpu::gles2::Texture* info = texture_ref->texture(); + if (info->target() != texture_target_) { + DLOG(ERROR) << "Texture target mismatch for texture id " << buffer_texture_ids[j]; NotifyError(VideoDecodeAccelerator::INVALID_ARGUMENT); return; } + if (texture_target_ == GL_TEXTURE_EXTERNAL_OES || + texture_target_ == GL_TEXTURE_RECTANGLE_ARB) { + // These textures have their dimensions defined by the underlying + // storage. + // Use |texture_dimensions_| for this size. + texture_manager->SetLevelInfo(texture_ref, texture_target_, 0, + GL_RGBA, texture_dimensions_.width(), + texture_dimensions_.height(), 1, 0, + GL_RGBA, GL_UNSIGNED_BYTE, gfx::Rect()); + } else { + // For other targets, texture dimensions should already be defined. + GLsizei width = 0, height = 0; + info->GetLevelSize(texture_target_, 0, &width, &height, nullptr); + if (width != texture_dimensions_.width() || + height != texture_dimensions_.height()) { + DLOG(ERROR) << "Size mismatch for texture id " + << buffer_texture_ids[j]; + NotifyError(VideoDecodeAccelerator::INVALID_ARGUMENT); + return; + } - // TODO(dshwang): after moving to D3D11, remove this. crbug.com/438691 - GLenum format = - video_decode_accelerator_.get()->GetSurfaceInternalFormat(); - if (format != GL_RGBA) { - DCHECK(format == GL_BGRA_EXT); - texture_manager->SetLevelInfo(texture_ref, texture_target_, 0, format, - width, height, 1, 0, format, - GL_UNSIGNED_BYTE, gfx::Rect()); + // TODO(dshwang): after moving to D3D11, remove this. crbug.com/438691 + GLenum format = + video_decode_accelerator_.get()->GetSurfaceInternalFormat(); + if (format != GL_RGBA) { + DCHECK(format == GL_BGRA_EXT); + texture_manager->SetLevelInfo(texture_ref, texture_target_, 0, + format, width, height, 1, 0, format, + GL_UNSIGNED_BYTE, gfx::Rect()); + } } + current_textures.push_back(texture_ref); } - service_ids.push_back(texture_ref->service_id()); - current_textures.push_back(texture_ref); + service_ids.push_back(service_id); } textures.push_back(current_textures); buffers.push_back(PictureBuffer(buffer_ids[i], texture_dimensions_,
diff --git a/media/gpu/v4l2_image_processor.cc b/media/gpu/v4l2_image_processor.cc index bbbed74..08bd66e 100644 --- a/media/gpu/v4l2_image_processor.cc +++ b/media/gpu/v4l2_image_processor.cc
@@ -365,14 +365,25 @@ DCHECK(gfx::Rect(input_allocated_size_) .Contains(gfx::Rect(input_visible_size_))); - struct v4l2_crop crop; - memset(&crop, 0, sizeof(crop)); - crop.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; - crop.c.left = 0; - crop.c.top = 0; - crop.c.width = base::checked_cast<__u32>(input_visible_size_.width()); - crop.c.height = base::checked_cast<__u32>(input_visible_size_.height()); - IOCTL_OR_ERROR_RETURN_FALSE(VIDIOC_S_CROP, &crop); + struct v4l2_rect visible_rect; + visible_rect.left = 0; + visible_rect.top = 0; + visible_rect.width = base::checked_cast<__u32>(input_visible_size_.width()); + visible_rect.height = base::checked_cast<__u32>(input_visible_size_.height()); + + struct v4l2_selection selection_arg; + memset(&selection_arg, 0, sizeof(selection_arg)); + selection_arg.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; + selection_arg.target = V4L2_SEL_TGT_CROP; + selection_arg.r = visible_rect; + if (device_->Ioctl(VIDIOC_S_SELECTION, &selection_arg) != 0) { + DVLOG(2) << "Fallback to VIDIOC_S_CROP for input buffers."; + struct v4l2_crop crop; + memset(&crop, 0, sizeof(crop)); + crop.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; + crop.c = visible_rect; + IOCTL_OR_ERROR_RETURN_FALSE(VIDIOC_S_CROP, &crop); + } struct v4l2_requestbuffers reqbufs; memset(&reqbufs, 0, sizeof(reqbufs)); @@ -416,14 +427,26 @@ .Contains(gfx::Rect(output_allocated_size_))); output_allocated_size_ = adjusted_allocated_size; - struct v4l2_crop crop; - memset(&crop, 0, sizeof(crop)); - crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; - crop.c.left = 0; - crop.c.top = 0; - crop.c.width = base::checked_cast<__u32>(output_visible_size_.width()); - crop.c.height = base::checked_cast<__u32>(output_visible_size_.height()); - IOCTL_OR_ERROR_RETURN_FALSE(VIDIOC_S_CROP, &crop); + struct v4l2_rect visible_rect; + visible_rect.left = 0; + visible_rect.top = 0; + visible_rect.width = base::checked_cast<__u32>(output_visible_size_.width()); + visible_rect.height = + base::checked_cast<__u32>(output_visible_size_.height()); + + struct v4l2_selection selection_arg; + memset(&selection_arg, 0, sizeof(selection_arg)); + selection_arg.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + selection_arg.target = V4L2_SEL_TGT_COMPOSE; + selection_arg.r = visible_rect; + if (device_->Ioctl(VIDIOC_S_SELECTION, &selection_arg) != 0) { + DVLOG(2) << "Fallback to VIDIOC_S_CROP for output buffers."; + struct v4l2_crop crop; + memset(&crop, 0, sizeof(crop)); + crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; + crop.c = visible_rect; + IOCTL_OR_ERROR_RETURN_FALSE(VIDIOC_S_CROP, &crop); + } struct v4l2_requestbuffers reqbufs; memset(&reqbufs, 0, sizeof(reqbufs));
diff --git a/media/renderers/video_renderer_impl.cc b/media/renderers/video_renderer_impl.cc index def6618..34185302 100644 --- a/media/renderers/video_renderer_impl.cc +++ b/media/renderers/video_renderer_impl.cc
@@ -557,35 +557,62 @@ // Paint the first frame if possible and necessary. Paint ahead of // HAVE_ENOUGH_DATA to ensure the user sees the frame as early as possible. + bool just_painted_first_frame = false; if (!sink_started_ && algorithm_->frames_queued() && !painted_first_frame_) { // We want to paint the first frame under two conditions: Either (1) we have // enough frames to know it's definitely the first frame or (2) there may be // no more frames coming (sometimes unless we paint one of them). // - // For the first condition, we need at least two frames or the first frame - // must have a timestamp >= |start_timestamp_|, since otherwise we may be - // prerolling frames before the actual start time that will be dropped. - if (algorithm_->frames_queued() > 1 || received_end_of_stream_ || - frame->timestamp() >= start_timestamp_ || low_delay_ || - !video_frame_stream_->CanReadWithoutStalling()) { + // For the first condition, we need at least two effective frames, since + // otherwise we may be prerolling frames before the actual start time that + // will be dropped. + bool should_paint_first_frame = + algorithm_->effective_frames_queued() > 1 || received_end_of_stream_ || + !video_frame_stream_->CanReadWithoutStalling(); + + // For the very first frame (i.e. not after seeks), we want to paint as fast + // as possible to ensure users don't abandon the playback. For live streams + // with long duration frames, waiting for a second frame may take seconds. + // + // Before time starts progressing we may not know if frames are effective or + // not, so the first frame must check if timestamp >= |start_timestamp_|. + // + // We only do this for the very first frame ever painted, since later frames + // risk being wrong due to the lack of duration on the first frame. This + // avoids any fast-forward or frame-flipping type effects as we try to + // resume after a seek. + if (!have_renderered_frames_ && !should_paint_first_frame) { + should_paint_first_frame = + frame->timestamp() >= start_timestamp_ || low_delay_; + } + + if (should_paint_first_frame) { scoped_refptr<VideoFrame> first_frame = algorithm_->Render(base::TimeTicks(), base::TimeTicks(), nullptr); CheckForMetadataChanges(first_frame->format(), first_frame->natural_size()); sink_->PaintSingleFrame(first_frame); - painted_first_frame_ = true; + just_painted_first_frame = painted_first_frame_ = true; } } // Signal buffering state if we've met our conditions. - if (buffering_state_ == BUFFERING_HAVE_NOTHING && HaveEnoughData_Locked()) + // + // If we've just painted the first frame, require the standard 1 frame for low + // latency playback. If we're resuming after a Flush(), wait until we have two + // frames even in low delay mode to avoid any kind of fast-forward or frame + // flipping effect while we attempt to find the best frame. + if (buffering_state_ == BUFFERING_HAVE_NOTHING && + HaveEnoughData_Locked(just_painted_first_frame ? 1u : 2u)) { TransitionToHaveEnough_Locked(); + } // Always request more decoded video if we have capacity. AttemptRead_Locked(); } -bool VideoRendererImpl::HaveEnoughData_Locked() { +bool VideoRendererImpl::HaveEnoughData_Locked( + size_t low_latency_frames_required) const { DCHECK_EQ(state_, kPlaying); lock_.AssertAcquired(); @@ -602,10 +629,16 @@ if (was_background_rendering_ && frames_decoded_) return true; - if (!low_delay_ && video_frame_stream_->CanReadWithoutStalling()) + // Note: We still require an effective frame in the stalling case since this + // method is also used to inform TransitionToHaveNothing_Locked() and thus + // would never pause and rebuffer if we always return true here. + if (!video_frame_stream_->CanReadWithoutStalling()) + return algorithm_->effective_frames_queued() > 0u; + + if (!low_delay_) return false; - return algorithm_->effective_frames_queued() > 0; + return algorithm_->effective_frames_queued() >= low_latency_frames_required; } void VideoRendererImpl::TransitionToHaveEnough_Locked() { @@ -725,7 +758,7 @@ } } -bool VideoRendererImpl::HaveReachedBufferingCap() { +bool VideoRendererImpl::HaveReachedBufferingCap() const { DCHECK(task_runner_->BelongsToCurrentThread()); if (use_complexity_based_buffering_)
diff --git a/media/renderers/video_renderer_impl.h b/media/renderers/video_renderer_impl.h index 2785bed..0cf59f82 100644 --- a/media/renderers/video_renderer_impl.h +++ b/media/renderers/video_renderer_impl.h
@@ -140,7 +140,12 @@ // Returns true if the renderer has enough data for playback purposes. // Note that having enough data may be due to reaching end of stream. - bool HaveEnoughData_Locked(); + // + // |low_latency_frames_required| indicates the required number of frame for + // have enough with a low latency playback. By default it's one frame, but + // during resume after a Flush() we may wait for 2 frames to ensure we have + // effective frames. + bool HaveEnoughData_Locked(size_t low_latency_frames_required = 1u) const; void TransitionToHaveEnough_Locked(); void TransitionToHaveNothing(); void TransitionToHaveNothing_Locked(); @@ -150,7 +155,7 @@ void UpdateStats_Locked(); // Returns true if there is no more room for additional buffered frames. - bool HaveReachedBufferingCap(); + bool HaveReachedBufferingCap() const; // Starts or stops |sink_| respectively. Do not call while |lock_| is held. void StartSink();
diff --git a/media/renderers/video_renderer_impl_unittest.cc b/media/renderers/video_renderer_impl_unittest.cc index eea5882..486ae88 100644 --- a/media/renderers/video_renderer_impl_unittest.cc +++ b/media/renderers/video_renderer_impl_unittest.cc
@@ -433,13 +433,14 @@ EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber()); EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)) .WillOnce(RunClosure(event.GetClosure())); + // Note: In the normal underflow case we queue 5 frames here instead of // four since the underflow increases the number of required frames to // reach the have enough state. if (type == UnderflowTestType::NORMAL) QueueFrames("80 100 120 140 160"); else - QueueFrames("40 60 80 90"); + QueueFrames("40 60 80 90 100"); SatisfyPendingDecode(); event.RunAndWait(); }
diff --git a/media/test/data/load_many_videos.html b/media/test/data/load_many_videos.html deleted file mode 100644 index 0eacf6f..0000000 --- a/media/test/data/load_many_videos.html +++ /dev/null
@@ -1,64 +0,0 @@ -<!-- -Loads lots of videos to make sure that we don't deadlock somewhere -while loading lots of videos. We try a variety of video formats and -containers to try to cover different read patterns. ---> -<html> -<body onload="RunTest();"> -<video controls preload=audo src="bear-320x180-hi10p.mp4"></video><br> -<video controls preload=audo src="bear-320x180-hi10p.mp4?A"></video><br> -<video controls preload=audo src="bear-320x180-hi10p.mp4?B"></video><br> -<video controls preload=audo src="bear-320x180-hi10p.mp4?C"></video><br> -<video controls preload=audo src="bear-320x180-hi10p.mp4?D"></video><br> -<video controls preload=audo src="bear-320x180-hi10p.mp4?E"></video><br> -<video controls preload=audo src="bear-320x180-hi10p.mp4?F"></video><br> -<video controls preload=audo src="bear-320x180-hi10p.mp4?G"></video><br> -<video controls preload=audo src="bear-320x180-hi10p.mp4?H"></video><br> -<video controls preload=audo src="bear-320x180-hi10p.mp4?I"></video><br> -<video controls preload=audo src="bear-320x180-hi10p.mp4?J"></video><br> -<video controls preload=audo src="bear-320x180-hi10p.mp4?K"></video><br> -<video controls preload=audo src="bear-320x180-hi10p.mp4?L"></video><br> -<video controls preload=audo src="bear-320x180-hi10p.mp4?M"></video><br> -<video controls preload=audo src="bear-320x180-hi10p.mp4?N"></video><br> -<video controls preload=audo src="bear-320x180-hi10p.mp4?O"></video><br> -<video controls preload=audo src="bear-320x180-hi10p.mp4?P"></video><br> -<video controls preload=audo src="bear-320x180-hi10p.mp4?Q"></video><br> -<video controls preload=audo src="bear-320x180-hi10p.mp4?R"></video><br> -<video controls preload=audo src="bear-320x180-hi10p.mp4?S"></video><br> -<video controls preload=audo src="bear-320x180-hi10p.mp4?T"></video><br> -<video controls preload=audo src="bear-320x180-hi10p.mp4?U"></video><br> -<video controls preload=audo src="bear-320x180-hi10p.mp4?V"></video><br> -<video controls preload=audo src="bear-320x180-hi10p.mp4?W"></video><br> -<video controls preload=audo src="bear-320x180-hi10p.mp4?X"></video><br> -<video controls preload=audo src="bear-320x180-hi10p.mp4?Y"></video><br> -<video controls preload=audo src="bear-320x180-hi10p.mp4?Z"></video><br> -<video controls preload=audo src="bear-1280x720.mp4"></video><br> -<video controls preload=audo src="bear-320x240.webm"></video><br> -<video controls preload=audo src="bear.mp4"></video><br> -<video controls preload=audo src="bear-vp8a.webm"></video><br> -<video controls preload=audo src="bear-320x240-video-only.webm"></video><br> -<video controls preload=audo src="bear-320x240-vp9_profile2.webm"></video><br> -<video controls preload=audo src="bear-320x180-hi12p-vp9.webm"></video><br> -<video controls preload=audo src="bbb-320x240-2video-2audio.mp4"></video><br> -<video controls preload=audo src="bear-1280x720-av_with-aud-nalus_frag.mp4"></video><br> -<video controls preload=audo src="bear-vp8-webvtt.webm"></video><br> -</body> - -<script> - function CheckIfDone() { - console.log("Done?"); - var players = document.getElementsByTagName("video"); - for (var i = 0; i < players.length; i++) { - if (players[i].readyState < 4) return; - } - document.title = "ENDED"; - } - function RunTest() { - var players = document.getElementsByTagName("video"); - for (var i = 0; i < players.length; i++) { - players[i].addEventListener('canplaythrough', function(e) { CheckIfDone(); }); - } - CheckIfDone(); - } -</script> -</html>
diff --git a/media/test/pipeline_integration_test_base.cc b/media/test/pipeline_integration_test_base.cc index cae4034..6f08481 100644 --- a/media/test/pipeline_integration_test_base.cc +++ b/media/test/pipeline_integration_test_base.cc
@@ -192,6 +192,7 @@ void PipelineIntegrationTestBase::OnError(PipelineStatus status) { DCHECK_NE(status, PIPELINE_OK); pipeline_status_ = status; + pipeline_->Stop(); scoped_task_environment_.GetMainThreadTaskRunner()->PostTask( FROM_HERE, base::MessageLoop::QuitWhenIdleClosure()); }
diff --git a/mojo/edk/embedder/README.md b/mojo/edk/embedder/README.md index 99ec23e..2e7c02d 100644 --- a/mojo/edk/embedder/README.md +++ b/mojo/edk/embedder/README.md
@@ -59,7 +59,7 @@ base::Thread ipc_thread("ipc!"); ipc_thread.StartWithOptions( - base::Thread::Options(base::MessageLoop::TYPE_IO)); + base::Thread::Options(base::MessageLoop::TYPE_IO, 0)); // As long as this object is alive, all EDK API surface relevant to IPC // connections is usable and message pipes which span a process boundary will @@ -120,7 +120,7 @@ base::Thread ipc_thread("ipc!"); ipc_thread.StartWithOptions( - base::Thread::Options(base::MessageLoop::TYPE_IO)); + base::Thread::Options(base::MessageLoop::TYPE_IO, 0)); mojo::edk::ScopedIPCSupport ipc_support( ipc_thread.task_runner(), @@ -164,7 +164,7 @@ base::Thread ipc_thread("ipc!"); ipc_thread.StartWithOptions( - base::Thread::Options(base::MessageLoop::TYPE_IO)); + base::Thread::Options(base::MessageLoop::TYPE_IO, 0)); mojo::edk::ScopedIPCSupport ipc_support( ipc_thread.task_runner(), @@ -212,7 +212,7 @@ base::Thread ipc_thread("ipc!"); ipc_thread.StartWithOptions( - base::Thread::Options(base::MessageLoop::TYPE_IO)); + base::Thread::Options(base::MessageLoop::TYPE_IO, 0)); mojo::edk::ScopedIPCSupport ipc_support( ipc_thread.task_runner(),
diff --git a/mojo/public/cpp/bindings/interface_id.h b/mojo/public/cpp/bindings/interface_id.h index 53475d6..d612853 100644 --- a/mojo/public/cpp/bindings/interface_id.h +++ b/mojo/public/cpp/bindings/interface_id.h
@@ -30,6 +30,10 @@ return id != kInvalidInterfaceId; } +inline bool HasInterfaceIdNamespaceBitSet(InterfaceId id) { + return (id & kInterfaceIdNamespaceMask) != 0; +} + } // namespace mojo #endif // MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_ID_H_
diff --git a/mojo/public/cpp/bindings/lib/multiplex_router.cc b/mojo/public/cpp/bindings/lib/multiplex_router.cc index 54fae5c8..031822c 100644 --- a/mojo/public/cpp/bindings/lib/multiplex_router.cc +++ b/mojo/public/cpp/bindings/lib/multiplex_router.cc
@@ -442,6 +442,14 @@ if (!IsValidInterfaceId(id)) return ScopedInterfaceEndpointHandle(); + // Unless it is the master ID, |id| is from the remote side and therefore its + // namespace bit is supposed to be different than the value that this router + // would use. + if (!IsMasterInterfaceId(id) && + set_interface_id_namespace_bit_ == HasInterfaceIdNamespaceBitSet(id)) { + return ScopedInterfaceEndpointHandle(); + } + MayAutoLock locker(&lock_); bool inserted = false; InterfaceEndpoint* endpoint = FindOrInsertEndpoint(id, &inserted); @@ -451,13 +459,13 @@ if (encountered_error_) UpdateEndpointStateMayRemove(endpoint, PEER_ENDPOINT_CLOSED); } else { - // If the endpoint already exist, it is because we have received a - // notification that the peer endpoint has closed. - CHECK(!endpoint->closed()); - CHECK(endpoint->peer_closed()); - if (endpoint->handle_created()) return ScopedInterfaceEndpointHandle(); + + // If the endpoint already exist, it is because we have received a + // notification that the peer endpoint has closed. + DCHECK(!endpoint->closed()); + DCHECK(endpoint->peer_closed()); } endpoint->set_handle_created();
diff --git a/mojo/public/js/new_bindings/interface_types.js b/mojo/public/js/new_bindings/interface_types.js index 3d35e8c..b7085e5a 100644 --- a/mojo/public/js/new_bindings/interface_types.js +++ b/mojo/public/js/new_bindings/interface_types.js
@@ -77,12 +77,20 @@ return interfaceId !== kInvalidInterfaceId; } + function hasInterfaceIdNamespaceBitSet(interfaceId) { + if (interfaceId >= 2 * kInterfaceIdNamespaceMask) { + throw new Error("Interface ID should be a 32-bit unsigned integer."); + } + return interfaceId >= kInterfaceIdNamespaceMask; + } + mojo.InterfacePtrInfo = InterfacePtrInfo; mojo.InterfaceRequest = InterfaceRequest; mojo.AssociatedInterfacePtrInfo = AssociatedInterfacePtrInfo; mojo.AssociatedInterfaceRequest = AssociatedInterfaceRequest; internal.isMasterInterfaceId = isMasterInterfaceId; internal.isValidInterfaceId = isValidInterfaceId; + internal.hasInterfaceIdNamespaceBitSet = hasInterfaceIdNamespaceBitSet; internal.kInvalidInterfaceId = kInvalidInterfaceId; internal.kMasterInterfaceId = kMasterInterfaceId; internal.kInterfaceIdNamespaceMask = kInterfaceIdNamespaceMask;
diff --git a/mojo/public/js/new_bindings/router.js b/mojo/public/js/new_bindings/router.js index c7065dc..9aab9c2 100644 --- a/mojo/public/js/new_bindings/router.js +++ b/mojo/public/js/new_bindings/router.js
@@ -165,6 +165,15 @@ return new internal.InterfaceEndpointHandle(); } + // Unless it is the master ID, |interfaceId| is from the remote side and + // therefore its namespace bit is supposed to be different than the value + // that this router would use. + if (!internal.isMasterInterfaceId(interfaceId) && + this.setInterfaceIdNamespaceBit_ === + internal.hasInterfaceIdNamespaceBitSet(interfaceId)) { + return new internal.InterfaceEndpointHandle(); + } + var endpoint = this.endpoints_.get(interfaceId); if (!endpoint) {
diff --git a/mojo/public/js/router.js b/mojo/public/js/router.js index 5fc0ed56..805f663 100644 --- a/mojo/public/js/router.js +++ b/mojo/public/js/router.js
@@ -194,14 +194,14 @@ EndpointStateUpdateType.PEER_ENDPOINT_CLOSED); } } else { + if (endpoint.handleCreated) { + return new InterfaceEndpointHandle(); + } + // If the endpoint already exist, it is because we have received a // notification that the peer endpoint has closed. check(!endpoint.closed); check(endpoint.peerClosed); - - if (endpoint.handleCreated) { - return new InterfaceEndpointHandle(); - } } endpoint.handleCreated = true;
diff --git a/net/base/network_change_notifier.cc b/net/base/network_change_notifier.cc index 080e7427..6bca78c 100644 --- a/net/base/network_change_notifier.cc +++ b/net/base/network_change_notifier.cc
@@ -63,18 +63,17 @@ NetworkChangeNotifier::kInvalidNetworkHandle = -1; // The main observer class that records UMAs for network events. -class HistogramWatcher - : public NetworkChangeNotifier::ConnectionTypeObserver, - public NetworkChangeNotifier::IPAddressObserver, - public NetworkChangeNotifier::DNSObserver, - public NetworkChangeNotifier::NetworkChangeObserver { +class NetworkChangeNotifier::HistogramWatcher : public ConnectionTypeObserver, + public IPAddressObserver, + public DNSObserver, + public NetworkChangeObserver { public: HistogramWatcher() : last_ip_address_change_(base::TimeTicks::Now()), last_connection_change_(base::TimeTicks::Now()), last_dns_change_(base::TimeTicks::Now()), last_network_change_(base::TimeTicks::Now()), - last_connection_type_(NetworkChangeNotifier::CONNECTION_UNKNOWN), + last_connection_type_(CONNECTION_UNKNOWN), offline_packets_received_(0), bytes_read_since_last_connection_change_(0), peak_kbps_since_last_connection_change_(0) {} @@ -87,22 +86,22 @@ void Init() { DCHECK(thread_checker_.CalledOnValidThread()); DCHECK(g_network_change_notifier); - NetworkChangeNotifier::AddConnectionTypeObserver(this); - NetworkChangeNotifier::AddIPAddressObserver(this); - NetworkChangeNotifier::AddDNSObserver(this); - NetworkChangeNotifier::AddNetworkChangeObserver(this); + AddConnectionTypeObserver(this); + AddIPAddressObserver(this); + AddDNSObserver(this); + AddNetworkChangeObserver(this); } ~HistogramWatcher() override { DCHECK(thread_checker_.CalledOnValidThread()); DCHECK(g_network_change_notifier); - NetworkChangeNotifier::RemoveConnectionTypeObserver(this); - NetworkChangeNotifier::RemoveIPAddressObserver(this); - NetworkChangeNotifier::RemoveDNSObserver(this); - NetworkChangeNotifier::RemoveNetworkChangeObserver(this); + RemoveConnectionTypeObserver(this); + RemoveIPAddressObserver(this); + RemoveDNSObserver(this); + RemoveNetworkChangeObserver(this); } - // NetworkChangeNotifier::IPAddressObserver implementation. + // IPAddressObserver implementation. void OnIPAddressChanged() override { DCHECK(thread_checker_.CalledOnValidThread()); UMA_HISTOGRAM_MEDIUM_TIMES("NCN.IPAddressChange", @@ -112,58 +111,57 @@ last_ip_address_change_ - last_connection_change_); } - // NetworkChangeNotifier::ConnectionTypeObserver implementation. - void OnConnectionTypeChanged( - NetworkChangeNotifier::ConnectionType type) override { + // ConnectionTypeObserver implementation. + void OnConnectionTypeChanged(ConnectionType type) override { DCHECK(thread_checker_.CalledOnValidThread()); base::TimeTicks now = base::TimeTicks::Now(); int32_t kilobytes_read = bytes_read_since_last_connection_change_ / 1000; base::TimeDelta state_duration = SinceLast(&last_connection_change_); if (bytes_read_since_last_connection_change_) { switch (last_connection_type_) { - case NetworkChangeNotifier::CONNECTION_UNKNOWN: + case CONNECTION_UNKNOWN: UMA_HISTOGRAM_TIMES("NCN.CM.FirstReadOnUnknown", first_byte_after_connection_change_); UMA_HISTOGRAM_TIMES("NCN.CM.FastestRTTOnUnknown", fastest_RTT_since_last_connection_change_); break; - case NetworkChangeNotifier::CONNECTION_ETHERNET: + case CONNECTION_ETHERNET: UMA_HISTOGRAM_TIMES("NCN.CM.FirstReadOnEthernet", first_byte_after_connection_change_); UMA_HISTOGRAM_TIMES("NCN.CM.FastestRTTOnEthernet", fastest_RTT_since_last_connection_change_); break; - case NetworkChangeNotifier::CONNECTION_WIFI: + case CONNECTION_WIFI: UMA_HISTOGRAM_TIMES("NCN.CM.FirstReadOnWifi", first_byte_after_connection_change_); UMA_HISTOGRAM_TIMES("NCN.CM.FastestRTTOnWifi", fastest_RTT_since_last_connection_change_); break; - case NetworkChangeNotifier::CONNECTION_2G: + case CONNECTION_2G: UMA_HISTOGRAM_TIMES("NCN.CM.FirstReadOn2G", first_byte_after_connection_change_); UMA_HISTOGRAM_TIMES("NCN.CM.FastestRTTOn2G", fastest_RTT_since_last_connection_change_); break; - case NetworkChangeNotifier::CONNECTION_3G: + case CONNECTION_3G: UMA_HISTOGRAM_TIMES("NCN.CM.FirstReadOn3G", first_byte_after_connection_change_); UMA_HISTOGRAM_TIMES("NCN.CM.FastestRTTOn3G", fastest_RTT_since_last_connection_change_); break; - case NetworkChangeNotifier::CONNECTION_4G: + case CONNECTION_4G: UMA_HISTOGRAM_TIMES("NCN.CM.FirstReadOn4G", first_byte_after_connection_change_); UMA_HISTOGRAM_TIMES("NCN.CM.FastestRTTOn4G", fastest_RTT_since_last_connection_change_); break; - case NetworkChangeNotifier::CONNECTION_NONE: + case CONNECTION_NONE: UMA_HISTOGRAM_TIMES("NCN.CM.FirstReadOnNone", first_byte_after_connection_change_); UMA_HISTOGRAM_TIMES("NCN.CM.FastestRTTOnNone", fastest_RTT_since_last_connection_change_); break; - case NetworkChangeNotifier::CONNECTION_BLUETOOTH: + case CONNECTION_BLUETOOTH: UMA_HISTOGRAM_TIMES("NCN.CM.FirstReadOnBluetooth", first_byte_after_connection_change_); UMA_HISTOGRAM_TIMES("NCN.CM.FastestRTTOnBluetooth", @@ -172,78 +170,78 @@ } if (peak_kbps_since_last_connection_change_) { switch (last_connection_type_) { - case NetworkChangeNotifier::CONNECTION_UNKNOWN: + case CONNECTION_UNKNOWN: UMA_HISTOGRAM_COUNTS_1M("NCN.CM.PeakKbpsOnUnknown", peak_kbps_since_last_connection_change_); break; - case NetworkChangeNotifier::CONNECTION_ETHERNET: + case CONNECTION_ETHERNET: UMA_HISTOGRAM_COUNTS_1M("NCN.CM.PeakKbpsOnEthernet", peak_kbps_since_last_connection_change_); break; - case NetworkChangeNotifier::CONNECTION_WIFI: + case CONNECTION_WIFI: UMA_HISTOGRAM_COUNTS_1M("NCN.CM.PeakKbpsOnWifi", peak_kbps_since_last_connection_change_); break; - case NetworkChangeNotifier::CONNECTION_2G: + case CONNECTION_2G: UMA_HISTOGRAM_COUNTS_1M("NCN.CM.PeakKbpsOn2G", peak_kbps_since_last_connection_change_); break; - case NetworkChangeNotifier::CONNECTION_3G: + case CONNECTION_3G: UMA_HISTOGRAM_COUNTS_1M("NCN.CM.PeakKbpsOn3G", peak_kbps_since_last_connection_change_); break; - case NetworkChangeNotifier::CONNECTION_4G: + case CONNECTION_4G: UMA_HISTOGRAM_COUNTS_1M("NCN.CM.PeakKbpsOn4G", peak_kbps_since_last_connection_change_); break; - case NetworkChangeNotifier::CONNECTION_NONE: + case CONNECTION_NONE: UMA_HISTOGRAM_COUNTS_1M("NCN.CM.PeakKbpsOnNone", peak_kbps_since_last_connection_change_); break; - case NetworkChangeNotifier::CONNECTION_BLUETOOTH: + case CONNECTION_BLUETOOTH: UMA_HISTOGRAM_COUNTS_1M("NCN.CM.PeakKbpsOnBluetooth", peak_kbps_since_last_connection_change_); break; } } switch (last_connection_type_) { - case NetworkChangeNotifier::CONNECTION_UNKNOWN: + case CONNECTION_UNKNOWN: UMA_HISTOGRAM_LONG_TIMES("NCN.CM.TimeOnUnknown", state_duration); UMA_HISTOGRAM_COUNTS_1M("NCN.CM.KBTransferedOnUnknown", kilobytes_read); break; - case NetworkChangeNotifier::CONNECTION_ETHERNET: + case CONNECTION_ETHERNET: UMA_HISTOGRAM_LONG_TIMES("NCN.CM.TimeOnEthernet", state_duration); UMA_HISTOGRAM_COUNTS_1M("NCN.CM.KBTransferedOnEthernet", kilobytes_read); break; - case NetworkChangeNotifier::CONNECTION_WIFI: + case CONNECTION_WIFI: UMA_HISTOGRAM_LONG_TIMES("NCN.CM.TimeOnWifi", state_duration); UMA_HISTOGRAM_COUNTS_1M("NCN.CM.KBTransferedOnWifi", kilobytes_read); break; - case NetworkChangeNotifier::CONNECTION_2G: + case CONNECTION_2G: UMA_HISTOGRAM_LONG_TIMES("NCN.CM.TimeOn2G", state_duration); UMA_HISTOGRAM_COUNTS_1M("NCN.CM.KBTransferedOn2G", kilobytes_read); break; - case NetworkChangeNotifier::CONNECTION_3G: + case CONNECTION_3G: UMA_HISTOGRAM_LONG_TIMES("NCN.CM.TimeOn3G", state_duration); UMA_HISTOGRAM_COUNTS_1M("NCN.CM.KBTransferedOn3G", kilobytes_read); break; - case NetworkChangeNotifier::CONNECTION_4G: + case CONNECTION_4G: UMA_HISTOGRAM_LONG_TIMES("NCN.CM.TimeOn4G", state_duration); UMA_HISTOGRAM_COUNTS_1M("NCN.CM.KBTransferedOn4G", kilobytes_read); break; - case NetworkChangeNotifier::CONNECTION_NONE: + case CONNECTION_NONE: UMA_HISTOGRAM_LONG_TIMES("NCN.CM.TimeOnNone", state_duration); UMA_HISTOGRAM_COUNTS_1M("NCN.CM.KBTransferedOnNone", kilobytes_read); break; - case NetworkChangeNotifier::CONNECTION_BLUETOOTH: + case CONNECTION_BLUETOOTH: UMA_HISTOGRAM_LONG_TIMES("NCN.CM.TimeOnBluetooth", state_duration); UMA_HISTOGRAM_COUNTS_1M("NCN.CM.KBTransferedOnBluetooth", kilobytes_read); break; } - if (type != NetworkChangeNotifier::CONNECTION_NONE) { + if (type != CONNECTION_NONE) { UMA_HISTOGRAM_MEDIUM_TIMES("NCN.OnlineChange", state_duration); if (offline_packets_received_) { @@ -262,7 +260,7 @@ UMA_HISTOGRAM_MEDIUM_TIMES("NCN.OfflineChange", state_duration); } - NetworkChangeNotifier::LogOperatorCodeHistogram(type); + LogOperatorCodeHistogram(type); UMA_HISTOGRAM_MEDIUM_TIMES( "NCN.IPAddressChangeToConnectionTypeChange", @@ -275,17 +273,17 @@ polling_interval_ = base::TimeDelta::FromSeconds(1); } - // NetworkChangeNotifier::DNSObserver implementation. + // DNSObserver implementation. void OnDNSChanged() override { DCHECK(thread_checker_.CalledOnValidThread()); UMA_HISTOGRAM_MEDIUM_TIMES("NCN.DNSConfigChange", SinceLast(&last_dns_change_)); } - // NetworkChangeNotifier::NetworkChangeObserver implementation. - void OnNetworkChanged(NetworkChangeNotifier::ConnectionType type) override { + // NetworkChangeObserver implementation. + void OnNetworkChanged(ConnectionType type) override { DCHECK(thread_checker_.CalledOnValidThread()); - if (type != NetworkChangeNotifier::CONNECTION_NONE) { + if (type != CONNECTION_NONE) { UMA_HISTOGRAM_MEDIUM_TIMES("NCN.NetworkOnlineChange", SinceLast(&last_network_change_)); } else { @@ -323,7 +321,7 @@ peak_kbps_since_last_connection_change_ = kbps; } - if (last_connection_type_ != NetworkChangeNotifier::CONNECTION_NONE) + if (last_connection_type_ != CONNECTION_NONE) return; UMA_HISTOGRAM_MEDIUM_TIMES("NCN.OfflineDataRecv", @@ -334,11 +332,9 @@ if ((now - last_polled_connection_) > polling_interval_) { polling_interval_ *= 2; last_polled_connection_ = now; - last_polled_connection_type_ = - NetworkChangeNotifier::GetConnectionType(); + last_polled_connection_type_ = GetConnectionType(); } - if (last_polled_connection_type_ == - NetworkChangeNotifier::CONNECTION_NONE) { + if (last_polled_connection_type_ == CONNECTION_NONE) { UMA_HISTOGRAM_MEDIUM_TIMES("NCN.PollingOfflineDataRecv", now - last_connection_change_); } @@ -361,15 +357,15 @@ // |polling_interval_| is initialized by |OnConnectionTypeChanged| on our // first transition to offline and on subsequent transitions. Once offline, // |polling_interval_| doubles as offline data is received and we poll - // with |NetworkChangeNotifier::GetConnectionType| to verify the connection + // with |GetConnectionType| to verify the connection // state. base::TimeDelta polling_interval_; // |last_connection_type_| is the last value passed to // |OnConnectionTypeChanged|. - NetworkChangeNotifier::ConnectionType last_connection_type_; + ConnectionType last_connection_type_; // |last_polled_connection_type_| is last result from calling - // |NetworkChangeNotifier::GetConnectionType| in |NotifyDataReceived|. - NetworkChangeNotifier::ConnectionType last_polled_connection_type_; + // |GetConnectionType| in |NotifyDataReceived|. + ConnectionType last_polled_connection_type_; // Count of how many times NotifyDataReceived() has been called while the // NetworkChangeNotifier thought network connection was offline. int32_t offline_packets_received_;
diff --git a/net/base/network_change_notifier.h b/net/base/network_change_notifier.h index 6678979..4f22ed1 100644 --- a/net/base/network_change_notifier.h +++ b/net/base/network_change_notifier.h
@@ -18,7 +18,6 @@ namespace net { struct DnsConfig; -class HistogramWatcher; class NetworkChangeNotifierFactory; struct NetworkInterface; typedef std::vector<NetworkInterface> NetworkInterfaceList; @@ -103,6 +102,7 @@ SUBTYPE_LAST = SUBTYPE_WIFI_AD }; + // DEPRECATED. Please use NetworkChangeObserver instead. crbug.com/754695. class NET_EXPORT IPAddressObserver { public: // Will be called when the IP address of the primary interface changes. @@ -117,6 +117,7 @@ DISALLOW_COPY_AND_ASSIGN(IPAddressObserver); }; + // DEPRECATED. Please use NetworkChangeObserver instead. crbug.com/754695. class NET_EXPORT ConnectionTypeObserver { public: // Will be called when the connection type of the system has changed. @@ -374,7 +375,12 @@ // called back with notifications. This is safe to call if Create() has not // been called (as long as it doesn't race the Create() call on another // thread), in which case it will simply do nothing. + + // DEPRECATED. IPAddressObserver is deprecated. Please use + // NetworkChangeObserver instead. crbug.com/754695. static void AddIPAddressObserver(IPAddressObserver* observer); + // DEPRECATED. ConnectionTypeObserver is deprecated. Please use + // NetworkChangeObserver instead. crbug.com/754695. static void AddConnectionTypeObserver(ConnectionTypeObserver* observer); static void AddDNSObserver(DNSObserver* observer); static void AddNetworkChangeObserver(NetworkChangeObserver* observer); @@ -388,7 +394,12 @@ // nothing. Technically, it's also safe to call after the notifier object has // been destroyed, if the call doesn't race the notifier's destruction, but // there's no reason to use the API in this risky way, so don't do it. + + // DEPRECATED. IPAddressObserver is deprecated. Please use + // NetworkChangeObserver instead. crbug.com/754695. static void RemoveIPAddressObserver(IPAddressObserver* observer); + // DEPRECATED. ConnectionTypeObserver is deprecated. Please use + // NetworkChangeObserver instead. crbug.com/754695. static void RemoveConnectionTypeObserver(ConnectionTypeObserver* observer); static void RemoveDNSObserver(DNSObserver* observer); static void RemoveNetworkChangeObserver(NetworkChangeObserver* observer); @@ -548,6 +559,7 @@ friend class NetworkChangeNotifierLinuxTest; friend class NetworkChangeNotifierWinTest; + class HistogramWatcher; class NetworkState; class NetworkChangeCalculator;
diff --git a/net/dns/host_resolver_impl.cc b/net/dns/host_resolver_impl.cc index f6b1b8fa..422a8e8 100644 --- a/net/dns/host_resolver_impl.cc +++ b/net/dns/host_resolver_impl.cc
@@ -2099,6 +2099,14 @@ MakeNotStale(stale_info); return net_error; } + + // Special-case localhost names, as per the recommendations in + // https://tools.ietf.org/html/draft-west-let-localhost-be-localhost. + if (ServeLocalhost(*key, info, addresses)) { + MakeNotStale(stale_info); + return OK; + } + if (ServeFromCache(*key, info, &net_error, addresses, allow_stale, stale_info)) { source_net_log.AddEvent(NetLogEventType::HOST_RESOLVER_IMPL_CACHE_HIT, @@ -2106,6 +2114,7 @@ // |ServeFromCache()| will set |*stale_info| as needed. return net_error; } + // TODO(szym): Do not do this if nsswitch.conf instructs not to. // http://crbug.com/117655 if (ServeFromHosts(*key, info, addresses)) { @@ -2115,11 +2124,6 @@ return OK; } - if (ServeLocalhost(*key, info, addresses)) { - MakeNotStale(stale_info); - return OK; - } - return ERR_DNS_CACHE_MISS; }
diff --git a/net/dns/host_resolver_impl_unittest.cc b/net/dns/host_resolver_impl_unittest.cc index 9b3b3948..249419c 100644 --- a/net/dns/host_resolver_impl_unittest.cc +++ b/net/dns/host_resolver_impl_unittest.cc
@@ -641,30 +641,6 @@ EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname); } -// RFC 6761 localhost names should always resolve to loopback. -TEST_F(HostResolverImplTest, LocalhostLookup) { - // Add a rule resolving localhost names to a non-loopback IP and test - // that they still resolves to loopback. - proc_->AddRuleForAllFamilies("foo.localhost", "192.168.1.42"); - proc_->AddRuleForAllFamilies("localhost", "192.168.1.42"); - proc_->AddRuleForAllFamilies("localhost.", "192.168.1.42"); - - Request* req0 = CreateRequest("foo.localhost", 80); - EXPECT_THAT(req0->Resolve(), IsOk()); - EXPECT_TRUE(req0->HasAddress("127.0.0.1", 80)); - EXPECT_TRUE(req0->HasAddress("::1", 80)); - - Request* req1 = CreateRequest("localhost", 80); - EXPECT_THAT(req1->Resolve(), IsOk()); - EXPECT_TRUE(req1->HasAddress("127.0.0.1", 80)); - EXPECT_TRUE(req1->HasAddress("::1", 80)); - - Request* req2 = CreateRequest("localhost.", 80); - EXPECT_THAT(req2->Resolve(), IsOk()); - EXPECT_TRUE(req2->HasAddress("127.0.0.1", 80)); - EXPECT_TRUE(req2->HasAddress("::1", 80)); -} - TEST_F(HostResolverImplTest, LocalhostIPV4IPV6Lookup) { Request* req1 = CreateRequest("localhost6", 80, MEDIUM, ADDRESS_FAMILY_IPV4); EXPECT_THAT(req1->Resolve(), IsOk()); @@ -1713,6 +1689,56 @@ // TODO(cbentzel): Test a mix of requests with different HostResolverFlags. +// RFC 6761 localhost names should always resolve to loopback. +TEST_F(HostResolverImplDnsTest, LocalhostLookup) { + // Add a rule resolving localhost names to a non-loopback IP and test + // that they still resolves to loopback. + proc_->AddRuleForAllFamilies("foo.localhost", "192.168.1.42"); + proc_->AddRuleForAllFamilies("localhost", "192.168.1.42"); + proc_->AddRuleForAllFamilies("localhost.", "192.168.1.42"); + + Request* req0 = CreateRequest("foo.localhost", 80); + EXPECT_THAT(req0->Resolve(), IsOk()); + EXPECT_TRUE(req0->HasAddress("127.0.0.1", 80)); + EXPECT_TRUE(req0->HasAddress("::1", 80)); + + Request* req1 = CreateRequest("localhost", 80); + EXPECT_THAT(req1->Resolve(), IsOk()); + EXPECT_TRUE(req1->HasAddress("127.0.0.1", 80)); + EXPECT_TRUE(req1->HasAddress("::1", 80)); + + Request* req2 = CreateRequest("localhost.", 80); + EXPECT_THAT(req2->Resolve(), IsOk()); + EXPECT_TRUE(req2->HasAddress("127.0.0.1", 80)); + EXPECT_TRUE(req2->HasAddress("::1", 80)); +} + +// RFC 6761 localhost names should always resolve to loopback, even if a HOSTS +// file is active. +TEST_F(HostResolverImplDnsTest, LocalhostLookupWithHosts) { + DnsHosts hosts; + hosts[DnsHostsKey("localhost", ADDRESS_FAMILY_IPV4)] = + IPAddress({192, 168, 1, 1}); + hosts[DnsHostsKey("foo.localhost", ADDRESS_FAMILY_IPV4)] = + IPAddress({192, 168, 1, 2}); + + DnsConfig config = CreateValidDnsConfig(); + config.hosts = hosts; + ChangeDnsConfig(config); + + Request* req1 = CreateRequest("localhost", 80); + EXPECT_THAT(req1->Resolve(), IsOk()); + EXPECT_TRUE(req1->HasAddress("127.0.0.1", 80)); + EXPECT_TRUE(req1->HasAddress("::1", 80)); + EXPECT_FALSE(req1->HasAddress("192.168.1.1", 80)); + + Request* req2 = CreateRequest("foo.localhost", 80); + EXPECT_THAT(req2->Resolve(), IsOk()); + EXPECT_TRUE(req2->HasAddress("127.0.0.1", 80)); + EXPECT_TRUE(req2->HasAddress("::1", 80)); + EXPECT_FALSE(req2->HasAddress("192.168.1.2", 80)); +} + // Test successful and fallback resolutions in HostResolverImpl::DnsTask. TEST_F(HostResolverImplDnsTest, DnsTask) { proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102"); @@ -2102,8 +2128,11 @@ // Expect synchronous resolution from DnsHosts. EXPECT_THAT(req->Resolve(), IsOk()); - EXPECT_EQ(saw_ipv4, req->HasAddress("127.0.0.1", 80)); - EXPECT_EQ(saw_ipv6, req->HasAddress("::1", 80)); + // Localhost names always resolve to IPv4 and IPv6, regardless of the content + // written into the HOSTS file above based on the results of the + // SystemHostResolverCall at the top of this test. + EXPECT_TRUE(req->HasAddress("127.0.0.1", 80)); + EXPECT_TRUE(req->HasAddress("::1", 80)); } // Cancel a request with a single DNS transaction active.
diff --git a/net/quic/chromium/quic_chromium_client_session.h b/net/quic/chromium/quic_chromium_client_session.h index a443e4a09..73d3f05 100644 --- a/net/quic/chromium/quic_chromium_client_session.h +++ b/net/quic/chromium/quic_chromium_client_session.h
@@ -475,6 +475,8 @@ // TODO(xunjieli): It only tracks |packet_readers_|. Write a better estimate. size_t EstimateMemoryUsage() const; + bool require_confirmation() const { return require_confirmation_; } + protected: // QuicSession methods: bool ShouldCreateIncomingDynamicStream(QuicStreamId id) override;
diff --git a/net/quic/chromium/quic_chromium_packet_reader.cc b/net/quic/chromium/quic_chromium_packet_reader.cc index 97e649e..816ad536 100644 --- a/net/quic/chromium/quic_chromium_packet_reader.cc +++ b/net/quic/chromium/quic_chromium_packet_reader.cc
@@ -35,34 +35,38 @@ QuicChromiumPacketReader::~QuicChromiumPacketReader() {} void QuicChromiumPacketReader::StartReading() { - if (read_pending_) - return; + for (;;) { + if (read_pending_) + return; - if (num_packets_read_ == 0) - yield_after_ = clock_->Now() + yield_after_duration_; + if (num_packets_read_ == 0) + yield_after_ = clock_->Now() + yield_after_duration_; - DCHECK(socket_); - read_pending_ = true; - int rv = socket_->Read(read_buffer_.get(), read_buffer_->size(), - base::Bind(&QuicChromiumPacketReader::OnReadComplete, - weak_factory_.GetWeakPtr())); - UMA_HISTOGRAM_BOOLEAN("Net.QuicSession.AsyncRead", rv == ERR_IO_PENDING); - if (rv == ERR_IO_PENDING) { - num_packets_read_ = 0; - return; - } + DCHECK(socket_); + read_pending_ = true; + int rv = socket_->Read(read_buffer_.get(), read_buffer_->size(), + base::Bind(&QuicChromiumPacketReader::OnReadComplete, + weak_factory_.GetWeakPtr())); + UMA_HISTOGRAM_BOOLEAN("Net.QuicSession.AsyncRead", rv == ERR_IO_PENDING); + if (rv == ERR_IO_PENDING) { + num_packets_read_ = 0; + return; + } - if (++num_packets_read_ > yield_after_packets_ || - clock_->Now() > yield_after_) { - num_packets_read_ = 0; - // Data was read, process it. - // Schedule the work through the message loop to 1) prevent infinite - // recursion and 2) avoid blocking the thread for too long. - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::Bind(&QuicChromiumPacketReader::OnReadComplete, - weak_factory_.GetWeakPtr(), rv)); - } else { - OnReadComplete(rv); + if (++num_packets_read_ > yield_after_packets_ || + clock_->Now() > yield_after_) { + num_packets_read_ = 0; + // Data was read, process it. + // Schedule the work through the message loop to 1) prevent infinite + // recursion and 2) avoid blocking the thread for too long. + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::Bind(&QuicChromiumPacketReader::OnReadComplete, + weak_factory_.GetWeakPtr(), rv)); + } else { + if (!ProcessReadResult(rv)) { + return; + } + } } } @@ -71,14 +75,14 @@ return kMaxPacketSize; } -void QuicChromiumPacketReader::OnReadComplete(int result) { +bool QuicChromiumPacketReader::ProcessReadResult(int result) { read_pending_ = false; if (result == 0) result = ERR_CONNECTION_CLOSED; if (result < 0) { visitor_->OnReadError(result, socket_); - return; + return false; } QuicReceivedPacket packet(read_buffer_->data(), result, clock_->Now()); @@ -86,12 +90,15 @@ IPEndPoint peer_address; socket_->GetLocalAddress(&local_address); socket_->GetPeerAddress(&peer_address); - if (!visitor_->OnPacket( - packet, QuicSocketAddress(QuicSocketAddressImpl(local_address)), - QuicSocketAddress(QuicSocketAddressImpl(peer_address)))) - return; + return visitor_->OnPacket( + packet, QuicSocketAddress(QuicSocketAddressImpl(local_address)), + QuicSocketAddress(QuicSocketAddressImpl(peer_address))); +} - StartReading(); +void QuicChromiumPacketReader::OnReadComplete(int result) { + if (ProcessReadResult(result)) { + StartReading(); + } } } // namespace net
diff --git a/net/quic/chromium/quic_chromium_packet_reader.h b/net/quic/chromium/quic_chromium_packet_reader.h index 113eeef..a7ad85a 100644 --- a/net/quic/chromium/quic_chromium_packet_reader.h +++ b/net/quic/chromium/quic_chromium_packet_reader.h
@@ -55,6 +55,8 @@ private: // A completion callback invoked when a read completes. void OnReadComplete(int result); + // Return true if reading should continue. + bool ProcessReadResult(int result); DatagramClientSocket* socket_; Visitor* visitor_;
diff --git a/net/quic/chromium/quic_stream_factory.cc b/net/quic/chromium/quic_stream_factory.cc index cee86b8..9572d01 100644 --- a/net/quic/chromium/quic_stream_factory.cc +++ b/net/quic/chromium/quic_stream_factory.cc
@@ -508,8 +508,7 @@ int QuicStreamFactory::Job::DoConnect() { io_state_ = STATE_CONNECT_COMPLETE; - bool require_confirmation = factory_->require_confirmation() || - was_alternative_service_recently_broken_; + bool require_confirmation = was_alternative_service_recently_broken_; net_log_.BeginEvent( NetLogEventType::QUIC_STREAM_FACTORY_JOB_CONNECT, NetLog::BoolCallback("require_confirmation", require_confirmation)); @@ -1533,6 +1532,11 @@ SocketPerformanceWatcherFactory::PROTOCOL_QUIC, address_list); } + // Wait for handshake confirmation before allowing streams to be created if + // either this session or the factory require confirmation. + if (require_confirmation_) + require_confirmation = true; + *session = new QuicChromiumClientSession( connection, std::move(socket), this, quic_crypto_client_stream_factory_, clock_, transport_security_state_, std::move(server_info), server_id,
diff --git a/net/quic/chromium/quic_stream_factory_test.cc b/net/quic/chromium/quic_stream_factory_test.cc index 1f474bfb..2fa53972 100644 --- a/net/quic/chromium/quic_stream_factory_test.cc +++ b/net/quic/chromium/quic_stream_factory_test.cc
@@ -222,7 +222,6 @@ allow_server_migration_, force_hol_blocking_, race_cert_verification_, estimate_initial_rtt_, connection_options_, client_connection_options_, /*enable_token_binding*/ false)); - factory_->set_require_confirmation(false); } void InitializeConnectionMigrationTest( @@ -469,6 +468,7 @@ store_server_configs_in_properties_ = true; idle_connection_timeout_seconds_ = 500; Initialize(); + factory_->set_require_confirmation(false); ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); @@ -781,8 +781,8 @@ EXPECT_EQ(OK, request3.Request(host_port_pair_, version_, privacy_mode_, /*cert_verify_flags=*/0, url_, "GET", net_log_, callback_.callback())); - stream = request3.CreateStream(); // Will reset stream 5. - stream.reset(); // Will reset stream 7. + stream = request3.CreateStream(); // Will reset stream 5. + stream.reset(); // Will reset stream 7. EXPECT_TRUE(socket_data.AllReadDataConsumed()); EXPECT_TRUE(socket_data.AllWriteDataConsumed()); @@ -790,6 +790,7 @@ TEST_P(QuicStreamFactoryTest, CreateZeroRtt) { Initialize(); + factory_->set_require_confirmation(false); ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); @@ -816,6 +817,7 @@ TEST_P(QuicStreamFactoryTest, CreateZeroRttPost) { Initialize(); + factory_->set_require_confirmation(false); ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); @@ -861,10 +863,75 @@ EXPECT_TRUE(stream.get()); QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); + EXPECT_TRUE(session->require_confirmation()); EXPECT_EQ(100000u, session->connection()->GetStats().srtt_us); ASSERT_FALSE(session->config()->HasInitialRoundTripTimeUsToSend()); } +TEST_P(QuicStreamFactoryTest, RequireConfirmation) { + crypto_client_stream_factory_.set_handshake_mode( + MockCryptoClientStream::ZERO_RTT); + host_resolver_.set_synchronous_mode(true); + host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(), + "192.168.0.1", ""); + Initialize(); + factory_->set_require_confirmation(true); + ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); + crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); + + MockQuicData socket_data; + socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); + socket_data.AddWrite(ConstructInitialSettingsPacket()); + socket_data.AddSocketDataToFactory(&socket_factory_); + + QuicStreamRequest request(factory_.get()); + EXPECT_EQ(ERR_IO_PENDING, + request.Request(host_port_pair_, version_, privacy_mode_, + /*cert_verify_flags=*/0, url_, "GET", net_log_, + callback_.callback())); + + crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent( + QuicSession::HANDSHAKE_CONFIRMED); + + EXPECT_THAT(callback_.WaitForResult(), IsOk()); + std::unique_ptr<HttpStream> stream = request.CreateStream(); + EXPECT_TRUE(stream.get()); + + QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); + EXPECT_TRUE(session->require_confirmation()); +} + +TEST_P(QuicStreamFactoryTest, DontRequireConfirmationFromSameIP) { + crypto_client_stream_factory_.set_handshake_mode( + MockCryptoClientStream::ZERO_RTT); + host_resolver_.set_synchronous_mode(true); + host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(), + "192.168.0.1", ""); + Initialize(); + factory_->set_require_confirmation(true); + http_server_properties_.SetSupportsQuic(IPAddress(192, 0, 2, 33)); + + ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); + crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); + + MockQuicData socket_data; + socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); + socket_data.AddWrite(ConstructInitialSettingsPacket()); + socket_data.AddSocketDataToFactory(&socket_factory_); + + QuicStreamRequest request(factory_.get()); + EXPECT_THAT(request.Request(host_port_pair_, version_, privacy_mode_, + /*cert_verify_flags=*/0, url_, "GET", net_log_, + callback_.callback()), + IsOk()); + + std::unique_ptr<HttpStream> stream = request.CreateStream(); + EXPECT_TRUE(stream.get()); + + QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); + EXPECT_FALSE(session->require_confirmation()); +} + TEST_P(QuicStreamFactoryTest, CachedInitialRtt) { ServerNetworkStats stats; stats.srtt = base::TimeDelta::FromMilliseconds(10); @@ -4269,6 +4336,7 @@ TEST_P(QuicStreamFactoryTest, EnableNotLoadFromDiskCache) { Initialize(); + factory_->set_require_confirmation(false); ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); @@ -4453,6 +4521,7 @@ TEST_P(QuicStreamFactoryTest, YieldAfterPackets) { Initialize(); + factory_->set_require_confirmation(false); ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); QuicStreamFactoryPeer::SetYieldAfterPackets(factory_.get(), 0); @@ -4497,6 +4566,7 @@ TEST_P(QuicStreamFactoryTest, YieldAfterDuration) { Initialize(); + factory_->set_require_confirmation(false); ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); QuicStreamFactoryPeer::SetYieldAfterDuration(
diff --git a/remoting/host/BUILD.gn b/remoting/host/BUILD.gn index 1bcad96..f14db57 100644 --- a/remoting/host/BUILD.gn +++ b/remoting/host/BUILD.gn
@@ -137,6 +137,8 @@ "dns_blackhole_checker.h", "evaluate_capability.cc", "evaluate_capability.h", + "file_proxy_wrapper.cc", + "file_proxy_wrapper.h", "file_transfer_message_handler.cc", "file_transfer_message_handler.h", "file_transfer_message_handler_factory.cc",
diff --git a/remoting/host/file_proxy_wrapper.cc b/remoting/host/file_proxy_wrapper.cc new file mode 100644 index 0000000..6e1aabc --- /dev/null +++ b/remoting/host/file_proxy_wrapper.cc
@@ -0,0 +1,13 @@ +// 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 "remoting/host/file_proxy_wrapper.h" + +namespace remoting { + +FileProxyWrapper::FileProxyWrapper() = default; + +FileProxyWrapper::~FileProxyWrapper() = default; + +} // namespace remoting
diff --git a/remoting/host/file_proxy_wrapper.h b/remoting/host/file_proxy_wrapper.h new file mode 100644 index 0000000..3065b3f --- /dev/null +++ b/remoting/host/file_proxy_wrapper.h
@@ -0,0 +1,39 @@ +// 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 REMOTING_HOST_FILE_PROXY_WRAPPER_H_ +#define REMOTING_HOST_FILE_PROXY_WRAPPER_H_ + +#include "base/callback.h" +#include "base/files/file_proxy.h" +#include "remoting/proto/file_transfer.pb.h" + +namespace remoting { + +class CompoundBuffer; + +// FileProxyWrapper is an interface for implementing platform-specific file +// writers for file transfers. Each operation is posted to a separate file IO +// thread, and possibly a different process depending on the platform. +class FileProxyWrapper { + public: + typedef base::Callback<void(protocol::FileTransferResponse_ErrorCode)> + ErrorCallback; + typedef base::Callback<void()> SuccessCallback; + + FileProxyWrapper(); + virtual ~FileProxyWrapper(); + + virtual void Init(const ErrorCallback& error_callback) = 0; + virtual void CreateFile(const std::string& filename, + uint64_t filesize, + const SuccessCallback& success_callback) = 0; + virtual void WriteChunk(std::unique_ptr<CompoundBuffer> buffer) = 0; + virtual void Close(const SuccessCallback& success_callback) = 0; + virtual void Cancel() = 0; +}; + +} // namespace remoting + +#endif // REMOTING_HOST_FILE_PROXY_WRAPPER_H_
diff --git a/services/device/generic_sensor/absolute_orientation_euler_angles_fusion_algorithm_using_accelerometer_and_magnetometer.cc b/services/device/generic_sensor/absolute_orientation_euler_angles_fusion_algorithm_using_accelerometer_and_magnetometer.cc index c6f2866..7d6b45c 100644 --- a/services/device/generic_sensor/absolute_orientation_euler_angles_fusion_algorithm_using_accelerometer_and_magnetometer.cc +++ b/services/device/generic_sensor/absolute_orientation_euler_angles_fusion_algorithm_using_accelerometer_and_magnetometer.cc
@@ -118,10 +118,8 @@ // angles. DCHECK(fusion_sensor_); - // Not generating a new sensor value when the |fusion_sensor_|'s reporting - // mode is ON_CHANGE and the accelerometer reading doesn't change. - if (fusion_sensor_->GetReportingMode() == mojom::ReportingMode::ON_CHANGE && - which_sensor_changed != mojom::SensorType::ACCELEROMETER) { + // Only generate a new sensor value when the accelerometer reading changes. + if (which_sensor_changed != mojom::SensorType::ACCELEROMETER) { return false; }
diff --git a/services/device/generic_sensor/generic_sensor_service_unittest.cc b/services/device/generic_sensor/generic_sensor_service_unittest.cc index 79147698..f3ae3d98 100644 --- a/services/device/generic_sensor/generic_sensor_service_unittest.cc +++ b/services/device/generic_sensor/generic_sensor_service_unittest.cc
@@ -53,7 +53,7 @@ if (GetType() == SensorType::AMBIENT_LIGHT) { // Set the shared buffer value as frequency for testing purpose. reading.als.value = configuration.frequency(); - UpdateSensorReading(reading, true); + UpdateSensorReading(reading); } return true; }
diff --git a/services/device/generic_sensor/platform_sensor.cc b/services/device/generic_sensor/platform_sensor.cc index 7bdf40c..c77be98 100644 --- a/services/device/generic_sensor/platform_sensor.cc +++ b/services/device/generic_sensor/platform_sensor.cc
@@ -6,6 +6,7 @@ #include <utility> +#include "base/logging.h" #include "base/memory/ptr_util.h" #include "base/threading/thread_task_runner_handle.h" #include "services/device/generic_sensor/platform_sensor_provider.h" @@ -103,8 +104,7 @@ return shared_buffer_reader_->GetReading(result); } -void PlatformSensor::UpdateSensorReading(const SensorReading& reading, - bool notify_clients) { +void PlatformSensor::UpdateSensorReading(const SensorReading& reading) { ReadingBuffer* buffer = static_cast<ReadingBuffer*>(shared_buffer_mapping_.get()); auto& seqlock = buffer->seqlock.value(); @@ -112,10 +112,9 @@ buffer->reading = reading; seqlock.WriteEnd(); - if (notify_clients) - task_runner_->PostTask( - FROM_HERE, base::Bind(&PlatformSensor::NotifySensorReadingChanged, - weak_factory_.GetWeakPtr())); + task_runner_->PostTask(FROM_HERE, + base::Bind(&PlatformSensor::NotifySensorReadingChanged, + weak_factory_.GetWeakPtr())); } void PlatformSensor::NotifySensorReadingChanged() {
diff --git a/services/device/generic_sensor/platform_sensor.h b/services/device/generic_sensor/platform_sensor.h index 2bcf963c04..9e466ff 100644 --- a/services/device/generic_sensor/platform_sensor.h +++ b/services/device/generic_sensor/platform_sensor.h
@@ -84,7 +84,7 @@ // Updates shared buffer with new sensor reading data. // Note: this method is thread-safe. - void UpdateSensorReading(const SensorReading& reading, bool notify_clients); + void UpdateSensorReading(const SensorReading& reading); void NotifySensorReadingChanged(); void NotifySensorError();
diff --git a/services/device/generic_sensor/platform_sensor_accelerometer_mac.cc b/services/device/generic_sensor/platform_sensor_accelerometer_mac.cc index bc0700e7..2eaa9c9 100644 --- a/services/device/generic_sensor/platform_sensor_accelerometer_mac.cc +++ b/services/device/generic_sensor/platform_sensor_accelerometer_mac.cc
@@ -98,7 +98,7 @@ if (IsSignificantlyDifferent(reading_, reading)) { reading_ = reading; - UpdateSensorReading(reading, true); + UpdateSensorReading(reading); } }
diff --git a/services/device/generic_sensor/platform_sensor_ambient_light_mac.cc b/services/device/generic_sensor/platform_sensor_ambient_light_mac.cc index bb9208f..bd44766 100644 --- a/services/device/generic_sensor/platform_sensor_ambient_light_mac.cc +++ b/services/device/generic_sensor/platform_sensor_ambient_light_mac.cc
@@ -171,7 +171,7 @@ reading.als.timestamp = (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); reading.als.value = current_lux_; - UpdateSensorReading(reading, true); + UpdateSensorReading(reading); return true; }
diff --git a/services/device/generic_sensor/platform_sensor_and_provider_unittest_linux.cc b/services/device/generic_sensor/platform_sensor_and_provider_unittest_linux.cc index 1668e8e..871316c 100644 --- a/services/device/generic_sensor/platform_sensor_and_provider_unittest_linux.cc +++ b/services/device/generic_sensor/platform_sensor_and_provider_unittest_linux.cc
@@ -35,6 +35,8 @@ // Zero value can mean whether value is not being not used or zero value. constexpr double kZero = 0.0; +constexpr double kAmbientLightFrequencyValue = 10.0; + constexpr double kAccelerometerFrequencyValue = 10.0; constexpr double kAccelerometerOffsetValue = 1.0; constexpr double kAccelerometerScalingValue = 0.009806; @@ -655,4 +657,43 @@ scaling * (sensor_values[2] + kMagnetometerOffsetValue)); } +// Tests that Ambient Light sensor client's OnSensorReadingChanged() is called +// when the Ambient Light sensor's reporting mode is +// mojom::ReportingMode::CONTINUOUS. +TEST_F(PlatformSensorAndProviderLinuxTest, + SensorClientGetReadingChangedNotificationWhenSensorIsInContinuousMode) { + mojo::ScopedSharedBufferHandle handle = provider_->CloneSharedBufferHandle(); + mojo::ScopedSharedBufferMapping mapping = handle->MapAtOffset( + sizeof(SensorReadingSharedBuffer), + SensorReadingSharedBuffer::GetOffset(SensorType::AMBIENT_LIGHT)); + + double sensor_value[3] = {22}; + // Set a non-zero frequency here and sensor's reporting mode will be + // mojom::ReportingMode::CONTINUOUS. + InitializeSupportedSensor(SensorType::AMBIENT_LIGHT, + kAmbientLightFrequencyValue, kZero, kZero, + sensor_value); + + InitializeMockUdevMethods(sensors_dir_.GetPath()); + SetServiceStart(); + + auto sensor = CreateSensor(SensorType::AMBIENT_LIGHT); + EXPECT_TRUE(sensor); + EXPECT_EQ(mojom::ReportingMode::CONTINUOUS, sensor->GetReportingMode()); + + auto client = base::MakeUnique<NiceMock<MockPlatformSensorClient>>(sensor); + + PlatformSensorConfiguration configuration( + sensor->GetMaximumSupportedFrequency()); + EXPECT_TRUE(sensor->StartListening(client.get(), configuration)); + + WaitOnSensorReadingChangedEvent(client.get(), sensor->GetType()); + + EXPECT_TRUE(sensor->StopListening(client.get(), configuration)); + + SensorReadingSharedBuffer* buffer = + static_cast<SensorReadingSharedBuffer*>(mapping.get()); + EXPECT_THAT(buffer->reading.als.value, sensor_value[0]); +} + } // namespace device
diff --git a/services/device/generic_sensor/platform_sensor_android.cc b/services/device/generic_sensor/platform_sensor_android.cc index 5c611763..daf4d2e 100644 --- a/services/device/generic_sensor/platform_sensor_android.cc +++ b/services/device/generic_sensor/platform_sensor_android.cc
@@ -93,8 +93,7 @@ reading.raw.values[2] = value3; reading.raw.values[3] = value4; - bool needNotify = (GetReportingMode() == mojom::ReportingMode::ON_CHANGE); - UpdateSensorReading(reading, needNotify); + UpdateSensorReading(reading); } } // namespace device
diff --git a/services/device/generic_sensor/platform_sensor_fusion.cc b/services/device/generic_sensor/platform_sensor_fusion.cc index b4d49ab..15b5173 100644 --- a/services/device/generic_sensor/platform_sensor_fusion.cc +++ b/services/device/generic_sensor/platform_sensor_fusion.cc
@@ -55,17 +55,7 @@ return false; } - if (GetReportingMode() == mojom::ReportingMode::CONTINUOUS) { - timer_.Start( - FROM_HERE, - base::TimeDelta::FromMicroseconds(base::Time::kMicrosecondsPerSecond / - configuration.frequency()), - base::Bind(&PlatformSensorFusion::OnSensorReadingChanged, - base::Unretained(this), GetType())); - } - fusion_algorithm_->SetFrequency(configuration.frequency()); - return true; } @@ -73,9 +63,6 @@ for (const auto& sensor : source_sensors_) sensor->StopSensor(); - if (timer_.IsRunning()) - timer_.Stop(); - fusion_algorithm_->Reset(); } @@ -102,8 +89,7 @@ } reading_ = reading; - UpdateSensorReading(reading_, - GetReportingMode() == mojom::ReportingMode::ON_CHANGE); + UpdateSensorReading(reading_); } void PlatformSensorFusion::OnSensorError() {
diff --git a/services/device/generic_sensor/platform_sensor_fusion.h b/services/device/generic_sensor/platform_sensor_fusion.h index fe9ea8d5..7d3331c 100644 --- a/services/device/generic_sensor/platform_sensor_fusion.h +++ b/services/device/generic_sensor/platform_sensor_fusion.h
@@ -70,9 +70,6 @@ SensorReading reading_; std::vector<scoped_refptr<PlatformSensor>> source_sensors_; std::unique_ptr<PlatformSensorFusionAlgorithm> fusion_algorithm_; - // Repeating timer for data polling if all source sensors are CONTINUOUS - // reporting mode. - base::RepeatingTimer timer_; mojom::ReportingMode reporting_mode_; DISALLOW_COPY_AND_ASSIGN(PlatformSensorFusion);
diff --git a/services/device/generic_sensor/platform_sensor_linux.cc b/services/device/generic_sensor/platform_sensor_linux.cc index 27907348..f501ba6 100644 --- a/services/device/generic_sensor/platform_sensor_linux.cc +++ b/services/device/generic_sensor/platform_sensor_linux.cc
@@ -51,16 +51,14 @@ void PlatformSensorLinux::UpdatePlatformSensorReading(SensorReading reading) { DCHECK(task_runner_->BelongsToCurrentThread()); - bool notifyNeeded = false; - if (GetReportingMode() == mojom::ReportingMode::ON_CHANGE) { - if (!HaveValuesChanged(reading, old_values_)) - return; - notifyNeeded = true; + if (GetReportingMode() == mojom::ReportingMode::ON_CHANGE && + !HaveValuesChanged(reading, old_values_)) { + return; } old_values_ = reading; reading.raw.timestamp = (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); - UpdateSensorReading(reading, notifyNeeded); + UpdateSensorReading(reading); } void PlatformSensorLinux::NotifyPlatformSensorError() {
diff --git a/services/device/generic_sensor/platform_sensor_win.cc b/services/device/generic_sensor/platform_sensor_win.cc index fd521ddd..48dac1b 100644 --- a/services/device/generic_sensor/platform_sensor_win.cc +++ b/services/device/generic_sensor/platform_sensor_win.cc
@@ -45,9 +45,7 @@ } void PlatformSensorWin::OnReadingUpdated(const SensorReading& reading) { - // Default reporting mode is ON_CHANGE, thus, set notify_clients parameter - // to true. - UpdateSensorReading(reading, true); + UpdateSensorReading(reading); } void PlatformSensorWin::OnSensorError() {
diff --git a/services/device/generic_sensor/sensor_impl.cc b/services/device/generic_sensor/sensor_impl.cc index 97f5800..1b91f12 100644 --- a/services/device/generic_sensor/sensor_impl.cc +++ b/services/device/generic_sensor/sensor_impl.cc
@@ -60,8 +60,10 @@ void SensorImpl::OnSensorReadingChanged(mojom::SensorType type) { DCHECK(!suspended_); - if (client_ && reading_notification_enabled_) + if (client_ && reading_notification_enabled_ && + sensor_->GetReportingMode() == mojom::ReportingMode::ON_CHANGE) { client_->SensorReadingChanged(); + } } void SensorImpl::OnSensorError() {
diff --git a/services/network/DEPS b/services/network/DEPS new file mode 100644 index 0000000..8fa9d48 --- /dev/null +++ b/services/network/DEPS
@@ -0,0 +1,3 @@ +include_rules = [ + "+net", +]
diff --git a/services/network/public/cpp/BUILD.gn b/services/network/public/cpp/BUILD.gn new file mode 100644 index 0000000..cc13936 --- /dev/null +++ b/services/network/public/cpp/BUILD.gn
@@ -0,0 +1,16 @@ +# 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. + +static_library("cpp") { + sources = [ + "net_adapters.cc", + "net_adapters.h", + ] + + deps = [ + "//base", + "//mojo/common", + "//net", + ] +}
diff --git a/content/common/net_adapters.cc b/services/network/public/cpp/net_adapters.cc similarity index 96% rename from content/common/net_adapters.cc rename to services/network/public/cpp/net_adapters.cc index 504f389..da516f2 100644 --- a/content/common/net_adapters.cc +++ b/services/network/public/cpp/net_adapters.cc
@@ -2,11 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "content/common/net_adapters.h" +#include "services/network/public/cpp/net_adapters.h" #include "net/base/net_errors.h" -namespace content { +namespace network { namespace { const uint32_t kMaxBufSize = 64 * 1024; @@ -99,4 +99,4 @@ pending_buffer_->CompleteRead(bytes_to_be_read_); } -} // namespace content +} // namespace network
diff --git a/content/common/net_adapters.h b/services/network/public/cpp/net_adapters.h similarity index 95% rename from content/common/net_adapters.h rename to services/network/public/cpp/net_adapters.h index f9955c13..1008a64 100644 --- a/content/common/net_adapters.h +++ b/services/network/public/cpp/net_adapters.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CONTENT_COMMON_NET_ADAPTERS_ -#define CONTENT_COMMON_NET_ADAPTERS_ +#ifndef SERVICES_NETWORK_PUBLIC_CPP_NET_ADAPTERS_ +#define SERVICES_NETWORK_PUBLIC_CPP_NET_ADAPTERS_ #include <stdint.h> @@ -11,7 +11,7 @@ #include "mojo/public/cpp/system/data_pipe.h" #include "net/base/io_buffer.h" -namespace content { +namespace network { // These adapters are used to transfer data between a Mojo pipe and the net // library. @@ -131,6 +131,6 @@ int bytes_to_be_read_; }; -} // namespace content +} // namespace network -#endif // CONTENT_COMMON_NET_ADAPTERS_ +#endif // SERVICES_NETWORK_PUBLIC_CPP_NET_ADAPTERS_
diff --git a/services/resource_coordinator/public/cpp/memory_instrumentation/os_metrics.h b/services/resource_coordinator/public/cpp/memory_instrumentation/os_metrics.h index 95d7e2d6..804c8697 100644 --- a/services/resource_coordinator/public/cpp/memory_instrumentation/os_metrics.h +++ b/services/resource_coordinator/public/cpp/memory_instrumentation/os_metrics.h
@@ -4,12 +4,17 @@ #ifndef SERVICES_RESOURCE_COORDINATOR_PUBLIC_CPP_MEMORY_INSTRUMENTATION_OS_METRICS_H_ #define SERVICES_RESOURCE_COORDINATOR_PUBLIC_CPP_MEMORY_INSTRUMENTATION_OS_METRICS_H_ +#include "base/gtest_prod_util.h" #include "base/process/process_handle.h" #include "base/trace_event/process_memory_dump.h" #include "build/build_config.h" #include "services/resource_coordinator/public/cpp/resource_coordinator_export.h" #include "services/resource_coordinator/public/interfaces/memory_instrumentation/memory_instrumentation.mojom.h" +namespace profiling { +FORWARD_DECLARE_TEST(ProfilingJsonExporterTest, MemoryMaps); +}; + namespace memory_instrumentation { class SERVICES_RESOURCE_COORDINATOR_PUBLIC_CPP_EXPORT OSMetrics { @@ -21,6 +26,7 @@ FRIEND_TEST_ALL_PREFIXES(OSMetricsTest, ParseProcSmaps); FRIEND_TEST_ALL_PREFIXES(OSMetricsTest, TestWinModuleReading); FRIEND_TEST_ALL_PREFIXES(OSMetricsTest, TestMachOReading); + FRIEND_TEST_ALL_PREFIXES(profiling::ProfilingJsonExporterTest, MemoryMaps); static std::vector<mojom::VmRegionPtr> GetProcessMemoryMaps(base::ProcessId); #if defined(OS_LINUX) || defined(OS_ANDROID)
diff --git a/services/resource_coordinator/public/cpp/memory_instrumentation/tracing_observer.cc b/services/resource_coordinator/public/cpp/memory_instrumentation/tracing_observer.cc index aadb8a7..74941237 100644 --- a/services/resource_coordinator/public/cpp/memory_instrumentation/tracing_observer.cc +++ b/services/resource_coordinator/public/cpp/memory_instrumentation/tracing_observer.cc
@@ -37,48 +37,6 @@ base::StringPrintf("%" PRIx32, os_dump.private_footprint_kb * 1024)); } -void MemoryMapsAsValueInto(TracedValue* value, - const std::vector<mojom::VmRegionPtr>& memory_maps) { - static const char kHexFmt[] = "%" PRIx64; - - // Refer to the design doc goo.gl/sxfFY8 for the semantics of these fields. - value->BeginArray("vm_regions"); - for (const auto& region : memory_maps) { - value->BeginDictionary(); - - value->SetString("sa", base::StringPrintf(kHexFmt, region->start_address)); - value->SetString("sz", base::StringPrintf(kHexFmt, region->size_in_bytes)); - if (region->module_timestamp) - value->SetString("ts", - base::StringPrintf(kHexFmt, region->module_timestamp)); - value->SetInteger("pf", region->protection_flags); - value->SetString("mf", region->mapped_file); - - value->BeginDictionary("bs"); // byte stats - value->SetString( - "pss", - base::StringPrintf(kHexFmt, region->byte_stats_proportional_resident)); - value->SetString( - "pd", - base::StringPrintf(kHexFmt, region->byte_stats_private_dirty_resident)); - value->SetString( - "pc", - base::StringPrintf(kHexFmt, region->byte_stats_private_clean_resident)); - value->SetString( - "sd", - base::StringPrintf(kHexFmt, region->byte_stats_shared_dirty_resident)); - value->SetString( - "sc", - base::StringPrintf(kHexFmt, region->byte_stats_shared_clean_resident)); - value->SetString("sw", - base::StringPrintf(kHexFmt, region->byte_stats_swapped)); - value->EndDictionary(); - - value->EndDictionary(); - } - value->EndArray(); -} - }; // namespace TracingObserver::TracingObserver( @@ -202,7 +160,7 @@ if (memory_maps->size()) { traced_value->BeginDictionary("process_mmaps"); - MemoryMapsAsValueInto(traced_value.get(), *memory_maps); + MemoryMapsAsValueInto(*memory_maps, traced_value.get()); traced_value->EndDictionary(); } @@ -210,6 +168,50 @@ return true; } +// static +void TracingObserver::MemoryMapsAsValueInto( + const std::vector<mojom::VmRegionPtr>& memory_maps, + TracedValue* value) { + static const char kHexFmt[] = "%" PRIx64; + + // Refer to the design doc goo.gl/sxfFY8 for the semantics of these fields. + value->BeginArray("vm_regions"); + for (const auto& region : memory_maps) { + value->BeginDictionary(); + + value->SetString("sa", base::StringPrintf(kHexFmt, region->start_address)); + value->SetString("sz", base::StringPrintf(kHexFmt, region->size_in_bytes)); + if (region->module_timestamp) + value->SetString("ts", + base::StringPrintf(kHexFmt, region->module_timestamp)); + value->SetInteger("pf", region->protection_flags); + value->SetString("mf", region->mapped_file); + + value->BeginDictionary("bs"); // byte stats + value->SetString( + "pss", + base::StringPrintf(kHexFmt, region->byte_stats_proportional_resident)); + value->SetString( + "pd", + base::StringPrintf(kHexFmt, region->byte_stats_private_dirty_resident)); + value->SetString( + "pc", + base::StringPrintf(kHexFmt, region->byte_stats_private_clean_resident)); + value->SetString( + "sd", + base::StringPrintf(kHexFmt, region->byte_stats_shared_dirty_resident)); + value->SetString( + "sc", + base::StringPrintf(kHexFmt, region->byte_stats_shared_clean_resident)); + value->SetString("sw", + base::StringPrintf(kHexFmt, region->byte_stats_swapped)); + value->EndDictionary(); + + value->EndDictionary(); + } + value->EndArray(); +} + bool TracingObserver::IsDumpModeAllowed( base::trace_event::MemoryDumpLevelOfDetail dump_mode) const { if (!memory_dump_config_)
diff --git a/services/resource_coordinator/public/cpp/memory_instrumentation/tracing_observer.h b/services/resource_coordinator/public/cpp/memory_instrumentation/tracing_observer.h index 1533365..b21866f 100644 --- a/services/resource_coordinator/public/cpp/memory_instrumentation/tracing_observer.h +++ b/services/resource_coordinator/public/cpp/memory_instrumentation/tracing_observer.h
@@ -36,6 +36,10 @@ const mojom::OSMemDump*, const std::vector<mojom::VmRegionPtr>*); + static void MemoryMapsAsValueInto( + const std::vector<mojom::VmRegionPtr>& memory_maps, + base::trace_event::TracedValue* value); + private: // Returns true if the dump mode is allowed for current tracing session. bool IsDumpModeAllowed(base::trace_event::MemoryDumpLevelOfDetail) const;
diff --git a/services/service_manager/embedder/BUILD.gn b/services/service_manager/embedder/BUILD.gn index 126bb9a..6511fc7 100644 --- a/services/service_manager/embedder/BUILD.gn +++ b/services/service_manager/embedder/BUILD.gn
@@ -15,6 +15,7 @@ "embedded_service_info.cc", "embedded_service_runner.cc", "manifest_utils.cc", + "service_manager_embedder_export.h", ] # iOS embeds the Service Manager but does not use service_manager::Main() (and @@ -32,7 +33,6 @@ sources += [ "main.cc", "main_delegate.cc", - "service_manager_embedder_export.h", "set_process_title.cc", "set_process_title_linux.cc", "shared_file_util.cc", @@ -82,12 +82,22 @@ testonly = true sources = [ + "embedded_instance_manager_unittest.cc", "manifest_utils_unittest.cc", ] + # These headers are duplicated here so that they can remain private in the + # "embedder" target. See http://crbug.com/732993 for a way to make it + # unnecessary to do this. + sources += [ + "embedded_instance_manager.h", + "service_manager_embedder_export.h", + ] + deps = [ ":embedder", "//base", + "//base/test:test_support", "//testing/gtest", ] }
diff --git a/services/service_manager/embedder/embedded_instance_manager.cc b/services/service_manager/embedder/embedded_instance_manager.cc index b5c41048..16d2b7e 100644 --- a/services/service_manager/embedder/embedded_instance_manager.cc +++ b/services/service_manager/embedder/embedded_instance_manager.cc
@@ -61,6 +61,7 @@ FROM_HERE, base::Bind(&EmbeddedInstanceManager::QuitOnServiceSequence, this)); } + thread_.reset(); } EmbeddedInstanceManager::~EmbeddedInstanceManager() {
diff --git a/services/service_manager/embedder/embedded_instance_manager.h b/services/service_manager/embedder/embedded_instance_manager.h index 4a9519d..c1755a66 100644 --- a/services/service_manager/embedder/embedded_instance_manager.h +++ b/services/service_manager/embedder/embedded_instance_manager.h
@@ -29,6 +29,8 @@ namespace service_manager { +class EmbeddedInstanceManagerTestApi; + // EmbeddedInstanceManager is an implementation detail of EmbeddedServiceRunner. // Outside of tests there is no need to use it directly. class SERVICE_MANAGER_EMBEDDER_EXPORT EmbeddedInstanceManager @@ -44,6 +46,7 @@ private: friend class base::RefCountedThreadSafe<EmbeddedInstanceManager>; + friend class EmbeddedInstanceManagerTestApi; ~EmbeddedInstanceManager();
diff --git a/services/service_manager/embedder/embedded_instance_manager_unittest.cc b/services/service_manager/embedder/embedded_instance_manager_unittest.cc new file mode 100644 index 0000000..dc011ed --- /dev/null +++ b/services/service_manager/embedder/embedded_instance_manager_unittest.cc
@@ -0,0 +1,68 @@ +// 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/service_manager/embedder/embedded_instance_manager.h" + +#include <memory> + +#include "base/bind.h" +#include "base/bind_helpers.h" +#include "base/memory/ptr_util.h" +#include "base/single_thread_task_runner.h" +#include "base/test/scoped_task_environment.h" +#include "base/threading/thread.h" +#include "services/service_manager/embedder/embedded_service_info.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace service_manager { +namespace { + +void OnQuit(bool* quit_called) { + *quit_called = true; +} + +std::unique_ptr<Service> CreateTestService() { + return base::MakeUnique<Service>(); +} + +} // namespace + +class EmbeddedInstanceManagerTestApi { + public: + EmbeddedInstanceManagerTestApi(EmbeddedInstanceManager* instance) + : instance_(instance) {} + + base::Thread* GetThread() { return instance_->thread_.get(); } + + private: + EmbeddedInstanceManager* instance_; + + DISALLOW_COPY_AND_ASSIGN(EmbeddedInstanceManagerTestApi); +}; + +TEST(EmbeddedInstanceManager, ShutdownWaitsForThreadToQuit) { + base::test::ScopedTaskEnvironment scoped_task_environment; + EmbeddedServiceInfo embedded_service_info; + embedded_service_info.use_own_thread = true; + embedded_service_info.factory = base::Bind(&CreateTestService); + bool quit_called = false; + scoped_refptr<EmbeddedInstanceManager> instance_manager = + new EmbeddedInstanceManager("test", embedded_service_info, + base::Bind(&OnQuit, &quit_called)); + instance_manager->BindServiceRequest(nullptr); + EmbeddedInstanceManagerTestApi test_api(instance_manager.get()); + ASSERT_TRUE(test_api.GetThread()); + scoped_refptr<base::SingleThreadTaskRunner> thread_task_runner = + test_api.GetThread()->task_runner(); + instance_manager->ShutDown(); + EXPECT_FALSE(test_api.GetThread()); + // Further verification the thread was shutdown. + EXPECT_FALSE( + thread_task_runner->PostTask(FROM_HERE, base::Bind(&base::DoNothing))); + // Because Shutdown() was explicitly called with the thread running the + // quit closure should not have run. + EXPECT_FALSE(quit_called); +} + +} // namespace service_manager
diff --git a/services/service_manager/public/cpp/test/BUILD.gn b/services/service_manager/public/cpp/test/BUILD.gn index ee7880c..3d231b2 100644 --- a/services/service_manager/public/cpp/test/BUILD.gn +++ b/services/service_manager/public/cpp/test/BUILD.gn
@@ -46,3 +46,20 @@ "//base/test:test_support", ] } + +source_set("test_support") { + sources = [ + "test_connector_factory.cc", + "test_connector_factory.h", + ] + + public_deps = [ + "//base", + "//services/service_manager/public/cpp", + "//services/service_manager/public/interfaces", + ] + + deps = [ + "//mojo/public/cpp/bindings", + ] +}
diff --git a/services/service_manager/public/cpp/test/test_connector_factory.cc b/services/service_manager/public/cpp/test/test_connector_factory.cc new file mode 100644 index 0000000..6d3e2b8e --- /dev/null +++ b/services/service_manager/public/cpp/test/test_connector_factory.cc
@@ -0,0 +1,79 @@ +// 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/service_manager/public/cpp/test/test_connector_factory.h" + +#include "base/macros.h" +#include "mojo/public/cpp/bindings/binding_set.h" +#include "services/service_manager/public/cpp/service.h" +#include "services/service_manager/public/interfaces/connector.mojom.h" + +namespace service_manager { + +namespace { + +class TestConnectorImpl : public mojom::Connector { + public: + TestConnectorImpl(TestConnectorFactory* factory, Service* service) + : factory_(factory), service_(service) {} + + ~TestConnectorImpl() override = default; + + void BindInterface(const Identity& target, + const std::string& interface_name, + mojo::ScopedMessagePipeHandle interface_pipe, + BindInterfaceCallback callback) override { + service_->OnBindInterface( + BindSourceInfo(factory_->source_identity(), CapabilitySet()), + interface_name, std::move(interface_pipe)); + std::move(callback).Run(mojom::ConnectResult::SUCCEEDED, Identity()); + } + + void StartService(const Identity& target, + StartServiceCallback callback) override { + NOTREACHED(); + } + + void StartServiceWithProcess( + const Identity& identity, + mojo::ScopedMessagePipeHandle service, + mojom::PIDReceiverRequest pid_receiver_request, + StartServiceWithProcessCallback callback) override { + NOTREACHED(); + } + + void Clone(mojom::ConnectorRequest request) override { + bindings_.AddBinding(this, std::move(request)); + } + + void FilterInterfaces(const std::string& spec, + const Identity& source, + mojom::InterfaceProviderRequest source_request, + mojom::InterfaceProviderPtr target) override { + NOTREACHED(); + } + + private: + TestConnectorFactory* const factory_; + Service* const service_; + mojo::BindingSet<mojom::Connector> bindings_; + + DISALLOW_COPY_AND_ASSIGN(TestConnectorImpl); +}; + +} // namespace + +TestConnectorFactory::TestConnectorFactory(Service* service) + : source_identity_("TestConnectorFactory"), + impl_(base::MakeUnique<TestConnectorImpl>(this, service)) {} + +TestConnectorFactory::~TestConnectorFactory() = default; + +std::unique_ptr<Connector> TestConnectorFactory::CreateConnector() { + mojom::ConnectorPtr proxy; + impl_->Clone(mojo::MakeRequest(&proxy)); + return base::MakeUnique<Connector>(std::move(proxy)); +} + +} // namespace service_manager
diff --git a/services/service_manager/public/cpp/test/test_connector_factory.h b/services/service_manager/public/cpp/test/test_connector_factory.h new file mode 100644 index 0000000..6573893 --- /dev/null +++ b/services/service_manager/public/cpp/test/test_connector_factory.h
@@ -0,0 +1,71 @@ +// 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_SERVICE_MANAGER_PUBLIC_CPP_TEST_TEST_CONNECTOR_FACTORY_H_ +#define SERVICES_SERVICE_MANAGER_PUBLIC_CPP_TEST_TEST_CONNECTOR_FACTORY_H_ + +#include <memory> + +#include "base/macros.h" +#include "services/service_manager/public/cpp/connector.h" +#include "services/service_manager/public/interfaces/connector.mojom.h" + +namespace service_manager { + +class Service; + +// Creates Connector instances which route BindInterface requests directly to +// a given Service implementation. Useful for testing production code which is +// parameterized over a Connector, while bypassing all the Service Manager +// machinery. Typical usage should look something like: +// +// TEST(MyTest, Foo) { +// MyServiceImpl impl; // Your implementation of service_manager::Service +// TestConnectorFactory connector_factory(&impl); +// std::unique_ptr<service_manager::Connector> connector = +// connector_factory.CreateConnector(); +// RunSomeClientCode(connector.get()); +// } +// +// Where |RunSomeClientCode()| would typically be some production code that +// expects a functioning Connector and uses it to connect to the service you're +// testing. +// +// Note that Connectors created by this factory ignore the target service name +// in BindInterface calls: interface requests are always routed to a single +// target Service instance. +class TestConnectorFactory { + public: + // Constructs a new TestConnectorFactory which creates Connectors whose + // requests are routed directly to |service|. |service| is not owned and must + // outlive this TestConnectorFactory instance. + explicit TestConnectorFactory(Service* service); + ~TestConnectorFactory(); + + // Allows a test to override the default Identity seen by the target service + // when it receives OnBindInterface requests from this factory's Connectors. + // + // This is useful if a Service implementation cares about the source identity + // services making incoming interface requests. Otherwise it can be ignored. + void set_source_identity(const Identity& identity) { + source_identity_ = identity; + } + + const Identity& source_identity() const { return source_identity_; } + + // Creates a new connector which routes BindInterfaces requests directly to + // the Service instance associated with this factory. + std::unique_ptr<Connector> CreateConnector(); + + private: + Identity source_identity_; + + std::unique_ptr<mojom::Connector> impl_; + + DISALLOW_COPY_AND_ASSIGN(TestConnectorFactory); +}; + +} // namespace service_manager + +#endif // SERVICES_SERVICE_MANAGER_PUBLIC_CPP_TEST_TEST_CONNECTOR_FACTORY_H_
diff --git a/services/service_manager/tests/BUILD.gn b/services/service_manager/tests/BUILD.gn index ebd0dcdc..9a3ea075 100644 --- a/services/service_manager/tests/BUILD.gn +++ b/services/service_manager/tests/BUILD.gn
@@ -18,6 +18,10 @@ service_test("service_manager_unittests") { catalog = ":service_manager_unittests_catalog" + sources = [ + "test_support_unittest.cc", + ] + deps = [ ":interfaces", "//base", @@ -32,6 +36,7 @@ "//services/service_manager/background/tests:unittests", "//services/service_manager/embedder:unittests", "//services/service_manager/public/cpp", + "//services/service_manager/public/cpp/test:test_support", "//services/service_manager/public/interfaces", "//services/service_manager/runner/host:unittests", "//services/service_manager/tests/connect",
diff --git a/services/service_manager/tests/test_support_unittest.cc b/services/service_manager/tests/test_support_unittest.cc new file mode 100644 index 0000000..add4038 --- /dev/null +++ b/services/service_manager/tests/test_support_unittest.cc
@@ -0,0 +1,108 @@ +// 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 "base/bind.h" +#include "base/callback.h" +#include "base/macros.h" +#include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" +#include "mojo/public/cpp/bindings/binding_set.h" +#include "services/service_manager/public/cpp/connector.h" +#include "services/service_manager/public/cpp/service.h" +#include "services/service_manager/public/cpp/test/test_connector_factory.h" +#include "services/service_manager/tests/test.mojom.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace service_manager { + +namespace { + +// This is a test service used to demonstrate usage of TestConnectorFactory. +// See documentation on TestConnectorFactory for more details about usage. +class TestServiceImpl : public Service { + public: + using OnBindInterfaceCallback = base::Callback<void(const Identity&)>; + + TestServiceImpl() = default; + ~TestServiceImpl() override = default; + + void set_on_bind_interface_callback(const OnBindInterfaceCallback& callback) { + on_bind_interface_callback_ = callback; + } + + // Service: + void OnBindInterface(const BindSourceInfo& source_info, + const std::string& interface_name, + mojo::ScopedMessagePipeHandle interface_pipe) override { + if (interface_name == TestC::Name_) + c_bindings_.AddBinding(&c_impl_, TestCRequest(std::move(interface_pipe))); + + if (on_bind_interface_callback_) + on_bind_interface_callback_.Run(source_info.identity); + } + + private: + // A simple test interface on the service, which can be pinged by test code + // to verify a working service connection. + class TestCImpl : public TestC { + public: + TestCImpl() = default; + ~TestCImpl() override = default; + + // TestC: + void C(CCallback callback) override { std::move(callback).Run(); } + + private: + DISALLOW_COPY_AND_ASSIGN(TestCImpl); + }; + + TestCImpl c_impl_; + mojo::BindingSet<TestC> c_bindings_; + OnBindInterfaceCallback on_bind_interface_callback_; + + DISALLOW_COPY_AND_ASSIGN(TestServiceImpl); +}; + +} // namespace + +TEST(ServiceManagerTestSupport, TestConnectorFactory) { + base::test::ScopedTaskEnvironment task_environment; + + TestServiceImpl service; + TestConnectorFactory factory(&service); + std::unique_ptr<Connector> connector = factory.CreateConnector(); + + TestCPtr c; + connector->BindInterface("ignored", &c); + + base::RunLoop loop; + c->C(loop.QuitClosure()); + loop.Run(); +} + +TEST(ServiceManagerTestSupport, TestConnectorFactoryOverrideSourceIdentity) { + base::test::ScopedTaskEnvironment task_environment; + + TestServiceImpl service; + + static const std::string kTestSourceIdentity = "worst. service. ever."; + TestConnectorFactory factory(&service); + factory.set_source_identity(Identity(kTestSourceIdentity)); + std::unique_ptr<Connector> connector = factory.CreateConnector(); + + // Verify that the test service sees our overridden source identity. + service.set_on_bind_interface_callback( + base::Bind([](const Identity& source_identity) { + EXPECT_EQ(kTestSourceIdentity, source_identity.name()); + })); + + TestCPtr c; + connector->BindInterface("ignored", &c); + + base::RunLoop loop; + c->C(loop.QuitClosure()); + loop.Run(); +} + +} // namespace service_manager
diff --git a/services/ui/public/interfaces/ime/ime.mojom b/services/ui/public/interfaces/ime/ime.mojom index 8251ac6..e9383ea5 100644 --- a/services/ui/public/interfaces/ime/ime.mojom +++ b/services/ui/public/interfaces/ime/ime.mojom
@@ -57,8 +57,8 @@ }; // Represents an underlined segment of text currently composed by IME. -// Corresponds to ui::CompositionUnderline. -struct CompositionUnderline { +// Corresponds to ui::ImeTextSpan. +struct ImeTextSpan { uint32 start_offset; uint32 end_offset; bool thick; @@ -70,7 +70,7 @@ // ui::CompositionText. struct CompositionText { string text; - array<CompositionUnderline> underlines; + array<ImeTextSpan> ime_text_spans; gfx.mojom.Range selection; }; @@ -167,7 +167,7 @@ // Sets composition text and attributes. See comments for // ui::TextInputClient::SetCompositionText() for more details. SetCompositionText(CompositionText composition); - + // Converts current composition text into final content. ConfirmCompositionText();
diff --git a/services/ui/public/interfaces/ime/ime.typemap b/services/ui/public/interfaces/ime/ime.typemap index 0327e43..51ee8a4 100644 --- a/services/ui/public/interfaces/ime/ime.typemap +++ b/services/ui/public/interfaces/ime/ime.typemap
@@ -6,7 +6,7 @@ public_headers = [ "//ui/base/ime/candidate_window.h", "//ui/base/ime/composition_text.h", - "//ui/base/ime/composition_underline.h", + "//ui/base/ime/ime_text_span.h", "//ui/base/ime/text_input_mode.h", "//ui/base/ime/text_input_type.h", ] @@ -25,7 +25,7 @@ "ui.mojom.CandidateWindowEntry=ui::CandidateWindow::Entry", "ui.mojom.CandidateWindowProperties=ui::CandidateWindow::CandidateWindowProperty", "ui.mojom.CompositionText=ui::CompositionText", - "ui.mojom.CompositionUnderline=ui::CompositionUnderline", + "ui.mojom.ImeTextSpan=ui::ImeTextSpan", "ui.mojom.TextInputMode=ui::TextInputMode", "ui.mojom.TextInputType=ui::TextInputType", ]
diff --git a/services/ui/public/interfaces/ime/ime_struct_traits.cc b/services/ui/public/interfaces/ime/ime_struct_traits.cc index a184652..1e729dd 100644 --- a/services/ui/public/interfaces/ime/ime_struct_traits.cc +++ b/services/ui/public/interfaces/ime/ime_struct_traits.cc
@@ -40,10 +40,9 @@ } // static -bool StructTraits<ui::mojom::CompositionUnderlineDataView, - ui::CompositionUnderline>:: - Read(ui::mojom::CompositionUnderlineDataView data, - ui::CompositionUnderline* out) { +bool StructTraits<ui::mojom::ImeTextSpanDataView, ui::ImeTextSpan>::Read( + ui::mojom::ImeTextSpanDataView data, + ui::ImeTextSpan* out) { if (data.is_null()) return false; out->start_offset = data.start_offset(); @@ -58,7 +57,7 @@ bool StructTraits<ui::mojom::CompositionTextDataView, ui::CompositionText>:: Read(ui::mojom::CompositionTextDataView data, ui::CompositionText* out) { return !data.is_null() && data.ReadText(&out->text) && - data.ReadUnderlines(&out->underlines) && + data.ReadImeTextSpans(&out->ime_text_spans) && data.ReadSelection(&out->selection); }
diff --git a/services/ui/public/interfaces/ime/ime_struct_traits.h b/services/ui/public/interfaces/ime/ime_struct_traits.h index 616f3f2..100d1c4 100644 --- a/services/ui/public/interfaces/ime/ime_struct_traits.h +++ b/services/ui/public/interfaces/ime/ime_struct_traits.h
@@ -9,7 +9,7 @@ #include "services/ui/public/interfaces/ime/ime.mojom-shared.h" #include "ui/base/ime/candidate_window.h" #include "ui/base/ime/composition_text.h" -#include "ui/base/ime/composition_underline.h" +#include "ui/base/ime/ime_text_span.h" #include "ui/base/ime/text_input_mode.h" #include "ui/base/ime/text_input_type.h" @@ -74,30 +74,12 @@ }; template <> -struct StructTraits<ui::mojom::CompositionUnderlineDataView, - ui::CompositionUnderline> { - static uint32_t start_offset(const ui::CompositionUnderline& c) { - return c.start_offset; - } - static uint32_t end_offset(const ui::CompositionUnderline& c) { - return c.end_offset; - } - static uint32_t color(const ui::CompositionUnderline& c) { return c.color; } - static uint32_t thick(const ui::CompositionUnderline& c) { return c.thick; } - static uint32_t background_color(const ui::CompositionUnderline& c) { - return c.background_color; - } - static bool Read(ui::mojom::CompositionUnderlineDataView data, - ui::CompositionUnderline* out); -}; - -template <> struct StructTraits<ui::mojom::CompositionTextDataView, ui::CompositionText> { static std::string text(const ui::CompositionText& c) { return base::UTF16ToUTF8(c.text); } - static ui::CompositionUnderlines underlines(const ui::CompositionText& c) { - return c.underlines; + static ui::ImeTextSpans ime_text_spans(const ui::CompositionText& c) { + return c.ime_text_spans; } static gfx::Range selection(const ui::CompositionText& c) { return c.selection; @@ -107,6 +89,20 @@ }; template <> +struct StructTraits<ui::mojom::ImeTextSpanDataView, ui::ImeTextSpan> { + static uint32_t start_offset(const ui::ImeTextSpan& c) { + return c.start_offset; + } + static uint32_t end_offset(const ui::ImeTextSpan& c) { return c.end_offset; } + static uint32_t color(const ui::ImeTextSpan& c) { return c.color; } + static uint32_t thick(const ui::ImeTextSpan& c) { return c.thick; } + static uint32_t background_color(const ui::ImeTextSpan& c) { + return c.background_color; + } + static bool Read(ui::mojom::ImeTextSpanDataView data, ui::ImeTextSpan* out); +}; + +template <> struct EnumTraits<ui::mojom::TextInputMode, ui::TextInputMode> { static ui::mojom::TextInputMode ToMojom(ui::TextInputMode text_input_mode); static bool FromMojom(ui::mojom::TextInputMode input, ui::TextInputMode* out);
diff --git a/services/ui/public/interfaces/ime/ime_struct_traits_unittest.cc b/services/ui/public/interfaces/ime/ime_struct_traits_unittest.cc index cfaec6f8..c718f82 100644 --- a/services/ui/public/interfaces/ime/ime_struct_traits_unittest.cc +++ b/services/ui/public/interfaces/ime/ime_struct_traits_unittest.cc
@@ -12,7 +12,7 @@ #include "services/ui/public/interfaces/ime/ime_struct_traits_test.mojom.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/base/ime/composition_text.h" -#include "ui/base/ime/composition_underline.h" +#include "ui/base/ime/ime_text_span.h" #include "ui/gfx/range/mojo/range_struct_traits.h" namespace ui { @@ -110,9 +110,9 @@ TEST_F(IMEStructTraitsTest, CompositionText) { CompositionText input; input.text = base::UTF8ToUTF16("abcdefghij"); - input.underlines.push_back(CompositionUnderline(0, 2, SK_ColorGRAY, false)); - input.underlines.push_back( - CompositionUnderline(3, 6, SK_ColorRED, true, SK_ColorGREEN)); + input.ime_text_spans.push_back(ImeTextSpan(0, 2, SK_ColorGRAY, false)); + input.ime_text_spans.push_back( + ImeTextSpan(3, 6, SK_ColorRED, true, SK_ColorGREEN)); input.selection = gfx::Range(1, 7); CompositionText output;
diff --git a/services/ui/ws/BUILD.gn b/services/ui/ws/BUILD.gn index c6a9073..60ccaffcc 100644 --- a/services/ui/ws/BUILD.gn +++ b/services/ui/ws/BUILD.gn
@@ -125,7 +125,6 @@ deps = [ "//components/viz/host", - "//components/viz/host/hit_test", "//gpu/command_buffer/client", "//gpu/command_buffer/client:gles2_interface", "//gpu/ipc/client",
diff --git a/services/viz/public/interfaces/compositing/BUILD.gn b/services/viz/public/interfaces/compositing/BUILD.gn index e9c3bf6..c157364 100644 --- a/services/viz/public/interfaces/compositing/BUILD.gn +++ b/services/viz/public/interfaces/compositing/BUILD.gn
@@ -12,6 +12,7 @@ "render_pass.mojom", "resource_settings.mojom", "returned_resource.mojom", + "shared_bitmap_allocation_notifier.mojom", "surface_info.mojom", "surface_sequence.mojom", ]
diff --git a/cc/ipc/shared_bitmap_allocation_notifier.mojom b/services/viz/public/interfaces/compositing/shared_bitmap_allocation_notifier.mojom similarity index 96% rename from cc/ipc/shared_bitmap_allocation_notifier.mojom rename to services/viz/public/interfaces/compositing/shared_bitmap_allocation_notifier.mojom index a10eff2..d8017cd 100644 --- a/cc/ipc/shared_bitmap_allocation_notifier.mojom +++ b/services/viz/public/interfaces/compositing/shared_bitmap_allocation_notifier.mojom
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -module cc.mojom; +module viz.mojom; import "gpu/ipc/common/mailbox.mojom";
diff --git a/services/viz/public/interfaces/hit_test/hit_test_region_list.mojom b/services/viz/public/interfaces/hit_test/hit_test_region_list.mojom index ff251be..f368cd08 100644 --- a/services/viz/public/interfaces/hit_test/hit_test_region_list.mojom +++ b/services/viz/public/interfaces/hit_test/hit_test_region_list.mojom
@@ -45,9 +45,6 @@ }; struct HitTestRegionList { - // SurfaceId corresponding to this HitTestData. - cc.mojom.SurfaceId surface_id; - // Flags indicate how to handle events that match no sub-regions. // kHitTestMine routes un-matched events to this surface (opaque). // kHitTestIgnore keeps previous match in the parent (transparent).
diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h index 675126e..e734274 100644 --- a/skia/config/SkUserConfig.h +++ b/skia/config/SkUserConfig.h
@@ -220,8 +220,8 @@ #define SK_SUPPORT_LEGACY_DELTA_AA #endif -#ifndef SK_SUPPORT_LEGACY_ROTATED_SHADERS -#define SK_SUPPORT_LEGACY_ROTATED_SHADERS +#ifndef SK_SUPPORT_LEGACY_RP_BLENDS +#define SK_SUPPORT_LEGACY_RP_BLENDS #endif ///////////////////////// Imported from BUILD.gn and skia_common.gypi
diff --git a/storage/DEPS b/storage/DEPS index 5d45d0bc..c4e59ed 100644 --- a/storage/DEPS +++ b/storage/DEPS
@@ -1,6 +1,7 @@ include_rules = [ "+mojo", "+net", + "+services/network/public/cpp", "+sql", "+third_party/leveldatabase", "+third_party/sqlite",
diff --git a/storage/browser/BUILD.gn b/storage/browser/BUILD.gn index b5f8a15..a64d797f 100644 --- a/storage/browser/BUILD.gn +++ b/storage/browser/BUILD.gn
@@ -38,6 +38,8 @@ "blob/blob_url_request_job.h", "blob/blob_url_request_job_factory.cc", "blob/blob_url_request_job_factory.h", + "blob/mojo_blob_reader.cc", + "blob/mojo_blob_reader.h", "blob/scoped_file.cc", "blob/scoped_file.h", "blob/shareable_blob_data_item.cc", @@ -207,6 +209,7 @@ "//base:i18n", "//base/third_party/dynamic_annotations", "//net", + "//services/network/public/cpp", "//sql", "//third_party/leveldatabase", "//third_party/sqlite", @@ -293,6 +296,7 @@ ":browser", ":test_support", "//base/test:test_support", + "//mojo/common", "//mojo/edk/system", "//net:test_support", "//sql:test_support",
diff --git a/storage/browser/blob/blob_impl.cc b/storage/browser/blob/blob_impl.cc index ab41aba..6db0007 100644 --- a/storage/browser/blob/blob_impl.cc +++ b/storage/browser/blob/blob_impl.cc
@@ -4,9 +4,42 @@ #include "storage/browser/blob/blob_impl.h" +#include <utility> #include "storage/browser/blob/blob_data_handle.h" +#include "storage/browser/blob/mojo_blob_reader.h" namespace storage { +namespace { + +class ReaderDelegate : public MojoBlobReader::Delegate { + public: + ReaderDelegate(mojo::ScopedDataPipeProducerHandle handle, + mojom::BlobReaderClientPtr client) + : handle_(std::move(handle)), client_(std::move(client)) {} + + mojo::ScopedDataPipeProducerHandle PassDataPipe() override { + return std::move(handle_); + } + + MojoBlobReader::Delegate::RequestSideData DidCalculateSize( + uint64_t total_size, + uint64_t content_size) override { + if (client_) + client_->OnCalculatedSize(total_size, content_size); + return MojoBlobReader::Delegate::DONT_REQUEST_SIDE_DATA; + } + + void OnComplete(net::Error result, uint64_t total_written_bytes) override { + if (client_) + client_->OnComplete(result, total_written_bytes); + } + + private: + mojo::ScopedDataPipeProducerHandle handle_; + mojom::BlobReaderClientPtr client_; +}; + +} // namespace // static base::WeakPtr<BlobImpl> BlobImpl::Create(std::unique_ptr<BlobDataHandle> handle, @@ -19,6 +52,23 @@ bindings_.AddBinding(this, std::move(request)); } +void BlobImpl::ReadRange(uint64_t offset, + uint64_t length, + mojo::ScopedDataPipeProducerHandle handle, + mojom::BlobReaderClientPtr client) { + MojoBlobReader::Create( + nullptr, handle_.get(), + net::HttpByteRange::Bounded(offset, offset + length - 1), + base::MakeUnique<ReaderDelegate>(std::move(handle), std::move(client))); +} + +void BlobImpl::ReadAll(mojo::ScopedDataPipeProducerHandle handle, + mojom::BlobReaderClientPtr client) { + MojoBlobReader::Create( + nullptr, handle_.get(), net::HttpByteRange(), + base::MakeUnique<ReaderDelegate>(std::move(handle), std::move(client))); +} + void BlobImpl::GetInternalUUID(GetInternalUUIDCallback callback) { std::move(callback).Run(handle_->uuid()); }
diff --git a/storage/browser/blob/blob_impl.h b/storage/browser/blob/blob_impl.h index 148ae96..9693504 100644 --- a/storage/browser/blob/blob_impl.h +++ b/storage/browser/blob/blob_impl.h
@@ -20,6 +20,12 @@ mojom::BlobRequest request); void Clone(mojom::BlobRequest request) override; + void ReadRange(uint64_t offset, + uint64_t length, + mojo::ScopedDataPipeProducerHandle handle, + mojom::BlobReaderClientPtr client) override; + void ReadAll(mojo::ScopedDataPipeProducerHandle handle, + mojom::BlobReaderClientPtr client) override; void GetInternalUUID(GetInternalUUIDCallback callback) override; void FlushForTesting();
diff --git a/storage/browser/blob/blob_impl_unittest.cc b/storage/browser/blob/blob_impl_unittest.cc index 051c715..19bdc45 100644 --- a/storage/browser/blob/blob_impl_unittest.cc +++ b/storage/browser/blob/blob_impl_unittest.cc
@@ -4,7 +4,10 @@ #include "storage/browser/blob/blob_impl.h" +#include "base/task_scheduler/post_task.h" #include "base/test/scoped_task_environment.h" +#include "mojo/common/data_pipe_drainer.h" +#include "net/base/net_errors.h" #include "storage/browser/blob/blob_data_builder.h" #include "storage/browser/blob/blob_data_handle.h" #include "storage/browser/blob/blob_storage_context.h" @@ -12,6 +15,49 @@ namespace storage { +namespace { + +class DataPipeReader : public mojo::common::DataPipeDrainer::Client { + public: + DataPipeReader(std::string* data_out, base::OnceClosure done_callback) + : data_out_(data_out), done_callback_(std::move(done_callback)) {} + + void OnDataAvailable(const void* data, size_t num_bytes) override { + data_out_->append(static_cast<const char*>(data), num_bytes); + } + + void OnDataComplete() override { std::move(done_callback_).Run(); } + + private: + std::string* data_out_; + base::OnceClosure done_callback_; +}; + +class MockBlobReaderClient : public mojom::BlobReaderClient { + public: + void OnCalculatedSize(uint64_t total_size, + uint64_t expected_content_size) override { + total_size_ = total_size; + expected_content_size_ = expected_content_size; + calculated_size_ = true; + } + + void OnComplete(int32_t status, uint64_t data_length) override { + status_ = static_cast<net::Error>(status); + data_length_ = data_length; + completed_ = true; + } + + bool calculated_size_ = false; + uint64_t total_size_ = 0; + uint64_t expected_content_size_ = 0; + bool completed_ = false; + net::Error status_ = net::OK; + uint64_t data_length_ = 0; +}; + +} // namespace + class BlobImplTest : public testing::Test { public: void SetUp() override { context_ = base::MakeUnique<BlobStorageContext>(); } @@ -39,6 +85,15 @@ return received_uuid; } + std::string ReadDataPipe(mojo::ScopedDataPipeConsumerHandle pipe) { + base::RunLoop loop; + std::string data; + DataPipeReader reader(&data, loop.QuitClosure()); + mojo::common::DataPipeDrainer drainer(&reader, std::move(pipe)); + loop.Run(); + return data; + } + protected: base::test::ScopedTaskEnvironment scoped_task_environment_; std::unique_ptr<BlobStorageContext> context_; @@ -82,4 +137,198 @@ EXPECT_FALSE(blob); } +TEST_F(BlobImplTest, ReadAll) { + const std::string kId = "id"; + const std::string kContents = "hello world"; + auto handle = CreateBlobFromString(kId, kContents); + + mojom::BlobPtr ptr; + BlobImpl::Create(std::move(handle), MakeRequest(&ptr)); + + MockBlobReaderClient client; + mojom::BlobReaderClientPtr client_ptr; + mojo::Binding<mojom::BlobReaderClient> client_binding( + &client, MakeRequest(&client_ptr)); + + mojo::DataPipe pipe; + ptr->ReadAll(std::move(pipe.producer_handle), std::move(client_ptr)); + std::string received = ReadDataPipe(std::move(pipe.consumer_handle)); + EXPECT_EQ(kContents, received); + + client_binding.FlushForTesting(); + EXPECT_TRUE(client.calculated_size_); + EXPECT_EQ(kContents.size(), client.total_size_); + EXPECT_EQ(kContents.size(), client.expected_content_size_); + + EXPECT_TRUE(client.completed_); + EXPECT_EQ(net::OK, client.status_); + EXPECT_EQ(kContents.size(), client.data_length_); +} + +TEST_F(BlobImplTest, ReadAll_WithoutClient) { + const std::string kId = "id"; + const std::string kContents = "hello world"; + auto handle = CreateBlobFromString(kId, kContents); + + mojom::BlobPtr ptr; + BlobImpl::Create(std::move(handle), MakeRequest(&ptr)); + + mojo::DataPipe pipe; + ptr->ReadAll(std::move(pipe.producer_handle), nullptr); + std::string received = ReadDataPipe(std::move(pipe.consumer_handle)); + EXPECT_EQ(kContents, received); +} + +TEST_F(BlobImplTest, ReadAll_BrokenBlob) { + const std::string kId = "id"; + auto handle = context_->AddBrokenBlob( + kId, "", "", BlobStatus::ERR_INVALID_CONSTRUCTION_ARGUMENTS); + + mojom::BlobPtr ptr; + BlobImpl::Create(std::move(handle), MakeRequest(&ptr)); + + MockBlobReaderClient client; + mojom::BlobReaderClientPtr client_ptr; + mojo::Binding<mojom::BlobReaderClient> client_binding( + &client, MakeRequest(&client_ptr)); + + mojo::DataPipe pipe; + ptr->ReadAll(std::move(pipe.producer_handle), std::move(client_ptr)); + + std::string received = ReadDataPipe(std::move(pipe.consumer_handle)); + EXPECT_EQ("", received); + + client_binding.FlushForTesting(); + EXPECT_FALSE(client.calculated_size_); + EXPECT_TRUE(client.completed_); + EXPECT_EQ(net::ERR_FAILED, client.status_); + EXPECT_EQ(0u, client.data_length_); +} + +TEST_F(BlobImplTest, ReadRange) { + const std::string kId = "id"; + const std::string kContents = "hello world"; + auto handle = CreateBlobFromString(kId, kContents); + + mojom::BlobPtr ptr; + BlobImpl::Create(std::move(handle), MakeRequest(&ptr)); + + MockBlobReaderClient client; + mojom::BlobReaderClientPtr client_ptr; + mojo::Binding<mojom::BlobReaderClient> client_binding( + &client, MakeRequest(&client_ptr)); + + mojo::DataPipe pipe; + ptr->ReadRange(2, 5, std::move(pipe.producer_handle), std::move(client_ptr)); + + std::string received = ReadDataPipe(std::move(pipe.consumer_handle)); + EXPECT_EQ(kContents.substr(2, 5), received); + + client_binding.FlushForTesting(); + EXPECT_TRUE(client.calculated_size_); + EXPECT_EQ(kContents.size(), client.total_size_); + EXPECT_EQ(5u, client.expected_content_size_); + + EXPECT_TRUE(client.completed_); + EXPECT_EQ(net::OK, client.status_); + EXPECT_EQ(5u, client.data_length_); +} + +TEST_F(BlobImplTest, ReadRange_WithoutClient) { + const std::string kId = "id"; + const std::string kContents = "hello world"; + auto handle = CreateBlobFromString(kId, kContents); + + mojom::BlobPtr ptr; + BlobImpl::Create(std::move(handle), MakeRequest(&ptr)); + + mojo::DataPipe pipe; + ptr->ReadRange(2, 5, std::move(pipe.producer_handle), nullptr); + + std::string received = ReadDataPipe(std::move(pipe.consumer_handle)); + EXPECT_EQ(kContents.substr(2, 5), received); +} + +TEST_F(BlobImplTest, ReadRange_TooLargeLength) { + const std::string kId = "id"; + const std::string kContents = "hello world"; + auto handle = CreateBlobFromString(kId, kContents); + + mojom::BlobPtr ptr; + BlobImpl::Create(std::move(handle), MakeRequest(&ptr)); + + MockBlobReaderClient client; + mojom::BlobReaderClientPtr client_ptr; + mojo::Binding<mojom::BlobReaderClient> client_binding( + &client, MakeRequest(&client_ptr)); + + mojo::DataPipe pipe; + ptr->ReadRange(2, 15, std::move(pipe.producer_handle), std::move(client_ptr)); + + std::string received = ReadDataPipe(std::move(pipe.consumer_handle)); + EXPECT_EQ(kContents.substr(2, 15), received); + + client_binding.FlushForTesting(); + EXPECT_TRUE(client.calculated_size_); + EXPECT_EQ(kContents.size(), client.total_size_); + EXPECT_EQ(kContents.size() - 2, client.expected_content_size_); + + EXPECT_TRUE(client.completed_); + EXPECT_EQ(net::OK, client.status_); + EXPECT_EQ(kContents.size() - 2, client.data_length_); +} + +TEST_F(BlobImplTest, ReadRange_BrokenBlob) { + const std::string kId = "id"; + auto handle = context_->AddBrokenBlob( + kId, "", "", BlobStatus::ERR_INVALID_CONSTRUCTION_ARGUMENTS); + + mojom::BlobPtr ptr; + BlobImpl::Create(std::move(handle), MakeRequest(&ptr)); + + MockBlobReaderClient client; + mojom::BlobReaderClientPtr client_ptr; + mojo::Binding<mojom::BlobReaderClient> client_binding( + &client, MakeRequest(&client_ptr)); + + mojo::DataPipe pipe; + ptr->ReadRange(2, 5, std::move(pipe.producer_handle), std::move(client_ptr)); + + std::string received = ReadDataPipe(std::move(pipe.consumer_handle)); + EXPECT_EQ("", received); + + client_binding.FlushForTesting(); + EXPECT_FALSE(client.calculated_size_); + EXPECT_TRUE(client.completed_); + EXPECT_EQ(net::ERR_FAILED, client.status_); + EXPECT_EQ(0u, client.data_length_); +} + +TEST_F(BlobImplTest, ReadRange_InvalidRange) { + const std::string kId = "id"; + const std::string kContents = "hello world"; + auto handle = CreateBlobFromString(kId, kContents); + + mojom::BlobPtr ptr; + BlobImpl::Create(std::move(handle), MakeRequest(&ptr)); + + MockBlobReaderClient client; + mojom::BlobReaderClientPtr client_ptr; + mojo::Binding<mojom::BlobReaderClient> client_binding( + &client, MakeRequest(&client_ptr)); + + base::RunLoop loop; + mojo::DataPipe pipe; + ptr->ReadRange(15, 4, std::move(pipe.producer_handle), std::move(client_ptr)); + + std::string received = ReadDataPipe(std::move(pipe.consumer_handle)); + EXPECT_EQ("", received); + + client_binding.FlushForTesting(); + EXPECT_FALSE(client.calculated_size_); + EXPECT_TRUE(client.completed_); + EXPECT_EQ(net::ERR_REQUEST_RANGE_NOT_SATISFIABLE, client.status_); + EXPECT_EQ(0u, client.data_length_); +} + } // namespace storage
diff --git a/storage/browser/blob/blob_registry_impl_unittest.cc b/storage/browser/blob/blob_registry_impl_unittest.cc index ee0e27d..0f0e3c8 100644 --- a/storage/browser/blob/blob_registry_impl_unittest.cc +++ b/storage/browser/blob/blob_registry_impl_unittest.cc
@@ -41,6 +41,18 @@ std::move(request)); } + void ReadRange(uint64_t offset, + uint64_t size, + mojo::ScopedDataPipeProducerHandle, + mojom::BlobReaderClientPtr) override { + NOTREACHED(); + } + + void ReadAll(mojo::ScopedDataPipeProducerHandle, + mojom::BlobReaderClientPtr) override { + NOTREACHED(); + } + void GetInternalUUID(GetInternalUUIDCallback callback) override { std::move(callback).Run(uuid_); }
diff --git a/storage/browser/blob/blob_url_request_job.cc b/storage/browser/blob/blob_url_request_job.cc index b1ac09e..03190ad 100644 --- a/storage/browser/blob/blob_url_request_job.cc +++ b/storage/browser/blob/blob_url_request_job.cc
@@ -142,9 +142,9 @@ scoped_refptr<net::HttpResponseHeaders> BlobURLRequestJob::GenerateHeaders( net::HttpStatusCode status_code, BlobDataHandle* blob_handle, - BlobReader* blob_reader, net::HttpByteRange* byte_range, - int64_t* content_size) { + uint64_t total_size, + uint64_t content_size) { std::string status("HTTP/1.1 "); status.append(base::IntToString(status_code)); status.append(" "); @@ -154,10 +154,9 @@ new net::HttpResponseHeaders(status); if (status_code == net::HTTP_OK || status_code == net::HTTP_PARTIAL_CONTENT) { - *content_size = blob_reader->remaining_bytes(); std::string content_length_header(net::HttpRequestHeaders::kContentLength); content_length_header.append(": "); - content_length_header.append(base::Int64ToString(*content_size)); + content_length_header.append(base::Uint64ToString(content_size)); headers->AddHeader(content_length_header); if (status_code == net::HTTP_PARTIAL_CONTENT) { DCHECK(byte_range->IsValid()); @@ -167,8 +166,7 @@ "%" PRId64 "-%" PRId64, byte_range->first_byte_position(), byte_range->last_byte_position())); content_range_header.append("/"); - content_range_header.append( - base::StringPrintf("%" PRId64, blob_reader->total_size())); + content_range_header.append(base::StringPrintf("%" PRId64, total_size)); headers->AddHeader(content_range_header); } if (!blob_handle->content_type().empty()) { @@ -323,12 +321,16 @@ } void BlobURLRequestJob::HeadersCompleted(net::HttpStatusCode status_code) { - int64_t content_size = 0; + uint64_t content_size = 0; + uint64_t total_size = 0; + if (status_code == net::HTTP_OK || status_code == net::HTTP_PARTIAL_CONTENT) { + content_size = blob_reader_->remaining_bytes(); + set_expected_content_size(content_size); + total_size = blob_reader_->total_size(); + } response_info_.reset(new net::HttpResponseInfo()); - response_info_->headers = - GenerateHeaders(status_code, blob_handle_.get(), blob_reader_.get(), - &byte_range_, &content_size); - set_expected_content_size(content_size); + response_info_->headers = GenerateHeaders( + status_code, blob_handle_.get(), &byte_range_, total_size, content_size); if (blob_reader_) response_info_->metadata = blob_reader_->side_data();
diff --git a/storage/browser/blob/blob_url_request_job.h b/storage/browser/blob/blob_url_request_job.h index b67aaef7..00649b8 100644 --- a/storage/browser/blob/blob_url_request_job.h +++ b/storage/browser/blob/blob_url_request_job.h
@@ -48,14 +48,14 @@ void SetExtraRequestHeaders(const net::HttpRequestHeaders& headers) override; // Helper method to create the HTTP headers for the response. - // |blob_handles|, |blob_reader|, |byte_range| and |content_size| are only + // |blob_handles|, |total_size|, |byte_range| and |content_size| are only // used if status_code isn't an error. static scoped_refptr<net::HttpResponseHeaders> GenerateHeaders( net::HttpStatusCode status_code, BlobDataHandle* blob_handle, - BlobReader* blob_reader, net::HttpByteRange* byte_range, - int64_t* content_size); + uint64_t total_size, + uint64_t content_size); // Helper method to map from a net error to an http status code. static net::HttpStatusCode NetErrorToHttpStatusCode(int error_code);
diff --git a/storage/browser/blob/mojo_blob_reader.cc b/storage/browser/blob/mojo_blob_reader.cc new file mode 100644 index 0000000..0e29999 --- /dev/null +++ b/storage/browser/blob/mojo_blob_reader.cc
@@ -0,0 +1,212 @@ +// 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 "storage/browser/blob/mojo_blob_reader.h" + +#include "net/base/io_buffer.h" +#include "services/network/public/cpp/net_adapters.h" +#include "storage/browser/blob/blob_data_handle.h" + +namespace storage { + +// static +void MojoBlobReader::Create(FileSystemContext* file_system_context, + const BlobDataHandle* handle, + const net::HttpByteRange& range, + std::unique_ptr<Delegate> delegate) { + new MojoBlobReader(file_system_context, handle, range, std::move(delegate)); +} + +MojoBlobReader::MojoBlobReader(FileSystemContext* file_system_context, + const BlobDataHandle* handle, + const net::HttpByteRange& range, + std::unique_ptr<Delegate> delegate) + : delegate_(std::move(delegate)), + byte_range_(range), + blob_reader_(handle->CreateReader(file_system_context)), + writable_handle_watcher_(FROM_HERE, + mojo::SimpleWatcher::ArmingPolicy::MANUAL), + peer_closed_handle_watcher_(FROM_HERE, + mojo::SimpleWatcher::ArmingPolicy::MANUAL), + weak_factory_(this) { + DCHECK(delegate_); + base::SequencedTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::Bind(&MojoBlobReader::Start, weak_factory_.GetWeakPtr())); +} + +MojoBlobReader::~MojoBlobReader() {} + +void MojoBlobReader::Start() { + if (blob_reader_->net_error()) { + NotifyCompletedAndDeleteIfNeeded(blob_reader_->net_error()); + return; + } + + BlobReader::Status size_status = blob_reader_->CalculateSize( + base::Bind(&MojoBlobReader::DidCalculateSize, base::Unretained(this))); + switch (size_status) { + case BlobReader::Status::NET_ERROR: + NotifyCompletedAndDeleteIfNeeded(blob_reader_->net_error()); + return; + case BlobReader::Status::IO_PENDING: + return; + case BlobReader::Status::DONE: + DidCalculateSize(net::OK); + return; + } + + NOTREACHED(); +} + +void MojoBlobReader::NotifyCompletedAndDeleteIfNeeded(int result) { + if (!notified_completed_) { + delegate_->OnComplete(static_cast<net::Error>(result), + total_written_bytes_); + notified_completed_ = true; + } + + bool has_data_pipe = pending_write_ || response_body_stream_.is_valid(); + if (!has_data_pipe) + delete this; +} + +void MojoBlobReader::DidCalculateSize(int result) { + if (result != net::OK) { + NotifyCompletedAndDeleteIfNeeded(result); + return; + } + + // Apply the range requirement. + if (!byte_range_.ComputeBounds(blob_reader_->total_size())) { + NotifyCompletedAndDeleteIfNeeded(net::ERR_REQUEST_RANGE_NOT_SATISFIABLE); + return; + } + + DCHECK_LE(byte_range_.first_byte_position(), + byte_range_.last_byte_position() + 1); + uint64_t length = base::checked_cast<uint64_t>( + byte_range_.last_byte_position() - byte_range_.first_byte_position() + 1); + + if (blob_reader_->SetReadRange(byte_range_.first_byte_position(), length) != + BlobReader::Status::DONE) { + NotifyCompletedAndDeleteIfNeeded(blob_reader_->net_error()); + return; + } + + if (delegate_->DidCalculateSize(blob_reader_->total_size(), + blob_reader_->remaining_bytes()) == + Delegate::REQUEST_SIDE_DATA) { + if (!blob_reader_->has_side_data()) { + DidReadSideData(BlobReader::Status::DONE); + } else { + BlobReader::Status read_status = blob_reader_->ReadSideData( + base::Bind(&MojoBlobReader::DidReadSideData, base::Unretained(this))); + if (read_status != BlobReader::Status::IO_PENDING) + DidReadSideData(BlobReader::Status::DONE); + } + } else { + StartReading(); + } +} + +void MojoBlobReader::DidReadSideData(BlobReader::Status status) { + if (status != BlobReader::Status::DONE) { + NotifyCompletedAndDeleteIfNeeded(blob_reader_->net_error()); + return; + } + delegate_->DidReadSideData(blob_reader_->side_data()); + StartReading(); +} + +void MojoBlobReader::StartReading() { + response_body_stream_ = delegate_->PassDataPipe(); + peer_closed_handle_watcher_.Watch( + response_body_stream_.get(), MOJO_HANDLE_SIGNAL_PEER_CLOSED, + base::Bind(&MojoBlobReader::OnResponseBodyStreamClosed, + base::Unretained(this))); + peer_closed_handle_watcher_.ArmOrNotify(); + + writable_handle_watcher_.Watch( + response_body_stream_.get(), MOJO_HANDLE_SIGNAL_WRITABLE, + base::Bind(&MojoBlobReader::OnResponseBodyStreamReady, + base::Unretained(this))); + + // Start reading... + ReadMore(); +} + +void MojoBlobReader::ReadMore() { + DCHECK(!pending_write_.get()); + + uint32_t num_bytes; + // TODO: we should use the abstractions in MojoAsyncResourceHandler. + MojoResult result = network::NetToMojoPendingBuffer::BeginWrite( + &response_body_stream_, &pending_write_, &num_bytes); + if (result == MOJO_RESULT_SHOULD_WAIT) { + // The pipe is full. We need to wait for it to have more space. + writable_handle_watcher_.ArmOrNotify(); + return; + } else if (result != MOJO_RESULT_OK) { + // The response body stream is in a bad state. Bail. + writable_handle_watcher_.Cancel(); + response_body_stream_.reset(); + NotifyCompletedAndDeleteIfNeeded(net::ERR_UNEXPECTED); + return; + } + + CHECK_GT(static_cast<uint32_t>(std::numeric_limits<int>::max()), num_bytes); + auto buf = + base::MakeRefCounted<network::NetToMojoIOBuffer>(pending_write_.get()); + int bytes_read; + BlobReader::Status read_status = blob_reader_->Read( + buf.get(), static_cast<int>(num_bytes), &bytes_read, + base::Bind(&MojoBlobReader::DidRead, base::Unretained(this), false)); + switch (read_status) { + case BlobReader::Status::NET_ERROR: + NotifyCompletedAndDeleteIfNeeded(blob_reader_->net_error()); + return; + case BlobReader::Status::IO_PENDING: + // Wait for DidRead. + return; + case BlobReader::Status::DONE: + if (bytes_read > 0) { + DidRead(true, bytes_read); + } else { + writable_handle_watcher_.Cancel(); + pending_write_->Complete(0); + pending_write_ = nullptr; // This closes the data pipe. + NotifyCompletedAndDeleteIfNeeded(net::OK); + return; + } + } +} + +void MojoBlobReader::DidRead(bool completed_synchronously, int num_bytes) { + delegate_->DidRead(num_bytes); + response_body_stream_ = pending_write_->Complete(num_bytes); + total_written_bytes_ += num_bytes; + pending_write_ = nullptr; + if (completed_synchronously) { + base::SequencedTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::Bind(&MojoBlobReader::ReadMore, weak_factory_.GetWeakPtr())); + } else { + ReadMore(); + } +} + +void MojoBlobReader::OnResponseBodyStreamClosed(MojoResult result) { + response_body_stream_.reset(); + pending_write_ = nullptr; + NotifyCompletedAndDeleteIfNeeded(net::ERR_ABORTED); +} + +void MojoBlobReader::OnResponseBodyStreamReady(MojoResult result) { + // TODO(jam): Handle a bad |result| value. + DCHECK_EQ(result, MOJO_RESULT_OK); + ReadMore(); +} + +} // namespace storage
diff --git a/storage/browser/blob/mojo_blob_reader.h b/storage/browser/blob/mojo_blob_reader.h new file mode 100644 index 0000000..04221e1 --- /dev/null +++ b/storage/browser/blob/mojo_blob_reader.h
@@ -0,0 +1,143 @@ +// 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 STORAGE_BROWSER_BLOB_MOJO_BLOB_READER_H_ +#define STORAGE_BROWSER_BLOB_MOJO_BLOB_READER_H_ + +#include <memory> +#include "base/memory/ref_counted.h" +#include "mojo/public/cpp/system/data_pipe.h" +#include "mojo/public/cpp/system/simple_watcher.h" +#include "net/base/net_errors.h" +#include "net/http/http_byte_range.h" +#include "storage/browser/blob/blob_reader.h" +#include "storage/browser/storage_browser_export.h" + +namespace net { +class IOBufferWithSize; +} + +namespace network { +class NetToMojoPendingBuffer; +} + +namespace storage { +class BlobDataHandle; +class FileSystemContext; + +// Reads a blob into a data pipe. Owns itself, and owns its delegate. Self +// destructs when reading is complete. +class STORAGE_EXPORT MojoBlobReader { + public: + // Methods on this delegate are called in the order they are defined here. + // With the exception of DidRead, each method is called at most once. + // OnComplete is always called, and is always the last method to be called, + // every other method could be skipped in case of errors, or if the method is + // otherwise not applicable. + class Delegate { + public: + enum RequestSideData { REQUEST_SIDE_DATA, DONT_REQUEST_SIDE_DATA }; + + virtual ~Delegate() {} + + // Called when the blob being read has been fully constructed and its size + // is known. |total_size| is the total size of the blob, while + // |content_size| is the size of the subset of this blob that matches the + // range passed to Create. + // Return |REQUEST_SIDE_DATA| if the blob's side data should be returned, + // otherwise MojoBlobReader will skip reading side data and immediately + // start reading the actual blob contents. Side data is used for example by + // service worker code to store compiled javascript alongside the script + // source in the cache. + virtual RequestSideData DidCalculateSize(uint64_t total_size, + uint64_t content_size) = 0; + + // Called if DidCalculateSize returned |REQUEST_SIDE_DATA|, with the side + // data associated with the blob being read. If the blob doesn't have side + // data this method is called with null. + virtual void DidReadSideData(net::IOBufferWithSize* data) {} + + // Called when the MojoBlobReader actually starts reading data from the + // blob. Should return a data pipe to which all the data read from the blob + // should be written. + virtual mojo::ScopedDataPipeProducerHandle PassDataPipe() = 0; + + // Called whenever some amount of data is read from the blob and about to be + // written to the data pipe. + virtual void DidRead(int num_bytes) {} + + // Called when reading the blob has finished. If an error occurs this could + // be the only method that gets called, but either way this method is always + // the last to be called, shortly before the delegate is deleted. + // |total_written_bytes| indicated the total number of bytes that were read + // from the blob, and written to the data pipe. When successful this should + // always be equal to the |content_size| that was passed to + // DidCalculateSize. + virtual void OnComplete(net::Error result, + uint64_t total_written_bytes) = 0; + }; + + static void Create(FileSystemContext* file_system_context, + const BlobDataHandle* handle, + const net::HttpByteRange& range, + std::unique_ptr<Delegate> delegate); + + private: + MojoBlobReader(FileSystemContext* file_system_context, + const BlobDataHandle* handle, + const net::HttpByteRange& range, + std::unique_ptr<Delegate> delegate); + ~MojoBlobReader(); + + void Start(); + + void NotifyCompletedAndDeleteIfNeeded(int result); + + void DidCalculateSize(int result); + void DidReadSideData(BlobReader::Status status); + void StartReading(); + void ReadMore(); + void DidRead(bool completed_synchronously, int num_bytes); + void OnResponseBodyStreamClosed(MojoResult result); + void OnResponseBodyStreamReady(MojoResult result); + + std::unique_ptr<Delegate> delegate_; + + // The range of the blob that should be read. Could be unbounded if the entire + // blob is being read. + net::HttpByteRange byte_range_; + + // Underlying BlobReader data is being read from. + std::unique_ptr<BlobReader> blob_reader_; + + // Mojo data pipe where the data that is being read is written to. Will be + // null during write operations, at which time |pending_write_| owns the data + // pipe instead. + mojo::ScopedDataPipeProducerHandle response_body_stream_; + + // During a write operation this owns the data pipe handle and gives access to + // the pipe's internal buffer where data should be written. + scoped_refptr<network::NetToMojoPendingBuffer> pending_write_; + + // Watchers to keep track of the state of the data pipe. One watches for the + // pipe being writable, while the other watches for the pipe unexpectedly + // closing. + mojo::SimpleWatcher writable_handle_watcher_; + mojo::SimpleWatcher peer_closed_handle_watcher_; + + // Total number of bytes written to the data pipe so far. + int64_t total_written_bytes_ = 0; + + // Set to true when the delegate's OnComplete has been called. Used to make + // sure OnComplete isn't called more than once. + bool notified_completed_ = false; + + base::WeakPtrFactory<MojoBlobReader> weak_factory_; + + DISALLOW_COPY_AND_ASSIGN(MojoBlobReader); +}; + +} // namespace storage + +#endif
diff --git a/storage/public/interfaces/blobs.mojom b/storage/public/interfaces/blobs.mojom index eb51dd8..90654ea2 100644 --- a/storage/public/interfaces/blobs.mojom +++ b/storage/public/interfaces/blobs.mojom
@@ -9,11 +9,41 @@ import "mojo/common/time.mojom"; import "url/mojo/url.mojom"; +// Interface that can be implemented to be informed of certain information while +// reading the data for a blob. +interface BlobReaderClient { + // Called when the size of the blob being read has been calculated: + // |total_size| is the total size of the blob. + // |expected_content_size| is how many bytes should be sent over the data + // pipe, taking into account a range if the blob was read with ReadRange. + // If an error occurs while reading the blob, this method might not get called. + OnCalculatedSize(uint64 total_size, + uint64 expected_content_size); + + // Called when reading the blob finished (with success or failure). Status is + // a net::Error indicating any potential error that might have occurred, + // |data_length| tells the reader how many bytes were written into the data + // pipe, and can be used as a sanity check to make sure all bytes were + // received. + OnComplete(int32 status, uint64 data_length); +}; + // This interface provides access to a blob in the blob system. interface Blob { // Creates a copy of this Blob reference. Clone(Blob& blob); + // Causes the entire contents of this blob to be written into the given data + // pipe. An optional BlobReaderClient will be informed of the result of the + // read operation. + ReadAll(handle<data_pipe_producer> pipe, BlobReaderClient? client); + + // Causes a subrange of the contents of this blob to be written into the given + // data pipe. An optional BlobReaderClient will be informed of the result of + // the read operation. + ReadRange(uint64 offset, uint64 length, handle<data_pipe_producer> pipe, + BlobReaderClient? client); + // This method is an implementation detail of the blob system. You should not // ever need to call it directly. // This returns the internal UUID of the blob, used by the blob system to
diff --git a/testing/android/docs/instrumentation.md b/testing/android/docs/instrumentation.md index 458e03f5..cfd9f0c 100644 --- a/testing/android/docs/instrumentation.md +++ b/testing/android/docs/instrumentation.md
@@ -51,13 +51,20 @@ In many cases, Chromium has extended the instrumentation test framework classes to implement additional features. -### Test runners +### Tracing -[todo](/testing/android/docs/todo.md) +Enabling tracing during a test run allows all the function calls involved to be +observed in a visual display (using Chrome's built-in chrome://tracing feature). +To run a test with tracing, add the `--trace-output` flag to the command used to +call the instrumentation test (either running the test_runner.py script, or a +generated binary such as `run_chrome_public_test_apk`). The `--trace-output` flag +takes a filename, which, after the test run, will contain a JSON file readable +by chrome://tracing. -### Test cases - -[todo](/testing/android/docs/todo.md) +By default, the trace includes only certain function calls important to the test +run, both within the Python test runner framework and the Java code running on +the device. For a more detailed look, add the (no-argument) `--trace-all` flag. +This causes every function called on the Python side to be added to the trace. ### Annotations
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json index 6e904f6..ffb4d42 100644 --- a/testing/buildbot/chromium.android.fyi.json +++ b/testing/buildbot/chromium.android.fyi.json
@@ -24,16 +24,18 @@ "Android Tests with Tracing": { "instrumentation_tests": [ { + "args": [ + "-f", + "ContextualSearchTapEventTest#*" + ], "test": "chrome_public_test_apk", "trace_output": true }, { - "test": "chrome_sync_shell_test_apk", - "trace_output": true + "test": "chrome_sync_shell_test_apk" }, { - "test": "content_shell_test_apk", - "trace_output": true + "test": "content_shell_test_apk" } ] },
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index 27a41f4..cf86565 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -10472,8 +10472,7 @@ }, "Fuchsia": { "additional_compile_targets": [ - "gl_unittests", - "net_unittests" + "gl_unittests" ], "gtest_tests": [ { @@ -10549,6 +10548,16 @@ "test": "mojo_system_unittests" }, { + "args": [ + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.net_unittests.filter", + "--test-launcher-batch-limit=200" + ], + "swarming": { + "can_use_on_swarming_builders": false + }, + "test": "net_unittests" + }, + { "swarming": { "can_use_on_swarming_builders": false }, @@ -11263,18 +11272,6 @@ } ] }, - "test": "oop_heap_profiling_unit_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "android_devices": "1", - "device_type": "coho" - } - ] - }, "test": "remoting_unittests" }, { @@ -11682,12 +11679,6 @@ "swarming": { "can_use_on_swarming_builders": true }, - "test": "oop_heap_profiling_unit_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, "test": "pdf_unittests" }, { @@ -12000,12 +11991,6 @@ "swarming": { "can_use_on_swarming_builders": true }, - "test": "oop_heap_profiling_unit_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, "test": "pdf_unittests" }, { @@ -12295,12 +12280,6 @@ "swarming": { "can_use_on_swarming_builders": true }, - "test": "oop_heap_profiling_unit_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, "test": "pdf_unittests" }, { @@ -13668,7 +13647,7 @@ }, { "gpu": "8086:0a2e", - "hidpi": 0, + "hidpi": "0", "os": "Mac-10.12.5" } ],
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json index 78e420f..0540cb24 100644 --- a/testing/buildbot/chromium.gpu.fyi.json +++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -2408,413 +2408,6 @@ "isolated_scripts": [] }, "Linux ChromiumOS Ozone Builder": {}, - "Linux Debug (Intel HD 530)": { - "gtest_tests": [ - { - "args": [ - "--use-gpu-in-tests", - "--test-launcher-retry-limit=0" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - }, - "test": "angle_end2end_tests", - "use_xvfb": false - }, - { - "args": [ - "--use-gpu-in-tests", - "--test-launcher-retry-limit=0", - "--no-xvfb" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - }, - "test": "angle_unittests", - "use_xvfb": false - }, - { - "args": [ - "--use-gpu-in-tests" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - }, - "test": "audio_unittests", - "use_xvfb": false - }, - { - "args": [ - "--use-gpu-in-tests" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - }, - "test": "gl_tests", - "use_xvfb": false - }, - { - "args": [ - "--use-gpu-in-tests", - "--no-xvfb" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - }, - "test": "gl_unittests", - "use_xvfb": false - }, - { - "args": [ - "--use-gpu-in-tests" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - }, - "test": "gles2_conform_test", - "use_xvfb": false - }, - { - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - }, - "test": "swiftshader_unittests", - "use_xvfb": false - } - ], - "isolated_scripts": [ - { - "args": [ - "context_lost", - "--show-stdout", - "--browser=debug", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "context_lost_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - } - }, - { - "args": [ - "depth_capture", - "--show-stdout", - "--browser=debug", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "depth_capture_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - } - }, - { - "args": [ - "gpu_process", - "--show-stdout", - "--browser=debug", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "gpu_process_launch_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - } - }, - { - "args": [ - "hardware_accelerated_feature", - "--show-stdout", - "--browser=debug", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "hardware_accelerated_feature_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - } - }, - { - "args": [ - "info_collection", - "--show-stdout", - "--browser=debug", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", - "--expected-vendor-id", - "8086", - "--expected-device-id", - "1912" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "info_collection_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - } - }, - { - "args": [ - "maps", - "--show-stdout", - "--browser=debug", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", - "--os-type", - "linux", - "--build-revision", - "${got_revision}", - "--test-machine-name", - "${buildername}" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "maps_pixel_test", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - } - }, - { - "args": [ - "pixel", - "--show-stdout", - "--browser=debug", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", - "--refimg-cloud-storage-bucket", - "chromium-gpu-archive/reference-images", - "--os-type", - "linux", - "--build-revision", - "${got_revision}", - "--test-machine-name", - "${buildername}" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "pixel_test", - "non_precommit_args": [ - "--upload-refimg-to-cloud-storage" - ], - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "precommit_args": [ - "--download-refimg-from-cloud-storage" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - } - }, - { - "args": [ - "screenshot_sync", - "--show-stdout", - "--browser=debug", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "screenshot_sync_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - } - }, - { - "args": [ - "trace_test", - "--show-stdout", - "--browser=debug", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "trace_test", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - } - }, - { - "args": [ - "webgl_conformance", - "--show-stdout", - "--browser=debug", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=gl --use-passthrough-cmd-decoder" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "webgl_conformance_gl_passthrough_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - } - }, - { - "args": [ - "webgl_conformance", - "--show-stdout", - "--browser=debug", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "webgl_conformance_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - } - } - ] - }, "Linux Debug (NVIDIA)": { "gtest_tests": [ { @@ -3862,481 +3455,6 @@ } ] }, - "Linux Release (Intel HD 530)": { - "gtest_tests": [ - { - "args": [ - "--use-gpu-in-tests", - "--test-launcher-retry-limit=0" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - }, - "test": "angle_end2end_tests", - "use_xvfb": false - }, - { - "args": [ - "--use-gpu-in-tests", - "--test-launcher-retry-limit=0", - "--no-xvfb" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - }, - "test": "angle_unittests", - "use_xvfb": false - }, - { - "args": [ - "--use-gpu-in-tests" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - }, - "test": "audio_unittests", - "use_xvfb": false - }, - { - "args": [ - "--enable-gpu", - "--no-xvfb", - "--test-launcher-jobs=1", - "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*" - ], - "name": "tab_capture_end2end_tests", - "swarming": { - "can_use_on_swarming_builders": false - }, - "test": "browser_tests", - "use_xvfb": false - }, - { - "args": [ - "--use-gpu-in-tests" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - }, - "test": "gl_tests", - "use_xvfb": false - }, - { - "args": [ - "--use-gpu-in-tests", - "--no-xvfb" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - }, - "test": "gl_unittests", - "use_xvfb": false - }, - { - "args": [ - "--use-gpu-in-tests" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - }, - "test": "gles2_conform_test", - "use_xvfb": false - }, - { - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - }, - "test": "swiftshader_unittests", - "use_xvfb": false - } - ], - "isolated_scripts": [ - { - "args": [ - "context_lost", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "context_lost_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - } - }, - { - "args": [ - "depth_capture", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "depth_capture_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - } - }, - { - "args": [ - "gpu_process", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "gpu_process_launch_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - } - }, - { - "args": [ - "hardware_accelerated_feature", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "hardware_accelerated_feature_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - } - }, - { - "args": [ - "info_collection", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", - "--expected-vendor-id", - "8086", - "--expected-device-id", - "1912" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "info_collection_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - } - }, - { - "args": [ - "maps", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", - "--os-type", - "linux", - "--build-revision", - "${got_revision}", - "--test-machine-name", - "${buildername}" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "maps_pixel_test", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - } - }, - { - "args": [ - "pixel", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", - "--refimg-cloud-storage-bucket", - "chromium-gpu-archive/reference-images", - "--os-type", - "linux", - "--build-revision", - "${got_revision}", - "--test-machine-name", - "${buildername}" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "pixel_test", - "non_precommit_args": [ - "--upload-refimg-to-cloud-storage" - ], - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "precommit_args": [ - "--download-refimg-from-cloud-storage" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - } - }, - { - "args": [ - "screenshot_sync", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "screenshot_sync_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - } - }, - { - "args": [ - "trace_test", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "trace_test", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - } - }, - { - "args": [ - "webgl_conformance", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=gl --use-passthrough-cmd-decoder", - "--webgl-conformance-version=2.0.1", - "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "webgl2_conformance_gl_passthrough_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ], - "shards": 15 - } - }, - { - "args": [ - "webgl_conformance", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", - "--webgl-conformance-version=2.0.1", - "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "webgl2_conformance_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ], - "shards": 15 - } - }, - { - "args": [ - "webgl_conformance", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=gl --use-passthrough-cmd-decoder" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "webgl_conformance_gl_passthrough_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - } - }, - { - "args": [ - "webgl_conformance", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "webgl_conformance_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Ubuntu" - } - ] - } - } - ] - }, "Linux Release (Intel HD 630)": { "gtest_tests": [ { @@ -11898,550 +11016,6 @@ } ] }, - "Win10 Debug (Intel HD 530)": { - "gtest_tests": [ - { - "args": [ - "--use-gpu-in-tests", - "--test-launcher-retry-limit=0" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - }, - "test": "angle_end2end_tests", - "use_xvfb": false - }, - { - "args": [ - "--use-gpu-in-tests", - "--test-launcher-retry-limit=0" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - }, - "test": "angle_unittests", - "use_xvfb": false - }, - { - "args": [ - "--test-launcher-retry-limit=0" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - }, - "test": "angle_white_box_tests", - "use_xvfb": false - }, - { - "args": [ - "--use-gpu-in-tests" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - }, - "test": "audio_unittests", - "use_xvfb": false - }, - { - "args": [ - "--use-gpu-in-tests" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - }, - "test": "gl_tests", - "use_xvfb": false - }, - { - "args": [ - "--use-gpu-in-tests" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - }, - "test": "gl_unittests", - "use_xvfb": false - }, - { - "args": [ - "--use-gpu-in-tests", - "--use-angle=d3d9" - ], - "name": "gles2_conform_d3d9_test", - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - }, - "test": "gles2_conform_test", - "use_xvfb": false - }, - { - "args": [ - "--use-gpu-in-tests", - "--use-angle=gl", - "--disable-gpu-sandbox" - ], - "name": "gles2_conform_gl_test", - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - }, - "test": "gles2_conform_test", - "use_xvfb": false - }, - { - "args": [ - "--use-gpu-in-tests" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - }, - "test": "gles2_conform_test", - "use_xvfb": false - }, - { - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - }, - "test": "swiftshader_unittests", - "use_xvfb": false - }, - { - "args": [ - "--use-angle=d3d11", - "--use-test-data-path", - "--test_video_data=test-25fps.h264:320:240:250:258:::1" - ], - "name": "video_decode_accelerator_d3d11_unittest", - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - }, - "test": "video_decode_accelerator_unittest", - "use_xvfb": false - }, - { - "args": [ - "--use-angle=d3d9", - "--use-test-data-path", - "--test_video_data=test-25fps.h264:320:240:250:258:::1" - ], - "name": "video_decode_accelerator_d3d9_unittest", - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - }, - "test": "video_decode_accelerator_unittest", - "use_xvfb": false - } - ], - "isolated_scripts": [ - { - "args": [ - "context_lost", - "--show-stdout", - "--browser=debug", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "context_lost_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - } - }, - { - "args": [ - "depth_capture", - "--show-stdout", - "--browser=debug", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "depth_capture_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - } - }, - { - "args": [ - "gpu_process", - "--show-stdout", - "--browser=debug", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "gpu_process_launch_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - } - }, - { - "args": [ - "hardware_accelerated_feature", - "--show-stdout", - "--browser=debug", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "hardware_accelerated_feature_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - } - }, - { - "args": [ - "info_collection", - "--show-stdout", - "--browser=debug", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", - "--expected-vendor-id", - "8086", - "--expected-device-id", - "1912" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "info_collection_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - } - }, - { - "args": [ - "maps", - "--show-stdout", - "--browser=debug", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", - "--os-type", - "win", - "--build-revision", - "${got_revision}", - "--test-machine-name", - "${buildername}" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "maps_pixel_test", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - } - }, - { - "args": [ - "pixel", - "--show-stdout", - "--browser=debug", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", - "--refimg-cloud-storage-bucket", - "chromium-gpu-archive/reference-images", - "--os-type", - "win", - "--build-revision", - "${got_revision}", - "--test-machine-name", - "${buildername}" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "pixel_test", - "non_precommit_args": [ - "--upload-refimg-to-cloud-storage" - ], - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "precommit_args": [ - "--download-refimg-from-cloud-storage" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - } - }, - { - "args": [ - "screenshot_sync", - "--show-stdout", - "--browser=debug", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "screenshot_sync_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - } - }, - { - "args": [ - "trace_test", - "--show-stdout", - "--browser=debug", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "trace_test", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - } - }, - { - "args": [ - "webgl_conformance", - "--show-stdout", - "--browser=debug", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-angle=d3d11 --use-passthrough-cmd-decoder" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "webgl_conformance_d3d11_passthrough_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - } - }, - { - "args": [ - "webgl_conformance", - "--show-stdout", - "--browser=debug", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-angle=d3d9" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "webgl_conformance_d3d9_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - } - }, - { - "args": [ - "webgl_conformance", - "--show-stdout", - "--browser=debug", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-angle=gl" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "webgl_conformance_gl_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - } - }, - { - "args": [ - "webgl_conformance", - "--show-stdout", - "--browser=debug", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "webgl_conformance_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - } - } - ] - }, "Win10 Debug (NVIDIA)": { "gtest_tests": [ { @@ -12528,6 +11102,24 @@ }, { "args": [ + "--use-gpu-in-tests", + "--use-passthrough-cmd-decoder" + ], + "name": "gl_tests_passthrough", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:104a", + "os": "Windows-10" + } + ] + }, + "test": "gl_tests", + "use_xvfb": false + }, + { + "args": [ "--use-gpu-in-tests" ], "swarming": { @@ -13005,591 +11597,6 @@ } ] }, - "Win10 Release (Intel HD 530)": { - "gtest_tests": [ - { - "args": [ - "--use-gpu-in-tests", - "--test-launcher-retry-limit=0" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - }, - "test": "angle_end2end_tests", - "use_xvfb": false - }, - { - "args": [ - "--use-gpu-in-tests", - "--test-launcher-retry-limit=0" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - }, - "test": "angle_unittests", - "use_xvfb": false - }, - { - "args": [ - "--test-launcher-retry-limit=0" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - }, - "test": "angle_white_box_tests", - "use_xvfb": false - }, - { - "args": [ - "--use-gpu-in-tests" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - }, - "test": "audio_unittests", - "use_xvfb": false - }, - { - "args": [ - "--enable-gpu", - "--no-xvfb", - "--test-launcher-jobs=1", - "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*" - ], - "name": "tab_capture_end2end_tests", - "swarming": { - "can_use_on_swarming_builders": false - }, - "test": "browser_tests", - "use_xvfb": false - }, - { - "args": [ - "--use-gpu-in-tests" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - }, - "test": "gl_tests", - "use_xvfb": false - }, - { - "args": [ - "--use-gpu-in-tests" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - }, - "test": "gl_unittests", - "use_xvfb": false - }, - { - "args": [ - "--use-gpu-in-tests", - "--use-angle=d3d9" - ], - "name": "gles2_conform_d3d9_test", - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - }, - "test": "gles2_conform_test", - "use_xvfb": false - }, - { - "args": [ - "--use-gpu-in-tests", - "--use-angle=gl", - "--disable-gpu-sandbox" - ], - "name": "gles2_conform_gl_test", - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - }, - "test": "gles2_conform_test", - "use_xvfb": false - }, - { - "args": [ - "--use-gpu-in-tests" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - }, - "test": "gles2_conform_test", - "use_xvfb": false - }, - { - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - }, - "test": "swiftshader_unittests", - "use_xvfb": false - }, - { - "args": [ - "--use-angle=d3d11", - "--use-test-data-path", - "--test_video_data=test-25fps.h264:320:240:250:258:::1" - ], - "name": "video_decode_accelerator_d3d11_unittest", - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - }, - "test": "video_decode_accelerator_unittest", - "use_xvfb": false - }, - { - "args": [ - "--use-angle=d3d9", - "--use-test-data-path", - "--test_video_data=test-25fps.h264:320:240:250:258:::1" - ], - "name": "video_decode_accelerator_d3d9_unittest", - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - }, - "test": "video_decode_accelerator_unittest", - "use_xvfb": false - } - ], - "isolated_scripts": [ - { - "args": [ - "context_lost", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "context_lost_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - } - }, - { - "args": [ - "depth_capture", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "depth_capture_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - } - }, - { - "args": [ - "gpu_process", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "gpu_process_launch_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - } - }, - { - "args": [ - "hardware_accelerated_feature", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "hardware_accelerated_feature_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - } - }, - { - "args": [ - "info_collection", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", - "--expected-vendor-id", - "8086", - "--expected-device-id", - "1912" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "info_collection_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - } - }, - { - "args": [ - "maps", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", - "--os-type", - "win", - "--build-revision", - "${got_revision}", - "--test-machine-name", - "${buildername}" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "maps_pixel_test", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - } - }, - { - "args": [ - "pixel", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", - "--refimg-cloud-storage-bucket", - "chromium-gpu-archive/reference-images", - "--os-type", - "win", - "--build-revision", - "${got_revision}", - "--test-machine-name", - "${buildername}" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "pixel_test", - "non_precommit_args": [ - "--upload-refimg-to-cloud-storage" - ], - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "precommit_args": [ - "--download-refimg-from-cloud-storage" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - } - }, - { - "args": [ - "screenshot_sync", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "screenshot_sync_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - } - }, - { - "args": [ - "trace_test", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "trace_test", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - } - }, - { - "args": [ - "webgl_conformance", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", - "--webgl-conformance-version=2.0.1", - "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "webgl2_conformance_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ], - "shards": 15 - } - }, - { - "args": [ - "webgl_conformance", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-angle=d3d11 --use-passthrough-cmd-decoder" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "webgl_conformance_d3d11_passthrough_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - } - }, - { - "args": [ - "webgl_conformance", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-angle=d3d9" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "webgl_conformance_d3d9_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - } - }, - { - "args": [ - "webgl_conformance", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-angle=gl" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "webgl_conformance_gl_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - } - }, - { - "args": [ - "webgl_conformance", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "webgl_conformance_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "8086:1912", - "os": "Windows-10" - } - ] - } - } - ] - }, "Win10 Release (Intel HD 630)": { "gtest_tests": [ { @@ -13690,6 +11697,24 @@ }, { "args": [ + "--use-gpu-in-tests", + "--use-passthrough-cmd-decoder" + ], + "name": "gl_tests_passthrough", + "swarming": { + "can_use_on_swarming_builders": false, + "dimension_sets": [ + { + "gpu": "8086:5912", + "os": "Windows-10" + } + ] + }, + "test": "gl_tests", + "use_xvfb": false + }, + { + "args": [ "--use-gpu-in-tests" ], "swarming": { @@ -14275,6 +12300,24 @@ }, { "args": [ + "--use-gpu-in-tests", + "--use-passthrough-cmd-decoder" + ], + "name": "gl_tests_passthrough", + "swarming": { + "can_use_on_swarming_builders": false, + "dimension_sets": [ + { + "gpu": "10de:1cb3", + "os": "Windows-10" + } + ] + }, + "test": "gl_tests", + "use_xvfb": false + }, + { + "args": [ "--use-gpu-in-tests" ], "swarming": { @@ -14885,6 +12928,24 @@ }, { "args": [ + "--use-gpu-in-tests", + "--use-passthrough-cmd-decoder" + ], + "name": "gl_tests_passthrough", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:104a", + "os": "Windows-10" + } + ] + }, + "test": "gl_tests", + "use_xvfb": false + }, + { + "args": [ "--use-gpu-in-tests" ], "swarming": { @@ -15557,6 +13618,24 @@ }, { "args": [ + "--use-gpu-in-tests", + "--use-passthrough-cmd-decoder" + ], + "name": "gl_tests_passthrough", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:6613", + "os": "Windows-2008ServerR2-SP1" + } + ] + }, + "test": "gl_tests", + "use_xvfb": false + }, + { + "args": [ "--use-gpu-in-tests" ], "swarming": { @@ -16096,6 +14175,24 @@ }, { "args": [ + "--use-gpu-in-tests", + "--use-passthrough-cmd-decoder" + ], + "name": "gl_tests_passthrough", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:104a", + "os": "Windows-2008ServerR2-SP1" + } + ] + }, + "test": "gl_tests", + "use_xvfb": false + }, + { + "args": [ "--use-gpu-in-tests" ], "swarming": { @@ -16692,6 +14789,24 @@ }, { "args": [ + "--use-gpu-in-tests", + "--use-passthrough-cmd-decoder" + ], + "name": "gl_tests_passthrough", + "swarming": { + "can_use_on_swarming_builders": false, + "dimension_sets": [ + { + "gpu": "1002:6613", + "os": "Windows-2008ServerR2-SP1" + } + ] + }, + "test": "gl_tests", + "use_xvfb": false + }, + { + "args": [ "--use-gpu-in-tests" ], "swarming": { @@ -17297,6 +15412,24 @@ }, { "args": [ + "--use-gpu-in-tests", + "--use-passthrough-cmd-decoder" + ], + "name": "gl_tests_passthrough", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:6613", + "os": "Windows-2008ServerR2-SP1" + } + ] + }, + "test": "gl_tests", + "use_xvfb": false + }, + { + "args": [ "--use-gpu-in-tests" ], "swarming": { @@ -17975,6 +16108,24 @@ }, { "args": [ + "--use-gpu-in-tests", + "--use-passthrough-cmd-decoder" + ], + "name": "gl_tests_passthrough", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:104a", + "os": "Windows-2008ServerR2-SP1" + } + ] + }, + "test": "gl_tests", + "use_xvfb": false + }, + { + "args": [ "--use-gpu-in-tests" ], "swarming": { @@ -18632,6 +16783,24 @@ }, { "args": [ + "--use-gpu-in-tests", + "--use-passthrough-cmd-decoder" + ], + "name": "gl_tests_passthrough", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:104a", + "os": "Windows-2008ServerR2-SP1" + } + ] + }, + "test": "gl_tests", + "use_xvfb": false + }, + { + "args": [ "--use-gpu-in-tests" ], "swarming": { @@ -19250,6 +17419,24 @@ }, { "args": [ + "--use-gpu-in-tests", + "--use-passthrough-cmd-decoder" + ], + "name": "gl_tests_passthrough", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:104a", + "os": "Windows-2008ServerR2-SP1" + } + ] + }, + "test": "gl_tests", + "use_xvfb": false + }, + { + "args": [ "--use-gpu-in-tests" ], "swarming": {
diff --git a/testing/buildbot/chromium.gpu.json b/testing/buildbot/chromium.gpu.json index 5f677998..9231b165 100644 --- a/testing/buildbot/chromium.gpu.json +++ b/testing/buildbot/chromium.gpu.json
@@ -2050,6 +2050,24 @@ }, { "args": [ + "--use-gpu-in-tests", + "--use-passthrough-cmd-decoder" + ], + "name": "gl_tests_passthrough", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:104a", + "os": "Windows-2008ServerR2-SP1" + } + ] + }, + "test": "gl_tests", + "use_xvfb": false + }, + { + "args": [ "--use-gpu-in-tests" ], "swarming": { @@ -2408,6 +2426,24 @@ }, { "args": [ + "--use-gpu-in-tests", + "--use-passthrough-cmd-decoder" + ], + "name": "gl_tests_passthrough", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:104a", + "os": "Windows-2008ServerR2-SP1" + } + ] + }, + "test": "gl_tests", + "use_xvfb": false + }, + { + "args": [ "--use-gpu-in-tests" ], "swarming": {
diff --git a/testing/buildbot/filters/fuchsia.media_unittests.filter b/testing/buildbot/filters/fuchsia.media_unittests.filter index bbe7692..4404e90d 100644 --- a/testing/buildbot/filters/fuchsia.media_unittests.filter +++ b/testing/buildbot/filters/fuchsia.media_unittests.filter
@@ -4,8 +4,11 @@ -Mojo* # These tests are slow and may flake under qemu. crbug.com/745094 --Pipeline* +-*AesDecryptorTest.* +-*SincResamplerTest* +-AudioRendererAlgorithmTest.FillBuffer_LargeBufferSize -MediaRemotingIntegrationTest* +-Pipeline* # These tests depend on base::CancelableSyncSocket, which is currently # broken, see https://crbug.com/741783
diff --git a/testing/buildbot/filters/fuchsia.net_unittests.filter b/testing/buildbot/filters/fuchsia.net_unittests.filter index d7065d5..d18ec7f 100644 --- a/testing/buildbot/filters/fuchsia.net_unittests.filter +++ b/testing/buildbot/filters/fuchsia.net_unittests.filter
@@ -1,5 +1,4 @@ # TODO(fuchsia): Fix these tests and remove the filter. crbug.com/731302 . - -*HTTPS* -*QuicEndToEndTest.Large* -*QuicEndToEndTest.TokenBinding* @@ -8,18 +7,19 @@ -*RootCert* -*Socket* -BbrSenderTest.SimpleTransferAckDecimation2 +-BidirectionalStreamTest.TestHonorAlternativeServiceHeader -CertNetFetcherImplTest* -CertVerifyProcInternalTest.* -CloseOnConnectHttpServerTest.ServerImmediatelyClosesConnection -DiskCache* -EffectiveConnectionTypeTest* -EmbeddedTestServer* --FileStreamTest.* -HttpNetworkTransactionTest.UploadUnreadableFile -HttpServerTest.* -NetworkInterfacesTest.GetNetworkList -NetworkQualitiesPrefManager* -NetworkQualityEstimatorTest* +-NetworkThrottleManager* -Proxy* -PythonUtils* -QuicSimpleClientTest* @@ -32,3 +32,13 @@ -TokenBindingURLRequest* -URLFetcher* -URLRequest* +-HostResolverImplDnsTest.DnsTask + +# TODO(fuchsia): These run too slowly at present. crbug.com/745094 +-BbrSenderTest.* +-CryptoServerTests/* +-HttpNetworkTransactionTest.* +-*Quic* +-RangeOfTreeSizes/* +-*Spdy* +-*SendAlgorithmTests.*
diff --git a/testing/buildbot/filters/mojo.fyi.network_content_browsertests.filter b/testing/buildbot/filters/mojo.fyi.network_content_browsertests.filter index b03eeb6a..d2e1074 100644 --- a/testing/buildbot/filters/mojo.fyi.network_content_browsertests.filter +++ b/testing/buildbot/filters/mojo.fyi.network_content_browsertests.filter
@@ -143,8 +143,10 @@ -TouchInputBrowserTest.MultiPointTouchPress -TouchInputBrowserTest.TouchHandlerNoConsume -WebContentsImplBrowserTest.ClearNonVisiblePendingOnFail +-WebContentsImplBrowserTest.DidGetResourceResponseStartUpdatesWaitingState -WebContentsImplBrowserTest.DownloadImage_Deny_FileImage -WebContentsImplBrowserTest.GetSizeForNewRenderView +-WebContentsImplBrowserTest.LoadingStateChangedForSameDocumentNavigation -WebContentsImplBrowserTest.UserAgentOverride -WebContentsViewAuraTest.ScreenshotForSwappedOutRenderViews -WebRtcGetUserMediaOldConstraintsBrowserTest.GetUserMediaWithInvalidMandatorySourceID @@ -161,3 +163,7 @@ # content/network/url_loader_impl.cc should handle failure in # URLLoaderImpl::OnResponseBodyStreamRead(). -SRC_ClearKey/EncryptedMediaTest.FrameSizeChangeVideo/0 + +# https://crbug.com/754827 +-ResourceDispatcherHostBrowserTest.SyncXMLHttpRequest_Cancelled +-BrowserSideNavigationBrowserDisableWebSecurityTest.ValidateBaseUrlForDataUrl
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl index f0c0957..71a4061 100644 --- a/testing/buildbot/gn_isolate_map.pyl +++ b/testing/buildbot/gn_isolate_map.pyl
@@ -777,10 +777,6 @@ "label": "//chrome/installer/mini_installer:next_version_mini_installer", "type": "additional_compile_target", }, - "oop_heap_profiling_unit_tests": { - "label": "//chrome/profiling:unit_tests", - "type": "console_test_launcher", - }, "ozone_unittests": { "label": "//ui/ozone:ozone_unittests", "type": "console_test_launcher",
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 22b5e67..639353f3 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -454,6 +454,22 @@ ] } ], + "ClearOldOnDemandFavicons": [ + { + "platforms": [ + "android", + "ios" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "ClearOldOnDemandFavicons" + ] + } + ] + } + ], "ClientSidePreviews": [ { "platforms": [ @@ -1696,8 +1712,8 @@ "params": { "availability": "any", "event_new_tab_opened": "name:new_tab_opened;comparator:==0;window:3650;storage:3650", + "event_new_tab_session_time_met": "name:new_tab_session_time_met;comparator:>=1;window:3650;storage:3650", "event_omnibox_used": "name:omnibox_used;comparator:>=1;window:3650;storage:3650", - "event_session_time": "name:session_time;comparator:>=1;window:3650;storage:3650", "event_trigger": "name:new_tab_trigger;comparator:any;window:3650;storage:3650", "event_used": "name:new_tab_clicked;comparator:any;window:3650;storage:3650", "session_rate": "<=3",
diff --git a/third_party/.gitignore b/third_party/.gitignore index 4213f70..94db067 100644 --- a/third_party/.gitignore +++ b/third_party/.gitignore
@@ -24,7 +24,7 @@ /apache-win32/modules/*.dll /apk-patch-size-estimator/lib/*.jar /asan -/bazel/desugar/*.jar +/bazel/desugar/Desugar.jar /bidichecker /bison /boringssl/src
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG index 2964525..0257867 100644 --- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG +++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
@@ -346,7 +346,7 @@ crbug.com/591099 compositing/gestures/gesture-tapHighlight-2-iframe.html [ Failure ] crbug.com/591099 compositing/gestures/gesture-tapHighlight-img-and-text-2.html [ Failure ] crbug.com/591099 compositing/gestures/gesture-tapHighlight-img-transformed.html [ Failure ] -crbug.com/591099 compositing/gestures/gesture-tapHighlight-overflowing-text-crash.html [ Failure ] +crbug.com/591099 compositing/gestures/gesture-tapHighlight-overflowing-text-crash.html [ Failure Pass ] crbug.com/591099 compositing/gestures/gesture-tapHighlight-with-box-shadow.html [ Failure ] crbug.com/591099 compositing/iframes/become-composited-nested-iframes.html [ Failure ] crbug.com/591099 compositing/iframes/become-overlapped-iframe.html [ Failure ] @@ -1491,8 +1491,8 @@ crbug.com/591099 css3/filters/filter-with-opacity-and-children.html [ Failure ] crbug.com/591099 css3/filters/filtered-compositing-descendant.html [ Failure ] crbug.com/591099 css3/filters/filtered-inline.html [ Failure ] -crbug.com/591099 css3/filters/huge-region-composited.html [ Failure ] -crbug.com/591099 css3/filters/huge-region.html [ Failure ] +crbug.com/591099 css3/filters/huge-region-composited.html [ Failure Pass ] +crbug.com/591099 css3/filters/huge-region.html [ Failure Pass ] crbug.com/591099 css3/filters/nested-filter.html [ Crash Failure ] crbug.com/591099 css3/filters/offscreen-filters-memory-usage.html [ Failure ] crbug.com/591099 css3/filters/regions-expanding.html [ Crash Failure ] @@ -1514,7 +1514,6 @@ crbug.com/591099 css3/flexbox/flex-flow-padding.html [ Failure ] crbug.com/591099 css3/flexbox/flex-item-contains-strict.html [ Crash Failure ] crbug.com/591099 css3/flexbox/flex-longhand-parsing.html [ Failure ] -crbug.com/591099 css3/flexbox/flex-one-sets-flex-basis-to-zero-px.html [ Failure Pass ] crbug.com/591099 css3/flexbox/flex-property-parsing.html [ Failure ] crbug.com/591099 css3/flexbox/flexbox-baseline-margins.html [ Failure ] crbug.com/591099 css3/flexbox/flexbox-baseline.html [ Failure ] @@ -2531,7 +2530,7 @@ crbug.com/591099 editing/execCommand/clipboard-access-with-userGesture.html [ Failure ] crbug.com/591099 editing/execCommand/clipboard-access.html [ Failure ] crbug.com/591099 editing/execCommand/convert-style-elements-to-spans.html [ Failure ] -crbug.com/591099 editing/execCommand/crash-line-break-after-outdent.html [ Crash Failure ] +crbug.com/591099 editing/execCommand/crash-line-break-after-outdent.html [ Crash Failure Pass ] crbug.com/591099 editing/execCommand/default-paragraph-separator.html [ Failure ] crbug.com/591099 editing/execCommand/default-parameters.html [ Failure ] crbug.com/591099 editing/execCommand/delete-selection-has-style.html [ Failure ] @@ -2565,7 +2564,7 @@ crbug.com/591099 editing/execCommand/insert-image-on-top-of-directional-text.html [ Failure ] crbug.com/591099 editing/execCommand/insert-line-break-no-scroll.html [ Failure ] crbug.com/591099 editing/execCommand/insert-list-br-with-child-crash.html [ Crash Failure ] -crbug.com/591099 editing/execCommand/insert-list-empty-div.html [ Failure ] +crbug.com/591099 editing/execCommand/insert_list_empty_div.html [ Failure ] crbug.com/591099 editing/execCommand/insert-list-in-noneditable-list-parent.html [ Failure ] crbug.com/591099 editing/execCommand/insert-lists-inside-another-list.html [ Crash Failure ] crbug.com/591099 editing/execCommand/insert-ordered-list-crash.html [ Crash Failure ] @@ -2574,9 +2573,11 @@ crbug.com/591099 editing/execCommand/insertHTML.html [ Failure ] crbug.com/591099 editing/execCommand/insertImage-src.html [ Failure ] crbug.com/591099 editing/execCommand/insertImage.html [ Failure ] +crbug.com/591099 editing/execCommand/insert_list/insert_list_no_hang.html [ Failure ] crbug.com/591099 editing/execCommand/inserting-ordered-list-crash.html [ Crash Failure ] crbug.com/591099 editing/execCommand/italicizeByCharacter.html [ Crash Failure ] crbug.com/591099 editing/execCommand/justify.html [ Failure Timeout ] +crbug.com/591099 editing/execCommand/keep_typing_style.html [ Failure ] crbug.com/591099 editing/execCommand/merge-text-decoration-with-typing-style.html [ Failure ] crbug.com/591099 editing/execCommand/modifyForeColorByCharacter.html [ Crash Failure ] crbug.com/591099 editing/execCommand/move-selection-back-line-rtl.html [ Failure ] @@ -2734,18 +2735,18 @@ crbug.com/591099 editing/pasteboard/can-read-in-dragstart-event.html [ Failure ] crbug.com/591099 editing/pasteboard/clipboard-customData.html [ Failure ] crbug.com/591099 editing/pasteboard/copy-backslash-with-euc.html [ Crash Failure ] -crbug.com/591099 editing/pasteboard/copy-crash.html [ Crash Timeout ] +crbug.com/591099 editing/pasteboard/copy-crash.html [ Crash Failure Timeout ] crbug.com/591099 editing/pasteboard/copy-display-none.html [ Failure ] crbug.com/591099 editing/pasteboard/copy-element-with-conflicting-background-color-from-rule.html [ Failure ] crbug.com/591099 editing/pasteboard/copy-image-with-alt-text.html [ Crash Failure ] crbug.com/591099 editing/pasteboard/copy-in-password-field.html [ Crash Failure ] crbug.com/591099 editing/pasteboard/copy-null-characters.html [ Crash Failure ] -crbug.com/591099 editing/pasteboard/copy-paste-bidi.html [ Crash Failure ] +crbug.com/591099 editing/pasteboard/copy-paste-bidi.html [ Crash Failure Pass ] crbug.com/591099 editing/pasteboard/copy-paste-float.html [ Crash Failure ] crbug.com/591099 editing/pasteboard/copy-paste-pre-line-content.html [ Failure ] crbug.com/591099 editing/pasteboard/copy-paste-ruby-text-with-block.html [ Crash Failure ] crbug.com/591099 editing/pasteboard/copy-paste-ruby-text.html [ Crash Failure ] -crbug.com/591099 editing/pasteboard/copy-paste-white-space.html [ Failure ] +crbug.com/591099 editing/pasteboard/copy-paste-white-space.html [ Crash Failure ] crbug.com/591099 editing/pasteboard/copy-resolves-urls.html [ Crash Failure ] crbug.com/591099 editing/pasteboard/copy-standalone-image-escaping.html [ Timeout ] crbug.com/591099 editing/pasteboard/copy-standalone-image.html [ Failure ] @@ -2869,7 +2870,7 @@ crbug.com/591099 editing/selection/anchor-focus1.html [ Crash Failure ] crbug.com/591099 editing/selection/anchor-focus2.html [ Crash Failure ] crbug.com/591099 editing/selection/anchor-focus3.html [ Crash Failure ] -crbug.com/591099 editing/selection/applystyle-to-inline-in-block.html [ Failure ] +crbug.com/591099 editing/selection/applystyle-to-inline-in-block.html [ Failure Pass ] crbug.com/591099 editing/selection/block-cursor-overtype-mode-rtl.html [ Failure ] crbug.com/591099 editing/selection/block-cursor-overtype-mode.html [ Failure ] crbug.com/591099 editing/selection/caret-after-keypress.html [ Failure ] @@ -3023,7 +3024,7 @@ crbug.com/591099 editing/selection/move-past-trailing-space.html [ Failure ] crbug.com/591099 editing/selection/move-vertically-with-paddings-borders.html [ Failure ] crbug.com/591099 editing/selection/no-range-canonicalization.html [ Failure ] -crbug.com/591099 editing/selection/offset-from-point.html [ Crash Failure ] +crbug.com/591099 editing/selection/offset-from-point.html [ Crash Failure Pass ] crbug.com/591099 editing/selection/paint-hyphen.html [ Failure ] crbug.com/591099 editing/selection/paragraph-granularity.html [ Failure ] crbug.com/591099 editing/selection/paragraph-with-ruby.html [ Crash Failure ] @@ -3090,16 +3091,7 @@ crbug.com/591099 editing/selection/user-select-all-parsing.html [ Failure ] crbug.com/591099 editing/selection/user-select-all-with-shift.html [ Crash Failure ] crbug.com/591099 editing/selection/user-select/user-select-all.html [ Crash Failure ] -crbug.com/591099 editing/selection/vertical-lr-ltr-extend-line-backward-br.html [ Failure Pass ] -crbug.com/591099 editing/selection/vertical-lr-ltr-extend-line-forward-br.html [ Failure Pass ] -crbug.com/591099 editing/selection/vertical-rl-ltr-extend-line-backward-br.html [ Failure Pass ] crbug.com/591099 editing/selection/vertical-rl-ltr-extend-line-backward-wrap.html [ Crash Failure ] -crbug.com/591099 editing/selection/vertical-rl-ltr-extend-line-forward-br.html [ Failure Pass ] -crbug.com/591099 editing/selection/vertical-rl-ltr-extend-line-forward-wrap.html [ Crash Failure Pass ] -crbug.com/591099 editing/selection/vertical-rl-rtl-extend-line-backward-br.html [ Failure Pass ] -crbug.com/591099 editing/selection/vertical-rl-rtl-extend-line-backward-p.html [ Failure Pass ] -crbug.com/591099 editing/selection/vertical-rl-rtl-extend-line-forward-br.html [ Failure Pass ] -crbug.com/591099 editing/selection/vertical-rl-rtl-extend-line-forward-p.html [ Failure Pass ] crbug.com/591099 editing/selection/word-granularity.html [ Failure ] crbug.com/591099 editing/selection/wrapped-line-caret-1.html [ Failure ] crbug.com/591099 editing/selection/wrapped-line-caret-2.html [ Failure ] @@ -3234,7 +3226,7 @@ crbug.com/591099 external/wpt/WebCryptoAPI/generateKey/failures_RSA-PSS.worker.html [ Timeout ] crbug.com/591099 external/wpt/WebCryptoAPI/generateKey/failures_RSASSA-PKCS1-v1_5.worker.html [ Timeout ] crbug.com/591099 external/wpt/WebCryptoAPI/generateKey/successes.worker.html [ Timeout ] -crbug.com/591099 external/wpt/WebCryptoAPI/generateKey/test_failures.https.html [ Pass Timeout ] +crbug.com/591099 external/wpt/WebCryptoAPI/generateKey/test_failures.https.html [ Crash Pass Timeout ] crbug.com/591099 external/wpt/WebCryptoAPI/generateKey/test_failures_AES-CBC.https.html [ Pass Timeout ] crbug.com/591099 external/wpt/WebCryptoAPI/generateKey/test_failures_AES-CTR.https.html [ Pass Timeout ] crbug.com/591099 external/wpt/WebCryptoAPI/generateKey/test_failures_AES-GCM.https.html [ Pass Timeout ] @@ -3244,20 +3236,10 @@ crbug.com/591099 external/wpt/XMLHttpRequest/send-authentication-prompt-2-manual.htm [ Crash Failure ] crbug.com/591099 external/wpt/css/CSS2/floats-clear/float-replaced-width-002.xht [ Failure ] crbug.com/591099 external/wpt/css/CSS2/floats-clear/floats-009.xht [ Failure ] -crbug.com/591099 external/wpt/css/CSS2/floats-clear/floats-029.xht [ Failure ] -crbug.com/591099 external/wpt/css/CSS2/floats-clear/floats-132.xht [ Failure Pass ] crbug.com/591099 external/wpt/css/CSS2/floats-clear/floats-143.xht [ Failure ] crbug.com/591099 external/wpt/css/CSS2/floats-clear/floats-147.xht [ Failure ] -crbug.com/591099 external/wpt/css/CSS2/floats-clear/margin-collapse-018.xht [ Failure ] -crbug.com/591099 external/wpt/css/CSS2/floats-clear/margin-collapse-027.xht [ Failure ] -crbug.com/591099 external/wpt/css/CSS2/floats-clear/margin-collapse-033.xht [ Failure ] -crbug.com/591099 external/wpt/css/CSS2/floats-clear/margin-collapse-034.xht [ Failure ] -crbug.com/591099 external/wpt/css/CSS2/floats-clear/margin-collapse-035.xht [ Failure ] crbug.com/591099 external/wpt/css/CSS2/floats-clear/margin-collapse-157.xht [ Failure ] crbug.com/591099 external/wpt/css/CSS2/floats-clear/margin-collapse-clear-008.xht [ Failure ] -crbug.com/591099 external/wpt/css/CSS2/floats-clear/margin-collapse-clear-012.xht [ Failure ] -crbug.com/591099 external/wpt/css/CSS2/floats-clear/margin-collapse-clear-013.xht [ Failure ] -crbug.com/591099 external/wpt/css/CSS2/floats-clear/margin-collapse-clear-014.xht [ Failure ] crbug.com/591099 external/wpt/css/CSS2/floats/floats-placement-vertical-001a.xht [ Failure Pass ] crbug.com/591099 external/wpt/css/CSS2/floats/floats-placement-vertical-001b.xht [ Failure Pass ] crbug.com/591099 external/wpt/css/CSS2/floats/floats-placement-vertical-001c.xht [ Failure Pass ] @@ -3281,9 +3263,6 @@ crbug.com/591099 external/wpt/css/CSS2/linebox/vertical-align-baseline-005a.xht [ Failure ] crbug.com/591099 external/wpt/css/CSS2/normal-flow/block-in-inline-percents-001.xht [ Failure ] crbug.com/591099 external/wpt/css/CSS2/normal-flow/block-replaced-width-006.xht [ Failure ] -crbug.com/591099 external/wpt/css/CSS2/normal-flow/inline-replaced-width-012.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/CSS2/normal-flow/inline-replaced-width-013.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/CSS2/normal-flow/inline-replaced-width-015.xht [ Failure Pass ] crbug.com/591099 external/wpt/css/CSS2/normal-flow/max-height-percentage-002.xht [ Failure ] crbug.com/591099 external/wpt/css/CSS2/normal-flow/root-box-001.xht [ Crash Failure ] crbug.com/591099 external/wpt/css/CSS2/positioning/absolute-replaced-width-036.xht [ Failure ] @@ -3379,30 +3358,6 @@ crbug.com/591099 external/wpt/css/css-grid-1/abspos/positioned-grid-items-009.html [ Failure ] crbug.com/591099 external/wpt/css/css-grid-1/abspos/positioned-grid-items-016.html [ Failure ] crbug.com/591099 external/wpt/css/css-grid-1/abspos/positioned-grid-items-017.html [ Failure ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-005.html [ Crash Failure Pass ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-006.html [ Crash Failure Pass ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-007.html [ Crash Failure Pass ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-008.html [ Crash Failure Pass ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-013.html [ Crash Failure Pass ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-014.html [ Crash Failure Pass ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-015.html [ Crash Failure Pass ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-016.html [ Crash Failure Pass ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-001.html [ Crash Failure Pass ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-002.html [ Crash Failure Pass ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-003.html [ Crash Failure Pass ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-004.html [ Crash Failure Pass ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-009.html [ Crash Failure Pass ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-010.html [ Crash Failure Pass ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-011.html [ Crash Failure Pass ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-012.html [ Crash Failure Pass ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-001.html [ Crash Failure Pass ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-002.html [ Crash Failure Pass ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-003.html [ Crash Failure Pass ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-004.html [ Crash Failure Pass ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-009.html [ Crash Failure Pass ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-010.html [ Crash Failure Pass ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-011.html [ Crash Failure Pass ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-012.html [ Crash Failure Pass ] crbug.com/591099 external/wpt/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-007.html [ Failure ] crbug.com/591099 external/wpt/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-008.html [ Failure ] crbug.com/591099 external/wpt/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-009.html [ Failure ] @@ -3734,125 +3689,61 @@ crbug.com/591099 external/wpt/css/css-writing-modes-3/abs-pos-non-replaced-vrl-222.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/abs-pos-non-replaced-vrl-226.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/abs-pos-non-replaced-vrl-228.xht [ Failure ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/background-position-vrl-018.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/background-position-vrl-020.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/background-position-vrl-022.xht [ Failure Pass ] crbug.com/591099 external/wpt/css/css-writing-modes-3/baseline-inline-non-replaced-002.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/baseline-inline-non-replaced-003.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/baseline-inline-non-replaced-004.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/baseline-inline-non-replaced-005.xht [ Failure ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/baseline-inline-replaced-002.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/baseline-inline-replaced-003.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vlr-003.xht [ Crash Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vlr-007.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vlr-008.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vlr-010.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vlr-014.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vlr-015.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vlr-016.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vlr-020.xht [ Failure Pass ] crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vlr-022.xht [ Failure ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vlr-023.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vrl-002.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vrl-005.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vrl-006.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vrl-011.xht [ Failure Pass ] crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vrl-012.xht [ Failure ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vrl-013.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vrl-019.xht [ Failure Pass ] crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vrl-021.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vrl-024.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vrl-026.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/block-plaintext-004.html [ Failure ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/box-offsets-rel-pos-vlr-003.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/box-offsets-rel-pos-vrl-002.xht [ Failure Pass ] crbug.com/591099 external/wpt/css/css-writing-modes-3/central-baseline-alignment-002.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/clearance-calculations-vrl-002.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/clearance-calculations-vrl-004.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/clearance-calculations-vrl-006.xht [ Failure ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/clip-rect-vlr-011.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/clip-rect-vlr-013.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/clip-rect-vlr-015.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/clip-rect-vlr-017.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/clip-rect-vrl-010.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/clip-rect-vrl-012.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/clip-rect-vrl-014.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/clip-rect-vrl-016.xht [ Failure Pass ] crbug.com/591099 external/wpt/css/css-writing-modes-3/contiguous-floated-table-vlr-007.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/contiguous-floated-table-vlr-009.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/contiguous-floated-table-vrl-006.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/contiguous-floated-table-vrl-008.xht [ Failure ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/direction-vlr-003.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/direction-vrl-002.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/float-contiguous-vlr-009.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/float-contiguous-vlr-011.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/float-contiguous-vlr-013.xht [ Failure Pass ] crbug.com/591099 external/wpt/css/css-writing-modes-3/float-contiguous-vrl-002.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/float-contiguous-vrl-004.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/float-contiguous-vrl-006.xht [ Failure Pass ] crbug.com/591099 external/wpt/css/css-writing-modes-3/float-contiguous-vrl-008.xht [ Failure ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/float-contiguous-vrl-010.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/float-contiguous-vrl-012.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/float-lft-orthog-htb-in-vlr-002.xht [ Failure Pass ] crbug.com/591099 external/wpt/css/css-writing-modes-3/float-lft-orthog-htb-in-vrl-002.xht [ Failure ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/float-lft-orthog-vlr-in-htb-002.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/float-lft-orthog-vrl-in-htb-002.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/float-rgt-orthog-htb-in-vlr-003.xht [ Failure Pass ] crbug.com/591099 external/wpt/css/css-writing-modes-3/float-rgt-orthog-htb-in-vrl-003.xht [ Failure ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/float-vlr-005.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/float-vlr-009.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/float-vlr-011.xht [ Failure Pass ] crbug.com/591099 external/wpt/css/css-writing-modes-3/float-vlr-013.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/float-vrl-002.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/float-vrl-004.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/float-vrl-006.xht [ Failure ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/float-vrl-008.xht [ Failure Pass ] crbug.com/591099 external/wpt/css/css-writing-modes-3/float-vrl-010.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/float-vrl-012.xht [ Failure ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/horizontal-rule-vlr-003.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/horizontal-rule-vrl-002.xht [ Failure Pass ] crbug.com/591099 external/wpt/css/css-writing-modes-3/inline-block-alignment-002.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/inline-block-alignment-004.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/inline-block-alignment-006.xht [ Failure ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/inline-replaced-vlr-005.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/inline-replaced-vrl-002.xht [ Failure Pass ] crbug.com/591099 external/wpt/css/css-writing-modes-3/inline-replaced-vrl-004.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/inline-table-alignment-002.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/inline-table-alignment-004.xht [ Failure ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/line-box-direction-vlr-003.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/line-box-direction-vlr-007.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/line-box-direction-vlr-008.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/line-box-direction-vlr-010.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/line-box-direction-vlr-013.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/line-box-direction-vlr-014.xht [ Failure Pass ] crbug.com/591099 external/wpt/css/css-writing-modes-3/line-box-direction-vlr-020.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/line-box-direction-vrl-002.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/line-box-direction-vrl-005.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/line-box-direction-vrl-006.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/line-box-direction-vrl-011.xht [ Failure ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/line-box-direction-vrl-012.xht [ Failure Pass ] crbug.com/591099 external/wpt/css/css-writing-modes-3/line-box-direction-vrl-019.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/margin-collapse-vrl-010.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/margin-vlr-003.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/margin-vrl-002.xht [ Failure ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/normal-flow-overconstrained-vlr-003.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/normal-flow-overconstrained-vlr-005.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/normal-flow-overconstrained-vrl-002.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/normal-flow-overconstrained-vrl-004.xht [ Failure Pass ] crbug.com/591099 external/wpt/css/css-writing-modes-3/ortho-htb-alongside-vrl-floats-002.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/ortho-htb-alongside-vrl-floats-010.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001a.html [ Crash Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001c.html [ Crash Failure ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001d.html [ Crash Failure Pass ] crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001e.html [ Crash Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001g.html [ Crash Failure ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001h.html [ Crash Failure Pass ] crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001i.html [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001k.html [ Failure ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001l.html [ Crash Failure Pass ] crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001m.html [ Crash Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001o.html [ Crash Failure ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001p.html [ Crash Failure Pass ] crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001q.html [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001r.html [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001s.html [ Failure ] @@ -3862,16 +3753,7 @@ crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001w.html [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001x.html [ Crash Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/outline-inline-block-vrl-006.html [ Failure ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/outline-inline-vlr-006.html [ Failure Pass ] crbug.com/591099 external/wpt/css/css-writing-modes-3/outline-inline-vrl-006.html [ Failure ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/overconstrained-rel-pos-ltr-left-right-vlr-005.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/overconstrained-rel-pos-ltr-left-right-vrl-004.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/overconstrained-rel-pos-ltr-top-bottom-vlr-003.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/overconstrained-rel-pos-ltr-top-bottom-vrl-002.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/overconstrained-rel-pos-rtl-left-right-vlr-009.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/overconstrained-rel-pos-rtl-left-right-vrl-008.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/overconstrained-rel-pos-rtl-top-bottom-vlr-007.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/overconstrained-rel-pos-rtl-top-bottom-vrl-006.xht [ Failure Pass ] crbug.com/591099 external/wpt/css/css-writing-modes-3/percent-margin-vlr-003.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/percent-margin-vlr-007.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/percent-margin-vrl-002.xht [ Failure ] @@ -3882,61 +3764,12 @@ crbug.com/591099 external/wpt/css/css-writing-modes-3/percent-padding-vrl-002.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/percent-padding-vrl-004.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/percent-padding-vrl-006.xht [ Failure ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vlr-003.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vlr-007.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vlr-008.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vlr-009.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vlr-013.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vlr-015.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vlr-019.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vlr-020.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vlr-021.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vrl-003.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vrl-007.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vrl-008.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vrl-009.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vrl-015.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vrl-019.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vrl-020.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vrl-021.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-prct-htb-in-vlr-003.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-prct-htb-in-vlr-007.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-prct-htb-in-vrl-003.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-prct-htb-in-vrl-007.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/text-align-vlr-009.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/text-align-vlr-011.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/text-align-vlr-013.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/text-align-vlr-015.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/text-align-vlr-017.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/text-align-vlr-019.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/text-align-vrl-008.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/text-align-vrl-010.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/text-align-vrl-012.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/text-align-vrl-014.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/text-align-vrl-016.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/text-align-vrl-018.xht [ Failure Pass ] crbug.com/591099 external/wpt/css/css-writing-modes-3/text-baseline-vlr-007.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/text-baseline-vrl-002.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/text-baseline-vrl-004.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/text-baseline-vrl-006.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/text-combine-upright-layout-rules-001.html [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/text-combine-upright-line-breaking-rules-001.html [ Failure ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/text-indent-vlr-003.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/text-indent-vlr-005.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/text-indent-vlr-007.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/text-indent-vlr-009.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/text-indent-vlr-011.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/text-indent-vlr-013.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/text-indent-vlr-015.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/text-indent-vlr-017.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/text-indent-vrl-002.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/text-indent-vrl-004.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/text-indent-vrl-006.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/text-indent-vrl-008.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/text-indent-vrl-010.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/text-indent-vrl-012.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/text-indent-vrl-014.xht [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/text-indent-vrl-016.xht [ Failure Pass ] crbug.com/591099 external/wpt/css/css-writing-modes-3/text-orientation-016.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/vertical-alignment-002.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/vertical-alignment-004.xht [ Failure ] @@ -4168,7 +4001,6 @@ crbug.com/591099 external/wpt/intersection-observer/edge-inclusive-intersection.html [ Failure ] crbug.com/591099 external/wpt/intersection-observer/remove-element.html [ Failure ] crbug.com/591099 external/wpt/intersection-observer/same-document-root.html [ Crash Failure ] -crbug.com/591099 external/wpt/media-source/mediasource-activesourcebuffers.html [ Crash Failure Pass ] crbug.com/591099 external/wpt/media-source/mediasource-getvideoplaybackquality.html [ Crash Timeout ] crbug.com/591099 external/wpt/media-source/mediasource-remove.html [ Crash Failure Pass ] crbug.com/591099 external/wpt/payment-request/payment-allowed-by-feature-policy.https.sub.html [ Crash Failure ] @@ -4335,18 +4167,13 @@ crbug.com/591099 fast/block/align-inverted-direction.html [ Failure ] crbug.com/591099 fast/block/available-width-changes-vertical.html [ Failure ] crbug.com/591099 fast/block/basic/011.html [ Failure ] -crbug.com/591099 fast/block/basic/013.html [ Failure ] crbug.com/591099 fast/block/basic/014.html [ Failure ] crbug.com/591099 fast/block/basic/016.html [ Failure ] crbug.com/591099 fast/block/basic/018.html [ Failure ] crbug.com/591099 fast/block/basic/020.html [ Failure ] -crbug.com/591099 fast/block/basic/adding-near-anonymous-block.html [ Failure ] crbug.com/591099 fast/block/basic/fieldset-stretch-to-legend.html [ Crash Failure ] -crbug.com/591099 fast/block/basic/min-pref-width-nowrap-floats.html [ Failure Pass ] crbug.com/591099 fast/block/basic/quirk-height.html [ Failure ] crbug.com/591099 fast/block/basic/quirk-percent-height-grandchild.html [ Failure ] -crbug.com/591099 fast/block/basic/text-indent-rtl.html [ Failure ] -crbug.com/591099 fast/block/basic/white-space-pre-wraps.html [ Failure ] crbug.com/591099 fast/block/block-parent-with-zero-width-child.html [ Failure ] crbug.com/591099 fast/block/block-width-recalc-with-relative-height.html [ Crash Failure ] crbug.com/591099 fast/block/block-with-inline-replaced-child-following-text.html [ Crash Failure ] @@ -4355,20 +4182,15 @@ crbug.com/591099 fast/block/float/002.html [ Crash Failure ] crbug.com/591099 fast/block/float/003.html [ Failure ] crbug.com/591099 fast/block/float/010.html [ Failure ] -crbug.com/591099 fast/block/float/012.html [ Failure ] crbug.com/591099 fast/block/float/014.html [ Crash Failure ] crbug.com/591099 fast/block/float/015.html [ Failure ] crbug.com/591099 fast/block/float/017.html [ Crash Failure ] crbug.com/591099 fast/block/float/018.html [ Failure ] -crbug.com/591099 fast/block/float/019.html [ Failure Pass ] -crbug.com/591099 fast/block/float/020.html [ Failure ] crbug.com/591099 fast/block/float/022.html [ Failure ] -crbug.com/591099 fast/block/float/023.html [ Failure ] crbug.com/591099 fast/block/float/025.html [ Failure ] crbug.com/591099 fast/block/float/026.html [ Failure ] crbug.com/591099 fast/block/float/027.html [ Failure ] crbug.com/591099 fast/block/float/028.html [ Failure ] -crbug.com/591099 fast/block/float/030.html [ Failure ] crbug.com/591099 fast/block/float/031.html [ Failure ] crbug.com/591099 fast/block/float/032.html [ Failure ] crbug.com/591099 fast/block/float/034.html [ Failure ] @@ -4389,9 +4211,7 @@ crbug.com/591099 fast/block/float/checkbox-and-radio-avoid-floats.html [ Failure ] crbug.com/591099 fast/block/float/crash-on-absolute-positioning.html [ Failure ] crbug.com/591099 fast/block/float/crash-replaced-display-block.html [ Failure ] -crbug.com/591099 fast/block/float/editable-text-overlapping-float.html [ Failure ] crbug.com/591099 fast/block/float/element-clears-float-without-clearance.html [ Failure ] -crbug.com/591099 fast/block/float/fit_line_below_floats.html [ Failure Pass ] crbug.com/591099 fast/block/float/float-at-start-of-clean-lines-that-are-subsequently-dirtied-vertical-rl.html [ Failure ] crbug.com/591099 fast/block/float/float-at-start-of-clean-lines-that-are-subsequently-dirtied.html [ Failure ] crbug.com/591099 fast/block/float/float-avoidance.html [ Failure ] @@ -4420,12 +4240,9 @@ crbug.com/591099 fast/block/float/floats-wrap-inside-inline-002.htm [ Failure ] crbug.com/591099 fast/block/float/floats-wrap-inside-inline-003.htm [ Failure ] crbug.com/591099 fast/block/float/floats-wrap-inside-inline-004.htm [ Failure ] -crbug.com/591099 fast/block/float/floats-wrap-inside-inline-007.html [ Failure ] +crbug.com/591099 fast/block/float/floats-wrap-inside-inline-007.html [ Failure Pass ] crbug.com/591099 fast/block/float/formatting-context-changes.html [ Crash Failure ] crbug.com/591099 fast/block/float/independent-align-positioning.html [ Failure ] -crbug.com/591099 fast/block/float/intruding-float-add-in-sibling-block-on-static-position.html [ Failure Pass ] -crbug.com/591099 fast/block/float/intruding-float-add-in-sibling-block-on-static-position2.html [ Crash Failure Pass ] -crbug.com/591099 fast/block/float/intruding-painted-twice.html [ Failure ] crbug.com/591099 fast/block/float/logical-bottom-exceeds-layoutunit-max.html [ Failure ] crbug.com/591099 fast/block/float/marquee-shrink-to-avoid-floats.html [ Failure ] crbug.com/591099 fast/block/float/negative-margin-on-element-avoiding-floats-with-margin-on-parent.html [ Failure ] @@ -4433,8 +4250,6 @@ crbug.com/591099 fast/block/float/nested-clearance.html [ Failure ] crbug.com/591099 fast/block/float/nopaint-after-layer-destruction.html [ Failure ] crbug.com/591099 fast/block/float/nopaint-after-layer-destruction2.html [ Failure ] -crbug.com/591099 fast/block/float/overhanging-float-add-in-static-position-block.html [ Crash Failure Pass ] -crbug.com/591099 fast/block/float/overhanging-float-add-in-static-position-block2.html [ Crash Failure Pass ] crbug.com/591099 fast/block/float/overhanging-float-crashes-when-sibling-becomes-formatting-context.html [ Failure Pass ] crbug.com/591099 fast/block/float/overhanging-float-remove-from-fixed-position-block.html [ Failure ] crbug.com/591099 fast/block/float/overhanging-float-remove-from-fixed-position-block2.html [ Failure ] @@ -4448,9 +4263,7 @@ crbug.com/591099 fast/block/float/selection-gap-clip-out-tiger-crash.html [ Failure Pass ] crbug.com/591099 fast/block/float/shrink-to-avoid-float-complexity.html [ Failure ] crbug.com/591099 fast/block/float/shrink-to-fit-width.html [ Failure ] -crbug.com/591099 fast/block/float/table-relayout.html [ Failure ] crbug.com/591099 fast/block/float/trailing-float-with-columns.html [ Failure ] -crbug.com/591099 fast/block/float/vertical-move-relayout.html [ Failure ] crbug.com/591099 fast/block/float/width-update-after-clear.html [ Failure ] crbug.com/591099 fast/block/hr-border-box-sizing.html [ Failure ] crbug.com/591099 fast/block/hr-with-float.html [ Failure ] @@ -4462,9 +4275,7 @@ crbug.com/591099 fast/block/margin-collapse/005.html [ Failure ] crbug.com/591099 fast/block/margin-collapse/032.html [ Failure ] crbug.com/591099 fast/block/margin-collapse/033.html [ Failure ] -crbug.com/591099 fast/block/margin-collapse/043.html [ Failure ] crbug.com/591099 fast/block/margin-collapse/057.html [ Failure ] -crbug.com/591099 fast/block/margin-collapse/101.html [ Failure ] crbug.com/591099 fast/block/margin-collapse/103.html [ Failure ] crbug.com/591099 fast/block/margin-collapse/bfc-beside-float-complex-margin-collapsing.html [ Failure ] crbug.com/591099 fast/block/margin-collapse/block-inside-inline/001.html [ Failure ] @@ -4498,36 +4309,19 @@ crbug.com/591099 fast/block/positioning/047.html [ Failure ] crbug.com/591099 fast/block/positioning/055.html [ Failure ] crbug.com/591099 fast/block/positioning/056.html [ Failure ] -crbug.com/591099 fast/block/positioning/058.html [ Crash Failure ] crbug.com/591099 fast/block/positioning/abs-inside-inline-rel.html [ Failure ] crbug.com/591099 fast/block/positioning/absolute-appended-to-inline.html [ Failure ] crbug.com/591099 fast/block/positioning/absolute-in-inline-dynamic.html [ Failure ] -crbug.com/591099 fast/block/positioning/absolute-in-inline-ltr-2.html [ Failure ] -crbug.com/591099 fast/block/positioning/absolute-in-inline-ltr-3.html [ Failure ] -crbug.com/591099 fast/block/positioning/absolute-in-inline-ltr.html [ Failure ] crbug.com/591099 fast/block/positioning/absolute-in-inline-rtl-2.html [ Failure ] crbug.com/591099 fast/block/positioning/absolute-in-inline-rtl-3.html [ Failure ] -crbug.com/591099 fast/block/positioning/absolute-in-inline-rtl-4.html [ Failure ] +crbug.com/591099 fast/block/positioning/absolute-in-inline-rtl-4.html [ Failure Pass ] crbug.com/591099 fast/block/positioning/absolute-in-inline-rtl.html [ Failure ] -crbug.com/591099 fast/block/positioning/absolute-in-inline-short-ltr.html [ Failure ] crbug.com/591099 fast/block/positioning/absolute-in-inline-short-rtl.html [ Failure ] -crbug.com/591099 fast/block/positioning/absolute-length-of-neg-666666.html [ Failure ] -crbug.com/591099 fast/block/positioning/absolute-position-direction.html [ Failure ] -crbug.com/591099 fast/block/positioning/absolute-positioned-overconstrained.html [ Failure ] -crbug.com/591099 fast/block/positioning/absolute-positioning-no-scrollbar.html [ Failure ] crbug.com/591099 fast/block/positioning/absolute-with-html-border-quirks.html [ Failure ] crbug.com/591099 fast/block/positioning/abspos-auto-left-and-width-change-parent-margin-left.html [ Failure ] crbug.com/591099 fast/block/positioning/auto-height-with-top-and-bottom.html [ Failure ] -crbug.com/591099 fast/block/positioning/auto/001.html [ Failure ] -crbug.com/591099 fast/block/positioning/auto/002.html [ Failure ] -crbug.com/591099 fast/block/positioning/auto/003.html [ Failure ] -crbug.com/591099 fast/block/positioning/auto/004.html [ Failure ] crbug.com/591099 fast/block/positioning/auto/005.html [ Failure ] crbug.com/591099 fast/block/positioning/auto/006.html [ Failure ] -crbug.com/591099 fast/block/positioning/auto/vertical-lr/001.html [ Failure ] -crbug.com/591099 fast/block/positioning/auto/vertical-lr/002.html [ Failure ] -crbug.com/591099 fast/block/positioning/auto/vertical-lr/003.html [ Failure ] -crbug.com/591099 fast/block/positioning/auto/vertical-lr/004.html [ Failure ] crbug.com/591099 fast/block/positioning/auto/vertical-lr/005.html [ Failure ] crbug.com/591099 fast/block/positioning/auto/vertical-lr/006.html [ Failure ] crbug.com/591099 fast/block/positioning/auto/vertical-lr/007.html [ Failure ] @@ -4543,7 +4337,6 @@ crbug.com/591099 fast/block/positioning/complex-percentage-height.html [ Crash Failure ] crbug.com/591099 fast/block/positioning/fixed-positioning-scrollbar-bug.html [ Failure ] crbug.com/591099 fast/block/positioning/flex-positioned-movement-layout-of-content-when-height-changes.html [ Failure ] -crbug.com/591099 fast/block/positioning/height-change.html [ Failure ] crbug.com/591099 fast/block/positioning/hiding-inside-relpositioned-inline.html [ Failure ] crbug.com/591099 fast/block/positioning/hittest-on-relative-positioned-children.html [ Failure ] crbug.com/591099 fast/block/positioning/inline-block-relposition.html [ Failure Pass ] @@ -4562,7 +4355,6 @@ crbug.com/591099 fast/block/positioning/relative-with-implicit-height-containing-block.html [ Failure ] crbug.com/591099 fast/block/positioning/relayout-nested-positioned-elements-crash-2.html [ Crash Failure Pass ] crbug.com/591099 fast/block/positioning/relayout-nested-positioned-elements-crash.html [ Crash Failure ] -crbug.com/591099 fast/block/positioning/relayout-on-position-change.html [ Failure ] crbug.com/591099 fast/block/positioning/replaced-inside-fixed-top-bottom.html [ Failure ] crbug.com/591099 fast/block/positioning/rtl-static-positioning-inline-block.html [ Crash Failure ] crbug.com/591099 fast/block/positioning/rtl-static-positioning.html [ Failure ] @@ -4650,12 +4442,8 @@ crbug.com/591099 fast/borders/bidi-012.html [ Failure ] crbug.com/591099 fast/borders/border-antialiasing.html [ Failure ] crbug.com/591099 fast/borders/border-color-visited.html [ Crash Failure ] -crbug.com/591099 fast/borders/border-image-scaled.html [ Failure ] crbug.com/591099 fast/borders/border-image-width-negative.html [ Failure ] crbug.com/591099 fast/borders/border-radius-child.html [ Failure ] -crbug.com/591099 fast/borders/border-radius-constraints-double.html [ Failure ] -crbug.com/591099 fast/borders/border-radius-constraints.html [ Failure ] -crbug.com/591099 fast/borders/border-radius-huge-assert.html [ Failure ] crbug.com/591099 fast/borders/border-radius-mask-canvas-all.html [ Crash Failure ] crbug.com/591099 fast/borders/border-radius-mask-canvas-border.html [ Failure ] crbug.com/591099 fast/borders/border-radius-mask-canvas-padding.html [ Failure ] @@ -4669,7 +4457,6 @@ crbug.com/591099 fast/borders/border-radius-wide-border-01.html [ Failure ] crbug.com/591099 fast/borders/border-styles-split.html [ Failure ] crbug.com/591099 fast/borders/border-width-percent.html [ Failure ] -crbug.com/591099 fast/borders/different-color-borders.html [ Failure ] crbug.com/591099 fast/borders/fieldsetBorderRadius.html [ Crash Failure ] crbug.com/591099 fast/borders/inline-mask-overlay-image-outset-vertical-rl.html [ Failure ] crbug.com/591099 fast/borders/inline-mask-overlay-image-outset.html [ Failure ] @@ -4878,7 +4665,6 @@ crbug.com/591099 fast/css-grid-layout/grid-align-justify-margin-border-padding-vertical-rl.html [ Failure ] crbug.com/591099 fast/css-grid-layout/grid-align-justify-margin-border-padding.html [ Failure ] crbug.com/591099 fast/css-grid-layout/grid-align-justify-overflow.html [ Failure ] -crbug.com/591099 fast/css-grid-layout/grid-align-justify-stretch-with-orthogonal-flows.html [ Failure Pass ] crbug.com/591099 fast/css-grid-layout/grid-align-justify-stretch.html [ Failure ] crbug.com/591099 fast/css-grid-layout/grid-align.html [ Failure ] crbug.com/591099 fast/css-grid-layout/grid-auto-columns-rows-auto-flow-resolution.html [ Failure ] @@ -4890,8 +4676,7 @@ crbug.com/591099 fast/css-grid-layout/grid-auto-flow-sparse.html [ Failure ] crbug.com/591099 fast/css-grid-layout/grid-auto-flow-update.html [ Failure ] crbug.com/591099 fast/css-grid-layout/grid-auto-repeat-inherit-initial-crash.html [ Failure ] -crbug.com/591099 fast/css-grid-layout/grid-automatic-minimum-for-auto-rows.html [ Failure ] -crbug.com/591099 fast/css-grid-layout/grid-change-fit-content-argument.html [ Failure Pass ] +crbug.com/591099 fast/css-grid-layout/grid-automatic-minimum-for-auto-rows.html [ Failure Pass ] crbug.com/591099 fast/css-grid-layout/grid-columns-rows-get-set-multiple.html [ Timeout ] crbug.com/591099 fast/css-grid-layout/grid-columns-rows-get-set.html [ Timeout ] crbug.com/591099 fast/css-grid-layout/grid-container-change-explicit-grid-recompute-child.html [ Failure ] @@ -4953,11 +4738,8 @@ crbug.com/591099 fast/css-grid-layout/grid-item-order-paint-order.html [ Failure ] crbug.com/591099 fast/css-grid-layout/grid-item-overflow-paint.html [ Failure ] crbug.com/591099 fast/css-grid-layout/grid-item-position-changed-dynamic.html [ Failure ] -crbug.com/591099 fast/css-grid-layout/grid-item-positioning-with-orthogonal-flows.html [ Failure Pass ] crbug.com/591099 fast/css-grid-layout/grid-item-removal-auto-placement-update.html [ Failure ] crbug.com/591099 fast/css-grid-layout/grid-item-removal-track-breadth-update.html [ Failure Timeout ] -crbug.com/591099 fast/css-grid-layout/grid-item-sizing-with-orthogonal-flows.html [ Failure Pass ] -crbug.com/591099 fast/css-grid-layout/grid-item-spanning-and-orthogonal-flows.html [ Failure Pass ] crbug.com/591099 fast/css-grid-layout/grid-item-spanning-resolution.html [ Failure ] crbug.com/591099 fast/css-grid-layout/grid-item-start-before-get-set.html [ Failure ] crbug.com/591099 fast/css-grid-layout/grid-item-stretch-with-margins-borders-padding-vertical-lr.html [ Failure ] @@ -5020,8 +4802,6 @@ crbug.com/591099 fast/css-grid-layout/grid-template-shorthand-computed-style-crash.html [ Failure ] crbug.com/591099 fast/css-grid-layout/grid-template-shorthand-get-set.html [ Timeout ] crbug.com/591099 fast/css-grid-layout/grid-template-shorthand-infinite-loop.html [ Failure ] -crbug.com/591099 fast/css-grid-layout/grid-track-sizing-with-orthogonal-flows.html [ Failure Pass ] -crbug.com/591099 fast/css-grid-layout/grid-track-sizing-with-percentages-and-orthogonal-flows.html [ Failure Pass ] crbug.com/591099 fast/css-grid-layout/grid-tracks-stretched-with-different-flex-factors-sum.html [ Failure ] crbug.com/591099 fast/css-grid-layout/grid-with-zero-content-size-should-not-crash.html [ Failure ] crbug.com/591099 fast/css-grid-layout/implicit-columns-auto-resolution.html [ Failure ] @@ -5097,7 +4877,6 @@ crbug.com/591099 fast/css-intrinsic-dimensions/min-width.html [ Crash Failure ] crbug.com/591099 fast/css-intrinsic-dimensions/resize-inside-percent-width-overflow-hidden.html [ Failure ] crbug.com/591099 fast/css-intrinsic-dimensions/width-property-value.html [ Failure ] -crbug.com/591099 fast/css-intrinsic-dimensions/width.html [ Crash Failure Pass ] crbug.com/591099 fast/css/001.html [ Crash Failure ] crbug.com/591099 fast/css/002.html [ Failure ] crbug.com/591099 fast/css/003.html [ Failure ] @@ -5300,7 +5079,6 @@ crbug.com/591099 fast/css/first-letter-capitalized.html [ Failure ] crbug.com/591099 fast/css/first-letter-crash-document-disposal.html [ Crash Failure ] crbug.com/591099 fast/css/first-letter-detach.html [ Failure ] -crbug.com/591099 fast/css/first-letter-first-line-hover.html [ Failure ] crbug.com/591099 fast/css/first-letter-float-after-float.html [ Failure ] crbug.com/591099 fast/css/first-letter-float.html [ Failure ] crbug.com/591099 fast/css/first-letter-hover.html [ Failure ] @@ -5309,9 +5087,9 @@ crbug.com/591099 fast/css/first-letter-removed-added.html [ Failure ] crbug.com/591099 fast/css/first-letter-set-text.html [ Failure ] crbug.com/591099 fast/css/first-letter-visibility.html [ Failure ] -crbug.com/591099 fast/css/first-line-change-color-direct.html [ Crash Failure ] +crbug.com/591099 fast/css/first-line-change-color-direct.html [ Crash Failure Pass ] crbug.com/591099 fast/css/first-line-parent-style-different.html [ Failure ] -crbug.com/591099 fast/css/first-line-style-for-before-after-content.html [ Failure ] +crbug.com/591099 fast/css/first-line-style-for-before-after-content.html [ Failure Pass ] crbug.com/591099 fast/css/first-line-text-decoration-inherited-from-parent.html [ Failure ] crbug.com/591099 fast/css/first-line-text-decoration.html [ Failure ] crbug.com/591099 fast/css/first-of-type-pseudo-class.html [ Failure ] @@ -5587,7 +5365,6 @@ crbug.com/591099 fast/css/live-cssrules.html [ Failure Pass ] crbug.com/591099 fast/css/margin-bottom-form-element-quirk.html [ Failure ] crbug.com/591099 fast/css/margin-bottom-form-element-strict.html [ Failure Pass ] -crbug.com/591099 fast/css/margin-collapse-top-margin-clearance.html [ Failure ] crbug.com/591099 fast/css/margin-start-end.html [ Failure ] crbug.com/591099 fast/css/margin-top-bottom-dynamic.html [ Failure ] crbug.com/591099 fast/css/marquee-in-template.html [ Crash Failure ] @@ -5688,7 +5465,7 @@ crbug.com/591099 fast/css/preferred-stylesheet-order.html [ Failure ] crbug.com/591099 fast/css/preferred-stylesheet-reversed-order.html [ Failure ] crbug.com/591099 fast/css/pseudo-any.html [ Crash Failure ] -crbug.com/591099 fast/css/pseudo-cache-stale.html [ Failure ] +crbug.com/591099 fast/css/pseudo-cache-stale.html [ Failure Pass ] crbug.com/591099 fast/css/pseudo-default-001.html [ Failure ] crbug.com/591099 fast/css/pseudo-default-002.html [ Failure ] crbug.com/591099 fast/css/pseudo-default-003.html [ Failure ] @@ -5808,7 +5585,7 @@ crbug.com/591099 fast/css/test-setting-canvas-color.html [ Failure ] crbug.com/591099 fast/css/text-align-webkit-match-parent.html [ Failure ] crbug.com/591099 fast/css/text-align.html [ Failure ] -crbug.com/591099 fast/css/text-decorations-on-first-line-and-containing-block.html [ Failure ] +crbug.com/591099 fast/css/text-decorations-on-first-line-and-containing-block.html [ Failure Pass ] crbug.com/734554 fast/css/text-indent-first-line-002.html [ Failure ] crbug.com/591099 fast/css/text-overflow-ellipsis-bidi.html [ Failure ] crbug.com/591099 fast/css/text-overflow-ellipsis-block-with-border-and-padding.html [ Failure ] @@ -5875,8 +5652,8 @@ crbug.com/591099 fast/css3-text/css3-text-decoration/stable/getComputedStyle-text-decoration.html [ Failure ] crbug.com/591099 fast/css3-text/css3-text-decoration/text-decoration-skip.html [ Failure ] crbug.com/591099 fast/css3-text/css3-text-decoration/text-decoration-style-inherit-not-propagated-by-out-of-flow.html [ Failure ] -crbug.com/591099 fast/css3-text/css3-text-decoration/text-underline-position/text-underline-first-line-decoration-vertical.html [ Crash Failure ] -crbug.com/591099 fast/css3-text/css3-text-decoration/text-underline-position/text-underline-first-line-decoration.html [ Crash Failure ] +crbug.com/591099 fast/css3-text/css3-text-decoration/text-underline-position/text-underline-first-line-decoration-vertical.html [ Crash Failure Pass ] +crbug.com/591099 fast/css3-text/css3-text-decoration/text-underline-position/text-underline-first-line-decoration.html [ Crash Failure Pass ] crbug.com/591099 fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-auto.html [ Failure ] crbug.com/591099 fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-cjk.html [ Crash Failure ] crbug.com/591099 fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-under.html [ Failure ] @@ -5892,29 +5669,10 @@ crbug.com/591099 fast/css3-text/css3-text-justify/text-justify-distribute.html [ Failure ] crbug.com/591099 fast/css3-text/css3-word-break/css3-word-break-keep-all.html [ Failure Pass ] crbug.com/591099 fast/css3-text/css3-word-break/word-break-all-rtl.html [ Failure ] -crbug.com/591099 fast/css3-text/css3-word-break/word-break-all-wrap-with-100percent-floats.html [ Failure Pass ] crbug.com/591099 fast/css3-text/css3-word-break/word-break-all-wrap-with-floats.html [ Failure ] crbug.com/591099 fast/css3-text/css3-word-break/word-break-break-all-in-span.html [ Failure ] -crbug.com/591099 fast/deprecated-flexbox/001.html [ Failure ] crbug.com/591099 fast/deprecated-flexbox/004.html [ Failure ] -crbug.com/591099 fast/deprecated-flexbox/007.html [ Failure ] -crbug.com/591099 fast/deprecated-flexbox/008.html [ Failure ] crbug.com/591099 fast/deprecated-flexbox/009-horizontal.html [ Failure ] -crbug.com/591099 fast/deprecated-flexbox/009.html [ Failure ] -crbug.com/591099 fast/deprecated-flexbox/010.html [ Failure ] -crbug.com/591099 fast/deprecated-flexbox/011.html [ Failure ] -crbug.com/591099 fast/deprecated-flexbox/012.html [ Failure ] -crbug.com/591099 fast/deprecated-flexbox/013.html [ Failure ] -crbug.com/591099 fast/deprecated-flexbox/014.html [ Crash Failure ] -crbug.com/591099 fast/deprecated-flexbox/015.html [ Failure ] -crbug.com/591099 fast/deprecated-flexbox/017.html [ Failure ] -crbug.com/591099 fast/deprecated-flexbox/018.html [ Failure ] -crbug.com/591099 fast/deprecated-flexbox/019.html [ Failure ] -crbug.com/591099 fast/deprecated-flexbox/020.html [ Failure ] -crbug.com/591099 fast/deprecated-flexbox/021.html [ Failure ] -crbug.com/591099 fast/deprecated-flexbox/022.html [ Failure ] -crbug.com/591099 fast/deprecated-flexbox/023.html [ Failure ] -crbug.com/591099 fast/deprecated-flexbox/024.html [ Failure ] crbug.com/591099 fast/deprecated-flexbox/assert-generated-deprecated-flexbox.html [ Failure ] crbug.com/591099 fast/deprecated-flexbox/box-ordinal-group.html [ Failure ] crbug.com/591099 fast/deprecated-flexbox/child-flexing.html [ Failure ] @@ -5998,7 +5756,6 @@ crbug.com/591099 fast/dom/Element/element-traversal.html [ Failure ] crbug.com/591099 fast/dom/Element/fixed-position-offset-parent.html [ Failure ] crbug.com/591099 fast/dom/Element/getAttribute-check-case-sensitivity.html [ Failure ] -crbug.com/591099 fast/dom/Element/getBoundingClientRect.html [ Failure ] crbug.com/591099 fast/dom/Element/id-in-formcollection.html [ Failure ] crbug.com/591099 fast/dom/Element/id-in-frame.html [ Failure ] crbug.com/591099 fast/dom/Element/id-in-getelement01.html [ Failure ] @@ -6262,7 +6019,6 @@ crbug.com/591099 fast/dom/Range/deleted-range-endpoints.html [ Failure ] crbug.com/591099 fast/dom/Range/detach-no-op.html [ Failure ] crbug.com/591099 fast/dom/Range/getClientRects-leading-trailing-whitespaces.html [ Failure ] -crbug.com/591099 fast/dom/Range/getClientRects.html [ Crash Failure Pass ] crbug.com/591099 fast/dom/Range/insertNode-empty-fragment-crash.html [ Failure ] crbug.com/591099 fast/dom/Range/range-clone-empty.html [ Failure ] crbug.com/591099 fast/dom/Range/range-constructor.html [ Failure ] @@ -6693,7 +6449,7 @@ crbug.com/591099 fast/dom/replace-child-siblings.html [ Failure ] crbug.com/591099 fast/dom/replace-first-child.html [ Failure ] crbug.com/591099 fast/dom/replaced-image-map.html [ Failure ] -crbug.com/591099 fast/dom/right-overflow-in-rtl.html [ Crash Failure ] +crbug.com/591099 fast/dom/right-overflow-in-rtl.html [ Crash Failure Pass ] crbug.com/591099 fast/dom/root-client-size-iframe.html [ Failure ] crbug.com/591099 fast/dom/root-client-size.html [ Failure ] crbug.com/591099 fast/dom/row-inner-text.html [ Failure ] @@ -7154,7 +6910,6 @@ crbug.com/591099 fast/events/drag_and_drop_into_removed_on_focus.html [ Failure ] crbug.com/591099 fast/events/dragevent-constructor.html [ Failure ] crbug.com/591099 fast/events/drop-generate-user-gesture.html [ Failure ] -crbug.com/591099 fast/events/drop-with-file-paths.html [ Failure ] crbug.com/591099 fast/events/event-attribute.html [ Failure Timeout ] crbug.com/591099 fast/events/event-attributes-after-exception.html [ Failure ] crbug.com/591099 fast/events/event-creation.html [ Failure ] @@ -7327,7 +7082,7 @@ crbug.com/591099 fast/events/mutation-during-replace-child.html [ Failure ] crbug.com/591099 fast/events/no-blur-on-enter-button.html [ Failure ] crbug.com/591099 fast/events/offsetX-offsetY.html [ Failure Timeout ] -crbug.com/591099 fast/events/onbeforeunload-focused-iframe.html [ Failure ] +crbug.com/591099 fast/events/onbeforeunload-focused-iframe.html [ Failure Pass ] crbug.com/591099 fast/events/onblur-remove.html [ Crash Failure ] crbug.com/591099 fast/events/onchange-passwordfield.html [ Failure ] crbug.com/591099 fast/events/onchange-range-slider.html [ Failure ] @@ -7571,8 +7326,8 @@ crbug.com/591099 fast/events/wheel/wheelevent-ctrl.html [ Failure ] crbug.com/591099 fast/events/wheel/wheelevent-document-createevent.html [ Failure ] crbug.com/591099 fast/events/wheel/wheelevent-handler-count.html [ Failure ] -crbug.com/591099 fast/events/wheel/wheelevent-in-horizontal-scrollbar-in-rtl.html [ Failure ] -crbug.com/591099 fast/events/wheel/wheelevent-in-vertical-scrollbar-in-rtl.html [ Failure ] +crbug.com/591099 fast/events/wheel/wheelevent-in-horizontal-scrollbar-in-rtl.html [ Failure Pass ] +crbug.com/591099 fast/events/wheel/wheelevent-in-vertical-scrollbar-in-rtl.html [ Failure Pass ] crbug.com/591099 fast/events/wheel/wheelevent-mousewheel-interaction.html [ Failure ] crbug.com/591099 fast/events/window-errorevent-01.html [ Failure ] crbug.com/591099 fast/events/window-errorevent-02.html [ Failure ] @@ -8212,7 +7967,7 @@ crbug.com/591099 fast/forms/range/slider-thumb-stylability.html [ Failure ] crbug.com/591099 fast/forms/range/slider-transformed.html [ Failure Pass ] crbug.com/591099 fast/forms/range/slider-zoomed.html [ Failure ] -crbug.com/591099 fast/forms/range/thumbslider-crash.html [ Failure ] +crbug.com/591099 fast/forms/range/thumbslider-crash.html [ Failure Pass ] crbug.com/591099 fast/forms/range/thumbslider-no-parent-slider.html [ Failure ] crbug.com/591099 fast/forms/removed-image-as-property.html [ Crash Failure ] crbug.com/591099 fast/forms/render-text-crash.html [ Crash Failure ] @@ -8959,10 +8714,6 @@ crbug.com/591099 fast/html/tab-order.html [ Crash Failure ] crbug.com/591099 fast/html/unknown-tag.html [ Crash Failure ] crbug.com/591099 fast/inline-block/002.html [ Failure ] -crbug.com/591099 fast/inline-block/003.html [ Failure ] -crbug.com/591099 fast/inline-block/004.html [ Failure ] -crbug.com/591099 fast/inline-block/005.html [ Failure ] -crbug.com/591099 fast/inline-block/14498-positionForCoordinates.html [ Failure ] crbug.com/591099 fast/inline-block/baseline-vertical.html [ Failure ] crbug.com/591099 fast/inline-block/contenteditable-baseline.html [ Failure ] crbug.com/591099 fast/inline-block/float-both-whitespace.html [ Failure ] @@ -8971,7 +8722,6 @@ crbug.com/591099 fast/inline-block/float-trailing-whitespace.html [ Failure ] crbug.com/591099 fast/inline-block/inline-block-vertical-align-2.html [ Failure ] crbug.com/591099 fast/inline-block/inline-block-vertical-align.html [ Failure ] -crbug.com/591099 fast/inline-block/overflow-clip.html [ Failure ] crbug.com/591099 fast/inline-block/tricky-baseline.html [ Failure ] crbug.com/591099 fast/inline-block/vertical-align-top-and-bottom-2.html [ Failure ] crbug.com/591099 fast/inline/absolute-positioned-inline-in-centred-block.html [ Failure ] @@ -8994,7 +8744,7 @@ crbug.com/591099 fast/inline/fixed-pos-with-transform-container-moves-with-abspos-parent.html [ Failure ] crbug.com/591099 fast/inline/inline-body-with-inline-child.html [ Failure ] crbug.com/591099 fast/inline/inline-borders-with-bidi-override.html [ Failure ] -crbug.com/591099 fast/inline/inline-box-adjust-position-crash.html [ Crash Failure ] +crbug.com/591099 fast/inline/inline-box-adjust-position-crash.html [ Crash Failure Pass ] crbug.com/591099 fast/inline/inline-box-background-long-image.html [ Failure ] crbug.com/591099 fast/inline/inline-box-background-repeat-x.html [ Failure ] crbug.com/591099 fast/inline/inline-box-background-repeat-y.html [ Failure ] @@ -9002,7 +8752,6 @@ crbug.com/591099 fast/inline/inline-destroy-dirty-lines-crash.html [ Failure ] crbug.com/591099 fast/inline/inline-fixed-position-boundingbox.html [ Failure ] crbug.com/591099 fast/inline/inline-focus-ring-under-absolute-enclosing-relative-div.html [ Failure ] -crbug.com/591099 fast/inline/inline-focus-ring.html [ Failure ] crbug.com/591099 fast/inline/inline-offsetLeft-relpos.html [ Crash Failure ] crbug.com/591099 fast/inline/inline-position-top-align.html [ Failure ] crbug.com/591099 fast/inline/inline-relative-offset-boundingbox.html [ Failure ] @@ -9351,8 +9100,6 @@ crbug.com/591099 fast/lists/007.html [ Crash Failure ] crbug.com/591099 fast/lists/008-vertical.html [ Crash Failure ] crbug.com/591099 fast/lists/008.html [ Crash Failure ] -crbug.com/591099 fast/lists/009-vertical.html [ Crash Failure ] -crbug.com/591099 fast/lists/009.html [ Crash Failure ] crbug.com/591099 fast/lists/alpha-boundary-values.html [ Crash Failure ] crbug.com/591099 fast/lists/alpha-list-wrap.html [ Crash Failure ] crbug.com/591099 fast/lists/anonymous-items.html [ Crash Failure ] @@ -9409,7 +9156,6 @@ crbug.com/591099 fast/lists/list-marker-padding-overflow-hidden-rtl.html [ Failure ] crbug.com/591099 fast/lists/list-marker-padding-overflow-hidden.html [ Failure ] crbug.com/591099 fast/lists/list-marker-with-line-height.html [ Crash Failure ] -crbug.com/591099 fast/lists/list-style-none-crash.html [ Failure ] crbug.com/591099 fast/lists/list-style-type-dynamic-change.html [ Crash Failure ] crbug.com/591099 fast/lists/marker-before-empty-inline.html [ Crash Failure ] crbug.com/591099 fast/lists/marker-image-error.html [ Crash Failure ] @@ -9631,13 +9377,12 @@ crbug.com/591099 fast/multicol/float-after-break-after.html [ Failure ] crbug.com/591099 fast/multicol/float-beside-bfc.html [ Failure ] crbug.com/591099 fast/multicol/float-big-line.html [ Failure ] -crbug.com/591099 fast/multicol/float-break.html [ Failure Pass ] crbug.com/591099 fast/multicol/float-content-break.html [ Failure ] crbug.com/591099 fast/multicol/float-margin-at-row-boundary-fixed-multicol-height.html [ Failure ] crbug.com/591099 fast/multicol/float-margin-at-row-boundary.html [ Failure ] crbug.com/591099 fast/multicol/float-moved-by-child-line-and-unbreakable.html [ Failure ] crbug.com/591099 fast/multicol/float-paginate-empty-lines.html [ Failure ] -crbug.com/591099 fast/multicol/float-paginate.html [ Failure ] +crbug.com/591099 fast/multicol/float-paginate.html [ Failure Pass ] crbug.com/591099 fast/multicol/float-with-margin-moved-by-child-block-and-unbreakable.html [ Failure ] crbug.com/591099 fast/multicol/float-with-margin-moved-by-child-block.html [ Failure ] crbug.com/591099 fast/multicol/float-with-margin-moved-by-child-line-and-unbreakable.html [ Failure ] @@ -9707,7 +9452,6 @@ crbug.com/591099 fast/multicol/newmulticol/breaks-3-columns-3.html [ Failure ] crbug.com/591099 fast/multicol/newmulticol/clipping-top-overflow.html [ Failure ] crbug.com/591099 fast/multicol/newmulticol/fixed-height-fill-balance.html [ Failure ] -crbug.com/591099 fast/multicol/newmulticol/hide-box-vertical-lr.html [ Failure Pass ] crbug.com/591099 fast/multicol/newmulticol/hide-box-vertical-rl.html [ Failure Pass ] crbug.com/591099 fast/multicol/newmulticol/orphans-and-widows-balance.html [ Failure ] crbug.com/591099 fast/multicol/null-lastFloat-in-removeFloatingObjectsBelow.html [ Failure ] @@ -9809,12 +9553,11 @@ crbug.com/591099 fast/multicol/vertical-lr/column-count-with-rules.html [ Failure ] crbug.com/591099 fast/multicol/vertical-lr/column-rules.html [ Failure ] crbug.com/591099 fast/multicol/vertical-lr/composited-relpos-overlapping-will-change.html [ Failure ] -crbug.com/591099 fast/multicol/vertical-lr/float-avoidance.html [ Failure Pass ] crbug.com/591099 fast/multicol/vertical-lr/float-big-line.html [ Failure ] crbug.com/591099 fast/multicol/vertical-lr/float-break.html [ Failure ] crbug.com/591099 fast/multicol/vertical-lr/float-content-break.html [ Failure ] crbug.com/591099 fast/multicol/vertical-lr/float-edge.html [ Failure ] -crbug.com/591099 fast/multicol/vertical-lr/float-paginate.html [ Failure ] +crbug.com/591099 fast/multicol/vertical-lr/float-paginate.html [ Failure Pass ] crbug.com/591099 fast/multicol/vertical-lr/gap-non-negative.html [ Failure ] crbug.com/591099 fast/multicol/vertical-lr/image-inside-nested-blocks-with-border.html [ Failure ] crbug.com/591099 fast/multicol/vertical-lr/unsplittable-inline-block.html [ Failure ] @@ -9850,11 +9593,9 @@ crbug.com/591099 fast/multicol/zeroColumnCount.html [ Failure ] crbug.com/591099 fast/overflow/001.html [ Failure ] crbug.com/591099 fast/overflow/002.html [ Failure ] -crbug.com/591099 fast/overflow/005.html [ Failure ] crbug.com/591099 fast/overflow/006.html [ Failure ] crbug.com/591099 fast/overflow/007.html [ Failure ] crbug.com/591099 fast/overflow/add-visual-overflow-and-change-container-position.html [ Failure ] -crbug.com/591099 fast/overflow/border-radius-clipping.html [ Crash Failure ] crbug.com/591099 fast/overflow/child-100percent-height-inside-fixed-container-with-overflow-auto.html [ Failure ] crbug.com/591099 fast/overflow/clip-rects-fixed-ancestor.html [ Failure ] crbug.com/591099 fast/overflow/float-in-relpositioned.html [ Failure ] @@ -9863,7 +9604,6 @@ crbug.com/591099 fast/overflow/hidden-html-auto-body.html [ Failure ] crbug.com/591099 fast/overflow/hidden-html-hidden-body.html [ Failure Pass ] crbug.com/591099 fast/overflow/hidden-html-paged-body.html [ Crash Failure ] -crbug.com/591099 fast/overflow/hit-test-overflow-controls.html [ Failure ] crbug.com/591099 fast/overflow/hit-test-overflow-hidden-with-box-shadow.html [ Failure ] crbug.com/591099 fast/overflow/image-selection-highlight.html [ Failure ] crbug.com/591099 fast/overflow/infiniteRecursion.html [ Crash Failure ] @@ -9892,7 +9632,6 @@ crbug.com/591099 fast/overflow/scroll-vertical-not-horizontal.html [ Failure ] crbug.com/591099 fast/overflow/scrollRevealButton.html [ Failure ] crbug.com/591099 fast/overflow/scrollbar-click-retains-focus.html [ Crash Failure ] -crbug.com/591099 fast/overflow/scrollbar-position-update.html [ Failure ] crbug.com/591099 fast/overflow/scrollbar-restored-and-then-locked.html [ Crash Failure ] crbug.com/591099 fast/overflow/scrollbar-restored.html [ Failure ] crbug.com/591099 fast/overflow/setting-scrollTop-after-hide-show.html [ Failure ] @@ -10059,15 +9798,10 @@ crbug.com/591099 fast/reflections/transparent-reflected-sublayers.html [ Failure ] crbug.com/591099 fast/regex/non-pattern-characters.html [ Failure ] crbug.com/591099 fast/regex/syntax-errors.html [ Failure ] -crbug.com/591099 fast/replaced/002.html [ Failure Pass ] -crbug.com/591099 fast/replaced/003.html [ Failure Pass ] crbug.com/591099 fast/replaced/008.html [ Crash Failure ] -crbug.com/591099 fast/replaced/absolute-image-sizing.html [ Failure ] crbug.com/591099 fast/replaced/absolute-position-auto-width-and-left-and-right-and-intrinsic-width-quirks.html [ Crash Failure ] crbug.com/591099 fast/replaced/absolute-position-auto-width-and-left-and-right-and-intrinsic-width.html [ Crash Failure ] crbug.com/591099 fast/replaced/absolute-position-percentage-height.html [ Failure ] -crbug.com/591099 fast/replaced/absolute-position-with-auto-height-and-top-and-bottom.html [ Failure ] -crbug.com/591099 fast/replaced/absolute-position-with-auto-width-and-left-and-right.html [ Failure ] crbug.com/591099 fast/replaced/aspect-ratio-of-replaced-child-with-auto-height.html [ Failure ] crbug.com/591099 fast/replaced/aspect-ratio-of-replaced-child-with-max-height.html [ Failure ] crbug.com/591099 fast/replaced/available-height-for-content.html [ Crash Failure ] @@ -10090,19 +9824,11 @@ crbug.com/591099 fast/replaced/image-map-on-inline-image.html [ Failure ] crbug.com/591099 fast/replaced/image-map.html [ Failure ] crbug.com/591099 fast/replaced/image-onload.html [ Failure Pass ] -crbug.com/591099 fast/replaced/image-resize-width.html [ Failure ] -crbug.com/591099 fast/replaced/image-solid-color-with-alpha.html [ Failure ] crbug.com/591099 fast/replaced/inline-box-wrapper-handover.html [ Failure ] crbug.com/591099 fast/replaced/invalid-object-with-fallback.html [ Crash Failure ] crbug.com/591099 fast/replaced/max-width-percent.html [ Failure ] -crbug.com/591099 fast/replaced/maxheight-percent.html [ Failure ] -crbug.com/591099 fast/replaced/maxheight-pxs.html [ Failure ] crbug.com/591099 fast/replaced/maxwidth-percent.html [ Failure ] -crbug.com/591099 fast/replaced/maxwidth-pxs.html [ Failure ] -crbug.com/591099 fast/replaced/minheight-percent.html [ Failure ] -crbug.com/591099 fast/replaced/minheight-pxs.html [ Failure ] crbug.com/591099 fast/replaced/minwidth-percent.html [ Failure ] -crbug.com/591099 fast/replaced/minwidth-pxs.html [ Failure ] crbug.com/591099 fast/replaced/no-focus-ring-embed.html [ Failure Timeout ] crbug.com/591099 fast/replaced/no-focus-ring-iframe.html [ Timeout ] crbug.com/591099 fast/replaced/no-focus-ring-object.html [ Failure Pass Timeout ] @@ -10111,7 +9837,6 @@ crbug.com/591099 fast/replaced/object-with-non-empty-classid-triggers-fallback.html [ Crash Failure ] crbug.com/591099 fast/replaced/outline-replaced-elements.html [ Failure Pass ] crbug.com/591099 fast/replaced/percent-height-in-anonymous-block-in-table.html [ Failure ] -crbug.com/591099 fast/replaced/percent-height-in-anonymous-block-widget.html [ Crash Failure ] crbug.com/591099 fast/replaced/percent-height-in-anonymous-block.html [ Failure ] crbug.com/591099 fast/replaced/percentage-height-with-dynamic-container-height.html [ Failure ] crbug.com/591099 fast/replaced/preferred-widths.html [ Failure ] @@ -10119,7 +9844,6 @@ crbug.com/591099 fast/replaced/replaced-breaking.html [ Failure ] crbug.com/591099 fast/replaced/replaced-child-of-absolute-with-auto-height.html [ Failure ] crbug.com/591099 fast/replaced/replaced-element-with-percentage-height-anonymous-block-parent.html [ Failure ] -crbug.com/591099 fast/replaced/selection-rect-in-table-cell.html [ Failure ] crbug.com/591099 fast/replaced/selection-rect-transform.html [ Crash Failure ] crbug.com/591099 fast/replaced/selection-rect.html [ Failure Pass ] crbug.com/591099 fast/replaced/table-percent-height-text-controls.html [ Failure ] @@ -10127,8 +9851,6 @@ crbug.com/591099 fast/replaced/table-percent-width.html [ Failure ] crbug.com/591099 fast/replaced/table-replaced-element.html [ Failure ] crbug.com/591099 fast/replaced/vertical-lr/absolute-position-percentage-width.html [ Failure ] -crbug.com/591099 fast/replaced/vertical-lr/absolute-position-with-auto-height-and-top-and-bottom.html [ Failure ] -crbug.com/591099 fast/replaced/vertical-lr/absolute-position-with-auto-width-and-left-and-right.html [ Failure ] crbug.com/591099 fast/replaced/vertical-resize-100percent-element.html [ Failure ] crbug.com/591099 fast/replaced/vertical-rl/absolute-position-percentage-width.html [ Failure ] crbug.com/591099 fast/replaced/vertical-rl/absolute-position-with-auto-height-and-top-and-bottom.html [ Failure ] @@ -10457,16 +10179,9 @@ crbug.com/591099 fast/table/032.html [ Failure ] crbug.com/591099 fast/table/035-vertical.html [ Failure ] crbug.com/591099 fast/table/035.html [ Failure ] -crbug.com/591099 fast/table/040-vertical.html [ Failure ] -crbug.com/591099 fast/table/040.html [ Failure ] -crbug.com/591099 fast/table/100-percent-cell-width.html [ Failure ] crbug.com/591099 fast/table/absolute-table-percent-lengths.html [ Failure ] -crbug.com/591099 fast/table/add-before-anonymous-child.html [ Failure ] crbug.com/591099 fast/table/add-cell-with-large-border.html [ Failure ] -crbug.com/591099 fast/table/align-right-within-left-aligned-div.html [ Failure Pass ] crbug.com/591099 fast/table/anonymous-table-no-baseline-align.html [ Failure ] -crbug.com/591099 fast/table/append-cells.html [ Failure ] -crbug.com/591099 fast/table/append-cells2.html [ Failure ] crbug.com/591099 fast/table/assert-autotablelayout-maxlogicalwidth.html [ Failure ] crbug.com/591099 fast/table/auto-table-layout-colgroup-removal-crash.html [ Failure ] crbug.com/591099 fast/table/auto-with-percent-height-vertical.html [ Failure ] @@ -10481,22 +10196,16 @@ crbug.com/591099 fast/table/bad-replaced-sizing-preferred-logical-widths.html [ Failure ] crbug.com/591099 fast/table/baseline-align-rowspan.html [ Failure ] crbug.com/591099 fast/table/border-changes.html [ Failure ] -crbug.com/591099 fast/table/border-collapsing/002-vertical.html [ Failure ] -crbug.com/591099 fast/table/border-collapsing/002.html [ Crash Failure ] crbug.com/591099 fast/table/border-collapsing/003-vertical.html [ Failure ] crbug.com/591099 fast/table/border-collapsing/004-vertical.html [ Crash Failure ] crbug.com/591099 fast/table/border-collapsing/004.html [ Failure ] crbug.com/591099 fast/table/border-collapsing/border-collapsing-head-foot-vertical.html [ Failure ] -crbug.com/591099 fast/table/border-collapsing/border-collapsing-head-foot.html [ Failure ] crbug.com/591099 fast/table/border-collapsing/dynamic-border-width-change.html [ Failure ] -crbug.com/591099 fast/table/border-collapsing/rtl-border-collapsing-vertical.html [ Failure ] -crbug.com/591099 fast/table/border-collapsing/rtl-border-collapsing.html [ Failure ] crbug.com/591099 fast/table/border-recalc.html [ Failure ] crbug.com/591099 fast/table/canvas-column-in-column-group.html [ Failure ] crbug.com/591099 fast/table/caption-encloses-overhanging-float.html [ Failure ] crbug.com/591099 fast/table/caption-in-inline.html [ Failure ] crbug.com/591099 fast/table/caption-orthogonal-writing-mode-sizing.html [ Failure ] -crbug.com/591099 fast/table/cell-absolute-child.html [ Failure ] crbug.com/591099 fast/table/cell-height-min-intrinsic.html [ Failure ] crbug.com/591099 fast/table/cellIndex-of-cell-with-different-parents.html [ Failure ] crbug.com/591099 fast/table/change-cell-border-width.html [ Failure ] @@ -10505,7 +10214,6 @@ crbug.com/591099 fast/table/change-table-border-width.html [ Crash Failure ] crbug.com/591099 fast/table/change-tbody-border-width-crash.html [ Failure ] crbug.com/591099 fast/table/change-tbody-border-width.html [ Crash Failure ] -crbug.com/591099 fast/table/click-near-anonymous-table.html [ Failure ] crbug.com/591099 fast/table/col-width-span-expand.html [ Failure ] crbug.com/591099 fast/table/colgroup-relative.html [ Failure ] crbug.com/591099 fast/table/colspan-with-empty-cells-needing-extra-width.html [ Failure ] @@ -10537,11 +10245,9 @@ crbug.com/591099 fast/table/fixed-table-layout/fixed-layout-column-colspan-wrong-size.html [ Failure ] crbug.com/591099 fast/table/fixed-table-layout/prepend-in-fixed-table.html [ Failure ] crbug.com/591099 fast/table/fixed-table-layout/table-with-percent-width.html [ Failure ] -crbug.com/591099 fast/table/fixed-table-non-cell-in-row.html [ Failure ] crbug.com/591099 fast/table/fixed-widths-exceed-available.html [ Failure ] crbug.com/591099 fast/table/form-with-non-table-display-inside-table-elements.html [ Failure ] crbug.com/591099 fast/table/form-with-table-style.html [ Crash Failure ] -crbug.com/591099 fast/table/generated-caption.html [ Failure ] crbug.com/591099 fast/table/height-percent-test-vertical.html [ Failure ] crbug.com/591099 fast/table/height-percent-test.html [ Failure ] crbug.com/591099 fast/table/hittest-tablecell-bottom-edge.html [ Failure Timeout ] @@ -10555,9 +10261,6 @@ crbug.com/591099 fast/table/inline-table-added-to-continuation.html [ Failure ] crbug.com/591099 fast/table/inline-table-margin-baseline.html [ Failure ] crbug.com/591099 fast/table/inner-percent-width-affects-outer-floated-div.html [ Failure ] -crbug.com/591099 fast/table/insert-before-anonymous-ancestors.html [ Failure ] -crbug.com/591099 fast/table/insert-cell-before-form.html [ Failure ] -crbug.com/591099 fast/table/insert-row-before-form.html [ Failure ] crbug.com/591099 fast/table/invisible-cell-background.html [ Failure ] crbug.com/591099 fast/table/large-shrink-wrapped-width.html [ Failure ] crbug.com/591099 fast/table/margins-flipped-text-direction.html [ Failure ] @@ -10584,14 +10287,11 @@ crbug.com/591099 fast/table/percent-height-overflow-hidden-content-in-cell.html [ Failure ] crbug.com/591099 fast/table/percent-height-overflow-scroll-content-in-cell.html [ Failure ] crbug.com/591099 fast/table/percent-height-overflow-visible-content-in-cell.html [ Failure ] -crbug.com/591099 fast/table/percent-heights.html [ Failure ] crbug.com/591099 fast/table/percent-widths-float.html [ Failure ] crbug.com/591099 fast/table/percent-widths-stretch-vertical.html [ Failure ] crbug.com/591099 fast/table/percent-widths-total-less-than-one.html [ Failure ] -crbug.com/591099 fast/table/prepend-in-anonymous-table.html [ Failure ] crbug.com/591099 fast/table/recalc-section-first-body-crash-main.html [ Failure ] crbug.com/591099 fast/table/remove-cell-with-large-border-width.html [ Failure ] -crbug.com/591099 fast/table/remove-td-display-none.html [ Failure ] crbug.com/591099 fast/table/resize-table-binding-cell.html [ Failure ] crbug.com/591099 fast/table/resize-table-cell.html [ Failure ] crbug.com/591099 fast/table/resize-table-row.html [ Failure ] @@ -10600,7 +10300,6 @@ crbug.com/591099 fast/table/rowindex-comment-nodes.html [ Failure ] crbug.com/591099 fast/table/rowindex.html [ Failure ] crbug.com/591099 fast/table/rowspan-only-rows-height-distribution.html [ Failure ] -crbug.com/591099 fast/table/rtl-cell-display-none-assert.html [ Failure ] crbug.com/591099 fast/table/split-anonymous-crash.html [ Failure ] crbug.com/591099 fast/table/split-table-no-section-update-crash.html [ Failure ] crbug.com/591099 fast/table/split-table-section-before-anonymous-block-crash.html [ Failure ] @@ -10714,27 +10413,17 @@ crbug.com/591099 fast/text/apply-start-width-after-skipped-text.html [ Failure ] crbug.com/591099 fast/text/atomic-inline-before-ellipsis.html [ Failure ] crbug.com/591099 fast/text/atsui-kerning-and-ligatures.html [ Failure ] -crbug.com/591099 fast/text/atsui-multiple-renderers.html [ Failure ] -crbug.com/591099 fast/text/atsui-partial-selection.html [ Failure ] -crbug.com/591099 fast/text/atsui-small-caps-punctuation-size.html [ Failure ] crbug.com/591099 fast/text/atsui-spacing-features.html [ Failure ] crbug.com/591099 fast/text/basic/002.html [ Failure ] crbug.com/591099 fast/text/basic/004.html [ Failure ] -crbug.com/591099 fast/text/basic/012.html [ Failure ] crbug.com/591099 fast/text/basic/014.html [ Failure ] crbug.com/591099 fast/text/basic/015.html [ Failure ] -crbug.com/591099 fast/text/basic/generic-family-reset.html [ Failure ] -crbug.com/591099 fast/text/bidi-embedding-pop-and-push-same.html [ Failure ] crbug.com/591099 fast/text/bidi-explicit-embedding-past-end.html [ Failure Pass ] -crbug.com/591099 fast/text/bidi-isolate-embedding-crash.html [ Failure ] +crbug.com/591099 fast/text/bidi-isolate-embedding-crash.html [ Failure Pass ] crbug.com/591099 fast/text/bidi-isolate-nextlinebreak-failure.html [ Failure Pass ] crbug.com/591099 fast/text/bidi-reverse-runs-crash.html [ Failure ] crbug.com/591099 fast/text/break-word-pre-wrap.html [ Failure ] crbug.com/591099 fast/text/break-word-with-floats.html [ Failure Pass ] -crbug.com/591099 fast/text/break-word.html [ Failure ] -crbug.com/591099 fast/text/capitalize-empty-generated-string.html [ Failure ] -crbug.com/591099 fast/text/capitalize-preserve-nbsp.html [ Failure ] -crbug.com/591099 fast/text/cg-fallback-bolding.html [ Failure ] crbug.com/591099 fast/text/chromium-linux-fallback-crash.html [ Failure ] crbug.com/591099 fast/text/chromium-linux-fontconfig-renderstyle.html [ Failure ] crbug.com/591099 fast/text/chromium-mac-duplicate-ime-composition.html [ Failure ] @@ -10744,8 +10433,6 @@ crbug.com/591099 fast/text/computed-line-height-and-font-size-with-font-size-adjust.html [ Failure ] crbug.com/591099 fast/text/container-align-with-inlines.html [ Failure ] crbug.com/591099 fast/text/decorations-with-text-combine.html [ Failure ] -crbug.com/591099 fast/text/delete-hard-break-character.html [ Failure ] -crbug.com/591099 fast/text/drawBidiText.html [ Failure ] crbug.com/591099 fast/text/ellipsis-at-edge-of-ltr-text-in-rtl-flow.html [ Failure ] crbug.com/591099 fast/text/ellipsis-at-edge-of-rtl-text-in-ltr-flow.html [ Failure ] crbug.com/591099 fast/text/ellipsis-in-absolute-block.html [ Failure ] @@ -10777,14 +10464,11 @@ crbug.com/591099 fast/text/emphasis-complex.html [ Failure ] crbug.com/591099 fast/text/emphasis-ellipsis-complextext.html [ Failure ] crbug.com/591099 fast/text/emphasis-overlap.html [ Failure ] -crbug.com/591099 fast/text/fake-italic.html [ Failure ] crbug.com/591099 fast/text/fallback-for-custom-font.html [ Failure ] crbug.com/591099 fast/text/find-kana.html [ Timeout ] crbug.com/591099 fast/text/find-russian.html [ Failure ] crbug.com/591099 fast/text/find-soft-hyphen.html [ Failure ] crbug.com/591099 fast/text/firstline/001.html [ Failure ] -crbug.com/591099 fast/text/firstline/002.html [ Failure ] -crbug.com/591099 fast/text/firstline/003.html [ Failure ] crbug.com/591099 fast/text/font-ascent-mac.html [ Failure ] crbug.com/591099 fast/text/font-fallback-synthetic-italics.html [ Failure ] crbug.com/591099 fast/text/font-initial.html [ Failure ] @@ -10797,49 +10481,34 @@ crbug.com/591099 fast/text/hide-atomic-inlines-after-ellipsis.html [ Crash Failure ] crbug.com/591099 fast/text/hyphenate-character.html [ Failure ] crbug.com/591099 fast/text/hyphens/hyphens-none.html [ Failure ] -crbug.com/591099 fast/text/in-rendered-text-rtl.html [ Failure ] crbug.com/591099 fast/text/international/arabic-justify.html [ Failure ] -crbug.com/591099 fast/text/international/arabic-vertical-offset.html [ Failure ] crbug.com/591099 fast/text/international/bidi-AN-after-empty-run.html [ Failure ] crbug.com/591099 fast/text/international/bidi-LDB-2-CSS.html [ Failure ] crbug.com/591099 fast/text/international/bidi-LDB-2-HTML.html [ Failure ] crbug.com/591099 fast/text/international/bidi-LDB-2-formatting-characters.html [ Failure ] -crbug.com/591099 fast/text/international/bidi-european-terminators.html [ Failure ] crbug.com/591099 fast/text/international/bidi-ignored-for-first-child-inline.html [ Failure ] -crbug.com/591099 fast/text/international/bidi-innertext.html [ Failure ] +crbug.com/591099 fast/text/international/bidi-innertext.html [ Failure Pass ] crbug.com/591099 fast/text/international/bidi-linebreak-001.html [ Failure ] crbug.com/591099 fast/text/international/bidi-linebreak-002.html [ Failure ] crbug.com/591099 fast/text/international/bidi-linebreak-003.html [ Failure ] crbug.com/591099 fast/text/international/bidi-listbox-atsui.html [ Failure ] crbug.com/591099 fast/text/international/bidi-listbox.html [ Failure ] crbug.com/591099 fast/text/international/bidi-mirror-he-ar.html [ Failure ] -crbug.com/591099 fast/text/international/bidi-neutral-directionality-paragraph-start.html [ Failure ] -crbug.com/591099 fast/text/international/bidi-neutral-run.html [ Failure ] crbug.com/591099 fast/text/international/block-flow-parser-test.html [ Crash Failure ] -crbug.com/591099 fast/text/international/bold-bengali.html [ Failure ] crbug.com/591099 fast/text/international/cjk-segmentation.html [ Crash Failure ] crbug.com/591099 fast/text/international/combining-marks-position.html [ Failure ] -crbug.com/591099 fast/text/international/complex-character-based-fallback.html [ Failure ] -crbug.com/591099 fast/text/international/complex-joining-using-gpos.html [ Failure ] -crbug.com/591099 fast/text/international/danda-space.html [ Failure ] crbug.com/591099 fast/text/international/draw-complex-text-from-to.html [ Failure ] -crbug.com/591099 fast/text/international/hebrew-vowels.html [ Failure ] -crbug.com/591099 fast/text/international/hindi-whitespace.html [ Failure ] crbug.com/591099 fast/text/international/iso-8859-8.html [ Failure ] crbug.com/591099 fast/text/international/listbox-width-rtl.html [ Crash Failure ] -crbug.com/591099 fast/text/international/plane2.html [ Failure ] crbug.com/591099 fast/text/international/rtl-caret.html [ Failure ] crbug.com/591099 fast/text/international/rtl-negative-letter-spacing.html [ Failure ] crbug.com/591099 fast/text/international/rtl-text-wrapping.html [ Failure ] -crbug.com/591099 fast/text/international/rtl-white-space-pre-wrap.html [ Crash Failure ] crbug.com/591099 fast/text/international/shape-across-elements.html [ Failure ] crbug.com/591099 fast/text/international/text-combine-image-test.html [ Failure ] crbug.com/591099 fast/text/international/text-combine-parser-test.html [ Crash Failure ] -crbug.com/591099 fast/text/international/text-spliced-font.html [ Failure Pass ] crbug.com/591099 fast/text/international/thai-cursor-position.html [ Crash Failure ] crbug.com/591099 fast/text/international/thai-offsetForPosition-inside-character.html [ Failure ] crbug.com/591099 fast/text/international/unicode-bidi-plaintext.html [ Failure ] -crbug.com/591099 fast/text/international/vertical-text-glyph-test.html [ Failure Pass ] crbug.com/591099 fast/text/international/vertical-text-metrics-test.html [ Crash Failure ] crbug.com/591099 fast/text/ipa-tone-letters.html [ Failure ] crbug.com/591099 fast/text/justified-selection-at-edge.html [ Failure ] @@ -10854,11 +10523,8 @@ crbug.com/591099 fast/text/large-text-composed-char.html [ Failure Timeout ] crbug.com/591099 fast/text/letter-spacing-negative-opacity.html [ Failure ] crbug.com/591099 fast/text/line-break-between-text-nodes-latin1.html [ Failure ] -crbug.com/591099 fast/text/line-initial-and-final-swashes.html [ Failure ] crbug.com/591099 fast/text/long-word.html [ Failure Timeout ] crbug.com/591099 fast/text/midword-break-after-breakable-char.html [ Failure ] -crbug.com/591099 fast/text/midword-break-before-surrogate-pair.html [ Failure ] -crbug.com/591099 fast/text/midword-break-hang.html [ Failure ] crbug.com/591099 fast/text/monospace-width-cache.html [ Failure ] crbug.com/591099 fast/text/multiglyph-characters.html [ Failure ] crbug.com/591099 fast/text/nested-bidi-isolate-crash.html [ Failure ] @@ -10897,68 +10563,47 @@ crbug.com/591099 fast/text/selection-rect-line-height-too-small.html [ Failure ] crbug.com/591099 fast/text/selection-with-inline-padding.html [ Failure ] crbug.com/591099 fast/text/shadow-no-blur.html [ Failure ] -crbug.com/591099 fast/text/shadow-translucent-fill.html [ Failure ] crbug.com/591099 fast/text/shaping/same-script-different-lang.html [ Failure ] -crbug.com/591099 fast/text/shaping/shaping-selection-rect.html [ Failure ] crbug.com/591099 fast/text/shaping/shaping-width-initialized.html [ Failure ] -crbug.com/591099 fast/text/should-use-atsui.html [ Failure ] crbug.com/591099 fast/text/soft-hyphen-2.html [ Failure ] crbug.com/591099 fast/text/soft-hyphen-4.html [ Failure ] crbug.com/591099 fast/text/soft-hyphen-5.html [ Failure ] crbug.com/591099 fast/text/soft-hyphen-min-preferred-width.html [ Failure ] crbug.com/591099 fast/text/soft-hyphen-overflow.html [ Failure ] -crbug.com/591099 fast/text/stale-TextLayout-from-first-line.html [ Failure ] +crbug.com/591099 fast/text/stale-TextLayout-from-first-line.html [ Failure Pass ] crbug.com/591099 fast/text/sub-pixel/text-scaling-pixel.html [ Failure Timeout ] crbug.com/591099 fast/text/tab-min-size.html [ Failure ] crbug.com/591099 fast/text/text-between-two-brs-in-nowrap-overflow.html [ Failure ] -crbug.com/591099 fast/text/text-combine-shrink-to-fit.html [ Failure Pass ] crbug.com/591099 fast/text/text-container-bounding-rect.html [ Crash Failure ] crbug.com/591099 fast/text/text-iterator-crash.html [ Crash Failure ] crbug.com/591099 fast/text/text-large-negative-letter-spacing-with-opacity.html [ Failure ] crbug.com/591099 fast/text/text-letter-spacing.html [ Failure ] -crbug.com/591099 fast/text/text-shadow-no-default-color.html [ Failure ] crbug.com/591099 fast/text/text-transform-nontext-node-crash.xhtml [ Failure ] crbug.com/591099 fast/text/textIteratorNilRenderer.html [ Failure ] crbug.com/591099 fast/text/trailing-white-space-2.html [ Failure ] crbug.com/591099 fast/text/trailing-white-space.html [ Failure ] crbug.com/591099 fast/text/vertical-rl-rtl-linebreak.html [ Failure ] -crbug.com/591099 fast/text/vertical-surrogate-pair.html [ Failure ] crbug.com/591099 fast/text/wbr-in-pre-crash.html [ Failure ] -crbug.com/591099 fast/text/wbr-pre.html [ Failure ] -crbug.com/591099 fast/text/wbr-styled.html [ Failure ] crbug.com/591099 fast/text/wbr.html [ Failure ] -crbug.com/591099 fast/text/webfont-synthetic-bold.html [ Failure ] -crbug.com/591099 fast/text/whitespace/001.html [ Failure ] crbug.com/591099 fast/text/whitespace/018.html [ Failure ] -crbug.com/591099 fast/text/whitespace/019.html [ Failure ] -crbug.com/591099 fast/text/whitespace/022.html [ Failure ] -crbug.com/591099 fast/text/whitespace/023.html [ Failure ] crbug.com/591099 fast/text/whitespace/024.html [ Failure ] crbug.com/591099 fast/text/whitespace/028.html [ Failure ] -crbug.com/591099 fast/text/whitespace/029.html [ Failure ] crbug.com/591099 fast/text/whitespace/inline-whitespace-wrapping-3.html [ Failure Pass ] crbug.com/591099 fast/text/whitespace/inline-whitespace-wrapping-4.html [ Failure Pass ] crbug.com/591099 fast/text/whitespace/inline-whitespace-wrapping-5.html [ Failure Pass ] crbug.com/591099 fast/text/whitespace/normal-after-nowrap-breaking.html [ Crash Failure ] -crbug.com/591099 fast/text/whitespace/nowrap-clear-float.html [ Failure Pass ] crbug.com/591099 fast/text/whitespace/nowrap-line-break-after-white-space.html [ Failure ] crbug.com/591099 fast/text/whitespace/nowrap-previous-trailing-space.html [ Failure ] crbug.com/591099 fast/text/whitespace/nowrap-trailing-space.html [ Failure ] -crbug.com/591099 fast/text/whitespace/pre-newline-box-test.html [ Failure ] -crbug.com/591099 fast/text/whitespace/pre-wrap-last-char.html [ Failure ] -crbug.com/591099 fast/text/whitespace/pre-wrap-overflow-selection.html [ Failure ] crbug.com/591099 fast/text/whitespace/pre-wrap-spaces-after-newline.html [ Failure ] crbug.com/591099 fast/text/whitespace/select-new-line-with-line-break-normal.html [ Failure ] crbug.com/591099 fast/text/whitespace/tab-character-basics.html [ Failure ] crbug.com/591099 fast/text/whitespace/whitespace-in-pre.html [ Failure ] crbug.com/591099 fast/text/wide-preformatted.html [ Failure ] -crbug.com/591099 fast/text/word-break-run-rounding.html [ Failure ] -crbug.com/591099 fast/text/word-break-soft-hyphen.html [ Failure ] crbug.com/591099 fast/text/word-break.html [ Failure Pass ] crbug.com/591099 fast/text/word-space-between-inlines.html [ Failure ] crbug.com/591099 fast/text/word-space.html [ Failure ] crbug.com/591099 fast/text/writing-root-with-overflow-clip-baseline.html [ Crash Failure Pass ] -crbug.com/591099 fast/text/zero-font-size.html [ Failure ] crbug.com/591099 fast/text/zero-width-characters-complex-script.html [ Failure ] crbug.com/591099 fast/text/zero-width-characters.html [ Failure ] crbug.com/591099 fast/tokenizer/001.html [ Failure ] @@ -11080,7 +10725,6 @@ crbug.com/591099 fast/writing-mode/auto-sizing-orthogonal-flows.html [ Failure ] crbug.com/591099 fast/writing-mode/background-vertical-lr.html [ Failure ] crbug.com/591099 fast/writing-mode/background-vertical-rl.html [ Failure ] -crbug.com/591099 fast/writing-mode/baseline-inline-replaced-002.html [ Failure Pass ] crbug.com/591099 fast/writing-mode/basic-vertical-line.html [ Failure ] crbug.com/591099 fast/writing-mode/block-level-images.html [ Failure ] crbug.com/591099 fast/writing-mode/border-image-vertical-lr.html [ Failure ] @@ -11088,12 +10732,8 @@ crbug.com/591099 fast/writing-mode/border-radius-clipping-vertical-lr.html [ Failure ] crbug.com/591099 fast/writing-mode/border-styles-vertical-lr.html [ Failure ] crbug.com/591099 fast/writing-mode/border-styles-vertical-rl.html [ Failure ] -crbug.com/591099 fast/writing-mode/border-vertical-lr.html [ Failure Pass ] crbug.com/591099 fast/writing-mode/borders.html [ Failure ] crbug.com/591099 fast/writing-mode/box-shadow-horizontal-tb-tile-edge.html [ Failure ] -crbug.com/591099 fast/writing-mode/broken-ideograph-small-caps.html [ Failure Pass ] -crbug.com/591099 fast/writing-mode/broken-ideographic-font.html [ Failure Pass ] -crbug.com/591099 fast/writing-mode/english-lr-text.html [ Failure Pass ] crbug.com/591099 fast/writing-mode/english-rl-text.html [ Failure ] crbug.com/591099 fast/writing-mode/fallback-orientation.html [ Failure ] crbug.com/591099 fast/writing-mode/flipped-blocks-hit-test-line-edges.html [ Failure ] @@ -11101,8 +10741,6 @@ crbug.com/591099 fast/writing-mode/flipped-blocks-inline-map-local-to-container.html [ Crash Failure ] crbug.com/591099 fast/writing-mode/flipped-blocks-text-map-local-to-container.html [ Failure ] crbug.com/591099 fast/writing-mode/inline-direction-positioning.html [ Crash Failure ] -crbug.com/591099 fast/writing-mode/japanese-lr-selection.html [ Failure Pass ] -crbug.com/591099 fast/writing-mode/japanese-lr-text.html [ Failure Pass ] crbug.com/591099 fast/writing-mode/japanese-rl-selection.html [ Failure ] crbug.com/591099 fast/writing-mode/japanese-rl-text-with-broken-font.html [ Failure ] crbug.com/591099 fast/writing-mode/japanese-rl-text.html [ Failure ] @@ -11123,7 +10761,6 @@ crbug.com/591099 fast/writing-mode/text-combine-justify.html [ Failure ] crbug.com/591099 fast/writing-mode/text-combine-line-break.html [ Failure ] crbug.com/591099 fast/writing-mode/text-combine-various-fonts.html [ Failure ] -crbug.com/591099 fast/writing-mode/text-orientation-basic.html [ Failure ] crbug.com/591099 fast/writing-mode/vertical-baseline-alignment.html [ Failure ] crbug.com/591099 fast/writing-mode/vertical-font-fallback.html [ Failure ] crbug.com/591099 fast/writing-mode/vertical-inline-block-hittest.html [ Crash Failure ] @@ -11285,7 +10922,7 @@ crbug.com/591099 fullscreen/full-screen-iframe-allowed.html [ Crash Failure ] crbug.com/591099 fullscreen/full-screen-iframe-legacy.html [ Failure ] crbug.com/591099 fullscreen/full-screen-iframe-not-allowed.html [ Failure ] -crbug.com/591099 fullscreen/full-screen-iframe-without-allow-attribute-allowed-from-parent.html [ Failure ] +crbug.com/591099 fullscreen/full-screen-iframe-without-allow-attribute-allowed-from-parent.html [ Failure Timeout ] crbug.com/591099 fullscreen/full-screen-placeholder.html [ Failure ] crbug.com/591099 fullscreen/full-screen-request-removed.html [ Failure ] crbug.com/591099 fullscreen/full-screen-table-section.html [ Failure ] @@ -11384,7 +11021,7 @@ crbug.com/591099 html/details_summary/details-clone.html [ Crash Failure ] crbug.com/591099 html/details_summary/details-keyboard-show-hide.html [ Crash Failure ] crbug.com/591099 html/details_summary/details-marker-style.html [ Crash Failure ] -crbug.com/591099 html/details_summary/details-mouse-click.html [ Crash Failure ] +crbug.com/591099 html/details_summary/details-mouse-click.html [ Crash Failure Pass ] crbug.com/591099 html/details_summary/details-nested-1.html [ Crash Failure ] crbug.com/591099 html/details_summary/details-nested-2.html [ Crash Failure ] crbug.com/591099 html/details_summary/details-no-summary1.html [ Crash Failure ] @@ -11572,7 +11209,7 @@ crbug.com/591099 http/tests/cache/subresource-fragment-identifier.html [ Crash Failure ] crbug.com/591099 http/tests/cache/subresource-multiple-instances.html [ Crash Failure ] crbug.com/591099 http/tests/cache/subresource-revalidation-referrer.html [ Failure ] -crbug.com/591099 http/tests/cache/x-frame-options-304.html [ Failure ] +crbug.com/591099 http/tests/cache/x-frame-options-304.html [ Failure Pass ] crbug.com/591099 http/tests/cache/xhr-body.html [ Crash Failure ] crbug.com/591099 http/tests/cache/xhr-vary-header.html [ Crash Failure ] crbug.com/591099 http/tests/cache/zero-length-xhr.html [ Failure ] @@ -11717,7 +11354,6 @@ crbug.com/591099 http/tests/inspector-enabled/resource-tree/resource-tree-mimetype.html [ Failure ] crbug.com/591099 http/tests/inspector-enabled/shadow-dom-rules-restart.html [ Crash Failure ] crbug.com/591099 http/tests/inspector-enabled/shadow-dom-rules.html [ Crash Failure ] -crbug.com/591099 http/tests/inspector-protocol/network/disable-interception-midway.js [ Failure Pass Timeout ] crbug.com/591099 http/tests/inspector-unit/viewport-datagrid-items-attached-to-dom.js [ Failure ] crbug.com/591099 http/tests/inspector-unit/viewport-datagrid-items-expandable-attached-to-dom.js [ Failure ] crbug.com/591099 http/tests/inspector/appcache/appcache-iframe-manifests.html [ Crash Failure Timeout ] @@ -11732,11 +11368,11 @@ crbug.com/591099 http/tests/inspector/bindings/bindings-frame-navigate.html [ Failure Timeout ] crbug.com/591099 http/tests/inspector/bindings/bindings-main-frame-navigated.html [ Failure Timeout ] crbug.com/591099 http/tests/inspector/bindings/bindings-multiple-frames.html [ Crash Failure Timeout ] -crbug.com/591099 http/tests/inspector/bindings/contentscripts-bindings-multiple-frames.html [ Crash Failure ] +crbug.com/591099 http/tests/inspector/bindings/contentscripts-bindings-multiple-frames.html [ Crash Failure Timeout ] crbug.com/591099 http/tests/inspector/bindings/contentscripts-navigator-multiple-frames.html [ Crash Failure Timeout ] crbug.com/591099 http/tests/inspector/bindings/dynamic-bindings-frame-attach-detach.html [ Failure Timeout ] crbug.com/591099 http/tests/inspector/bindings/dynamic-navigator-frame-attach-detach.html [ Failure Timeout ] -crbug.com/591099 http/tests/inspector/bindings/livelocation-main-frame-navigated.html [ Failure ] +crbug.com/591099 http/tests/inspector/bindings/livelocation-main-frame-navigated.html [ Failure Timeout ] crbug.com/591099 http/tests/inspector/bindings/navigator-frame-attach-detach.html [ Failure Timeout ] crbug.com/591099 http/tests/inspector/bindings/navigator-frame-navigate.html [ Failure Timeout ] crbug.com/591099 http/tests/inspector/bindings/navigator-main-frame-navigated.html [ Failure Timeout ] @@ -11767,10 +11403,10 @@ crbug.com/591099 http/tests/inspector/debugger/fetch-breakpoints.html [ Crash Failure Timeout ] crbug.com/591099 http/tests/inspector/elements/elements-linkify-attributes.html [ Crash Failure Timeout ] crbug.com/591099 http/tests/inspector/elements/event-listeners-framework-with-service-worker.html [ Crash Failure ] -crbug.com/591099 http/tests/inspector/elements/html-link-import.html [ Crash Failure ] +crbug.com/591099 http/tests/inspector/elements/html-link-import.html [ Crash Failure Timeout ] crbug.com/591099 http/tests/inspector/elements/styles/edit-css-with-source-url.html [ Crash Failure Timeout ] crbug.com/591099 http/tests/inspector/elements/styles/import-added-through-js-crash.html [ Crash Failure ] -crbug.com/591099 http/tests/inspector/elements/styles/inline-stylesheet-sourceurl-and-sourcemapurl.html [ Crash Failure ] +crbug.com/591099 http/tests/inspector/elements/styles/inline-stylesheet-sourceurl-and-sourcemapurl.html [ Crash Failure Timeout ] crbug.com/591099 http/tests/inspector/elements/styles/selector-line-deprecated.html [ Crash Failure Timeout ] crbug.com/591099 http/tests/inspector/elements/styles/selector-line-sourcemap-header-deprecated.html [ Crash Failure Timeout ] crbug.com/591099 http/tests/inspector/elements/styles/selector-line-sourcemap-header.html [ Crash Failure Timeout ] @@ -11871,7 +11507,7 @@ crbug.com/591099 http/tests/inspector/network/request-name-path.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/network/request-parameters-decoding.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/network/resource-priority.html [ Crash Failure ] -crbug.com/591099 http/tests/inspector/network/script-as-text-loading-long-url.html [ Crash Failure ] +crbug.com/591099 http/tests/inspector/network/script-as-text-loading-long-url.html [ Crash Failure Timeout ] crbug.com/591099 http/tests/inspector/network/script-as-text-loading-with-caret.html [ Failure ] crbug.com/591099 http/tests/inspector/network/subresource-integrity-number-of-requests-for-script.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/network/subresource-integrity-number-of-requests-for-stylesheet.html [ Crash Failure ] @@ -12701,7 +12337,7 @@ crbug.com/591099 http/tests/xmlhttprequest/access-control-preflight-data-saver.html [ Failure Timeout ] crbug.com/591099 http/tests/xmlhttprequest/access-control-preflight-headers-async.html [ Failure ] crbug.com/591099 http/tests/xmlhttprequest/access-control-preflight-headers-sync.html [ Failure ] -crbug.com/591099 http/tests/xmlhttprequest/access-control-preflight-request-header-lowercase.html [ Failure ] +crbug.com/591099 http/tests/xmlhttprequest/access-control-preflight-request-header-lowercase.html [ Failure Timeout ] crbug.com/591099 http/tests/xmlhttprequest/access-control-preflight-request-header-sorted.html [ Failure ] crbug.com/591099 http/tests/xmlhttprequest/access-control-preflight-request-headers-origin.html [ Failure ] crbug.com/591099 http/tests/xmlhttprequest/access-control-preflight-request-invalid-status-301.html [ Failure ] @@ -12915,14 +12551,14 @@ crbug.com/591099 http/tests/xmlhttprequest/xmlhttprequest-image-not-loaded.html [ Failure ] crbug.com/591099 http/tests/xmlhttprequest/xmlhttprequest-inheritance.html [ Failure ] crbug.com/591099 http/tests/xmlhttprequest/xmlhttprequest-latin1.html [ Failure ] -crbug.com/591099 http/tests/xmlhttprequest/xmlhttprequest-mimetype-mixed-case.html [ Failure ] +crbug.com/591099 http/tests/xmlhttprequest/xmlhttprequest-mimetype-mixed-case.html [ Failure Timeout ] crbug.com/591099 http/tests/xmlhttprequest/xmlhttprequest-missing-file-exception.html [ Failure ] crbug.com/591099 http/tests/xmlhttprequest/xmlhttprequest-multiple-open.html [ Failure ] crbug.com/591099 http/tests/xmlhttprequest/xmlhttprequest-no-content-length-onProgress-response-type-blob.html [ Failure ] crbug.com/591099 http/tests/xmlhttprequest/xmlhttprequest-no-content-length-onProgress.html [ Failure ] crbug.com/591099 http/tests/xmlhttprequest/xmlhttprequest-no-content-type-with-text.html [ Failure ] crbug.com/591099 http/tests/xmlhttprequest/xmlhttprequest-no-content-type.html [ Failure ] -crbug.com/591099 http/tests/xmlhttprequest/xmlhttprequest-onProgress-open-should-zero-length.html [ Failure ] +crbug.com/591099 http/tests/xmlhttprequest/xmlhttprequest-onProgress-open-should-zero-length.html [ Failure Timeout ] crbug.com/591099 http/tests/xmlhttprequest/xmlhttprequest-open-empty-method.html [ Failure ] crbug.com/591099 http/tests/xmlhttprequest/xmlhttprequest-overridemimetype-content-type-header.html [ Failure ] crbug.com/591099 http/tests/xmlhttprequest/xmlhttprequest-overridemimetype-mixed-case.html [ Failure ] @@ -13123,7 +12759,7 @@ crbug.com/591099 inspector-protocol/accessibility/accessibility-nameSources-labelledby.js [ Crash Failure Timeout ] crbug.com/591099 inspector-protocol/accessibility/accessibility-nameSources-visiblity.js [ Crash Failure Timeout ] crbug.com/591099 inspector-protocol/css/css-add-rule.js [ Timeout ] -crbug.com/591099 inspector-protocol/css/css-get-platform-fonts.js [ Failure ] +crbug.com/591099 inspector-protocol/css/css-get-platform-fonts.js [ Failure Pass ] crbug.com/591099 inspector-protocol/css/css-set-style-text.js [ Timeout ] crbug.com/591099 inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot.js [ Crash Failure Timeout ] crbug.com/591099 inspector-protocol/emulation/device-emulation-small-dw.js [ Failure ] @@ -13326,7 +12962,7 @@ crbug.com/591099 inspector/elements/edit/set-outer-html.html [ Crash Failure ] crbug.com/591099 inspector/elements/edit/shadow-dom-modify-chardata.html [ Crash Failure ] crbug.com/591099 inspector/elements/edit/switch-panels-while-editing-as-html.html [ Crash Failure Timeout ] -crbug.com/591099 inspector/elements/edit/undo-dom-edits-2.html [ Crash Failure ] +crbug.com/591099 inspector/elements/edit/undo-dom-edits-2.html [ Crash Failure Timeout ] crbug.com/591099 inspector/elements/edit/undo-dom-edits.html [ Crash Failure Timeout ] crbug.com/591099 inspector/elements/edit/undo-set-outer-html-2.html [ Crash Failure Timeout ] crbug.com/591099 inspector/elements/edit/undo-set-outer-html.html [ Crash Failure ] @@ -13343,9 +12979,9 @@ crbug.com/591099 inspector/elements/elements-panel-selection-after-delete.html [ Crash Failure Timeout ] crbug.com/591099 inspector/elements/elements-panel-selection-on-refresh.html [ Crash Failure ] crbug.com/591099 inspector/elements/elements-panel-structure.html [ Crash Failure ] -crbug.com/591099 inspector/elements/elements-panel-styles.html [ Crash Failure ] +crbug.com/591099 inspector/elements/elements-panel-styles.html [ Crash Failure Timeout ] crbug.com/591099 inspector/elements/elements-tab-stops.html [ Crash Failure ] -crbug.com/591099 inspector/elements/elements-treeoutline-copy.html [ Crash Failure ] +crbug.com/591099 inspector/elements/elements-treeoutline-copy.html [ Crash Failure Timeout ] crbug.com/591099 inspector/elements/event-listener-sidebar-custom-framework.html [ Crash Failure ] crbug.com/591099 inspector/elements/event-listener-sidebar-jquery1.html [ Crash Failure ] crbug.com/591099 inspector/elements/event-listener-sidebar-jquery2.html [ Crash Failure ] @@ -13353,7 +12989,7 @@ crbug.com/591099 inspector/elements/event-listener-sidebar.html [ Crash Failure ] crbug.com/591099 inspector/elements/event-listeners-about-blank.html [ Crash Failure Timeout ] crbug.com/591099 inspector/elements/expand-recursively.html [ Crash Failure ] -crbug.com/591099 inspector/elements/hide-shortcut.html [ Crash Failure ] +crbug.com/591099 inspector/elements/hide-shortcut.html [ Crash Failure Timeout ] crbug.com/591099 inspector/elements/highlight/highlight-css-shapes-outside-scroll.html [ Crash Failure Timeout ] crbug.com/591099 inspector/elements/highlight/highlight-css-shapes-outside.html [ Crash Failure ] crbug.com/591099 inspector/elements/highlight/highlight-dom-updates.html [ Crash Failure Timeout ] @@ -13378,7 +13014,7 @@ crbug.com/591099 inspector/elements/shadow/breadcrumb-shadow-roots.html [ Crash Failure ] crbug.com/591099 inspector/elements/shadow/create-shadow-root.html [ Crash Failure Timeout ] crbug.com/591099 inspector/elements/shadow/elements-panel-shadow-selection-on-refresh-1.html [ Crash Failure ] -crbug.com/591099 inspector/elements/shadow/elements-panel-shadow-selection-on-refresh-2.html [ Crash Failure ] +crbug.com/591099 inspector/elements/shadow/elements-panel-shadow-selection-on-refresh-2.html [ Crash Failure Timeout ] crbug.com/591099 inspector/elements/shadow/elements-panel-shadow-selection-on-refresh-3.html [ Crash Failure ] crbug.com/591099 inspector/elements/shadow/inspect-deep-shadow-element.html [ Crash Failure ] crbug.com/591099 inspector/elements/shadow/reveal-shadow-dom-node.html [ Crash Failure ] @@ -14456,7 +14092,6 @@ crbug.com/591099 paint/invalidation/negative-shadow-box-shrink.html [ Failure ] crbug.com/591099 paint/invalidation/negative-text-indent-with-overflow-hidden.html [ Failure ] crbug.com/591099 paint/invalidation/nested-fixed-iframe-scrolled.html [ Failure Pass ] -crbug.com/591099 paint/invalidation/no-caret-repaint-in-non-content-editable-element.html [ Failure ] crbug.com/591099 paint/invalidation/offset-change-wrong-invalidation-with-float.html [ Crash Failure ] crbug.com/591099 paint/invalidation/opacity-change-on-overflow-float.html [ Failure ] crbug.com/591099 paint/invalidation/outline-add-repaint.html [ Failure Pass ] @@ -14563,7 +14198,6 @@ crbug.com/591099 paint/invalidation/scrollbar-invalidation-on-resize.html [ Failure Pass ] crbug.com/591099 paint/invalidation/scrollbar-parts.html [ Failure ] crbug.com/591099 paint/invalidation/scrolled-iframe-scrollbar-change.html [ Failure ] -crbug.com/591099 paint/invalidation/search-field-cancel.html [ Crash Failure ] crbug.com/591099 paint/invalidation/select-option-background-color.html [ Failure ] crbug.com/591099 paint/invalidation/selected-replaced.html [ Failure ] crbug.com/591099 paint/invalidation/selection-after-delete.html [ Failure ] @@ -14641,7 +14275,6 @@ crbug.com/591099 paint/invalidation/svg/transform-foreign-object.html [ Failure Pass ] crbug.com/591099 paint/invalidation/svg/use-instanceRoot-event-bubbling.xhtml [ Timeout ] crbug.com/591099 paint/invalidation/svg/use-setAttribute-crash.svg [ Failure Pass ] -crbug.com/591099 paint/invalidation/table-cell-collapsed-border.html [ Failure ] crbug.com/591099 paint/invalidation/table-cell-move.html [ Failure ] crbug.com/591099 paint/invalidation/table-cell-overflow.html [ Failure Pass ] crbug.com/591099 paint/invalidation/table-cell-vertical-overflow.html [ Failure ] @@ -14803,7 +14436,7 @@ crbug.com/591099 presentation/presentation-controller-close-connection.html [ Crash Pass Timeout ] crbug.com/591099 presentation/presentation-controller-connection-closed-by-receiver.html [ Crash Pass Timeout ] crbug.com/591099 presentation/presentation-controller-terminate-connection.html [ Crash Pass Timeout ] -crbug.com/591099 presentation/presentation-receiver-terminate-connection.html [ Crash Pass Timeout ] +crbug.com/591099 presentation/presentation-receiver-terminate-connection.html [ Crash Failure Pass Timeout ] crbug.com/591099 presentation/presentation-start-error.html [ Crash Failure Pass Timeout ] crbug.com/591099 presentation/presentation-start.html [ Crash Pass Timeout ] crbug.com/591099 presentation/presentationconnectionavailableevent-ctor-mock.html [ Crash Pass Timeout ] @@ -16029,23 +15662,19 @@ crbug.com/591099 tables/hittesting/filltable-stress.html [ Pass Timeout ] crbug.com/591099 tables/layering/paint-test-layering-1.html [ Failure ] crbug.com/591099 tables/layering/paint-test-layering-2.html [ Failure ] -crbug.com/591099 tables/mozilla/bugs/bug10565.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug10633.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug109043.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug110566.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug113235-1.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug113235-2.html [ Failure ] -crbug.com/591099 tables/mozilla/bugs/bug11384q.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug12008.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug126742.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug1271.html [ Failure ] -crbug.com/591099 tables/mozilla/bugs/bug12908-1.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug1302.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug131020-2.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug131020.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug131020_iframe.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug13105.html [ Failure ] -crbug.com/591099 tables/mozilla/bugs/bug13118.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug133948.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug137388-3.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug149275-1.html [ Failure ] @@ -16053,43 +15682,29 @@ crbug.com/591099 tables/mozilla/bugs/bug154780.html [ Crash Failure ] crbug.com/591099 tables/mozilla/bugs/bug16012.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug16252.html [ Failure ] -crbug.com/591099 tables/mozilla/bugs/bug17130-1.html [ Failure ] -crbug.com/591099 tables/mozilla/bugs/bug17130-2.html [ Failure ] -crbug.com/591099 tables/mozilla/bugs/bug17138.html [ Failure ] -crbug.com/591099 tables/mozilla/bugs/bug18359.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug18440.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug18664.html [ Failure ] -crbug.com/591099 tables/mozilla/bugs/bug18955.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug19061-1.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug19061-2.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug19599.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug196870.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug2050.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug20579.html [ Failure ] -crbug.com/591099 tables/mozilla/bugs/bug20804.html [ Failure ] -crbug.com/591099 tables/mozilla/bugs/bug215629.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug219693-1.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug219693-2.html [ Failure ] -crbug.com/591099 tables/mozilla/bugs/bug22019.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug221784-2.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug23151.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug23235.html [ Crash Failure ] crbug.com/591099 tables/mozilla/bugs/bug24200.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug2469.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug2479-3.html [ Failure ] -crbug.com/591099 tables/mozilla/bugs/bug25086.html [ Failure ] -crbug.com/591099 tables/mozilla/bugs/bug2684.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug269566.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug27038-1.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug27038-2.html [ Failure ] -crbug.com/591099 tables/mozilla/bugs/bug2773.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug2886.html [ Failure ] -crbug.com/591099 tables/mozilla/bugs/bug28928.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug29326.html [ Failure ] -crbug.com/591099 tables/mozilla/bugs/bug2947.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug2962.html [ Crash Failure ] crbug.com/591099 tables/mozilla/bugs/bug2981-2.html [ Failure Pass ] -crbug.com/591099 tables/mozilla/bugs/bug2997.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug30559.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug30692.html [ Crash Failure ] crbug.com/591099 tables/mozilla/bugs/bug3191.html [ Crash Failure ] @@ -16099,19 +15714,13 @@ crbug.com/591099 tables/mozilla/bugs/bug3309-2.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug33137.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug3454.html [ Failure ] -crbug.com/591099 tables/mozilla/bugs/bug38916.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug3977.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug4093.html [ Failure ] -crbug.com/591099 tables/mozilla/bugs/bug42187.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug4284.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug43204.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug43854-1.html [ Failure ] -crbug.com/591099 tables/mozilla/bugs/bug44523.html [ Failure ] -crbug.com/591099 tables/mozilla/bugs/bug4527.html [ Failure Pass ] crbug.com/591099 tables/mozilla/bugs/bug4576.html [ Failure ] -crbug.com/591099 tables/mozilla/bugs/bug46480-1.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug4849-2.html [ Failure ] -crbug.com/591099 tables/mozilla/bugs/bug48827.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug50695-1.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug50695-2.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug51140.html [ Failure ] @@ -16122,22 +15731,17 @@ crbug.com/591099 tables/mozilla/bugs/bug57828-2.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug57828.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug5798.html [ Failure ] -crbug.com/591099 tables/mozilla/bugs/bug5835.html [ Crash Failure ] crbug.com/591099 tables/mozilla/bugs/bug58402-1.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug60992.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug6304.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug63785.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug641-2.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug647.html [ Failure ] -crbug.com/591099 tables/mozilla/bugs/bug68912.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug69187.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug7112-1.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug7112-2.html [ Failure ] -crbug.com/591099 tables/mozilla/bugs/bug7121-1.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug727.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug7342.html [ Failure ] -crbug.com/591099 tables/mozilla/bugs/bug7471.html [ Failure ] -crbug.com/591099 tables/mozilla/bugs/bug7714.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug82946-1.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug82946-2.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug83786.html [ Crash Failure Pass ] @@ -16148,8 +15752,6 @@ crbug.com/591099 tables/mozilla/bugs/bug88524.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug8858.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug8950.html [ Failure ] -crbug.com/591099 tables/mozilla/bugs/bug9123-1.html [ Failure ] -crbug.com/591099 tables/mozilla/bugs/bug9123-2.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug97383.html [ Failure Pass ] crbug.com/591099 tables/mozilla/bugs/bug98196.html [ Failure ] crbug.com/591099 tables/mozilla/collapsing_borders/bug41262-3.html [ Crash Failure ] @@ -16160,114 +15762,16 @@ crbug.com/591099 tables/mozilla/core/col_span.html [ Failure ] crbug.com/591099 tables/mozilla/core/margins.html [ Failure ] crbug.com/591099 tables/mozilla/core/table_heights.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/col_span.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/colgroup_align_center.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/colgroup_align_justify.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/colgroup_align_left.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/colgroup_align_right.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/colgroup_span.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/colgroup_valign_baseline.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/colgroup_valign_bottom.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/colgroup_valign_middle.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/colgroup_valign_top.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/colgroup_width_pct.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/colgroup_width_px.html [ Failure ] crbug.com/591099 tables/mozilla/marvin/tables_align_center.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_aqua.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_aqua_rgb.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_black.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_black_rgb.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_blue.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_blue_rgb.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_fuchsia.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_fuchsia_rgb.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_gray.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_gray_rgb.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_green.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_green_rgb.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_lime.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_lime_rgb.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_maroon.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_maroon_rgb.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_navy.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_navy_rgb.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_olive.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_olive_rgb.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_purple.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_purple_rgb.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_red.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_red_rgb.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_silver.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_silver_rgb.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_teal.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_teal_rgb.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_white.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_white_rgb.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_yellow.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_yellow_rgb.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_caption_align_bot.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_caption_align_top.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tables_cellpadding_pct.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tbody_align_center.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tbody_align_char.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tbody_align_justify.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tbody_align_left.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tbody_align_right.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tbody_char.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tfoot_align_center.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tfoot_align_char.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tfoot_align_justify.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tfoot_align_left.html [ Crash Failure ] -crbug.com/591099 tables/mozilla/marvin/tfoot_align_right.html [ Failure ] crbug.com/591099 tables/mozilla/marvin/tfoot_char.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/thead_align_center.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/thead_align_char.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/thead_align_justify.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/thead_align_left.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/thead_align_right.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/thead_char.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_aqua_rgb.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_black.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_black_rgb.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_blue.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_blue_rgb.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_fuchsia.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_fuchsia_rgb.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_gray.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_gray_rgb.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_green.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_green_rgb.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_lime.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_lime_rgb.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_maroon.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_maroon_rgb.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_navy.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_navy_rgb.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_olive.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_olive_rgb.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_purple.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_purple_rgb.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_red.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_red_rgb.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_silver.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_silver_rgb.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_teal.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_teal_rgb.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_white.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_white_rgb.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_yellow.html [ Failure ] -crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_yellow_rgb.html [ Failure ] crbug.com/591099 tables/mozilla/marvin/x_table.xml [ Failure ] crbug.com/591099 tables/mozilla/marvin/x_table_align_center.xml [ Failure ] -crbug.com/591099 tables/mozilla/other/test3.html [ Failure ] -crbug.com/591099 tables/mozilla/other/test6.html [ Failure ] crbug.com/591099 tables/mozilla/other/wa_table_thtd_rowspan.html [ Crash Failure ] crbug.com/591099 tables/mozilla/other/wa_table_tr_align.html [ Crash Failure ] crbug.com/591099 tables/mozilla_expected_failures/bugs/bug1010.html [ Crash Failure ] crbug.com/591099 tables/mozilla_expected_failures/bugs/bug104898.html [ Failure ] crbug.com/591099 tables/mozilla_expected_failures/bugs/bug1055-2.html [ Failure ] crbug.com/591099 tables/mozilla_expected_failures/bugs/bug1128.html [ Failure ] -crbug.com/591099 tables/mozilla_expected_failures/bugs/bug11331.html [ Failure ] crbug.com/591099 tables/mozilla_expected_failures/bugs/bug14007-2.html [ Failure ] crbug.com/591099 tables/mozilla_expected_failures/bugs/bug14489.html [ Crash Failure ] crbug.com/591099 tables/mozilla_expected_failures/bugs/bug19526.html [ Failure ] @@ -16280,9 +15784,6 @@ crbug.com/591099 tables/mozilla_expected_failures/bugs/bug3166-17.html [ Failure ] crbug.com/591099 tables/mozilla_expected_failures/bugs/bug3166-18.html [ Failure ] crbug.com/591099 tables/mozilla_expected_failures/bugs/bug33784.html [ Failure ] -crbug.com/591099 tables/mozilla_expected_failures/bugs/bug42043.html [ Failure ] -crbug.com/591099 tables/mozilla_expected_failures/bugs/bug4294.html [ Failure ] -crbug.com/591099 tables/mozilla_expected_failures/bugs/bug51000.html [ Failure ] crbug.com/591099 tables/mozilla_expected_failures/bugs/bug61042-1.html [ Failure ] crbug.com/591099 tables/mozilla_expected_failures/bugs/bug61042-2.html [ Failure ] crbug.com/591099 tables/mozilla_expected_failures/bugs/bug7113.html [ Failure ] @@ -16303,11 +15804,6 @@ crbug.com/591099 tables/mozilla_expected_failures/marvin/table_overflow_caption_left.html [ Failure ] crbug.com/591099 tables/mozilla_expected_failures/marvin/table_overflow_caption_right.html [ Crash Failure ] crbug.com/591099 tables/mozilla_expected_failures/marvin/table_overflow_caption_top.html [ Crash Failure ] -crbug.com/591099 tables/mozilla_expected_failures/marvin/tables_caption_align_left.html [ Failure ] -crbug.com/591099 tables/mozilla_expected_failures/marvin/tables_caption_align_right.html [ Failure ] -crbug.com/591099 tables/mozilla_expected_failures/marvin/tables_cellspacing_pct.html [ Failure ] -crbug.com/591099 tables/mozilla_expected_failures/other/empty_cells.html [ Failure ] -crbug.com/591099 tables/mozilla_expected_failures/other/test4.html [ Failure ] crbug.com/591099 touchadjustment/big-div.html [ Failure ] crbug.com/591099 touchadjustment/block-testing.html [ Failure ] crbug.com/591099 touchadjustment/context-menu-select-text.html [ Failure ] @@ -16830,11 +16326,9 @@ crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/clear-applies-to-012.xht [ Crash Failure ] crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/float-applies-to-008.xht [ Crash Failure ] crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/float-replaced-width-002.xht [ Crash Failure ] -crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/floats-005.xht [ Crash Failure ] +crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/floats-005.xht [ Crash Failure Pass ] crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/floats-036.xht [ Crash Failure ] crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/floats-143.xht [ Crash Failure ] -crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/margin-collapse-018.xht [ Crash Failure ] -crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/margin-collapse-035.xht [ Crash Failure ] crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats/floats-placement-vertical-001a.xht [ Crash Failure ] crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats/floats-placement-vertical-001b.xht [ Crash Failure ] crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats/floats-placement-vertical-001c.xht [ Crash Failure ] @@ -16855,7 +16349,6 @@ crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/linebox/vertical-align-sub-001.xht [ Crash Failure ] crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/linebox/vertical-align-super-001.xht [ Crash Failure ] crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/normal-flow/block-replaced-width-006.xht [ Failure ] -crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/normal-flow/inline-replaced-width-013.xht [ Crash Failure Pass ] crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/normal-flow/root-box-001.xht [ Crash Failure ] crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/positioning/top-019.xht [ Crash Failure ] crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/positioning/top-020.xht [ Crash Failure ] @@ -16875,7 +16368,6 @@ crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/positioning/top-104.xht [ Crash Failure ] crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/positioning/top-113.xht [ Crash Failure ] crbug.com/591099 virtual/layout_ng/fast/block/basic/016.html [ Crash Failure ] -crbug.com/591099 virtual/layout_ng/fast/block/basic/adding-near-anonymous-block.html [ Crash Failure ] crbug.com/591099 virtual/layout_ng/fast/block/basic/fieldset-stretch-to-legend.html [ Crash Failure ] crbug.com/591099 virtual/layout_ng/fast/block/float/002.html [ Failure ] crbug.com/591099 virtual/layout_ng/fast/block/float/014.html [ Crash Failure ] @@ -16885,8 +16377,6 @@ crbug.com/591099 virtual/layout_ng/fast/block/float/floats-offset-image-quirk-line-height.html [ Crash Failure ] crbug.com/635619 virtual/layout_ng/fast/block/float/float-not-removed-from-first-letter.html [ Crash Failure ] crbug.com/591099 virtual/layout_ng/fast/block/float/formatting-context-changes.html [ Crash Failure ] -crbug.com/591099 virtual/layout_ng/fast/block/float/overhanging-float-add-in-static-position-block.html [ Failure Pass ] -crbug.com/591099 virtual/layout_ng/fast/block/float/overhanging-float-add-in-static-position-block2.html [ Failure Pass ] crbug.com/591099 virtual/layout_ng/fast/block/float/rubybase-children-made-inline-crash.html [ Failure ] crbug.com/591099 virtual/layout_ng/fast/block/float/rubybase-children-moved-crash-2.html [ Crash Failure ] crbug.com/591099 virtual/layout_ng/fast/block/float/rubybase-children-moved-crash.html [ Failure ] @@ -16911,7 +16401,6 @@ crbug.com/591099 virtual/mojo-blobs/fast/files/workers/worker-file-last-modified.html [ Failure ] crbug.com/591099 virtual/mojo-blobs/fast/files/workers/worker-read-blob-async-crash.html [ Failure ] crbug.com/591099 virtual/mojo-blobs/fast/files/xhr-response-blob.html [ Failure ] -crbug.com/591099 virtual/mojo-loading/http/tests/inspector-protocol/network/disable-interception-midway.js [ Failure Pass Timeout ] crbug.com/591099 virtual/mojo-loading/http/tests/inspector/appcache/appcache-iframe-manifests.html [ Pass Timeout ] crbug.com/591099 virtual/mojo-loading/http/tests/inspector/application-panel/storage-view-reports-quota.html [ Failure Pass Timeout ] crbug.com/591099 virtual/mojo-loading/http/tests/inspector/bindings/livelocation-main-frame-navigated.html [ Failure Pass Timeout ] @@ -17408,7 +16897,7 @@ crbug.com/591099 virtual/threaded/animations/hit-testing/inline-element-animation-end-hit-test.html [ Failure ] crbug.com/591099 virtual/threaded/animations/interpolation/backdrop-filter-interpolation.html [ Crash Timeout ] crbug.com/591099 virtual/threaded/animations/interpolation/background-image-interpolation.html [ Crash Pass Timeout ] -crbug.com/591099 virtual/threaded/animations/interpolation/background-size-interpolation.html [ Timeout ] +crbug.com/591099 virtual/threaded/animations/interpolation/background-size-interpolation.html [ Pass Timeout ] crbug.com/591099 virtual/threaded/animations/interpolation/border-image-slice-interpolation.html [ Crash Pass Timeout ] crbug.com/591099 virtual/threaded/animations/interpolation/border-image-width-interpolation.html [ Crash Timeout ] crbug.com/591099 virtual/threaded/animations/interpolation/line-height-interpolation.html [ Crash Pass Timeout ] @@ -17635,8 +17124,8 @@ crbug.com/591099 virtual/wheelscrolllatching/fast/events/wheel/wheelevent-ctrl.html [ Failure ] crbug.com/591099 virtual/wheelscrolllatching/fast/events/wheel/wheelevent-document-createevent.html [ Failure ] crbug.com/591099 virtual/wheelscrolllatching/fast/events/wheel/wheelevent-handler-count.html [ Failure ] -crbug.com/591099 virtual/wheelscrolllatching/fast/events/wheel/wheelevent-in-horizontal-scrollbar-in-rtl.html [ Failure ] -crbug.com/591099 virtual/wheelscrolllatching/fast/events/wheel/wheelevent-in-vertical-scrollbar-in-rtl.html [ Failure ] +crbug.com/591099 virtual/wheelscrolllatching/fast/events/wheel/wheelevent-in-horizontal-scrollbar-in-rtl.html [ Failure Pass ] +crbug.com/591099 virtual/wheelscrolllatching/fast/events/wheel/wheelevent-in-vertical-scrollbar-in-rtl.html [ Failure Pass ] crbug.com/591099 virtual/wheelscrolllatching/fast/events/wheel/wheelevent-mousewheel-interaction.html [ Failure ] crbug.com/591099 webaudio/BiquadFilter/tail-time-lowpass.html [ Timeout ] crbug.com/591099 webaudio/internals/audiocontext-lock-threading-race.html [ Failure ]
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService b/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService index f7ed034..100bd8a 100644 --- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService +++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService
@@ -101,77 +101,23 @@ Bug(none) bluetooth/service/getCharacteristics/gen-get-same-object.html [ Timeout ] Bug(none) bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.html [ Timeout ] Bug(none) compositing/video-frame-size-change.html [ Timeout ] -Bug(none) css-parser/color3.html [ Failure ] -Bug(none) css-parser/color3_hsl.html [ Failure ] -Bug(none) css-parser/color3_hsla_1.html [ Failure ] -Bug(none) css-parser/color3_hsla_2.html [ Failure ] -Bug(none) css-parser/color3_keywords.html [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/Attribute_Nodes.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/Attribute_Nodes_xmlns.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/Comment_Nodes.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/Conformance_Expressions.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/Conformance_ID.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/Conformance_hasFeature_3.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/Conformance_hasFeature_empty.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/Conformance_hasFeature_null.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/Element_Nodes.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/Processing_Instruction_Nodes.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/Text_Nodes.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathEvaluatorCast01.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathEvaluator_createExpression_INVALID_EXPRESSION_ERR.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathEvaluator_createExpression_NAMESPACE_ERR_01.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathEvaluator_createExpression_NAMESPACE_ERR_02.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathEvaluator_createExpression_NS.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathEvaluator_createExpression_no_NS.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathEvaluator_createNSResolver_all.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathEvaluator_createNSResolver_document.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathEvaluator_createNSResolver_documentElement.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathEvaluator_evaluate_INVALID_EXPRESSION_ERR.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathEvaluator_evaluate_NAMESPACE_ERR.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathEvaluator_evaluate_NOT_SUPPORTED_ERR.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathEvaluator_evaluate_WRONG_DOCUMENT_ERR.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathEvaluator_evaluate_document.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathEvaluator_evaluate_documentElement.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathExpression_evaluate_NOT_SUPPORTED_ERR.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathExpression_evaluate_WRONG_DOCUMENT_ERR.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathExpression_evaluate_document.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathExpression_evaluate_documentElement.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathNSResolver_lookupNamespaceURI_nist_dmstc.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathNSResolver_lookupNamespaceURI_null.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathNSResolver_lookupNamespaceURI_prefix.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathNSResolver_lookupNamespaceURI_xml.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_TYPE_ERR.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_booleanValue_false.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_booleanValue_true.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_invalidIteratorState_ANY_TYPE.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_invalidIteratorState_ANY_UNORDERED_NODE_TYPE.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_invalidIteratorState_BOOLEAN_TYPE.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_invalidIteratorState_FIRST_ORDERED_NODE_TYPE.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_invalidIteratorState_NUMBER_TYPE.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_invalidIteratorState_ORDERED_NODE_ITERATOR_TYPE.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_invalidIteratorState_ORDERED_NODE_SNAPSHOT_TYPE.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_invalidIteratorState_STRING_TYPE.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_invalidIteratorState_UNORDERED_NODE_ITERATOR_TYPE.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_invalidIteratorState_UNORDERED_NODE_SNAPSHOT_TYPE.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_iterateNext_INVALID_STATE_ERR.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_iteratorNext_ORDERED_NODE_ITERATOR_TYPE.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_numberValue.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_resultType.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_singleNodeValue_ANY_UNORDERED_NODE_TYPE.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_singleNodeValue_FIRST_ORDERED_NODE_TYPE.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_snapshotItem_ORDERED_NODE_SNAPSHOT_TYPE_null.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_snapshotItem_ORDERED_NODE_SNAPSHOT_TYPE_order.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_snapshotItem_UNORDERED_NODE_SNAPSHOT_TYPE_count.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_snapshotItem_UNORDERED_NODE_SNAPSHOT_TYPE_null.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_snapshotLength_ORDERED_NODE_SNAPSHOT_TYPE.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_snapshotLength_UNORDERED_NODE_SNAPSHOT_TYPE.svg [ Failure ] -Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_stringValue.svg [ Failure ] Bug(none) external/wpt/2dcontext/imagebitmap/createImageBitmap-drawImage.html [ Crash Failure Timeout ] Bug(none) external/wpt/clear-site-data/storage.https.html [ Failure ] Bug(none) external/wpt/fetch/api/abort/serviceworker-intercepted.https.html [ Crash Failure Timeout ] Bug(none) external/wpt/FileAPI/historical.https.html [ Crash Failure Timeout ] Bug(none) external/wpt/FileAPI/url/url_xmlhttprequest.html [ Crash Failure Timeout ] -Bug(none) external/wpt/XMLHttpRequest [ Crash Failure Timeout ] +Bug(none) external/wpt/XMLHttpRequest/anonymous-mode-unsupported.htm [ Failure ] +Bug(none) external/wpt/XMLHttpRequest/event-upload-progress-crossorigin.htm [ Failure ] +Bug(none) external/wpt/XMLHttpRequest/event-upload-progress.htm [ Failure ] +Bug(none) external/wpt/XMLHttpRequest/formdata-blob.htm [ Failure ] +Bug(none) external/wpt/XMLHttpRequest/formdata.htm [ Failure ] +Bug(none) external/wpt/XMLHttpRequest/overridemimetype-blob.html [ Failure ] +Bug(none) external/wpt/XMLHttpRequest/send-accept.htm [ Failure ] +Bug(none) external/wpt/XMLHttpRequest/send-blob-with-no-mime-type.html [ Failure ] +Bug(none) external/wpt/XMLHttpRequest/send-data-blob.htm [ Failure ] +Bug(none) external/wpt/XMLHttpRequest/send-redirect-post-upload.htm [ Failure ] +Bug(none) external/wpt/XMLHttpRequest/send-response-upload-event-loadend.htm [ Timeout ] +Bug(none) external/wpt/XMLHttpRequest/send-response-upload-event-progress.htm [ Timeout ] Bug(none) external/wpt/background-fetch/interfaces-worker.https.html [ Crash Failure Timeout ] Bug(none) external/wpt/beacon/headers/header-content-type.html [ Timeout ] Bug(none) external/wpt/clear-site-data/navigation.https.html [ Timeout ] @@ -229,12 +175,6 @@ Bug(none) external/wpt/content-security-policy/worker-src/shared-list.sub.html [ Failure Timeout ] Bug(none) external/wpt/cookies/secure/set-from-dom.https.sub.html [ Failure Timeout ] Bug(none) external/wpt/cookies/secure/set-from-http.https.sub.html [ Failure Timeout ] -Bug(none) external/wpt/cors/allow-headers.htm [ Failure Timeout ] -Bug(none) external/wpt/cors/origin.htm [ Failure Timeout ] -Bug(none) external/wpt/cors/preflight-cache.htm [ Failure Timeout ] -Bug(none) external/wpt/cors/request-headers.htm [ Failure Timeout ] -Bug(none) external/wpt/cors/response-headers.htm [ Failure Timeout ] -Bug(none) external/wpt/cors/simple-requests.htm [ Failure Timeout ] Bug(none) external/wpt/cssom-view/scrolling-quirks-vs-nonquirks.html [ Failure Timeout ] Bug(none) external/wpt/cssom-view/scrollingElement.html [ Failure Timeout ] Bug(none) external/wpt/domxpath/xml_xpath_runner.html [ Failure Timeout ] @@ -252,22 +192,17 @@ Bug(none) external/wpt/fetch/api/policies/referrer-origin-when-cross-origin-service-worker.https.html [ Crash Failure Timeout ] Bug(none) external/wpt/fetch/api/policies/referrer-unsafe-url-service-worker.https.html [ Crash Failure Timeout ] Bug(none) external/wpt/fetch/api/response/response-cancel-stream.html [ Timeout ] -Bug(none) external/wpt/html/browsers/browsing-the-web/navigating-across-documents/012.html [ Failure Timeout ] Bug(none) external/wpt/html/browsers/history/the-location-interface/location-protocol-setter-non-broken-weird.html [ Failure Timeout Failure ] Bug(none) external/wpt/html/browsers/offline/appcache/workers/appcache-worker.html [ Timeout ] Bug(none) external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/window-serviceworker-failure.https.html [ Crash Failure Timeout ] Bug(none) external/wpt/html/semantics/embedded-content/media-elements/playing-the-media-resource/playbackRate.html [ Failure Timeout ] -Bug(none) external/wpt/html/semantics/embedded-content/media-elements/ready-states/autoplay-with-slow-text-tracks.html [ Failure Timeout ] -Bug(none) external/wpt/html/semantics/embedded-content/media-elements/video_008.htm [ Failure Timeout ] Bug(none) external/wpt/html/semantics/embedded-content/media-elements/volume_nonfinite.html [ Failure Timeout ] Bug(none) external/wpt/html/semantics/embedded-content/the-iframe-element/iframe-load-event.html [ Failure Timeout ] -Bug(none) external/wpt/html/semantics/forms/form-submission-0/getactionurl.html [ Failure Timeout ] Bug(none) external/wpt/html/semantics/forms/form-submission-0/submit-entity-body.html [ Failure Timeout ] Bug(none) external/wpt/html/semantics/forms/the-legend-element/legend-form.html [ Failure Timeout ] Bug(none) external/wpt/html/semantics/scripting-1/the-script-element/async_003.htm [ Failure Timeout ] Bug(none) external/wpt/html/semantics/scripting-1/the-script-element/module/credentials.sub.html [ Failure Timeout ] Bug(none) external/wpt/html/semantics/scripting-1/the-script-element/script-crossorigin-network.html [ Failure Timeout ] -Bug(none) external/wpt/html/webappapis/idle-callbacks/callback-suspended.html [ Failure Timeout ] Bug(none) external/wpt/html/webappapis/scripting/events/messageevent-constructor.https.html [ Crash Failure Timeout ] Bug(none) external/wpt/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/canblock-serviceworker.https.html [ Crash Failure Timeout ] Bug(none) external/wpt/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-events.serviceworker.https.html [ Crash Failure Timeout ] @@ -276,15 +211,7 @@ Bug(none) external/wpt/mixed-content/allowed/http-csp/same-host-wss/websocket-request/top-level/no-redirect/websocket-allowed.https.html [ Failure Timeout ] Bug(none) external/wpt/navigation-timing/nav2_test_attributes_values.html [ Failure Timeout ] Bug(none) external/wpt/navigation-timing/nav2_test_unloadEvents_previous_document_cross_origin.sub.html [ Failure Timeout ] -Bug(none) external/wpt/notifications/shownotification-resolve-manual.https.html [ Failure Timeout ] -Bug(none) external/wpt/offscreen-canvas [ Crash Failure Timeout ] Bug(none) external/wpt/preload/fetch-destination.https.html [ Crash Failure Timeout ] -Bug(none) external/wpt/preload/single-download-preload.html [ Failure Timeout ] -Bug(none) external/wpt/resource-timing/resource_TAO_match_origin.htm [ Failure Timeout ] -Bug(none) external/wpt/resource-timing/resource_TAO_match_wildcard.htm [ Failure Timeout ] -Bug(none) external/wpt/resource-timing/resource_TAO_multi.htm [ Failure Timeout ] -Bug(none) external/wpt/resource-timing/resource_cached.htm [ Failure Timeout ] -Bug(none) external/wpt/resource-timing/resource_connection_reuse.html [ Failure Timeout ] Bug(none) external/wpt/resource-timing/test_resource_timing.html [ Failure Timeout ] Bug(none) external/wpt/service-workers [ Crash Failure Timeout ] Bug(none) external/wpt/streams/byte-length-queuing-strategy.serviceworker.https.html [ Crash Failure Timeout ] @@ -317,11 +244,9 @@ Bug(none) external/wpt/streams/writable-streams/bad-strategies.dedicatedworker.html [ Failure Timeout ] Bug(none) external/wpt/streams/writable-streams/bad-strategies.serviceworker.https.html [ Crash Failure Timeout ] Bug(none) external/wpt/streams/writable-streams/bad-underlying-sinks.serviceworker.https.html [ Crash Failure Timeout ] -Bug(none) external/wpt/streams/writable-streams/bad-underlying-sinks.sharedworker.html [ Failure Timeout ] Bug(none) external/wpt/streams/writable-streams/brand-checks.serviceworker.https.html [ Crash Failure Timeout ] Bug(none) external/wpt/streams/writable-streams/byte-length-queuing-strategy.serviceworker.https.html [ Crash Failure Timeout ] Bug(none) external/wpt/streams/writable-streams/close.serviceworker.https.html [ Crash Failure Timeout ] -Bug(none) external/wpt/streams/writable-streams/close.sharedworker.html [ Failure Timeout ] Bug(none) external/wpt/streams/writable-streams/constructor.serviceworker.https.html [ Crash Failure Timeout ] Bug(none) external/wpt/streams/writable-streams/count-queuing-strategy.serviceworker.https.html [ Crash Failure Timeout ] Bug(none) external/wpt/streams/writable-streams/error.serviceworker.https.html [ Crash Failure Timeout ] @@ -362,7 +287,6 @@ Bug(none) fast/workers/close-context-messageport-crash.html [ Timeout ] Bug(none) fast/xmlhttprequest/xmlhttprequest-bad-mimetype.html [ Failure ] Bug(none) fast/xmlhttprequest/xmlhttprequest-html-response-encoding.html [ Failure ] -Bug(none) fast/xmlhttprequest/xmlhttprequest-nonexistent-file.html [ Timeout ] Bug(none) fast/xmlhttprequest/xmlhttprequest-responsetype-arraybuffer.html [ Timeout ] Bug(none) fast/xpath/4XPath/Borrowed/od_20000608.html [ Failure ] Bug(none) fast/xsl/document-function.xml [ Failure ] @@ -377,32 +301,19 @@ Bug(none) fast/xsl/xslt-processor.html [ Failure ] Bug(none) fast/xsl/xslt-relative-path.xml [ Failure ] Bug(none) fast/xsl/xslt-second-level-import.xml [ Skip ] -Bug(none) http/tests/appcache/404-manifest.html [ Failure ] +Bug(none) http/tests/appcache/404-manifest.html [ Failure Pass ] Bug(none) http/tests/appcache/abort-cache-ondownloading-manifest-404.html [ Timeout ] Bug(none) http/tests/appcache/access-via-redirect.php [ Timeout ] -Bug(none) http/tests/appcache/crash-when-navigating-away-then-back.html [ Timeout ] -Bug(none) http/tests/appcache/cyrillic-uri.html [ Failure Timeout ] -Bug(none) http/tests/appcache/different-https-origin-resource-main.html [ Timeout ] -Bug(none) http/tests/appcache/fail-on-update-2.html [ Timeout ] Bug(none) http/tests/appcache/fallback.html [ Failure ] -Bug(none) http/tests/appcache/local-content.html [ Timeout ] -Bug(none) http/tests/appcache/main-resource-hash.html [ Timeout ] -Bug(none) http/tests/appcache/main-resource-redirect.html [ Timeout ] -Bug(715632) http/tests/appcache/manifest-redirect-2.html [ Crash ] -Bug(715632) http/tests/appcache/manifest-redirect.html [ Crash ] +Bug(754827) http/tests/appcache/main-resource-redirect.html [ Timeout ] Bug(none) http/tests/appcache/manifest-parsing.html [ Failure ] Bug(none) http/tests/appcache/multi-fallback.html [ Failure Timeout ] -Bug(none) http/tests/appcache/non-html.xhtml [ Crash ] -Bug(none) http/tests/appcache/offline-access.html [ Timeout ] -Bug(none) http/tests/appcache/online-fallback-layering.html [ Timeout ] +Bug(none) http/tests/appcache/non-html.xhtml [ Timeout ] +Bug(754827) http/tests/appcache/online-fallback-layering.html [ Failure ] Bug(none) http/tests/appcache/online-whitelist.html [ Failure ] -Bug(none) http/tests/appcache/reload.html [ Crash Failure Timeout ] Bug(none) http/tests/appcache/remove-cache.html [ Crash Failure Timeout ] -Bug(715632) http/tests/appcache/resource-redirect.html [ Crash ] -Bug(715632) http/tests/appcache/resource-redirect-2.html [ Crash ] Bug(none) http/tests/appcache/simple.html [ Timeout ] Bug(none) http/tests/appcache/top-frame-1.html [ Timeout ] -Bug(none) http/tests/appcache/top-frame-2.html [ Crash Timeout ] Bug(none) http/tests/appcache/top-frame-3.html [ Crash Timeout ] Bug(none) http/tests/appcache/top-frame-4.html [ Crash Timeout ] Bug(none) http/tests/appcache/update-cache.html [ Timeout ] @@ -422,30 +333,19 @@ Bug(none) http/tests/background_sync/oneshot-register-failure-worker-not-activated.html [ Crash Failure ] Bug(none) http/tests/background_sync/oneshot.html [ Crash Failure Timeout ] Bug(none) http/tests/background_sync/permission_denied.html [ Crash Failure Timeout ] -Bug(none) http/tests/bluetooth/https/requestDevice/cross-origin-iframe.html [ Timeout ] Bug(none) http/tests/budget/get-budget-in-service-worker.html [ Timeout ] -Bug(none) http/tests/budget/get-budget.html [ Timeout ] Bug(none) http/tests/budget/get-cost-fails-in-service-worker.html [ Timeout ] Bug(none) http/tests/budget/get-cost-in-service-worker.html [ Timeout ] -Bug(none) http/tests/budget/get-cost.html [ Timeout ] Bug(none) http/tests/budget/interfaces-in-service-worker.html [ Crash Failure Timeout ] Bug(none) http/tests/budget/reserve-in-service-worker.html [ Timeout ] -Bug(none) http/tests/budget/reserve.html [ Timeout ] Bug(none) http/tests/cache/cached-main-resource.html [ Timeout ] -Bug(none) http/tests/cache/history-only-cached-subresource-loads-max-age-https.html [ Timeout ] Bug(none) http/tests/cache/iframe-304-crash.html [ Failure Timeout ] -Bug(none) http/tests/cache/network-error-during-revalidation.html [ Timeout ] Bug(none) http/tests/cache/post-redirect-get.php [ Timeout ] -Bug(none) http/tests/cache/post-with-cached-subresources.php [ Timeout ] Bug(none) http/tests/cache/reload-main-resource.php [ Timeout ] -Bug(none) http/tests/cache/stopped-revalidation.html [ Failure ] Bug(none) http/tests/cache/subresource-expiration-1.html [ Failure ] Bug(none) http/tests/cache/subresource-expiration-2.html [ Failure ] Bug(none) http/tests/cache/subresource-failover-to-network.html [ Failure ] -Bug(none) http/tests/cache/subresource-fragment-identifier.html [ Failure ] -Bug(none) http/tests/cache/sync-xhr-304.html [ Failure ] Bug(none) http/tests/cachestorage/serviceworker/credentials.html [ Crash Failure Timeout ] -Bug(none) http/tests/canvas/webgl/origin-clean-conformance.html [ Timeout ] Bug(none) http/tests/cookies/double-quoted-value-with-semi-colon.html [ Failure ] Bug(none) http/tests/cookies/http-get-cookie-set-in-js.html [ Failure ] Bug(none) http/tests/cookies/js-get-and-set-http-only-cookie.html [ Failure ] @@ -459,14 +359,7 @@ Bug(none) http/tests/cookies/simple-cookies-expired.html [ Failure ] Bug(none) http/tests/cookies/simple-cookies-max-age.html [ Failure ] Bug(none) http/tests/cookies/single-quoted-value.html [ Failure ] -Bug(none) http/tests/credentialmanager/credentialscontainer-frame-errors.html [ Timeout ] Bug(none) http/tests/credentialmanager/passwordcredential-fetch.html [ Failure ] -Bug(none) http/tests/css/border-image-loading.html [ Failure ] -Bug(none) http/tests/css/css-image-loading.html [ Failure ] -Bug(none) http/tests/css/font-face-src-cached.html [ Failure ] -Bug(none) http/tests/css/image-value-cached.html [ Failure ] -Bug(none) http/tests/css/mask-image-loading.html [ Failure ] -Bug(none) http/tests/css/reflection-mask-image-loading.html [ Failure ] Bug(none) http/tests/csspaint/invalidation-background-image.html [ Failure ] Bug(none) http/tests/csspaint/invalidation-border-image.html [ Failure ] Bug(none) http/tests/csspaint/invalidation-content-image.html [ Crash Failure ] @@ -593,29 +486,17 @@ Bug(none) http/tests/fetch/serviceworker/thorough/redirect.html [ Crash Timeout ] Bug(none) http/tests/fetch/serviceworker/thorough/scheme-blob-base-https-other-https.html [ Crash Timeout ] Bug(none) http/tests/fetch/serviceworker/thorough/scheme-blob-other-https.html [ Crash Timeout ] +Bug(none) http/tests/fetch/serviceworker/thorough/scheme-blob.html [ Timeout ] Bug(none) http/tests/fetch/serviceworker/thorough/scheme-data-base-https-other-https.html [ Crash Timeout ] Bug(none) http/tests/fetch/serviceworker/thorough/scheme-data-other-https.html [ Crash Timeout ] Bug(none) http/tests/fetch/serviceworker/thorough/scheme-data.html [ Crash Timeout ] -Bug(none) http/tests/fetch/window/block-mixed-content-base-https.html [ Failure Timeout ] -Bug(none) http/tests/fetch/window/block-mixed-content-nocors-base-https.html [ Failure Timeout ] -Bug(none) http/tests/fetch/window/body-mixin-base-https-other-https.html [ Failure Timeout ] -Bug(none) http/tests/fetch/window/body-mixin.html [ Failure Timeout ] Bug(none) http/tests/fetch/window/cache-override-base-https-other-https.html [ Failure Timeout ] Bug(none) http/tests/fetch/window/fetch-base-https-other-https.html [ Failure Timeout ] Bug(none) http/tests/fetch/window/fetch.html [ Failure Timeout ] -Bug(none) http/tests/fetch/window/filtered-response-base-https-other-https.html [ Failure Timeout ] -Bug(none) http/tests/fetch/window/filtered-response-other-https.html [ Failure Timeout ] -Bug(none) http/tests/fetch/window/headers-base-https-other-https.html [ Failure Timeout ] -Bug(none) http/tests/fetch/window/headers-guard-base-https-other-https.html [ Failure Timeout ] -Bug(none) http/tests/fetch/window/referrer-base-https-other-https.html [ Failure Timeout ] Bug(none) http/tests/fetch/window/request-base-https-other-https.html [ Failure Timeout ] Bug(none) http/tests/fetch/window/request.html [ Failure Timeout ] Bug(none) http/tests/fetch/window/response-base-https-other-https.html [ Failure Timeout ] Bug(none) http/tests/fetch/window/response-content-base-https-other-https.html [ Failure Timeout ] -Bug(none) http/tests/fetch/window/response-content.html [ Failure Timeout ] -Bug(none) http/tests/fetch/window/response.html [ Failure Timeout ] -Bug(none) http/tests/fetch/window/stream-reader-base-https-other-https.html [ Failure Timeout ] -Bug(none) http/tests/fetch/window/stream-reader.html [ Failure Timeout ] Bug(none) http/tests/fetch/window/thorough/access-control-base-https-other-https.html [ Failure Timeout ] Bug(none) http/tests/fetch/window/thorough/access-control.html [ Failure Timeout ] Bug(none) http/tests/fetch/window/thorough/auth-base-https-other-https.html [ Failure Timeout ] @@ -661,9 +542,6 @@ Bug(none) http/tests/fetch/window/thorough/scheme-data-other-https.html [ Failure Timeout ] Bug(none) http/tests/fetch/window/thorough/scheme-data.html [ Failure Timeout ] Bug(none) http/tests/fetch/workers/block-mixed-content-base-https.html [ Failure Timeout ] -Bug(none) http/tests/fetch/workers/block-mixed-content-nocors-base-https.html [ Failure Timeout ] -Bug(none) http/tests/fetch/workers/body-mixin-base-https-other-https.html [ Failure Timeout ] -Bug(none) http/tests/fetch/workers/body-mixin.html [ Failure Timeout ] Bug(none) http/tests/fetch/workers/cache-override-base-https-other-https.html [ Failure Timeout ] Bug(none) http/tests/fetch/workers/fetch-base-https-other-https.html [ Failure Timeout ] Bug(none) http/tests/fetch/workers/fetch.html [ Failure Timeout ] @@ -678,8 +556,6 @@ Bug(none) http/tests/fetch/workers/response-content-base-https-other-https.html [ Failure Timeout ] Bug(none) http/tests/fetch/workers/response-content.html [ Failure Timeout ] Bug(none) http/tests/fetch/workers/response.html [ Failure Timeout ] -Bug(none) http/tests/fetch/workers/stream-reader-base-https-other-https.html [ Failure Timeout ] -Bug(none) http/tests/fetch/workers/stream-reader.html [ Failure Timeout ] Bug(none) http/tests/fetch/workers/thorough/access-control-base-https-other-https.html [ Failure Timeout ] Bug(none) http/tests/fetch/workers/thorough/access-control.html [ Failure Timeout ] Bug(none) http/tests/fetch/workers/thorough/auth-base-https-other-https.html [ Failure Timeout ] @@ -729,22 +605,26 @@ Bug(none) http/tests/history/push-state-in-new-frame.html [ Timeout ] Bug(none) http/tests/htmlimports/import-cors-credentials.html [ Failure ] Bug(none) http/tests/https/verify-ssl-enabled.php [ Timeout ] -Bug(none) http/tests/inspector [ Crash Failure Timeout ] -Bug(none) http/tests/inspector-enabled [ Failure Timeout ] +Bug(none) http/tests/inspector/extensions-ignore-cache.html [ Crash ] +Bug(none) http/tests/inspector/extensions-useragent.html [ Crash ] +Bug(none) http/tests/inspector/network/har-content.html [ Failure Timeout ] +Bug(none) http/tests/inspector/network/load-resource-for-frontend.html [ Failure Timeout ] +Bug(none) http/tests/inspector/network/network-datareceived.html [ Failure ] +Bug(none) http/tests/inspector/network/ping-response.html [ Failure ] +Bug(none) http/tests/inspector/network/warning-for-long-cookie.html [ Failure ] +Bug(none) http/tests/inspector/network/x-frame-options-deny.html [ Failure ] +Bug(none) http/tests/inspector/network/long-script-content.html [ Crash ] +Bug(none) http/tests/inspector/persistence/persistence-tabbed-editor-tabs-order.html [ Crash ] +Bug(none) http/tests/inspector/resource-har-conversion.html [ Failure ] +Bug(none) http/tests/inspector/resource-parameters.html [ Failure ] +Bug(none) http/tests/inspector/resource-parameters-ipv6.html [ Timeout ] +Bug(none) http/tests/inspector/service-workers/service-workers-bypass-for-network-redirect.html [ Crash ] +Bug(none) http/tests/inspector/service-workers/service-workers-force-update-on-page-load.html [ Timeout ] +Bug(none) http/tests/inspector/service-workers/service-workers-navigation-preload.html [ Timeout ] +Bug(none) http/tests/inspector/service-workers/service-workers-redundant.html [ Timeout ] +Bug(none) http/tests/inspector/service-workers/service-workers-view.html [ Timeout ] Bug(none) http/tests/inspector-protocol [ Failure Timeout ] -Bug(none) http/tests/inspector-protocol/cachestorage/read-cached-response.js [ Timeout ] Bug(none) http/tests/inspector-protocol/page/frameScheduledNavigation.js [ Crash ] -Bug(none) http/tests/inspector/extensions/extensions-api.html [ Timeout ] -Bug(none) http/tests/inspector/extensions/extensions-audits-api.html [ Timeout ] -Bug(none) http/tests/inspector/extensions/extensions-audits-content-script.html [ Timeout ] -Bug(none) http/tests/inspector/extensions/extensions-audits.html [ Timeout ] -Bug(none) http/tests/inspector/extensions/extensions-events.html [ Timeout ] -Bug(none) http/tests/inspector/extensions/extensions-network.html [ Failure Timeout ] -Bug(none) http/tests/inspector/extensions/extensions-reload.html [ Timeout ] -Bug(none) http/tests/inspector/extensions/extensions-resources.html [ Timeout ] -Bug(none) http/tests/inspector/extensions/extensions-timeline-api.html [ Timeout ] -Bug(none) http/tests/inspector/extensions/multiple-extensions.html [ Timeout ] -Bug(none) http/tests/linkHeader/link-preconnect-schemeless.https.php [ Timeout ] Bug(none) http/tests/loading/307-after-303-after-post.html [ Failure ] Bug(none) http/tests/loading/doc-write-sync-third-party-script-reload.html [ Crash ] Bug(none) http/tests/loading/bad-scheme-subframe.html [ Failure ] @@ -781,31 +661,25 @@ Bug(none) http/tests/misc/image-checks-for-accept.html [ Failure Pass ] Bug(none) http/tests/misc/image-input-type-outlives-gc-without-crashing.html [ Failure Pass ] Bug(none) http/tests/misc/image-load-outlives-gc-without-crashing.html [ Failure Pass ] -Bug(none) http/tests/misc/link-preconnect-schemeless.https.html [ Timeout ] Bug(none) http/tests/misc/link-rel-prefetch.html [ Failure ] Bug(none) http/tests/misc/onload-detach-during-csp-frame-src-none.html [ Failure ] Bug(none) http/tests/misc/redirect-to-about-blank.html [ Timeout ] Bug(none) http/tests/misc/resource-timing-sizes-sync-xhr-transfer-size.html [ Timeout ] Bug(none) http/tests/misc/resource-timing-sizes-tags.html [ Failure Timeout ] Bug(none) http/tests/misc/resource-timing-sizes-xhr-fetch.html [ Timeout ] -Bug(none) http/tests/misc/tests-finishing-simultaneously.html [ Timeout ] Bug(none) http/tests/misc/webtiming-ssl.php [ Timeout ] -Bug(none) http/tests/misc/window-dot-stop.html [ Failure ] Bug(none) http/tests/misc/xhtml.php [ Failure ] Bug(none) http/tests/navigation/image-load-in-unload-handler.html [ Failure ] Bug(none) http/tests/navigation/location-reload-after-post.php [ Failure ] Bug(none) http/tests/navigation/multiple-back-forward-entries.html [ Timeout ] -Bug(none) http/tests/navigation/navigation-interrupted-by-fragment.html [ Timeout ] Bug(none) http/tests/navigation/onload-navigation-iframe-2.html [ Timeout ] Bug(none) http/tests/navigation/onload-navigation-iframe-timeout.html [ Timeout ] Bug(none) http/tests/navigation/onload-navigation-iframe.html [ Timeout ] Bug(none) http/tests/navigation/ping-cookie.html [ Failure ] -Bug(none) http/tests/navigation/ping-cross-origin-from-https.html [ Timeout ] Bug(none) http/tests/navigation/ping-same-origin.html [ Failure ] Bug(none) http/tests/navigation/post-basic.html [ Failure ] -Bug(none) http/tests/navigation/post-frames-goback1.html [ Failure ] +Bug(none) http/tests/navigation/post-frames-goback1.html [ Crash Failure ] Bug(none) http/tests/navigation/post-frames.html [ Failure ] -Bug(none) http/tests/navigation/post-goback1.html [ Failure ] Bug(none) http/tests/navigation/redirect-on-back-updates-history-item.html [ Timeout ] Bug(none) http/tests/navigation/redirect-on-reload-updates-history-item.html [ Timeout ] Bug(none) http/tests/navigation/rename-subframe-goback.html [ Failure ] @@ -834,7 +708,6 @@ Bug(none) http/tests/notifications/serviceworkerregistration-document-image-slow-404.html [ Crash Failure Timeout ] Bug(none) http/tests/notifications/serviceworkerregistration-document-image-slow.html [ Crash Failure Timeout ] Bug(none) http/tests/notifications/serviceworkerregistration-document-no-permission.html [ Crash Failure Timeout ] -Bug(none) http/tests/notifications/serviceworkerregistration-document-not-activated.html [ Crash Failure ] Bug(none) http/tests/notifications/serviceworkerregistration-document-vibrate-throw.html [ Crash Failure Timeout ] Bug(none) http/tests/notifications/serviceworkerregistration-get-close.html [ Crash Failure Timeout ] Bug(none) http/tests/notifications/serviceworkerregistration-get-empty.html [ Crash Failure Timeout ] @@ -861,21 +734,14 @@ Bug(none) http/tests/payments/payment-app-interfaces.html [ Crash Failure Timeout ] Bug(none) http/tests/payments/payment-instruments.html [ Crash Failure Timeout ] Bug(none) http/tests/payments/payment-request-event.html [ Crash Failure Timeout ] -Bug(none) http/tests/performance-timing/paint-timing/first-contentful-paint.html [ Failure ] -Bug(none) http/tests/permissions/test-api-surface.html [ Crash Failure ] Bug(none) http/tests/permissions/test-query.html [ Crash Failure ] -Bug(none) http/tests/previews/client-lofi-sprite.html [ Failure ] Bug(none) http/tests/push_messaging/application-server-key-format-test.html [ Crash Failure Timeout ] Bug(none) http/tests/push_messaging/application-server-key-standard-endpoint.html [ Crash Failure Timeout ] Bug(none) http/tests/push_messaging/get-subscription-in-document.html [ Crash Failure Timeout ] Bug(none) http/tests/push_messaging/get-subscription-in-service-worker.html [ Crash Failure Timeout ] -Bug(none) http/tests/push_messaging/permission-state-denied-in-document.html [ Crash Failure ] Bug(none) http/tests/push_messaging/permission-state-denied-in-service-worker.html [ Crash Failure Timeout ] -Bug(none) http/tests/push_messaging/permission-state-exception-in-document.html [ Crash Failure ] Bug(none) http/tests/push_messaging/permission-state-exception-in-service-worker.html [ Crash Failure Timeout ] -Bug(none) http/tests/push_messaging/permission-state-granted-in-document.html [ Crash ] Bug(none) http/tests/push_messaging/permission-state-granted-in-service-worker.html [ Crash Failure Timeout ] -Bug(none) http/tests/push_messaging/permission-state-prompt-in-document.html [ Crash Failure ] Bug(none) http/tests/push_messaging/permission-state-prompt-in-service-worker.html [ Crash Failure Timeout ] Bug(none) http/tests/push_messaging/push-subscription-options.html [ Crash Failure Timeout ] Bug(none) http/tests/push_messaging/push-subscription-stringification.html [ Crash Failure Timeout ] @@ -887,14 +753,12 @@ Bug(none) http/tests/push_messaging/subscribe-failure-permission-default-in-service-worker.html [ Crash Failure Timeout ] Bug(none) http/tests/push_messaging/subscribe-failure-permission-denied-in-document.html [ Crash Failure Timeout ] Bug(none) http/tests/push_messaging/subscribe-failure-permission-denied-in-service-worker.html [ Crash Failure Timeout ] -Bug(none) http/tests/push_messaging/subscribe-failure-worker-not-activated.html [ Crash Failure ] Bug(none) http/tests/push_messaging/subscribe-success-in-document.html [ Crash Failure Timeout ] Bug(none) http/tests/push_messaging/subscribe-success-in-service-worker.html [ Crash Failure Timeout ] Bug(none) http/tests/push_messaging/unsubscribe-in-document.html [ Crash Failure Timeout ] Bug(none) http/tests/push_messaging/unsubscribe-in-service-worker.html [ Crash Failure Timeout ] Bug(none) http/tests/security/contentSecurityPolicy/1.1/form-action-src-get-blocked-with-redirect.html [ Failure ] Bug(none) http/tests/security/contentSecurityPolicy/1.1/form-action-src-redirect-blocked.html [ Failure ] -Bug(none) http/tests/security/contentSecurityPolicy/block-mixed-content-hides-warning.html [ Failure ] Bug(none) http/tests/security/contentSecurityPolicy/cascade/same-origin-window-open.html [ Timeout ] Bug(none) http/tests/security/contentSecurityPolicy/cascade/same-origin-with-own-policy-window-open.html [ Timeout ] Bug(none) http/tests/security/contentSecurityPolicy/cascade/same-origin-with-own-policy.html [ Timeout ] @@ -902,170 +766,39 @@ Bug(none) http/tests/security/contentSecurityPolicy/frame-src-child-frame-navigates-to-blocked-origin.html [ Failure Timeout ] Bug(none) http/tests/security/contentSecurityPolicy/frame-src-cross-origin-load.html [ Failure ] Bug(none) http/tests/security/contentSecurityPolicy/frame-src-redirect-blocked.html [ Failure ] -Bug(none) http/tests/security/contentSecurityPolicy/register-bypassing-scheme-script.https.html [ Timeout ] -Bug(none) http/tests/security/contentSecurityPolicy/report-same-origin-with-cookies.php [ Failure ] -Bug(none) http/tests/security/contentSecurityPolicy/script-src-star-cross-scheme.html [ Failure ] -Bug(none) http/tests/security/contentSecurityPolicy/source-list-parsing-10.html [ Failure ] Bug(none) http/tests/security/cookies/first-party-cookie-allow-xslt.xml [ Failure ] Bug(none) http/tests/security/cookies/third-party-cookie-blocking-main-frame.html [ Failure ] Bug(none) http/tests/security/cookies/third-party-cookie-blocking-worker.html [ Failure ] Bug(none) http/tests/security/cookies/xmlhttprequest.html [ Timeout ] Bug(none) http/tests/security/cors-rfc1918 [ Crash Timeout ] -Bug(none) http/tests/security/cross-frame-access-parent-explicit-domain-isolated-world.html [ Timeout ] -Bug(none) http/tests/security/cross-frame-access-parent-isolated-world.html [ Timeout ] -Bug(none) http/tests/security/cross-frame-access-protocol-explicit-domain.html [ Timeout ] -Bug(none) http/tests/security/cross-frame-access-protocol.html [ Timeout ] -Bug(none) http/tests/security/cross-origin-OffscreenCanvas2D-transferToImageBitmap.html [ Timeout ] -Bug(none) http/tests/security/cross-origin-OffscreenCanvasWebGL-texImage2D.html [ Timeout ] -Bug(none) http/tests/security/cross-origin-createImageBitmap.html [ Timeout ] -Bug(none) http/tests/security/detached-window-cross-origin-access.html [ Timeout ] -Bug(none) http/tests/security/document-all.html [ Failure ] Bug(none) http/tests/security/img-crossorigin-cookies.html [ Failure ] Bug(none) http/tests/security/img-redirect-to-crossorigin-credentials.html [ Failure ] Bug(none) http/tests/security/listener/xss-XMLHttpRequest-addEventListener.html [ Timeout ] -Bug(none) http/tests/security/local-video-source-from-remote.html [ Timeout ] -Bug(none) http/tests/security/location-change-from-detached-DOMWindow.html [ Timeout ] -Bug(none) http/tests/security/media-element-audio-source-node-cross-origin-allowed.html [ Timeout ] -Bug(none) http/tests/security/media-element-audio-source-node-cross-origin-with-credentials.html [ Failure Timeout ] Bug(none) http/tests/security/media-element-audio-source-node-cross-origin.html [ Failure Pass Timeout ] Bug(none) http/tests/security/media-element-audio-source-node-same-origin.html [ Failure Pass ] Bug(none) http/tests/security/mime-type-execute-as-html-01.html [ Failure ] Bug(none) http/tests/security/mime-type-execute-as-html-04.html [ Failure ] -Bug(none) http/tests/security/mixedContent/about-blank-iframe-in-main-frame.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/active-subresource-in-http-iframe-not-blocked.https.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/active-subresource-in-iframe-blocked.https.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/data-url-iframe-in-main-frame.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/data-url-script-in-data-iframe.https.html [ Timeout ] Bug(none) http/tests/security/mixedContent/filesystem-url-in-iframe.html [ Failure Timeout ] -Bug(none) http/tests/security/mixedContent/insecure-async-post-xhr-blocked.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/insecure-audio-video-in-main-frame.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/insecure-css-image-with-reload.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/insecure-css-in-iframe.html [ Failure ] -Bug(none) http/tests/security/mixedContent/insecure-css-in-main-frame.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/insecure-css-resources.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/insecure-empty-srcset-in-main-frame-blocked.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/insecure-eventsource-in-main-frame.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/insecure-fetch-blocked.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/insecure-font-in-main-frame.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/insecure-formSubmission-in-invisible-DOM.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/insecure-formSubmission-in-main-frame-allowed.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/insecure-formSubmission-in-main-frame-blocked.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/insecure-formSubmission-in-main-frame-javascript-allowed.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/insecure-formSubmission-in-main-frame.html [ Timeout ] Bug(none) http/tests/security/mixedContent/insecure-frame-in-data-iframe-in-main-frame-blocked.html [ Failure Timeout ] Bug(none) http/tests/security/mixedContent/insecure-iframe-in-iframe.html [ Failure ] Bug(none) http/tests/security/mixedContent/insecure-iframe-in-main-frame-allowed.html [ Failure Timeout ] Bug(none) http/tests/security/mixedContent/insecure-iframe-in-main-frame-blocked.html [ Failure Timeout ] Bug(none) http/tests/security/mixedContent/insecure-iframe-in-main-frame.html [ Failure Timeout ] -Bug(none) http/tests/security/mixedContent/insecure-iframe-with-hsts.https.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/insecure-image-in-iframe.html [ Failure ] -Bug(none) http/tests/security/mixedContent/insecure-image-in-main-frame-allowed.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/insecure-image-in-main-frame-blocked.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/insecure-image-in-main-frame.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/insecure-localhost-allowed.https.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/insecure-picture-in-main-frame-blocked.https.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/insecure-plugin-in-iframe.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/insecure-prefetch-in-main-frame.html [ Failure ] -Bug(none) http/tests/security/mixedContent/insecure-script-in-data-iframe-in-main-frame-blocked.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/insecure-script-in-iframe.html [ Failure ] -Bug(none) http/tests/security/mixedContent/insecure-script-in-main-frame-allowed.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/insecure-script-in-main-frame-blocked.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/insecure-script-through-redirection.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/insecure-srcset-in-main-frame-blocked.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/insecure-sync-post-xhr-allowed.html [ Failure Timeout ] -Bug(none) http/tests/security/mixedContent/insecure-sync-post-xhr-blocked.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/insecure-texttrack-in-main-frame-blocked.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/insecure-xhr-in-main-frame.https.html [ Timeout ] Bug(none) http/tests/security/mixedContent/nonwebby-scheme-in-iframe-allowed.https.html [ Failure Timeout ] -Bug(none) http/tests/security/mixedContent/preload-insecure-image-in-main-frame-blocked.html [ Timeout ] Bug(none) http/tests/security/mixedContent/redirect-http-to-https-iframe-in-main-frame.html [ Failure Timeout ] -Bug(none) http/tests/security/mixedContent/redirect-http-to-https-script-in-iframe.html [ Failure ] Bug(none) http/tests/security/mixedContent/redirect-https-to-http-iframe-in-main-frame.html [ Failure Timeout ] -Bug(none) http/tests/security/mixedContent/redirect-https-to-http-script-in-iframe.html [ Failure ] -Bug(none) http/tests/security/mixedContent/strict-mode-image-blocked.https.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/strict-mode-image-in-frame-blocked.https.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/strict-mode-image-no-policy.https.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/strict-mode-image-reportonly.https.php [ Timeout ] -Bug(none) http/tests/security/mixedContent/strict-mode-via-pref-image-blocked.https.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/strict-mode-websocket-blocked.https.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/websocket/insecure-websocket-in-sandbox-in-secure-page.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/websocket/insecure-websocket-in-secure-page-allowed.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/websocket/insecure-websocket-in-secure-page-worker-allowed.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/websocket/insecure-websocket-in-secure-page-worker.html [ Timeout ] -Bug(none) http/tests/security/mixedContent/websocket/insecure-websocket-in-secure-page.html [ Timeout ] -Bug(none) http/tests/security/no-indexeddb-from-sandbox.html [ Failure ] -Bug(none) http/tests/security/no-popup-from-sandbox-top.html [ Failure ] -Bug(none) http/tests/security/no-popup-from-sandbox.html [ Failure ] Bug(none) http/tests/security/no-referrer.html [ Timeout ] Bug(none) http/tests/security/offscreen-canvas-worker-read-blocked-by-setting.html [ Crash Pass Timeout ] -Bug(none) http/tests/security/opened-document-security-origin-resets-on-navigation.html [ Timeout ] -Bug(none) http/tests/security/originHeader/origin-header-for-https.html [ Timeout ] -Bug(none) http/tests/security/popup-allowed-by-sandbox-can-navigate.html [ Failure ] -Bug(none) http/tests/security/popup-allowed-by-sandbox-is-sandboxed-control.html [ Failure ] -Bug(none) http/tests/security/popup-allowed-by-sandbox-is-sandboxed.html [ Failure ] -Bug(none) http/tests/security/popup-allowed-by-sandbox-when-allowed.html [ Failure ] -Bug(none) http/tests/security/powerfulFeatureRestrictions/geolocation-on-sandboxed-insecure-origin.html [ Timeout ] -Bug(none) http/tests/security/powerfulFeatureRestrictions/geolocation-on-secure-origin-in-insecure-origin.html [ Timeout ] -Bug(none) http/tests/security/powerfulFeatureRestrictions/geolocation-on-secure-origin-in-secure-origin.html [ Timeout ] -Bug(none) http/tests/security/powerfulFeatureRestrictions/serviceworker-on-insecure-origin.html [ Failure ] -Bug(none) http/tests/security/referrer-on-client-redirect.html [ Timeout ] -Bug(none) http/tests/security/referrer-policy-attribute-anchor-no-referrer-when-downgrade.html [ Timeout ] -Bug(none) http/tests/security/referrer-policy-attribute-area-no-referrer-when-downgrade.html [ Timeout ] -Bug(none) http/tests/security/referrer-policy-attribute-iframe-no-referrer-when-downgrade.html [ Timeout ] -Bug(none) http/tests/security/referrer-policy-attribute-img-no-referrer-when-downgrade.html [ Timeout ] -Bug(none) http/tests/security/referrer-policy-conflicting-policies.html [ Timeout ] -Bug(none) http/tests/security/referrer-policy-https-always.html [ Timeout ] -Bug(none) http/tests/security/referrer-policy-https-default.html [ Timeout ] -Bug(none) http/tests/security/referrer-policy-https-never.html [ Timeout ] -Bug(none) http/tests/security/referrer-policy-https-no-referrer-when-downgrade.html [ Timeout ] -Bug(none) http/tests/security/referrer-policy-https-no-referrer.html [ Timeout ] -Bug(none) http/tests/security/referrer-policy-https-origin-when-crossorigin.html [ Timeout ] -Bug(none) http/tests/security/referrer-policy-https-origin.html [ Timeout ] -Bug(none) http/tests/security/referrer-policy-https-unsafe-url.html [ Timeout ] -Bug(none) http/tests/security/referrer-policy-redirect-link.html [ Timeout ] -Bug(none) http/tests/security/referrer-policy-redirect.html [ Timeout ] -Bug(none) http/tests/security/referrerPolicyHeader/basic-header-cross-origin-with-origin-when-cross-origin.php [ Timeout ] -Bug(none) http/tests/security/referrerPolicyHeader/basic-header-cross-origin-with-origin.php [ Timeout ] -Bug(none) http/tests/security/referrerPolicyHeader/basic-header-downgrade-with-no-referrer-when-downgrade.https.php [ Timeout ] -Bug(none) http/tests/security/referrerPolicyHeader/basic-header-no-downgrade-with-no-referrer-when-downgrade.https.php [ Timeout ] -Bug(none) http/tests/security/referrerPolicyHeader/basic-header-unsafe-url.https.php [ Timeout ] -Bug(none) http/tests/security/referrerPolicyHeader/legacy-always.php [ Timeout ] -Bug(none) http/tests/security/referrerPolicyHeader/legacy-default.php [ Timeout ] -Bug(none) http/tests/security/referrerPolicyHeader/legacy-never.php [ Timeout ] -Bug(none) http/tests/security/referrerPolicyHeader/legacy-origin-when-crossorigin.php [ Timeout ] -Bug(none) http/tests/security/referrerPolicyHeader/referrer-policy-cross-origin-redirect.php [ Timeout ] -Bug(none) http/tests/security/referrerPolicyHeader/referrer-policy-header-on-cross-origin-redirect-response.https.html [ Timeout ] -Bug(none) http/tests/security/sandboxed-opener-can-close-window.html [ Failure ] -Bug(none) http/tests/security/secureContexts/authenticated.html [ Timeout ] -Bug(none) http/tests/security/secureContexts/authenticated_sandbox.html [ Timeout ] -Bug(none) http/tests/security/secureContexts/authenticated_srcdoc.html [ Timeout ] Bug(none) http/tests/security/secureContexts/authenticated_worker.https.html [ Timeout ] -Bug(none) http/tests/security/secureContexts/unauthenticated.html [ Timeout ] -Bug(none) http/tests/security/secureContexts/unauthenticated_sandbox.html [ Timeout ] -Bug(none) http/tests/security/secureContexts/unauthenticated_srcdoc.html [ Timeout ] Bug(none) http/tests/security/secureContexts/unauthenticated_worker.html [ Timeout ] Bug(none) http/tests/security/suborigins/suborigin-cookies.php [ Timeout ] Bug(none) http/tests/security/suborigins/suborigin-service-worker-fetch-event.html [ Crash Failure Timeout ] Bug(none) http/tests/security/suborigins/suborigin-service-worker-no-xorigin-caching.html [ Crash Timeout ] Bug(none) http/tests/security/suborigins/suborigin-unsafe-cookies.php [ Timeout ] -Bug(none) http/tests/security/upgrade-insecure-requests/basic-upgrade.https.html [ Timeout ] -Bug(none) http/tests/security/upgrade-insecure-requests/form-upgrade.html [ Timeout ] -Bug(none) http/tests/security/upgrade-insecure-requests/iframe-upgrade.https.html [ Timeout ] -Bug(none) http/tests/security/upgrade-insecure-requests/sandbox-upgrade.https.php [ Timeout ] -Bug(none) http/tests/security/video-cross-origin-readback.html [ Timeout ] -Bug(none) http/tests/security/video-cross-origin-via-dom.html [ Timeout ] -Bug(none) http/tests/security/webgl-remote-read-remote-image-allowed-with-credentials.html [ Timeout ] -Bug(none) http/tests/security/webgl-remote-read-remote-image-allowed.html [ Timeout ] -Bug(none) http/tests/security/webgl-remote-read-remote-image-blocked-no-crossorigin.html [ Timeout ] -Bug(none) http/tests/security/window-named-proto.html [ Failure ] -Bug(none) http/tests/security/window-named-valueOf.html [ Failure ] -Bug(none) http/tests/security/xss-exception.html [ Timeout ] Bug(none) http/tests/sendbeacon/beacon-cookie.html [ Failure ] Bug(none) http/tests/sendbeacon/beacon-cross-origin.https.html [ Timeout ] Bug(none) http/tests/sendbeacon/beacon-same-origin.html [ Failure ] Bug(none) http/tests/serviceworker [ Crash Failure Timeout ] -Bug(none) http/tests/storage/callbacks-are-called-in-correct-context.html [ Timeout ] -Bug(none) http/tests/usb/secure-context.html [ Timeout ] Bug(none) http/tests/w3c/webperf/submission/Google/resource-timing/html/test_resource_redirects.html [ Failure ] Bug(none) http/tests/webaudio/autoplay-crossorigin.html [ Timeout ] Bug(none) http/tests/webfont/crbug-655076.html [ Timeout ] @@ -1076,206 +809,45 @@ Bug(none) http/tests/websocket/cookie-http-to-ws.pl [ Failure ] Bug(none) http/tests/websocket/fragmented-binary-frames.html [ Failure ] Bug(none) http/tests/websocket/httponly-cookie.pl [ Failure ] -Bug(none) http/tests/workers/shared-worker-secure-context.https.html [ Timeout ] Bug(none) http/tests/workers/text-encoding.html [ Failure ] -Bug(none) http/tests/xmlhttprequest [ Crash Failure Timeout ] -Bug(none) inspector-enabled/console/console-uncaught-promise-no-inspector.html [ Timeout ] +Bug(none) http/tests/xmlhttprequest/access-control-preflight-request-must-not-contain-cookie.html [ Failure ] +Bug(none) http/tests/xmlhttprequest/filename-encoding.html [ Failure ] +Bug(none) http/tests/xmlhttprequest/post-formdata.html [ Failure ] +Bug(none) http/tests/xmlhttprequest/upload-onprogress-event.html [ Failure ] +Bug(none) http/tests/xmlhttprequest/workers/post-formdata.html [ Failure ] +Bug(none) http/tests/xmlhttprequest/workers/upload-onprogress-event.html [ Failure ] +Bug(none) http/tests/xmlhttprequest/xmlhttprequest-data-url.html [ Failure ] +Bug(none) http/tests/xmlhttprequest/upload-onload-event.html [ Timeout ] +Bug(none) http/tests/xmlhttprequest/upload-onloadend-event-after-abort.html [ Timeout ] +Bug(none) http/tests/xmlhttprequest/upload-onloadend-event-after-load.html [ Timeout ] +Bug(none) http/tests/xmlhttprequest/upload-progress-events.html [ Timeout ] +Bug(none) http/tests/xmlhttprequest/workers/shared-worker-response-type-blob-sync.html [ Timeout ] +Bug(none) http/tests/xmlhttprequest/workers/shared-worker-response-type-blob.html [ Timeout ] Bug(none) inspector-protocol/accessibility/accessibility-nameSources-buttons.js [ Timeout ] -Bug(none) inspector-protocol/css/css-get-background-colors.js [ Timeout ] Bug(none) inspector-protocol/css/cssom-modify-rule-and-get-rule-list.js [ Timeout ] Bug(none) inspector-protocol/dom/dom-request-document-with-child-nodes.js [ Failure ] Bug(none) inspector-protocol/heap-profiler/heap-samples-in-snapshot.js [ Failure ] Bug(none) inspector-protocol/heap-profiler/heap-snapshot-with-active-dom-object.js [ Failure ] Bug(none) inspector-protocol/heap-profiler/heap-snapshot-with-detached-dom-tree.js [ Failure ] Bug(none) inspector-protocol/heap-profiler/heap-snapshot-with-event-listener.js [ Failure ] -Bug(none) inspector-protocol/network/resource-type.js [ Timeout ] Bug(none) inspector-protocol/network/websocket-initiator.js [ Timeout ] Bug(none) inspector-protocol/worker/exception-from-worker-contains-stack.js [ Timeout ] Bug(none) inspector-protocol/worker/worker-console.js [ Crash Timeout ] -Bug(none) inspector/agents-enable-disable.html [ Timeout ] -Bug(none) inspector/animation/animation-KeyframeEffectReadOnly-crash.html [ Timeout ] -Bug(none) inspector/animation/animation-group-matching-animations.html [ Timeout ] -Bug(none) inspector/animation/animation-group-matching-transitions.html [ Timeout ] Bug(none) inspector/animation/animation-transition-setTiming-crash.html [ Timeout ] -Bug(none) inspector/audits/audits-empty-stylesheet.html [ Timeout ] -Bug(none) inspector/audits/audits-panel-functional.html [ Timeout ] -Bug(none) inspector/audits/audits-panel-noimages-functional.html [ Timeout ] -Bug(none) inspector/changes/changes-highlighter.html [ Timeout ] -Bug(none) inspector/changes/changes-sidebar.html [ Timeout ] -Bug(none) inspector/components/chunked-file-reader.html [ Failure Timeout ] -Bug(none) inspector/components/dom-extension.html [ Timeout ] -Bug(none) inspector/components/file-path-scoring.html [ Timeout ] -Bug(none) inspector/components/parsed-url.html [ Timeout ] -Bug(none) inspector/components/progress-bar.html [ Timeout ] -Bug(none) inspector/components/segmented-range.html [ Timeout ] -Bug(none) inspector/components/throttler.html [ Failure ] -Bug(none) inspector/console/console-copy-treeoutline.html [ Failure ] -Bug(none) inspector/console/console-export.html [ Failure ] -Bug(none) inspector/console/console-filter-level-test.html [ Failure ] -Bug(none) inspector/console/console-format-collections.html [ Failure ] -Bug(none) inspector/console/console-format-perfomance.html [ Failure ] -Bug(none) inspector/console/console-format-table.html [ Failure ] -Bug(none) inspector/console/console-format.html [ Failure ] -Bug(none) inspector/console/console-functions.html [ Failure ] -Bug(none) inspector/console/console-log-short-hand-method.html [ Failure ] -Bug(none) inspector/console/console-object-constructor-name.html [ Failure ] -Bug(none) inspector/console/console-tests.html [ Failure ] -Bug(none) inspector/console/console-uncaught-promise.html [ Failure Timeout ] -Bug(none) inspector/coverage/coverage-repeated.html [ Failure Timeout ] -Bug(none) inspector/coverage/coverage-view-filter.html [ Failure ] -Bug(none) inspector/coverage/coverage-view.html [ Failure Timeout ] -Bug(none) inspector/coverage/decorations-after-script-formatter.html [ Timeout ] -Bug(none) inspector/coverage/gutter-js.html [ Timeout ] -Bug(none) inspector/coverage/multiple-instances-merge.html [ Timeout Failure ] -Bug(none) inspector/coverage/reveal-autoformat.html [ Timeout ] -Bug(none) inspector/coverage/segments-merge.html [ Timeout ] -Bug(none) inspector/device-mode/device-mode-responsive.html [ Timeout ] -Bug(none) inspector/device-mode/device-mode-switching-devices.html [ Timeout ] -Bug(none) inspector/domdebugger/domdebugger-getEventListeners.html [ Timeout ] -Bug(none) inspector/editor/text-editor-ctrl-d-2.html [ Timeout ] -Bug(none) inspector/editor/text-editor-enter-behaviour.html [ Timeout ] -Bug(none) inspector/editor/text-editor-reveal-line.html [ Timeout ] -Bug(none) inspector/editor/text-editor-selection-to-search.html [ Timeout ] -Bug(none) inspector/editor/text-editor-smart-braces.html [ Timeout ] -Bug(none) inspector/editor/text-editor-token-at-position.html [ Timeout ] -Bug(none) inspector/elements/accessibility/autocomplete-attribute.html [ Timeout ] -Bug(none) inspector/elements/accessibility/edit-aria-attributes.html [ Timeout ] -Bug(none) inspector/elements/attribute-modified-ns.html [ Timeout ] -Bug(none) inspector/elements/bidi-dom-tree.html [ Timeout ] -Bug(none) inspector/elements/dom-search-crash.html [ Timeout ] -Bug(none) inspector/elements/edit/edit-dom-actions-4.html [ Timeout ] -Bug(none) inspector/elements/elements-img-tooltip.html [ Timeout ] -Bug(none) inspector/elements/elements-panel-reload-assert.html [ Timeout ] Bug(none) inspector/elements/elements-panel-restore-selection-when-node-comes-later.html [ Timeout ] -Bug(none) inspector/elements/elements-panel-rewrite-href.html [ Timeout ] -Bug(none) inspector/elements/elements-panel-search.html [ Timeout ] -Bug(none) inspector/elements/elements-panel-selection-on-refresh.html [ Timeout ] -Bug(none) inspector/elements/elements-panel-styles.html [ Timeout ] -Bug(none) inspector/elements/event-listener-sidebar-remove.html [ Timeout ] -Bug(none) inspector/elements/hide-shortcut.html [ Timeout ] -Bug(none) inspector/elements/highlight/highlight-css-shapes-outside-scroll.html [ Timeout ] -Bug(none) inspector/elements/highlight/highlight-dom-updates.html [ Timeout ] -Bug(none) inspector/elements/highlight/highlight-node-transformed.html [ Timeout ] -Bug(none) inspector/elements/highlight/highlight-node.html [ Timeout ] -Bug(none) inspector/elements/highlight/highlight-svg-root-zoomed.html [ Timeout ] -Bug(none) inspector/elements/highlight/highlight-svg-root.html [ Timeout ] -Bug(none) inspector/elements/shadow/breadcrumb-shadow-roots.html [ Timeout ] -Bug(none) inspector/elements/shadow/create-shadow-root.html [ Timeout ] -Bug(none) inspector/elements/shadow/elements-panel-shadow-selection-on-refresh-1.html [ Timeout ] -Bug(none) inspector/elements/shadow/elements-panel-shadow-selection-on-refresh-2.html [ Timeout ] -Bug(none) inspector/elements/shadow/elements-panel-shadow-selection-on-refresh-3.html [ Timeout ] -Bug(none) inspector/elements/shadow/inspect-deep-shadow-element.html [ Timeout ] -Bug(none) inspector/elements/shadow/update-shadowdom.html [ Timeout ] Bug(none) inspector/elements/styles-1/color-aware-property-value-edit.html [ Timeout ] -Bug(none) inspector/elements/styles-1/css-live-edit.html [ Timeout ] -Bug(none) inspector/elements/styles-1/disable-property-workingcopy-update.html [ Timeout ] -Bug(none) inspector/elements/styles-1/edit-media-text.html [ Timeout ] -Bug(none) inspector/elements/styles-1/edit-name-with-trimmed-value.html [ Timeout ] -Bug(none) inspector/elements/styles-1/edit-value-inside-property.html [ Timeout ] -Bug(none) inspector/elements/styles-1/empty-background-url.html [ Failure ] -Bug(none) inspector/elements/styles-2/add-import-rule.html [ Timeout ] -Bug(none) inspector/elements/styles-2/cssom-shorthand-important.html [ Timeout ] -Bug(none) inspector/elements/styles-2/force-pseudo-state.html [ Timeout ] -Bug(none) inspector/elements/styles-2/inactive-properties.html [ Timeout ] -Bug(none) inspector/elements/styles-2/inject-stylesheet.html [ Timeout ] -Bug(none) inspector/elements/styles-2/media-emulation.html [ Timeout ] -Bug(none) inspector/elements/styles-2/mixed-case-color-aware-properties.html [ Timeout ] -Bug(none) inspector/elements/styles-2/page-reload-update-sidebar.html [ Timeout ] -Bug(none) inspector/elements/styles-2/property-ui-location.html [ Timeout Failure ] -Bug(none) inspector/elements/styles-3/style-autocomplete.html [ Timeout ] -Bug(none) inspector/elements/styles-3/styles-add-blank-property.html [ Timeout ] -Bug(none) inspector/elements/styles-3/styles-add-new-rule-colon.html [ Timeout ] -Bug(none) inspector/elements/styles-3/styles-add-new-rule-to-stylesheet.html [ Timeout ] -Bug(none) inspector/elements/styles-3/styles-add-new-rule.html [ Timeout ] -Bug(none) inspector/elements/styles-3/styles-change-node-while-editing.html [ Timeout ] -Bug(none) inspector/elements/styles-3/styles-commit-editing.html [ Timeout ] -Bug(none) inspector/elements/styles-3/styles-disable-inherited.html [ Timeout ] -Bug(none) inspector/elements/styles-3/styles-disable-then-change.html [ Timeout ] -Bug(none) inspector/elements/styles-3/styles-disable-then-enable-overriden-ua.html [ Timeout ] -Bug(none) inspector/elements/styles-3/styles-variables.html [ Timeout ] -Bug(none) inspector/elements/styles-4/styles-formatting.html [ Timeout ] -Bug(none) inspector/elements/styles-4/styles-inline-element-style-changes-should-not-force-style-recalc.html [ Timeout ] -Bug(none) inspector/elements/styles-4/styles-live-locations-leak.html [ Timeout ] -Bug(none) inspector/elements/styles-4/styles-new-API.html [ Timeout ] -Bug(none) inspector/elements/styles-4/styles-properties-overload.html [ Timeout ] -Bug(none) inspector/elements/styles-4/styles-should-not-force-sync-style-recalc.html [ Timeout ] -Bug(none) inspector/elements/styles-4/styles-update-from-js.html [ Timeout ] -Bug(none) inspector/elements/styles-4/styles-update-links-3.html [ Timeout ] -Bug(none) inspector/elements/styles-4/styles-url-linkify.html [ Timeout ] -Bug(none) inspector/elements/styles-4/stylesheet-source-url-comment.html [ Timeout ] -Bug(none) inspector/elements/styles/cancel-upon-invalid-property.html [ Timeout ] -Bug(none) inspector/elements/styles/original-content-provider.html [ Timeout ] -Bug(none) inspector/elements/styles/url-multiple-collapsing.html [ Timeout ] -Bug(none) inspector/file-system-mapping.html [ Timeout ] -Bug(none) inspector/file-system-project.html [ Failure ] -Bug(none) inspector/geolocation-emulation-tests.html [ Timeout ] -Bug(none) inspector/import-open-inspector.html [ Timeout ] -Bug(none) inspector/input-event-warning.html [ Timeout ] -Bug(none) inspector/inspected-objects-not-overriden.html [ Timeout ] -Bug(none) inspector/layers/layer-replay-scale.html [ Timeout ] -Bug(none) inspector/layers/layers-3d-view-hit-testing.html [ Timeout ] -Bug(none) inspector/modules-load-elements.html [ Timeout ] -Bug(none) inspector/modules-load-initial.html [ Timeout ] -Bug(none) inspector/modules-load-network.html [ Timeout ] -Bug(none) inspector/modules-load-source.html [ Timeout ] -Bug(none) inspector/network/network-cookies-pane.html [ Timeout ] -Bug(none) inspector/network/network-json-parser.html [ Timeout ] -Bug(none) inspector/profiler/cpu-profiler-save-load.html [ Timeout ] -Bug(none) inspector/profiler/heap-snapshot-loader.html [ Timeout ] -Bug(none) inspector/quick-open/command-menu.html [ Timeout ] -Bug(none) inspector/runtime/runtime-es6-setSymbolPropertyValue.html [ Timeout ] -Bug(none) inspector/sass/test-ast-css-1.html [ Timeout ] -Bug(none) inspector/sass/test-ast-diff-1.html [ Timeout ] -Bug(none) inspector/sass/test-ast-editing-1.html [ Timeout ] -Bug(none) inspector/sass/test-ast-scss-3.html [ Timeout ] -Bug(none) inspector/sass/test-ast-scss-6.html [ Timeout ] -Bug(none) inspector/sass/test-edit-remove-property.html [ Timeout ] -Bug(none) inspector/sass/test-edit-toggle-property.html [ Timeout ] -Bug(none) inspector/sass/test-mapping-bad.html [ Timeout ] -Bug(none) inspector/sass/test-mapping-good.html [ Timeout ] -Bug(none) inspector/sass/test-mapping-with-cache-busting-url.html [ Timeout ] -Bug(none) inspector/screen-orientation-override.html [ Timeout ] -Bug(none) inspector/sha1.html [ Timeout ] -Bug(none) inspector/sources/debugger-breakpoints/breakpoint-manager-listeners-count.html [ Failure ] -Bug(none) inspector/sources/debugger-breakpoints/breakpoints-in-anonymous-script-with-two-targets.html [ Timeout ] Bug(none) inspector/sources/debugger-breakpoints/event-listener-breakpoints-xhr.html [ Timeout ] -Bug(none) inspector/sources/debugger-pause/pause-in-inline-script.html [ Timeout ] -Bug(none) inspector/sources/debugger-step/debugger-step-out-document-write.html [ Timeout ] -Bug(none) inspector/sources/debugger-ui/script-snippet-model.html [ Timeout ] -Bug(none) inspector/sources/debugger-ui/watch-expressions-preserve-expansion.html [ Failure ] -Bug(none) inspector/sources/debugger/dynamic-script-tag.html [ Failure ] -Bug(none) inspector/tabbed-pane-closeable-persistence.html [ Timeout ] -Bug(none) inspector/tabbed-pane-max-tab-width-calculation.html [ Timeout ] -Bug(none) inspector/tracing-session-id.html [ Timeout ] -Bug(none) inspector/tracing/console-timeline.html [ Failure ] -Bug(none) inspector/tracing/timeline-network/timeline-network-resource-details.html [ Failure ] -Bug(none) inspector/tracing/timeline-network/timeline-network-resource.html [ Failure ] -Bug(none) inspector/user-agent-setting.html [ Timeout ] -Bug(none) inspector/version-controller.html [ Timeout ] Bug(none) installedapp/getinstalledrelatedapps-empty.html [ Timeout ] Bug(none) installedapp/getinstalledrelatedapps.html [ Timeout ] Bug(none) loader/iframe-src-change-onload-crash.html [ Timeout ] -Bug(none) paint/invalidation/media-audio-no-spurious-repaints.html [ Timeout ] Bug(none) paint/invalidation/svg/relative-sized-image.xhtml [ Failure ] Bug(none) paint/invalidation/svg/scrolling-embedded-svg-file-image-repaint-problem.html [ Failure ] -Bug(none) paint/invalidation/video-mute-repaint.html [ Timeout ] -Bug(none) paint/invalidation/video-paint-invalidation.html [ Timeout ] -Bug(none) paint/invalidation/video-unmute-repaint.html [ Timeout ] Bug(none) payments/payment-request-interface.html [ Failure ] Bug(none) payments/promises-keep-request-alive.html [ Timeout ] -Bug(none) plugins/createScriptableObject-before-start.html [ Failure ] -Bug(none) plugins/focus-change-3-change-blur.html [ Failure ] -Bug(none) plugins/focus-change-4-change-focus-and-blur.html [ Failure ] -Bug(none) plugins/gesture-events-scrolled.html [ Timeout Failure ] -Bug(none) plugins/gesture-events.html [ Timeout ] Bug(none) plugins/iframe-plugin-bgcolor.html [ Timeout ] -Bug(none) plugins/plugin-document-back-forward.html [ Timeout ] -Bug(none) plugins/plugin-initiate-popup-window.html [ Timeout ] Bug(none) presentation/presentation-controller-close-connection.html [ Timeout ] Bug(none) presentation/presentation-controller-connection-closed-by-receiver.html [ Timeout ] Bug(none) presentation/presentation-controller-terminate-connection.html [ Timeout ] -Bug(none) presentation/presentation-navigation-multipleurls.html [ Timeout ] -Bug(none) presentation/presentation-navigation.html [ Timeout ] Bug(none) presentation/presentation-onreceiverconnection.html [ Timeout ] Bug(none) presentation/presentation-receiver-terminate-connection.html [ Timeout ] Bug(none) presentation/presentation-reconnect.html [ Timeout ] @@ -1284,9 +856,6 @@ Bug(none) presentation/presentationconnectionavailableevent-ctor-mock.html [ Timeout ] Bug(none) printing/subframes-percentage-height.html [ Failure ] Bug(none) scrollbars/listbox-scrollbar-combinations.html [ Failure ] -Bug(none) storage/domstorage/events/basic.html [ Failure Timeout ] -Bug(none) tables/mozilla/core/col_widths_fix_autoFixPer.html [ Timeout ] -Bug(none) tables/mozilla_expected_failures/marvin/backgr_fixed-bg.html [ Failure ] Bug(none) traversal/node-iterator-009.html [ Failure ] Bug(none) traversal/tree-walker-006.html [ Failure ] Bug(none) virtual [ Crash Failure Timeout ]
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations index ce44765..3b0f24b8 100644 --- a/third_party/WebKit/LayoutTests/TestExpectations +++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -541,7 +541,6 @@ crbug.com/635619 virtual/layout_ng/fast/block/float/floats-wrap-inside-inline-002.htm [ Failure ] crbug.com/635619 virtual/layout_ng/fast/block/float/floats-wrap-inside-inline-003.htm [ Failure ] crbug.com/635619 virtual/layout_ng/fast/block/float/floats-wrap-inside-inline-004.htm [ Failure ] -crbug.com/635619 virtual/layout_ng/fast/block/float/floats-wrap-inside-inline-007.html [ Failure ] crbug.com/635619 virtual/layout_ng/fast/block/float/formatting-context-changes.html [ Failure Crash ] crbug.com/635619 virtual/layout_ng/fast/block/float/independent-align-positioning.html [ Failure ] crbug.com/635619 virtual/layout_ng/fast/block/float/intruding-painted-twice.html [ Failure ] @@ -1757,7 +1756,6 @@ crbug.com/626703 external/wpt/css/css-ui-3/text-overflow-021.html [ Failure ] crbug.com/626703 external/wpt/encoding/eof-utf-8-three.html [ Failure ] crbug.com/626703 external/wpt/encoding/eof-utf-8-two.html [ Failure ] -crbug.com/626703 external/wpt/fetch/api/abort/general.html [ Timeout ] crbug.com/626703 virtual/mojo-blobs/external/wpt/fetch/api/abort/general.html [ Timeout ] crbug.com/626703 virtual/outofblink-cors/external/wpt/fetch/api/abort/general.html [ Timeout ] crbug.com/626703 external/wpt/page-visibility/onvisibilitychange.html [ Timeout ] @@ -1766,7 +1764,7 @@ crbug.com/626703 external/wpt/webrtc/RTCPeerConnection-setLocalDescription-offer.html [ Timeout ] crbug.com/626703 external/wpt/webrtc/RTCPeerConnection-setRemoteDescription-answer.html [ Timeout ] crbug.com/626703 external/wpt/webrtc/RTCPeerConnection-setRemoteDescription-offer.html [ Timeout ] -crbug.com/626703 [ Mac10.10 ] external/wpt/WebCryptoAPI/generateKey/test_successes_RSA-PSS.https.html [ Timeout ] +crbug.com/626703 [ Mac ] external/wpt/WebCryptoAPI/generateKey/test_successes_RSA-PSS.https.html [ Timeout Pass Failure ] crbug.com/626703 external/wpt/webrtc/RTCDtlsTransport-getRemoteCertificates.html [ Timeout ] crbug.com/626703 [ Win10 ] external/wpt/preload/delaying-onload-link-preload-after-discovery.html [ Timeout ] crbug.com/626703 external/wpt/2dcontext/building-paths/canvas_complexshapes_arcto_001.htm [ Failure ] @@ -2120,6 +2118,20 @@ crbug.com/626703 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/update-bytecheck.https.html [ Timeout ] crbug.com/717157 external/wpt/fetch/api/basic/integrity-sharedworker.html [ Crash Timeout Pass ] +# These external tests fail after turning on color correct rendering for canvas +# since they use a non-SRGB source image. +crbug.com/733274 external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_1.html [ Failure ] +crbug.com/733274 external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_2.html [ Failure ] +crbug.com/733274 external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_3.html [ Failure ] +crbug.com/733274 external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_4.html [ Failure ] +crbug.com/733274 external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_5.html [ Failure ] +crbug.com/733274 external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_6.html [ Failure ] +crbug.com/733274 external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_7.html [ Failure ] +crbug.com/733274 external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_8.html [ Failure ] +crbug.com/733274 external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_10.html [ Failure ] +crbug.com/733274 external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_svg_image_1.html [ Failure ] +crbug.com/733274 virtual/display_list_2d_canvas/fast/canvas/canvas-pattern-no-repeat-with-transformations.html [ Failure ] +crbug.com/733274 virtual/display_list_2d_canvas/fast/canvas/image-object-in-canvas.html [ Failure ] crbug.com/666993 external/wpt/html/webappapis/idle-callbacks/basic.html [ Timeout ] crbug.com/666993 external/wpt/html/webappapis/idle-callbacks/callback-idle-periods.html [ Timeout ] @@ -2790,7 +2802,7 @@ crbug.com/713094 [ Win ] fast/css/fontfaceset-check-platform-fonts.html [ Failure Pass ] # Image decode failures due to document destruction. -crbug.com/721435 external/wpt/image-decodes/image-decode-iframe.html [ Skip ] +crbug.com/721435 external/wpt/html/semantics/embedded-content/the-img-element/decode/image-decode-iframe.html [ Skip ] # Sheriff failures 2017-05-22 crbug.com/725542 [ Debug ] editing/selection/doubleclick-beside-cr-span.html [ Pass Timeout ] @@ -2866,18 +2878,9 @@ crbug.com/736177 [ Mac10.12 ] fast/css/h1-in-section-elements.html [ Failure Pass ] crbug.com/736177 [ Mac10.12 ] fast/css/rem-calc-dynamic-scaling.html [ Failure Pass ] crbug.com/736177 [ Mac10.12 ] fast/css/rem-dynamic-scaling.html [ Failure Pass ] -crbug.com/736177 [ Mac10.12 ] fast/css/text-overflow-input.html [ Failure Pass ] crbug.com/736177 [ Mac10.12 ] fast/dom/HTMLMeterElement/meter-optimums.html [ Failure Pass ] crbug.com/736177 [ Mac10.12 ] fast/dynamic/012.html [ Failure Pass ] -crbug.com/736177 [ Mac10.12 ] fast/forms/control-restrict-line-height.html [ Failure Pass ] crbug.com/736177 [ Mac10.12 ] fast/forms/form-element-geometry.html [ Failure Pass ] -crbug.com/736177 [ Mac10.12 ] fast/forms/input-appearance-height.html [ Failure Pass ] -crbug.com/736177 [ Mac10.12 ] fast/forms/placeholder-position.html [ Failure Pass ] -crbug.com/736177 [ Mac10.12 ] fast/forms/search/search-appearance-basic.html [ Failure Pass ] -crbug.com/736177 [ Mac10.12 ] fast/forms/search/search-cancel-button-style-sharing.html [ Failure Pass ] -crbug.com/736177 [ Mac10.12 ] fast/forms/search/search-display-none-cancel-button.html [ Failure Pass ] -crbug.com/736177 [ Mac10.12 ] fast/forms/search/search-rtl.html [ Failure Pass ] -crbug.com/736177 [ Mac10.12 ] fast/forms/search/searchfield-heights.html [ Failure Pass ] crbug.com/736177 [ Mac10.12 ] fast/inline/absolute-positioned-inline-in-centred-block.html [ Failure Pass ] crbug.com/736177 [ Mac10.12 ] fast/inline/left-right-center-inline-alignment-in-ltr-and-rtl-blocks.html [ Failure Pass ] crbug.com/736177 [ Mac10.12 ] fast/lists/ordered-list-with-no-ol-tag.html [ Failure Pass ] @@ -2923,6 +2926,59 @@ crbug.com/736177 [ Mac10.12 ] virtual/off-main-thread-fetch/http/tests/misc/acid2-pixel.html [ Failure Pass ] crbug.com/736177 [ Mac10.12 ] virtual/prefer_compositing_to_lcd_text/scrollbars/custom-scrollbar-with-incomplete-style.html [ Failure Pass ] crbug.com/736177 [ Mac10.12 ] virtual/rootlayerscrolls/scrollbars/custom-scrollbar-with-incomplete-style.html [ Failure Pass ] +# These tests are failing on both Mac-10.12 when using an Intel GPU and Mac-10.11.6 when using no GPU +crbug.com/736177 [ Mac ] fast/forms/control-restrict-line-height.html [ Failure Pass ] +crbug.com/736177 [ Mac ] fast/forms/input-appearance-height.html [ Failure Pass ] +crbug.com/736177 [ Mac ] fast/forms/placeholder-position.html [ Failure Pass ] +crbug.com/736177 [ Mac ] fast/forms/search/search-appearance-basic.html [ Failure Pass ] +crbug.com/736177 [ Mac ] fast/forms/search/search-cancel-button-style-sharing.html [ Failure Pass ] +crbug.com/736177 [ Mac ] fast/forms/search/search-display-none-cancel-button.html [ Failure Pass ] +crbug.com/736177 [ Mac ] fast/forms/search/search-rtl.html [ Failure Pass ] +crbug.com/736177 [ Mac ] fast/forms/search/searchfield-heights.html [ Failure Pass ] +# These tests are failing on Mac-10.12 when using an Intel GPU and Mac Retina +crbug.com/736177 [ Mac10.12 Retina ] compositing/overflow/theme-affects-visual-overflow.html [ Failure Pass ] +crbug.com/736177 [ Mac10.12 Retina ] css1/box_properties/acid_test.html [ Failure Pass ] +crbug.com/736177 [ Mac10.12 Retina ] css2.1/t09-c5526c-display-00-e.html [ Failure Pass ] +crbug.com/736177 [ Mac10.12 Retina ] css3/selectors3/html/css3-modsel-25.html [ Failure Pass ] +crbug.com/736177 [ Mac10.12 Retina ] css3/selectors3/html/css3-modsel-70.html [ Failure Pass ] +crbug.com/736177 [ Mac10.12 Retina ] css3/selectors3/xhtml/css3-modsel-25.xml [ Failure Pass ] +crbug.com/736177 [ Mac10.12 Retina ] css3/selectors3/xhtml/css3-modsel-70.xml [ Failure Pass ] +crbug.com/736177 [ Mac10.12 Retina ] css3/selectors3/xml/css3-modsel-25.xml [ Failure Pass ] +crbug.com/736177 [ Mac10.12 Retina ] css3/selectors3/xml/css3-modsel-70.xml [ Failure Pass ] +crbug.com/736177 [ Mac10.12 Retina ] fast/block/basic/011.html [ Failure Pass ] +crbug.com/736177 [ Mac10.12 Retina ] fast/block/margin-collapse/103.html [ Failure Pass ] +crbug.com/736177 [ Mac10.12 Retina ] fast/css/non-standard-checkbox-size.html [ Failure Pass ] +crbug.com/736177 [ Mac10.12 Retina ] fast/forms/001.html [ Failure Pass ] +crbug.com/736177 [ Mac10.12 Retina ] fast/forms/basic-inputs.html [ Failure Pass ] +crbug.com/736177 [ Mac10.12 Retina ] fast/forms/checkbox/checkbox-appearance-basic.html [ Failure Pass ] +crbug.com/736177 [ Mac10.12 Retina ] fast/forms/file/file-input-disabled.html [ Failure Pass ] +crbug.com/736177 [ Mac10.12 Retina ] fast/forms/formmove.html [ Failure Pass ] +crbug.com/736177 [ Mac10.12 Retina ] fast/forms/formmove2.html [ Failure Pass ] +crbug.com/736177 [ Mac10.12 Retina ] fast/forms/indeterminate.html [ Failure Pass ] +crbug.com/736177 [ Mac10.12 Retina ] fast/forms/input-value.html [ Failure Pass ] +crbug.com/736177 [ Mac10.12 Retina ] fast/forms/radio/radio-appearance-basic.html [ Failure Pass ] +crbug.com/736177 [ Mac10.12 Retina ] fast/inline/positionedLifetime.html [ Failure Pass ] +crbug.com/736177 [ Mac10.12 Retina ] fast/parser/bad-xml-slash.html [ Failure Pass ] +crbug.com/736177 [ Mac10.12 Retina ] fast/replaced/replaced-breaking.html [ Failure Pass ] +crbug.com/736177 [ Mac10.12 Retina ] fast/text/textIteratorNilRenderer.html [ Failure Pass ] +crbug.com/736177 [ Mac10.12 Retina ] fast/text/whitespace/normal-after-nowrap-breaking.html [ Failure Pass ] +crbug.com/736177 [ Mac10.12 Retina ] paint/invalidation/forms/checkbox-focus-by-mouse-then-keydown.html [ Failure Pass ] +crbug.com/736177 [ Mac10.12 Retina ] paint/invalidation/forms/radio-focus-by-mouse-then-keydown.html [ Failure Pass ] +crbug.com/736177 [ Mac10.12 Retina ] tables/mozilla/bugs/bug1318.html [ Failure Pass ] +crbug.com/736177 [ Mac10.12 Retina ] tables/mozilla/bugs/bug4527.html [ Failure Pass ] +crbug.com/736177 [ Mac10.12 Retina ] tables/mozilla_expected_failures/core/captions1.html [ Failure Pass ] +crbug.com/736177 [ Mac10.12 Retina ] tables/mozilla_expected_failures/core/captions2.html [ Failure Pass ] +crbug.com/736177 [ Mac10.12 Retina ] virtual/mojo-loading/css1/box_properties/acid_test.html [ Failure Pass ] +crbug.com/736177 [ Mac10.12 Retina ] virtual/prefer_compositing_to_lcd_text/compositing/overflow/theme-affects-visual-overflow.html [ Failure Pass ] +crbug.com/736177 [ Mac10.12 Retina ] virtual/scalefactor200/fast/hidpi/static/validation-bubble-appearance-hidpi.html [ Failure Pass ] +# These tests are failing on Mac-10.9.5 when using no GPU +crbug.com/736177 [ Mac10.9 ] editing/selection/modify_move/move_left_right_character_in_mixed_bidi.html [ Skip ] +crbug.com/736177 [ Mac10.9 ] external/wpt/css/css-writing-modes-3/bidi-isolate-override-007.html [ Skip ] +crbug.com/736177 [ Mac10.9 ] fast/text/international/bidi-LDB-2-formatting-characters.html [ Skip ] +crbug.com/736177 [ Mac10.9 ] fast/text/international/bidi-neutral-run.html [ Skip ] +crbug.com/736177 [ Mac10.9 ] inspector/elements/bidi-dom-tree.html [ Skip ] +# fast/css/text-overflow-input.html test is flaky on all Mac platforms +crbug.com/736177 [ Mac ] fast/css/text-overflow-input.html [ Failure Pass ] crbug.com/736177 [ Mac ] svg/as-border-image/svg-as-border-image.html [ Failure Pass ] @@ -2945,9 +3001,6 @@ # module script lacks XHTML support crbug.com/717643 external/wpt/html/semantics/scripting-1/the-script-element/module/module-in-xhtml.xhtml [ Failure ] -# Skia rebaseline -skbug.com/6931 [ Linux ] fast/text/sub-pixel/text-scaling-pixel.html [ NeedsManualRebaseline ] - # Geolocation tests crbug.com/745079 external/wpt/geolocation-API/PositionOptions.https.html [ Failure ] @@ -2965,7 +3018,7 @@ crbug.com/746128 [ Win7 Debug ] virtual/new-remote-playback-pipeline/media/controls/video-enter-exit-fullscreen-without-hovering-doesnt-show-controls.html [ Failure ] crbug.com/746128 [ Win7 Debug ] virtual/new-remote-playback-pipeline/media/controls/controls-video-keynav.html [ Failure ] -crbug.com/626703 [ Win7 ] external/wpt/image-decodes/image-decode-path-changes.html [ Pass Crash ] +crbug.com/626703 [ Win7 ] external/wpt/html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes.html [ Crash Pass ] # Sheriff failures 2017-07-20 crbug.com/747163 [ Linux ] imagecapture/MediaStreamTrack-applyConstraints.html [ Pass Crash ] @@ -2990,6 +3043,7 @@ # Sheriff failure 2017-08-11 crbug.com/754657 http/tests/media/media-source/mediasource-duration.html [ Pass Failure ] +crbug.com/626703 virtual/outofblink-cors/external/wpt/fetch/api/response/response-cancel-stream.html [ Pass Timeout ] # Ganesh dither changes crbug.com/753462 virtual/gpu/fast/canvas/canvas-text-alignment.html [ NeedsManualRebaseline ] @@ -2997,3 +3051,9 @@ crbug.com/753462 virtual/gpu/fast/canvas/gradient-add-second-start-end-stop.html [ NeedsManualRebaseline ] crbug.com/746904 [ Win ] fast/text/ellipsis-in-relative-inline.html [ Failure Pass ] + +crbug.com/731018 [ Mac ] sensor/accelerometer.html [ Failure Pass Crash ] +crbug.com/731018 [ Mac ] sensor/ambient-light-sensor.html [ Failure Pass Crash ] +crbug.com/731018 [ Mac ] sensor/gyroscope.html [ Failure Pass Crash ] +crbug.com/731018 [ Mac ] sensor/magnetometer.html [ Failure Pass Crash ] +crbug.com/731018 [ Mac ] sensor/orientation-sensor.html [ Failure Pass Crash ]
diff --git a/third_party/WebKit/LayoutTests/W3CImportExpectations b/third_party/WebKit/LayoutTests/W3CImportExpectations index ac4b820..85fce77 100644 --- a/third_party/WebKit/LayoutTests/W3CImportExpectations +++ b/third_party/WebKit/LayoutTests/W3CImportExpectations
@@ -89,7 +89,6 @@ external/wpt/css/css-conditional-3 [ Skip ] external/wpt/css/css-counter-styles-3 [ Skip ] external/wpt/css/css-exclusions-1 [ Skip ] -external/wpt/css/css-fonts-3 [ Skip ] external/wpt/css/css-gcpm-3 [ Skip ] external/wpt/css/css-images-3 [ Skip ] external/wpt/css/css-lists-3 [ Skip ]
diff --git a/third_party/WebKit/LayoutTests/editing/execCommand/insert-list-empty-div-expected.txt b/third_party/WebKit/LayoutTests/editing/execCommand/insert-list-empty-div-expected.txt deleted file mode 100644 index d07245c..0000000 --- a/third_party/WebKit/LayoutTests/editing/execCommand/insert-list-empty-div-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -| <ul> -| <li> -| <#selection-caret> -| <br>
diff --git a/third_party/WebKit/LayoutTests/editing/execCommand/insert-list-empty-div.html b/third_party/WebKit/LayoutTests/editing/execCommand/insert-list-empty-div.html deleted file mode 100644 index 8c46ce9..0000000 --- a/third_party/WebKit/LayoutTests/editing/execCommand/insert-list-empty-div.html +++ /dev/null
@@ -1,12 +0,0 @@ -<script src="../../resources/dump-as-markup.js"></script> -<p>This tests InsertList inside an empty div with no placeholder. You should see an empty list item with a caret inside of it.</p> -<div id="div" contenteditable="true"></div> - -<script> -var sel = window.getSelection(); -var div = document.getElementById("div"); -sel.collapse(div, 0); - -document.execCommand("InsertUnorderedList"); -Markup.dump("div"); -</script>
diff --git a/third_party/WebKit/LayoutTests/editing/execCommand/insert_list_empty_div.html b/third_party/WebKit/LayoutTests/editing/execCommand/insert_list_empty_div.html new file mode 100644 index 0000000..834980c6 --- /dev/null +++ b/third_party/WebKit/LayoutTests/editing/execCommand/insert_list_empty_div.html
@@ -0,0 +1,15 @@ +<!doctype html> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="../assert_selection.js"></script> +<script> +test(() => assert_selection( + '<div contenteditable>|</div>', + 'InsertUnorderedList', + [ + '<div contenteditable>', + '<ul><li>|<br></li></ul>', + '</div>' + ]), + 'This tests InsertList inside an empty div with no placeholder'); +</script>
diff --git a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json index 91ccd6c..0c906de5 100644 --- a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json +++ b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
@@ -4845,6 +4845,54 @@ {} ] ], + "compat/webkit-linear-gradient-line-bottom.html": [ + [ + "/compat/webkit-linear-gradient-line-bottom.html", + [ + [ + "/compat/green-ref.html", + "==" + ] + ], + {} + ] + ], + "compat/webkit-linear-gradient-line-left.html": [ + [ + "/compat/webkit-linear-gradient-line-left.html", + [ + [ + "/compat/green-ref.html", + "==" + ] + ], + {} + ] + ], + "compat/webkit-linear-gradient-line-right.html": [ + [ + "/compat/webkit-linear-gradient-line-right.html", + [ + [ + "/compat/green-ref.html", + "==" + ] + ], + {} + ] + ], + "compat/webkit-linear-gradient-line-top.html": [ + [ + "/compat/webkit-linear-gradient-line-top.html", + [ + [ + "/compat/green-ref.html", + "==" + ] + ], + {} + ] + ], "compat/webkit-text-fill-color-property-001a.html": [ [ "/compat/webkit-text-fill-color-property-001a.html", @@ -68073,6 +68121,11 @@ {} ] ], + "compat/green-ref.html": [ + [ + {} + ] + ], "compat/webkit-text-fill-color-property-001-ref.html": [ [ {} @@ -79153,6 +79206,11 @@ {} ] ], + "css/css-transforms-2/animation/resources/interpolation-testcommon.js": [ + [ + {} + ] + ], "css/css-transforms-2/css-rotate-2d-3d-001-ref.html": [ [ {} @@ -83713,6 +83771,11 @@ {} ] ], + "css/motion-1/animation/resources/interpolation-testcommon.js": [ + [ + {} + ] + ], "css/motion-1/offset-path-ray-ref.html": [ [ {} @@ -86388,6 +86451,11 @@ {} ] ], + "editing/data/insert-list-items-in-table-cells.js": [ + [ + {} + ] + ], "editing/data/inserthorizontalrule.js": [ [ {} @@ -87848,7 +87916,17 @@ {} ] ], - "fetch/api/abort/general.js": [ + "fetch/api/abort/general-sharedworker-expected.txt": [ + [ + {} + ] + ], + "fetch/api/abort/general.any-expected.txt": [ + [ + {} + ] + ], + "fetch/api/abort/general.any.worker-expected.txt": [ [ {} ] @@ -88173,6 +88251,11 @@ {} ] ], + "fetch/api/request/request-error.js": [ + [ + {} + ] + ], "fetch/api/request/request-idl-expected.txt": [ [ {} @@ -126320,6 +126403,24 @@ {} ] ], + "css/css-transforms-2/animation/rotate-interpolation.html": [ + [ + "/css/css-transforms-2/animation/rotate-interpolation.html", + {} + ] + ], + "css/css-transforms-2/animation/scale-interpolation.html": [ + [ + "/css/css-transforms-2/animation/scale-interpolation.html", + {} + ] + ], + "css/css-transforms-2/animation/translate-interpolation.html": [ + [ + "/css/css-transforms-2/animation/translate-interpolation.html", + {} + ] + ], "css/css-transforms-2/parsing/rotate-parsing-invalid.html": [ [ "/css/css-transforms-2/parsing/rotate-parsing-invalid.html", @@ -126860,6 +126961,30 @@ {} ] ], + "css/motion-1/animation/offset-anchor-interpolation.html": [ + [ + "/css/motion-1/animation/offset-anchor-interpolation.html", + {} + ] + ], + "css/motion-1/animation/offset-distance-interpolation.html": [ + [ + "/css/motion-1/animation/offset-distance-interpolation.html", + {} + ] + ], + "css/motion-1/animation/offset-position-interpolation.html": [ + [ + "/css/motion-1/animation/offset-position-interpolation.html", + {} + ] + ], + "css/motion-1/animation/offset-rotate-interpolation.html": [ + [ + "/css/motion-1/animation/offset-rotate-interpolation.html", + {} + ] + ], "css/motion-1/parsing/offset-anchor-parsing-invalid.html": [ [ "/css/motion-1/parsing/offset-anchor-parsing-invalid.html", @@ -129878,6 +130003,12 @@ {} ] ], + "editing/run/insert-list-items-in-table-cell.html": [ + [ + "/editing/run/insert-list-items-in-table-cell.html", + {} + ] + ], "editing/run/inserthorizontalrule.html": [ [ "/editing/run/inserthorizontalrule.html", @@ -131798,9 +131929,19 @@ {} ] ], - "fetch/api/abort/general.html": [ + "fetch/api/abort/general-sharedworker.html": [ [ - "/fetch/api/abort/general.html", + "/fetch/api/abort/general-sharedworker.html", + {} + ] + ], + "fetch/api/abort/general.any.js": [ + [ + "/fetch/api/abort/general.any.html", + {} + ], + [ + "/fetch/api/abort/general.any.worker.html", {} ] ], @@ -137284,6 +137425,30 @@ {} ] ], + "html/semantics/embedded-content/the-img-element/decode/image-decode-iframe.html": [ + [ + "/html/semantics/embedded-content/the-img-element/decode/image-decode-iframe.html", + { + "timeout": "long" + } + ] + ], + "html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes.html": [ + [ + "/html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes.html", + { + "timeout": "long" + } + ] + ], + "html/semantics/embedded-content/the-img-element/decode/image-decode.html": [ + [ + "/html/semantics/embedded-content/the-img-element/decode/image-decode.html", + { + "timeout": "long" + } + ] + ], "html/semantics/embedded-content/the-img-element/delay-load-event-detached.html": [ [ "/html/semantics/embedded-content/the-img-element/delay-load-event-detached.html", @@ -141514,30 +141679,6 @@ {} ] ], - "image-decodes/image-decode-iframe.html": [ - [ - "/image-decodes/image-decode-iframe.html", - { - "timeout": "long" - } - ] - ], - "image-decodes/image-decode-path-changes.html": [ - [ - "/image-decodes/image-decode-path-changes.html", - { - "timeout": "long" - } - ] - ], - "image-decodes/image-decode.html": [ - [ - "/image-decodes/image-decode.html", - { - "timeout": "long" - } - ] - ], "imagebitmap-renderingcontext/bitmaprenderer-as-imagesource.html": [ [ "/imagebitmap-renderingcontext/bitmaprenderer-as-imagesource.html", @@ -165638,6 +165779,12 @@ {} ] ], + "wasm/create_multiple_memory.worker.js": [ + [ + "/wasm/create_multiple_memory.worker.html", + {} + ] + ], "wasm/wasm_indexeddb_test.html": [ [ "/wasm/wasm_indexeddb_test.html", @@ -174884,7 +175031,7 @@ "support" ], "./.travis.yml": [ - "250f9bc8512445215c63504d28305b723c4b3385", + "8057d3e8925cb559271139ebbbfc516cad484a6c", "support" ], "./CONTRIBUTING.md": [ @@ -181644,7 +181791,7 @@ "support" ], "WebIDL/current-realm.html": [ - "167c7c1f53ae2bf457f6b3f917f0ef988c585c7c", + "3d9564314c7ce59ce6a29dfa94c35e496e214bf5", "testharness" ], "WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.any.js": [ @@ -181816,7 +181963,7 @@ "support" ], "XMLHttpRequest/access-control-and-redirects.htm": [ - "2b635d3c25e01a971ce2e75efa63ede57194a8b3", + "ff051032814b1242f527970edc58675e3e14fb98", "testharness" ], "XMLHttpRequest/access-control-basic-allow-access-control-origin-header.htm": [ @@ -183180,11 +183327,11 @@ "support" ], "background-fetch/interfaces-expected.txt": [ - "aa898874db8a0e7d1996e5c6edf908e630ad59f1", + "e1917d1f86972afa30445d34ab2666a1b30b7f6c", "support" ], "background-fetch/interfaces-worker.https-expected.txt": [ - "d71d5e37ff9207c0f649048605c608ea4bdf381d", + "c0afe335a3e598594ab8779028b02548687db44e", "support" ], "background-fetch/interfaces-worker.https.html": [ @@ -183200,7 +183347,7 @@ "support" ], "background-fetch/interfaces.worker-expected.txt": [ - "460a2a19f8dffd1763bb3053f62e26b9374becf5", + "6d0f72fd0b1a601f7d29eb2c9f709494d8fbceb1", "support" ], "background-fetch/interfaces.worker.js": [ @@ -183272,7 +183419,7 @@ "support" ], "beacon/headers/header-content-type-expected.txt": [ - "369e5f74f98a790f954289e3786974c2941fb682", + "cfce1555852fb39dee45de50c96d2510d7c99267", "support" ], "beacon/headers/header-content-type.html": [ @@ -183595,6 +183742,26 @@ "80579a1e88af8e60c7446f34446b90bd3e9cf8c7", "support" ], + "compat/green-ref.html": [ + "4b23ea52d785a6dd19785bd4278bf700eb5547f8", + "support" + ], + "compat/webkit-linear-gradient-line-bottom.html": [ + "af59a0aa3b8a195ba7ef401b582be9384a23a388", + "reftest" + ], + "compat/webkit-linear-gradient-line-left.html": [ + "f131166051da9a82ede93f076f15832f61f39234", + "reftest" + ], + "compat/webkit-linear-gradient-line-right.html": [ + "2d87c4a09d77f3171fa91bbf8f2f0b1a412b7d94", + "reftest" + ], + "compat/webkit-linear-gradient-line-top.html": [ + "be7fb91dc6459617c20232cd5333e9b3340f3341", + "reftest" + ], "compat/webkit-text-fill-color-currentColor.html": [ "7512b6ce45b5528ee7b9794c32954e954d736f88", "testharness" @@ -185928,7 +186095,7 @@ "testharness" ], "content-security-policy/securitypolicyviolation/idl-expected.txt": [ - "8a26544297000dbcd2ad096b596bfb2b53e28807", + "375bdc2a72d96d28608acab81a57240d16a300e7", "support" ], "content-security-policy/securitypolicyviolation/idl.html": [ @@ -186596,7 +186763,7 @@ "reftest" ], "css-fonts/variations/font-parse-numeric-stretch-style-weight.html": [ - "421e402060f1418562819bb6efae85a7a1cc8958", + "b9aa593e5fcba0d7af8f66446d473608a7025f1c", "testharness" ], "css-fonts/variations/resources/variabletest_box.ttf": [ @@ -210843,6 +211010,22 @@ "86257012c615c6580cea602a1ee2f8617dcbb336", "support" ], + "css/css-transforms-2/animation/resources/interpolation-testcommon.js": [ + "e53ebd086f11169bf516f4d2e68449290943ba98", + "support" + ], + "css/css-transforms-2/animation/rotate-interpolation.html": [ + "f5b8b30c9bc0789d59b3451789c24009b93dd21f", + "testharness" + ], + "css/css-transforms-2/animation/scale-interpolation.html": [ + "51271e16c98a7a4e6405c28d149e77eb439e670c", + "testharness" + ], + "css/css-transforms-2/animation/translate-interpolation.html": [ + "9a28f675c790c3dec66f655418051a5a7ba52ec7", + "testharness" + ], "css/css-transforms-2/backface-visibility-hidden-001.html": [ "d12cfa3b31b7f98d0ff5693bfde49247d34cb156", "reftest" @@ -220064,7 +220247,7 @@ "testharness" ], "css/geometry-1/interfaces-expected.txt": [ - "d78f1e1c8b781893ad6da9ee8bb2c60448f88066", + "52cba59f4b0eb6de5e3f4bbb42c7b0c4547b7de7", "support" ], "css/geometry-1/interfaces.html": [ @@ -220087,6 +220270,26 @@ "13d88ccf8c2f03db7e1db7f6fc704ba46a06e0e1", "support" ], + "css/motion-1/animation/offset-anchor-interpolation.html": [ + "30eb3ea68aa502d93125d4e54ff15c0a96458cfa", + "testharness" + ], + "css/motion-1/animation/offset-distance-interpolation.html": [ + "f242f67f0d1a1c25a871d4ae949d42f9d1df0027", + "testharness" + ], + "css/motion-1/animation/offset-position-interpolation.html": [ + "6c21c93c0715af758033d7b582f072988b379b15", + "testharness" + ], + "css/motion-1/animation/offset-rotate-interpolation.html": [ + "37c091bd5a59d4853bc9f5c82e157ac3d4f29643", + "testharness" + ], + "css/motion-1/animation/resources/interpolation-testcommon.js": [ + "51a3f4808392b7bcce4f2569256c540a3be817dc", + "support" + ], "css/motion-1/offset-path-ray-ref.html": [ "dfea2bd9cadf9d1b83e95bc2dbffef3539937ff1", "support" @@ -222900,7 +223103,7 @@ "support" ], "cssom-view/scrollIntoView-empty-args.html": [ - "c1bd398158cc935c8c69cb0291c2ef0e0faa6bad", + "57e22136750f54145c37722674389590b7f340b6", "testharness" ], "cssom-view/scrollIntoView-shadow.html": [ @@ -223304,7 +223507,7 @@ "testharness" ], "cssom/interfaces-expected.txt": [ - "5dc9fe830179160590e75ddf075deadc074f0c63", + "a42310bfdde44ca58b0070f39d8d1394e0dbbfab", "support" ], "cssom/interfaces.html": [ @@ -224112,7 +224315,7 @@ "testharness" ], "dom/interfaces-expected.txt": [ - "31cb05f866e726cfe568c3598b29a6eaf8ef29ab", + "077850253a4dbaab9b562bf3f435c192ba3bc223", "support" ], "dom/interfaces.html": [ @@ -225699,6 +225902,10 @@ "821cc4fefcfce96832c1a4547698801b554ae426", "support" ], + "editing/data/insert-list-items-in-table-cells.js": [ + "f6e8969d30a53e42c6adace5bd9598862b92c611", + "support" + ], "editing/data/inserthorizontalrule.js": [ "118414ee839b94b9a747e0dfd2068d728c171db7", "support" @@ -225951,6 +226158,10 @@ "1bed1283ad3b220b2949c0720cba60105c888ec2", "testharness" ], + "editing/run/insert-list-items-in-table-cell.html": [ + "7bb730a43273a9220ef491511acbdd5c91fbc9b7", + "testharness" + ], "editing/run/inserthorizontalrule-expected.txt": [ "6535eed7f208b2eca892bdec4e712c240db6a9f5", "support" @@ -228056,19 +228267,31 @@ "testharness" ], "fetch/api/abort/general-serviceworker.https-expected.txt": [ - "ebd3eaef4e979be418b0694548d8bb5c0b0fcbed", + "cddf57d551be890ab3f27755e15ebedf77874f30", "support" ], "fetch/api/abort/general-serviceworker.https.html": [ - "c7baa6df72fb31f6e5463d1a459c3dbf37d106e2", + "ea0eda077eb4a5a234ad3b97595da16aee178fc9", "testharness" ], - "fetch/api/abort/general.html": [ - "203afd95b91a83943d3d84db5d43bfe4245fa177", + "fetch/api/abort/general-sharedworker-expected.txt": [ + "a46979591ba7c4632cebef4c904a48db5cec41f1", + "support" + ], + "fetch/api/abort/general-sharedworker.html": [ + "96563c4324949b5dece964eaf6df0b25324e8365", "testharness" ], - "fetch/api/abort/general.js": [ - "980a50cf0be82bc7ffb2e7024739173273ae1263", + "fetch/api/abort/general.any-expected.txt": [ + "a46979591ba7c4632cebef4c904a48db5cec41f1", + "support" + ], + "fetch/api/abort/general.any.js": [ + "69e4ceb672265f67535e2cc98f24b1cb47b66b5c", + "testharness" + ], + "fetch/api/abort/general.any.worker-expected.txt": [ + "a46979591ba7c4632cebef4c904a48db5cec41f1", "support" ], "fetch/api/abort/serviceworker-intercepted.https-expected.txt": [ @@ -228728,19 +228951,23 @@ "testharness" ], "fetch/api/request/request-error-expected.txt": [ - "b77223e27d25a075956326f1a1bb4293adda8a83", + "2953657949847b572bc2b030de3ee9f58b3cab98", "support" ], "fetch/api/request/request-error.html": [ - "ff308916884f69b3f4aa8f2017c4d9fe0caf0f00", + "ec4b12f1eca0a0c64c04269f67194cdc90571e0a", "testharness" ], + "fetch/api/request/request-error.js": [ + "ad664c95b0de2ff02c4967cff601d5ed4d8fc2e4", + "support" + ], "fetch/api/request/request-headers.html": [ "0a645876664c428f6ac8d170e991ccf257bb307e", "testharness" ], "fetch/api/request/request-idl-expected.txt": [ - "8ca22265e999443344290f4cdfa2dfb9bc88e7a0", + "1492a19999f400ce9c84780ef4c5025585cf47fc", "support" ], "fetch/api/request/request-idl.html": [ @@ -228920,7 +229147,7 @@ "testharness" ], "fetch/api/response/response-idl-expected.txt": [ - "aedba6ed576b1adae6fba4311c276e8ef45c09aa", + "dbdf2f1d39394760cba0b90b3d0e5609bd53a87b", "support" ], "fetch/api/response/response-idl.html": [ @@ -229336,7 +229563,7 @@ "testharness" ], "fullscreen/interfaces-expected.txt": [ - "b9a34fdf818c6c0fcf06b2a91357fa1963b70066", + "dcf3f5ed6afbeec88d53490c67c9d3d3d71bd4aa", "support" ], "fullscreen/interfaces.html": [ @@ -229496,7 +229723,7 @@ "testharness" ], "hr-time/idlharness-expected.txt": [ - "0e4c8b54fc09dce8b64143477ccb1253cc234f0c", + "9b54045e82c2ae9fedf0612db7dc963b14acdbaa", "support" ], "hr-time/idlharness.html": [ @@ -229516,7 +229743,7 @@ "testharness" ], "hr-time/timeOrigin.html": [ - "3bb4eb8162169e582fea93a7cb1f6257325a0606", + "f07da265bb9d1036589ff116b14ea1370abc4194", "testharness" ], "hr-time/timing-attack.html": [ @@ -229664,7 +229891,7 @@ "manual" ], "html-media-capture/idlharness-expected.txt": [ - "a1fd1490201959a01f00647584a0dd47465d68f7", + "f581be5efe31ddca7a4bb3405c18a751dae21fe3", "support" ], "html-media-capture/idlharness.html": [ @@ -229708,7 +229935,7 @@ "testharness" ], "html/browsers/browsing-the-web/history-traversal/PopStateEvent.html": [ - "2a7ed0827fc61af7b3bdd238577887aff1902ea7", + "5a9c575a86adbbbca30734992b4d80c22f3973a1", "testharness" ], "html/browsers/browsing-the-web/history-traversal/browsing_context_name-0.html": [ @@ -233992,7 +234219,7 @@ "support" ], "html/dom/interfaces-expected.txt": [ - "0e0f256e79bf4c71a581dae5071fe1c916c3fa74", + "52d9b50e4d2c14f774cf4e69f746877b9a65824b", "support" ], "html/dom/interfaces.html": [ @@ -234000,7 +234227,7 @@ "testharness" ], "html/dom/interfaces.worker-expected.txt": [ - "259f9df6b1bc2bad20760c591893e5eac739e218", + "fc0cba1f6dfcb7ff77efd101a57f0255d1f217b1", "support" ], "html/dom/interfaces.worker.js": [ @@ -240471,6 +240698,18 @@ "bdbfbe9a5908c6233bd7b9697a0762bd2e0f6ede", "testharness" ], + "html/semantics/embedded-content/the-img-element/decode/image-decode-iframe.html": [ + "2632f69b005ea382ed91bfb71a7e0e2ee931a0c8", + "testharness" + ], + "html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes.html": [ + "64dde3f7b1f9ed02e4433858f075123f18c092a4", + "testharness" + ], + "html/semantics/embedded-content/the-img-element/decode/image-decode.html": [ + "02d38d593fb42587c3ef261c349f7c42db345005", + "testharness" + ], "html/semantics/embedded-content/the-img-element/delay-load-event-detached.html": [ "6845b4a7fd45b083c1c380ad021860654baefc4f", "testharness" @@ -245383,18 +245622,6 @@ "bc4c7a8b5eef0e082a5fa7c8c763957d92730747", "support" ], - "image-decodes/image-decode-iframe.html": [ - "2632f69b005ea382ed91bfb71a7e0e2ee931a0c8", - "testharness" - ], - "image-decodes/image-decode-path-changes.html": [ - "64dde3f7b1f9ed02e4433858f075123f18c092a4", - "testharness" - ], - "image-decodes/image-decode.html": [ - "02d38d593fb42587c3ef261c349f7c42db345005", - "testharness" - ], "imagebitmap-renderingcontext/OWNERS": [ "2df4accfcd4bf31567eaf545e056469356f2529e", "support" @@ -245640,7 +245867,7 @@ "testharness" ], "input-events/input-events-typing-data-manual.html": [ - "f94325d74e69fbd62bfdff3c0f4676a3d2c50d09", + "196d4a35b474ef3ad25a56a22a58cf421555903f", "manual" ], "interfaces/clipboard.idl": [ @@ -245800,7 +246027,7 @@ "testharness" ], "intersection-observer/timestamp.html": [ - "b26e1b4b295722e8def9a2d6870465fe4140873c", + "b9bf8d472d7751ec4a1ebee925d12668bedeee7a", "testharness" ], "intersection-observer/unclipped-root.html": [ @@ -245820,7 +246047,7 @@ "support" ], "keyboard-lock/idlharness.https-expected.txt": [ - "c78b5d669f56d9f602ca93c9e7492a7fee9839b1", + "47d938943455f98a229a6b3b66f81abc35eb6dc0", "support" ], "keyboard-lock/idlharness.https.html": [ @@ -245924,7 +246151,7 @@ "testharness" ], "media-capabilities/idlharness-expected.txt": [ - "63d4a0979b459e2d469d38042908a553016f446d", + "27f2c3b9e1a399f723ac51b9f81401ca66a8a389", "support" ], "media-capabilities/idlharness.html": [ @@ -245988,7 +246215,7 @@ "support" ], "media-source/interfaces-expected.txt": [ - "41a616b5f8c34187c445a473990bfadaecbda8e0", + "40b07412dc1a50737ed9d1887e7ada88d321b39d", "support" ], "media-source/interfaces.html": [ @@ -246544,7 +246771,7 @@ "testharness" ], "mediacapture-fromelement/idlharness-expected.txt": [ - "8a4cd1bf27e02170c3dace68de4bd1723a2f25fa", + "c40a2b1d040d63881489b806dbc05fd69d8b970f", "support" ], "mediacapture-fromelement/idlharness.html": [ @@ -246568,7 +246795,7 @@ "support" ], "mediacapture-record/idlharness-expected.txt": [ - "15c47d282eedba507c099d404e44848b4e4b6e74", + "a81911676e4584e569303a050b4474288836f588", "support" ], "mediacapture-record/idlharness.html": [ @@ -246620,7 +246847,7 @@ "testharness" ], "mediacapture-streams/MediaDevices-IDL-all-expected.txt": [ - "26a244770dd0578e9f9b8f0194e1c6837d926ad8", + "1cdc2218b94bba210533b4b4bc4821691fb7818b", "support" ], "mediacapture-streams/MediaDevices-IDL-all.html": [ @@ -246628,7 +246855,7 @@ "testharness" ], "mediacapture-streams/MediaDevices-IDL-enumerateDevices-expected.txt": [ - "0f2cdc842faac1e6425df74e8029cdea893e15c1", + "4ab4fb05ead702f828be7eb05b144f6ef917437f", "support" ], "mediacapture-streams/MediaDevices-IDL-enumerateDevices.html": [ @@ -246720,7 +246947,7 @@ "testharness" ], "mediacapture-streams/MediaStreamTrack-init.https-expected.txt": [ - "36aea560450ddb3cbeea30e6b8d3d34a55081699", + "13316326e8513f117457b3be5c383e2f01df9c2e", "support" ], "mediacapture-streams/MediaStreamTrack-init.https.html": [ @@ -246744,7 +246971,7 @@ "support" ], "mediasession/idlharness-expected.txt": [ - "5b32854f7c36eb7dcd421de90382bd664c6ac666", + "b10b66066037ac11bcae9dfb437a5d25b167f9ac", "support" ], "mediasession/idlharness.html": [ @@ -254888,7 +255115,7 @@ "manual" ], "orientation-event/idlharness-expected.txt": [ - "0ed66e5c56365883369a9dd2f6f9f318d04e511c", + "8a114868522547b2080271312b1950d57d5da3d9", "support" ], "orientation-event/idlharness.html": [ @@ -254980,7 +255207,7 @@ "support" ], "page-visibility/idlharness-expected.txt": [ - "b029990e4d570e3b511c3837007dae7797cc484e", + "f068bcd6833212e8d040fc3af6f38594e43a0fd0", "support" ], "page-visibility/idlharness.html": [ @@ -255156,11 +255383,11 @@ "testharness" ], "payment-request/interfaces.https-expected.txt": [ - "383ad10aa73720a986fff191e6e639de5fa03b6b", + "3b7338291e1f3b8bb040ac7706c220b26ec0277e", "support" ], "payment-request/interfaces.https.html": [ - "8a171d3a4fb4a384b56caa8648f04451a65007fe", + "e531c0ceda2fa798e5e6df3c7131e6b80f342884", "testharness" ], "payment-request/payment-allowed-by-feature-policy-attribute-redirect-on-load.https.sub.html": [ @@ -255308,7 +255535,7 @@ "testharness" ], "performance-timeline/idlharness-expected.txt": [ - "f4d224a610cb977b6d28c0c9941f14e84b2e55c1", + "9143dd9c7542a602bc42e62da34577b97f99d4c5", "support" ], "performance-timeline/idlharness.html": [ @@ -255700,7 +255927,7 @@ "testharness" ], "pointerlock/idlharness-expected.txt": [ - "2ab8d7035e48deac2307e4fd3ea8846ef4837d8d", + "3c5ec9228841fd321af3f928116b66a1ebcb54f1", "support" ], "pointerlock/idlharness.html": [ @@ -263688,7 +263915,7 @@ "support" ], "resource-timing/idlharness-expected.txt": [ - "3a98bbc74b9ab03914d1f1bd5ee1c6acf55cfa6c", + "87d2343b126a54f9400a0815e2056c1477ce1b1b", "support" ], "resource-timing/idlharness.html": [ @@ -264300,7 +264527,7 @@ "support" ], "server-timing/test_server_timing.html": [ - "3f582e55c8d96a4fb1589ad9bd6e7ca26b75b7a2", + "bd80353850b822d6ee4a6b32ffae0e6e2120c61f", "testharness" ], "server-timing/test_server_timing.html.sub.headers": [ @@ -264976,7 +265203,7 @@ "testharness" ], "service-workers/service-worker/interfaces-sw.https-expected.txt": [ - "752f015a291ab6b0d0353005e6289dcb3fdcd52b", + "e67da250e73a7372d6bb00ec94ccb064d1781032", "support" ], "service-workers/service-worker/interfaces-sw.https.html": [ @@ -264984,7 +265211,7 @@ "testharness" ], "service-workers/service-worker/interfaces-window.https-expected.txt": [ - "7325bc8cf772cce2960c40096ee5acfc81ecf04e", + "5db8d214dc2b46707cedd5ef5082a8e557c8ea69", "support" ], "service-workers/service-worker/interfaces-window.https.html": [ @@ -267924,7 +268151,7 @@ "testharness" ], "svg/interfaces-expected.txt": [ - "b7a7340cd44da47b750faf350a0cd7e5c1b99c70", + "a17e04d6f78002714fc2682972624dc9a3f74b27", "support" ], "svg/interfaces.html": [ @@ -268500,7 +268727,7 @@ "support" ], "url/interfaces.any-expected.txt": [ - "d96f2ae8cf99df1be22793542a8c5d184843e172", + "91b54f60c8f56dbf3e256385b483b3d563f7153f", "support" ], "url/interfaces.any.js": [ @@ -268508,7 +268735,7 @@ "testharness" ], "url/interfaces.any.worker-expected.txt": [ - "d96f2ae8cf99df1be22793542a8c5d184843e172", + "91b54f60c8f56dbf3e256385b483b3d563f7153f", "support" ], "url/setters_tests.json": [ @@ -268847,6 +269074,10 @@ "652193b876206d7a0f361f145469a604d03e3784", "support" ], + "wasm/create_multiple_memory.worker.js": [ + "893d408fc56d030416a3c89ae3680dc028ecf1d7", + "testharness" + ], "wasm/incrementer.wasm": [ "acdf9d22c042ea3b2637c14b1576b4c8ffb4e97a", "support" @@ -269012,7 +269243,7 @@ "testharness" ], "web-animations/interfaces/Animation/idlharness-expected.txt": [ - "98bfa3e93e802537514d3791809cfec523149b73", + "112b0ebc2d142e9f5480eac54e872b2cefe9b711", "support" ], "web-animations/interfaces/Animation/idlharness.html": [ @@ -270388,7 +270619,7 @@ "testharness" ], "webrtc/RTCPeerConnection-idl-expected.txt": [ - "b0a742082027191a583c2982b3245cb18fa3aaad", + "97adb536e084d11fe49f9c0f48d5a5bc7bea4780", "support" ], "webrtc/RTCPeerConnection-idl.html": [ @@ -270668,7 +270899,7 @@ "testharness" ], "webrtc/datachannel-idlharness-expected.txt": [ - "de46e2abe3f943b563dad21be3840eff49284d39", + "70161bca80811ddfbc6349f1b04cb2ad8b4e0f35", "support" ], "webrtc/datachannel-idlharness.html": [ @@ -270700,7 +270931,7 @@ "support" ], "webrtc/interfaces-expected.txt": [ - "24a06be7ff2b7bcbf6bd857dc91f39ec5869206d", + "f2a0a84bec7eae80cc8fe85df244bffdd6d9beb7", "support" ], "webrtc/interfaces.html": [ @@ -271796,7 +272027,7 @@ "support" ], "webstorage/idlharness-expected.txt": [ - "72df62ee24b21ba10b13e605a4374af3c554c59c", + "5f6de914348f8340db088f5c8877e92902227f7f", "support" ], "webstorage/idlharness.html": [ @@ -271956,7 +272187,7 @@ "support" ], "webusb/idlharness.https.html": [ - "0da5e66dd0b0e82d25082733465c22c54a96d1de", + "135ae431cdac90d34b85fe1ea355abaf9a9fb732", "testharness" ], "webusb/resources/fake-devices.js": [ @@ -272188,7 +272419,7 @@ "support" ], "webvtt/api/interfaces-expected.txt": [ - "ddc368a5243a892afd8d14fc2cdb2c7f8a7db3c6", + "0293abe70348da9529ff369121f3e10064bbd88d", "support" ], "webvtt/api/interfaces.html": [ @@ -275076,7 +275307,7 @@ "testharness" ], "workers/Worker_dispatchEvent_ErrorEvent.htm": [ - "a1100df5a79ed7b484a8d5c5746bd646a165242b", + "a27efcba6fcdbb34bb07ac8553a6bbfa04761008", "testharness" ], "workers/Worker_script_mimetype.htm": [ @@ -275348,11 +275579,11 @@ "testharness" ], "workers/data-url.html": [ - "50abaf936cfb58ba14e6870c9b7f239f5d54f59c", + "8f854b63f97beae3d814478946ad86836a5cea0a", "testharness" ], "workers/interfaces.worker-expected.txt": [ - "7b4b27c0bcfab473617d161f21242e06c7a689f6", + "4ae85cb913879ed9b1605223bc476aa763d4450a", "support" ], "workers/interfaces.worker.js": [
diff --git a/third_party/WebKit/LayoutTests/external/wpt/.travis.yml b/third_party/WebKit/LayoutTests/external/wpt/.travis.yml index 27448221..f4469e0 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/.travis.yml +++ b/third_party/WebKit/LayoutTests/external/wpt/.travis.yml
@@ -83,11 +83,8 @@ - env: JOB=build_css SCRIPT=css/build-css-testsuites.sh - env: - secure: "YTSXPwI0DyCA1GhYrLT9KMEV6b7QQKuEeaQgeFDP38OTzJ1+cIj3CC4SRNqbnJ/6SJwPGcdqSxLuV8m4e5HFFnyCcQnJe6h8EMsTehZ7W3j/fP9UYrJqYqvGpe3Vj3xblO5pwBYmq7sg3jAmmuCgAgOW6VGf7cRMucrsmFeo7VM=" - - JOB=stability SCRIPT=tools/ci/ci_stability.sh PRODUCT=chrome:unstable - - env: - - secure: "YTSXPwI0DyCA1GhYrLT9KMEV6b7QQKuEeaQgeFDP38OTzJ1+cIj3CC4SRNqbnJ/6SJwPGcdqSxLuV8m4e5HFFnyCcQnJe6h8EMsTehZ7W3j/fP9UYrJqYqvGpe3Vj3xblO5pwBYmq7sg3jAmmuCgAgOW6VGf7cRMucrsmFeo7VM=" - JOB=stability SCRIPT=tools/ci/ci_stability.sh PRODUCT=sauce:MicrosoftEdge:14.14393 PLATFORM='Windows 10' - env: + - env: - secure: "YTSXPwI0DyCA1GhYrLT9KMEV6b7QQKuEeaQgeFDP38OTzJ1+cIj3CC4SRNqbnJ/6SJwPGcdqSxLuV8m4e5HFFnyCcQnJe6h8EMsTehZ7W3j/fP9UYrJqYqvGpe3Vj3xblO5pwBYmq7sg3jAmmuCgAgOW6VGf7cRMucrsmFeo7VM=" - JOB=stability SCRIPT=tools/ci/ci_stability.sh PRODUCT=sauce:safari:10.0 PLATFORM='macOS 10.12' script:
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/2x2-srgb.png b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/2x2-srgb.png new file mode 100644 index 0000000..9be3156 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/2x2-srgb.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_10_srgb.html b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_10_srgb.html new file mode 100644 index 0000000..0b2a2f698 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_10_srgb.html
@@ -0,0 +1,49 @@ +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<canvas id="dest" height="100" width="100"></canvas> + +<script> +var sourceWidth = 128; +var sourceHeight = 128; +var smoothingEnabled = false; +var destCanvas = document.getElementById('dest'); +var sourceImg = document.createElement('img'); +sourceImg.src = '../2x2-srgb.png' +sourceImg.width = sourceWidth; +sourceImg.height = sourceHeight; +var destCtx = destCanvas.getContext('2d'); + +function checkPixel(x, y, expected, epsilon) { + var actual = destCtx.getImageData(x, y, 1, 1).data; + assert_true(actual.length === expected.length); + for (var i=0; i < actual.length; i++) + assert_approx_equals(actual[i], expected[i], epsilon); +} + +var pixelTests = [ + ['Pixel Top Left Image', 0, 0, [253, 140, 245, 255], 1], + ['Pixel Top Right Image', 0, 99, [253, 140, 245, 255], 1], + ['Pixel Bottom Left Image', 99, 0, [253, 140, 245, 255], 1], + ['Pixel Bottom Right Image', 99, 99, [253, 140, 245, 255], 1], +]; + +function runTest() { + destCtx.fillStyle = "#FF0000"; + destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height); + destCtx.imageSmoothingEnabled = smoothingEnabled; + // The destination rectangle is larger than the destination canvas. + // When the destination rectangle is outside the destination image (the scratch bitmap), + // the pixels that land outside the scratch bitmap are discarded, + // as if the destination was an infinite canvas + // whose rendering was clipped to the dimensions of the scratch bitmap. + destCtx.drawImage(sourceImg, 0, 0, 512, 512, 0, 0, 256, 256); + generate_tests(checkPixel, pixelTests); +} + +async_test(t => { + window.onload = function() { + t.step(runTest); + t.done(); + } +}, 'Draw a 100x100 image to a 100x100 canvas with resize and clipping.'); +</script> \ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_1_srgb.html b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_1_srgb.html new file mode 100644 index 0000000..e2e5a63 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_1_srgb.html
@@ -0,0 +1,46 @@ +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<canvas id="dest" height="100" width="100"></canvas> + +<script> +var sourceWidth = 100; +var sourceHeight = 100; +var smoothingEnabled = false; +var destCanvas = document.getElementById('dest'); +var sourceImg = document.createElement('img'); +sourceImg.src = '../2x2-srgb.png' +sourceImg.width = sourceWidth; +sourceImg.height = sourceHeight; +var destCtx = destCanvas.getContext('2d'); + +function checkPixel(x, y, expected, epsilon) { + var actual = destCtx.getImageData(x, y, 1, 1).data; + assert_true(actual.length === expected.length); + for (var i=0; i < actual.length; i++) + assert_approx_equals(actual[i], expected[i], epsilon); +} + +var pixelTests = [ + ['Pixel Top Left Image', 0, 0, [253, 140, 245, 255], 1], + ['Pixel Top Right Image', 0, 99, [253, 140, 245, 255], 1], + ['Pixel Bottom Left Image', 99, 0, [253, 140, 245, 255], 1], + ['Pixel Bottom Right Image', 99, 99, [253, 140, 245, 255], 1], +]; + +function runTest() { + destCtx.fillStyle = "#FF0000"; + destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height); + destCtx.imageSmoothingEnabled = smoothingEnabled; + // 2 arguments, the dest origin is 0,0 + // The source canvas will copied to the 0,0 position of the destination canvas + destCtx.drawImage(sourceImg, 0, 0); + generate_tests(checkPixel, pixelTests); +} + +async_test(t => { + window.onload = function() { + t.step(runTest); + t.done(); + } +}, 'Draw 100x100 image to 100x100 canvas at 0,0.'); +</script> \ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_2_srgb.html b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_2_srgb.html new file mode 100644 index 0000000..14c78d1 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_2_srgb.html
@@ -0,0 +1,53 @@ +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<canvas id="dest" height="100" width="100"></canvas> + +<script> +var sourceWidth = 100; +var sourceHeight = 100; +var smoothingEnabled = false; +var destCanvas = document.getElementById('dest'); +var sourceImg = document.createElement('img'); +sourceImg.src = '../2x2-srgb.png' +sourceImg.width = sourceWidth; +sourceImg.height = sourceHeight; +var destCtx = destCanvas.getContext('2d'); + +function checkPixel(x, y, expected, epsilon) { + var actual = destCtx.getImageData(x, y, 1, 1).data; + assert_true(actual.length === expected.length); + for (var i=0; i < actual.length; i++) + assert_approx_equals(actual[i], expected[i], epsilon); +} + +var pixelTests = [ + ['Pixel Top Left Canvas Background', 0, 0, [255, 0, 0, 255], 1], + ['Pixel Middle Middle Canvas Background', 24, 24, [255, 0, 0, 255], 1], + ['Pixel Top Middle Canvas Background', 0, 25, [255, 0, 0, 255], 1], + ['Pixel Middle Left Canvas Background', 25, 0, [255, 0, 0, 255], 1], + ['Pixel Top Right Canvas Background', 0, 99, [255, 0, 0, 255], 1], + ['Pixel Bottom Left Canvas Background', 99, 0, [255, 0, 0, 255], 1], + + ['Pixel Top Left Image', 25, 25, [253, 140, 245, 255], 1], + ['Pixel Top Right Image', 25, 99, [253, 140, 245, 255], 1], + ['Pixel Bottom Left Image', 99, 25, [253, 140, 245, 255], 1], + ['Pixel Bottom Right Image', 99, 99, [253, 140, 245, 255], 1], +]; + +function runTest() { + destCtx.fillStyle = "#FF0000"; + destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height); + destCtx.imageSmoothingEnabled = smoothingEnabled; + // 2 arguments, the dest origin is not 0,0 + // The source canvas will copied to the 25,25 position of the destination canvas + destCtx.drawImage(sourceImg, 25, 25); + generate_tests(checkPixel, pixelTests); +} + +async_test(t => { + window.onload = function() { + t.step(runTest); + t.done(); + } +}, 'Draw 100x100 image to 100x100 canvas at 25,25.'); +</script> \ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_3_srgb.html b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_3_srgb.html new file mode 100644 index 0000000..0e2c378 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_3_srgb.html
@@ -0,0 +1,54 @@ +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<canvas id="dest" height="100" width="100"></canvas> + +<script> +var sourceWidth = 100; +var sourceHeight = 100; +var smoothingEnabled = false; +var destCanvas = document.getElementById('dest'); +var sourceImg = document.createElement('img'); +sourceImg.src = '../2x2-srgb.png' +sourceImg.width = sourceWidth; +sourceImg.height = sourceHeight; +var destCtx = destCanvas.getContext('2d'); + +function checkPixel(x, y, expected, epsilon) { + var actual = destCtx.getImageData(x, y, 1, 1).data; + assert_true(actual.length === expected.length); + for (var i=0; i < actual.length; i++) + assert_approx_equals(actual[i], expected[i], epsilon); +} + +var pixelTests = [ + ['Pixel Top Left Canvas Background', 0, 0, [255, 0, 0, 255], 1], + ['Pixel Middle Middle Canvas Background', 49, 49, [255, 0, 0, 255], 1], + ['Pixel Top Middle Canvas Background', 0, 50, [255, 0, 0, 255], 1], + ['Pixel Middle Left Canvas Background', 50, 0, [255, 0, 0, 255], 1], + ['Pixel Top Right Canvas Background', 0, 99, [255, 0, 0, 255], 1], + ['Pixel Bottom Left Canvas Background', 99, 0, [255, 0, 0, 255], 1], + + ['Pixel Top Left Image', 50, 50, [253, 140, 245, 255], 1], + ['Pixel Top Right Image', 50, 99, [41, 122, 115, 255], 1], + ['Pixel Bottom Left Image', 99, 50, [41, 122, 115, 255], 1], + ['Pixel Bottom Right Image', 99, 99, [253, 140, 245, 255], 1], +]; + +function runTest() { + destCtx.fillStyle = "#FF0000"; + destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height); + destCtx.imageSmoothingEnabled = smoothingEnabled; + // 4 arguments, the source origin is not 0,0, the dest size is provided + // The source canvas will copied to the 50, 50 position of the destination canvas and + // on an area of 50x50 pixels + destCtx.drawImage(sourceImg, 50, 50, 50, 50); + generate_tests(checkPixel, pixelTests); +} + +async_test(t => { + window.onload = function() { + t.step(runTest); + t.done(); + } +}, 'Draw 100x100 image to 100x100 canvas at 50,50 with resize to 50x50.'); +</script> \ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_4_srgb.html b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_4_srgb.html new file mode 100644 index 0000000..97b671f9 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_4_srgb.html
@@ -0,0 +1,58 @@ +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<canvas id="dest" height="100" width="100"></canvas> + +<script> +var sourceWidth = 100; +var sourceHeight = 100; +var smoothingEnabled = false; +var destCanvas = document.getElementById('dest'); +var sourceImg = document.createElement('img'); +sourceImg.src = '../2x2-srgb.png' +sourceImg.width = sourceWidth; +sourceImg.height = sourceHeight; +var destCtx = destCanvas.getContext('2d'); + +function checkPixel(x, y, expected, epsilon) { + var actual = destCtx.getImageData(x, y, 1, 1).data; + assert_true(actual.length === expected.length); + for (var i=0; i < actual.length; i++) + assert_approx_equals(actual[i], expected[i], epsilon); +} + +var pixelTests = [ + ['Pixel Top Left Canvas Background', 0, 0, [255, 0, 0, 255], 1], + ['Pixel Top Right Canvas Background', 0, 99, [255, 0, 0, 255], 1], + ['Pixel Bottom Left Canvas Background', 99, 0, [255, 0, 0, 255], 1], + ['Pixel Bottom Right Canvas Background', 99, 99, [255, 0, 0, 255], 1], + + ['Pixel Surrounding Top Left Canvas Background', 49, 49, [255, 0, 0, 255], 1], + ['Pixel Surrounding Top Right Canvas Background', 49, 66, [255, 0, 0, 255], 1], + ['Pixel Surrounding Bottom Left Canvas Background', 66, 49, [255, 0, 0, 255], 1], + ['Pixel Surrounding Bottom Right Canvas Background', 66, 66, [255, 0, 0, 255], 1], + + ['Pixel Top Left Image', 50, 50, [253, 140, 245, 255], 1], + ['Pixel Top Right Image', 50, 65, [41, 122, 115, 255], 1], + ['Pixel Bottom Left Image', 65, 50, [41, 122, 115, 255], 1], + ['Pixel Bottom Right Image', 65, 65, [253, 140, 245, 255], 1], +]; + +function runTest() { + destCtx.fillStyle = "#FF0000"; + destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height); + destCtx.imageSmoothingEnabled = smoothingEnabled; + // 4 arguments, the dest origin is not 0,0 and the dest size is provided but + // does not match the size of the source. The image will be distorted + // The source canvas will copied to the 50,50 position of the destination canvas + // and it will be shrunk to a and area of 16x16 + destCtx.drawImage(sourceImg, 50, 50, 16, 16); + generate_tests(checkPixel, pixelTests); +} + +async_test(t => { + window.onload = function() { + t.step(runTest); + t.done(); + } +}, 'Draw 100x100 image to 100x100 canvas at 50,50 with resize to 16x16.'); +</script> \ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_5_srgb.html b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_5_srgb.html new file mode 100644 index 0000000..3f3242b --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_5_srgb.html
@@ -0,0 +1,57 @@ +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<canvas id="dest" height="100" width="100"></canvas> + +<script> +var sourceWidth = 100; +var sourceHeight = 100; +var smoothingEnabled = false; +var destCanvas = document.getElementById('dest'); +var sourceImg = document.createElement('img'); +sourceImg.src = '../2x2-srgb.png' +sourceImg.width = sourceWidth; +sourceImg.height = sourceHeight; +var destCtx = destCanvas.getContext('2d'); + +function checkPixel(x, y, expected, epsilon) { + var actual = destCtx.getImageData(x, y, 1, 1).data; + assert_true(actual.length === expected.length); + for (var i=0; i < actual.length; i++) + assert_approx_equals(actual[i], expected[i], epsilon); +} + +var pixelTests = [ + ['Pixel Top Left Canvas Background', 0, 0, [255, 0, 0, 255], 1], + ['Pixel Top Right Canvas Background', 0, 99, [255, 0, 0, 255], 1], + ['Pixel Bottom Left Canvas Background', 99, 0, [255, 0, 0, 255], 1], + ['Pixel Bottom Right Canvas Background', 99, 99, [255, 0, 0, 255], 1], + + ['Pixel Surrounding Top Left Canvas Background', 49, 49, [255, 0, 0, 255], 1], + ['Pixel Surrounding Top Right Canvas Background', 49, 82, [255, 0, 0, 255], 1], + ['Pixel Surrounding Bottom Left Canvas Background', 99, 49, [255, 0, 0, 255], 1], + ['Pixel Surrounding Bottom Right Canvas Background', 99, 82, [255, 0, 0, 255], 1], + + ['Pixel Top Left Image', 50, 50, [253, 140, 245, 255], 1], + ['Pixel Top Right Image', 50, 81, [41, 122, 115, 255], 1], + ['Pixel Bottom Left Image', 99, 50, [41, 122, 115, 255], 1], + ['Pixel Bottom Right Image', 99, 81, [253, 140, 245, 255], 1], +]; + +function runTest() { + destCtx.fillStyle = "#FF0000"; + destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height); + destCtx.imageSmoothingEnabled = smoothingEnabled; + // The source canvas will copied to the 50,50 position of the destination canvas + // over an area of 64x32 pixels + // The copied image will be distorted along the x axis + destCtx.drawImage(sourceImg, 50, 50, 64, 32); + generate_tests(checkPixel, pixelTests); +} + +async_test(t => { + window.onload = function() { + t.step(runTest); + t.done(); + } +}, 'Draw 100x100 image to 100x100 canvas at 50,50 with resize to 64x32.'); +</script> \ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_6_srgb.html b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_6_srgb.html new file mode 100644 index 0000000..79f9200 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_6_srgb.html
@@ -0,0 +1,55 @@ +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<canvas id="dest" height="100" width="100"></canvas> + +<script> +var sourceWidth = 100; +var sourceHeight = 100; +var smoothingEnabled = false; +var destCanvas = document.getElementById('dest'); +var sourceImg = document.createElement('img'); +sourceImg.src = '../2x2-srgb.png' +sourceImg.width = sourceWidth; +sourceImg.height = sourceHeight; +var destCtx = destCanvas.getContext('2d'); + +function checkPixel(x, y, expected, epsilon) { + var actual = destCtx.getImageData(x, y, 1, 1).data; + assert_true(actual.length === expected.length); + for (var i=0; i < actual.length; i++) + assert_approx_equals(actual[i], expected[i], epsilon); +} + +var pixelTests = [ + ['Pixel Top Right Canvas Background', 0, 99, [255, 0, 0, 255], 1], + ['Pixel Bottom Left Canvas Background', 99, 0, [255, 0, 0, 255], 1], + ['Pixel Bottom Right Canvas Background', 99, 99, [255, 0, 0, 255], 1], + + ['Pixel Surrounding Top Left Canvas Background', 0, 32, [255, 0, 0, 255], 1], + ['Pixel Surrounding Bottom Left Canvas Background', 32, 0, [255, 0, 0, 255], 1], + ['Pixel Surrounding Orthogonal Canvas Background', 32, 32, [255, 0, 0, 255], 1], + + ['Pixel Top Left Image', 0, 0, [253, 140, 245, 255], 1], + ['Pixel Top Right Image', 0, 31, [253, 140, 245, 255], 1], + ['Pixel Bottom Left Image', 31, 0, [253, 140, 245, 255], 1], + ['Pixel Bottom Right Image', 31, 31, [253, 140, 245, 255], 1], +]; + +function runTest() { + destCtx.fillStyle = "#FF0000"; + destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height); + destCtx.imageSmoothingEnabled = smoothingEnabled; + // 8 arguments, both destination and source origins are 0, 0 + // An area of 32x32 pixels of the source image will be copied to + // an area of 32x32 pixels of the destination canvas + destCtx.drawImage(sourceImg, 0, 0, 32, 32, 0, 0, 32, 32); + generate_tests(checkPixel, pixelTests); +} + +async_test(t => { + window.onload = function() { + t.step(runTest); + t.done(); + } +}, 'Draw a 32x32 area of a 100x100 image to a 32x32 area of a 100x100 canvas at 0,0.'); +</script> \ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_7_srgb.html b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_7_srgb.html new file mode 100644 index 0000000..2214c20 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_7_srgb.html
@@ -0,0 +1,57 @@ +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<canvas id="dest" height="100" width="100"></canvas> + +<script> +var sourceWidth = 100; +var sourceHeight = 100; +var smoothingEnabled = false; +var destCanvas = document.getElementById('dest'); +var sourceImg = document.createElement('img'); +sourceImg.src = '../2x2-srgb.png' +sourceImg.width = sourceWidth; +sourceImg.height = sourceHeight; +var destCtx = destCanvas.getContext('2d'); + +function checkPixel(x, y, expected, epsilon) { + var actual = destCtx.getImageData(x, y, 1, 1).data; + assert_true(actual.length === expected.length); + for (var i=0; i < actual.length; i++) + assert_approx_equals(actual[i], expected[i], epsilon); +} + +var pixelTests = [ + ['Pixel Top Left Canvas Background', 0, 0, [255, 0, 0, 255], 1], + ['Pixel Top Right Canvas Background', 0, 99, [255, 0, 0, 255], 1], + ['Pixel Bottom Left Canvas Background', 99, 0, [255, 0, 0, 255], 1], + ['Pixel Bottom Right Canvas Background', 99, 99, [255, 0, 0, 255], 1], + + ['Pixel Surrounding Top Left Canvas Background', 31, 31, [255, 0, 0, 255], 1], + ['Pixel Surrounding Top Right Canvas Background', 31, 64, [255, 0, 0, 255], 1], + ['Pixel Surrounding Bottom Left Canvas Background', 64, 31, [255, 0, 0, 255], 1], + ['Pixel Surrounding Bottom Right Canvas Background', 64, 64, [255, 0, 0, 255], 1], + + ['Pixel Top Left Image', 32, 32, [253, 140, 245, 255], 1], + ['Pixel Top Right Image', 32, 63, [253, 140, 245, 255], 1], + ['Pixel Bottom Left Image', 63, 32, [253, 140, 245, 255], 1], + ['Pixel Bottom Right Image', 63, 63, [253, 140, 245, 255], 1], +]; + +function runTest() { + destCtx.fillStyle = "#FF0000"; + destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height); + destCtx.imageSmoothingEnabled = smoothingEnabled; + // 8 arguments the destination origin is not 0,0 + // An area of 32x32 pixels of the source image will be copied to + // an area of 32x32 pixels of the destination canvas in the position 32,32 + destCtx.drawImage(sourceImg, 0, 0, 32, 32, 32, 32, 32, 32); + generate_tests(checkPixel, pixelTests); +} + +async_test(t => { + window.onload = function() { + t.step(runTest); + t.done(); + } +}, 'Draw a 32x32 area of a 100x100 image to a 32x32 area of a 100x100 canvas at 32,32.'); +</script> \ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_8_srgb.html b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_8_srgb.html new file mode 100644 index 0000000..1197c4297 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_8_srgb.html
@@ -0,0 +1,55 @@ +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<canvas id="dest" height="100" width="100"></canvas> + +<script> +var sourceWidth = 100; +var sourceHeight = 100; +var smoothingEnabled = false; +var destCanvas = document.getElementById('dest'); +var sourceImg = document.createElement('img'); +sourceImg.src = '../2x2-srgb.png' +sourceImg.width = sourceWidth; +sourceImg.height = sourceHeight; +var destCtx = destCanvas.getContext('2d'); + +function checkPixel(x, y, expected, epsilon) { + var actual = destCtx.getImageData(x, y, 1, 1).data; + assert_true(actual.length === expected.length); + for (var i=0; i < actual.length; i++) + assert_approx_equals(actual[i], expected[i], epsilon); +} + +var pixelTests = [ + ['Pixel Top Right Canvas Background', 0, 99, [255, 0, 0, 255], 1], + ['Pixel Bottom Left Canvas Background', 99, 0, [255, 0, 0, 255], 1], + ['Pixel Bottom Right Canvas Background', 99, 99, [255, 0, 0, 255], 1], + + ['Pixel Surrounding Top Left Canvas Background', 0, 32, [255, 0, 0, 255], 1], + ['Pixel Surrounding Bottom Left Canvas Background', 32, 0, [255, 0, 0, 255], 1], + ['Pixel Surrounding Orthogonal Canvas Background', 32, 32, [255, 0, 0, 255], 1], + + ['Pixel Top Left Image', 0, 0, [253, 140, 245, 255], 1], + ['Pixel Top Right Image', 0, 31, [253, 140, 245, 255], 1], + ['Pixel Bottom Left Image', 31, 0, [253, 140, 245, 255], 1], + ['Pixel Bottom Right Image', 31, 31, [253, 140, 245, 255], 1], +]; + +function runTest() { + destCtx.fillStyle = "#FF0000"; + destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height); + destCtx.imageSmoothingEnabled = smoothingEnabled; + // The source rectangle overflows the source image + // The source area is clipped to fit the source image + // and the destination are is clipped in the same proportion + destCtx.drawImage(sourceImg, 32, 32, 32, 32, 0, 0, 32, 32); + generate_tests(checkPixel, pixelTests); +} + +async_test(t => { + window.onload = function() { + t.step(runTest); + t.done(); + } +}, 'Draw a 32x32 area of a 100x100 image to a 32x32 area of a 100x100 canvas at 32,32 with clipping.'); +</script> \ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_svg_image_1_srgb.html b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_svg_image_1_srgb.html new file mode 100644 index 0000000..fbb614d8 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_svg_image_1_srgb.html
@@ -0,0 +1,46 @@ +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<canvas id="dest" height="100" width="100"></canvas> + +<script> +var sourceWidth = 100; +var sourceHeight = 100; +var smoothingEnabled = false; +var destCanvas = document.getElementById('dest'); +var sourceImg = document.createElementNS('http://www.w3.org/2000/svg', 'image'); +sourceImg.setAttributeNS('http://www.w3.org/1999/xlink', 'href', '../2x2-srgb.png'); +sourceImg.width = sourceWidth; +sourceImg.height = sourceHeight; +var destCtx = destCanvas.getContext('2d'); + +function checkPixel(x, y, expected, epsilon) { + var actual = destCtx.getImageData(x, y, 1, 1).data; + assert_true(actual.length === expected.length); + for (var i=0; i < actual.length; i++) + assert_approx_equals(actual[i], expected[i], epsilon); +} + +var pixelTests = [ + ['Pixel Top Left Image', 0, 0, [253, 140, 245, 255], 1], + ['Pixel Top Right Image', 0, 99, [253, 140, 245, 255], 1], + ['Pixel Bottom Left Image', 99, 0, [253, 140, 245, 255], 1], + ['Pixel Bottom Right Image', 99, 99, [253, 140, 245, 255], 1], +]; + +function runTest() { + destCtx.fillStyle = "#FF0000"; + destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height); + destCtx.imageSmoothingEnabled = smoothingEnabled; + // 2 arguments, the dest origin is 0,0 + // The source canvas will copied to the 0,0 position of the destination canvas + destCtx.drawImage(sourceImg, 0, 0); + generate_tests(checkPixel, pixelTests); +} + +async_test(t => { + window.onload = function() { + t.step(runTest); + t.done(); + } +}, 'Load a 100x100 image to a SVG image and draw it to a 100x100 canvas.'); +</script> \ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/WebIDL/current-realm.html b/third_party/WebKit/LayoutTests/external/wpt/WebIDL/current-realm.html index fd24709b..e015ec5 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/WebIDL/current-realm.html +++ b/third_party/WebKit/LayoutTests/external/wpt/WebIDL/current-realm.html
@@ -110,8 +110,13 @@ test(function() { var c = self[0].document.createElement("canvas"), obj = c.getContext(val) - assert_global(obj) + // WebGL might not be enabled in this environment + if (!obj && val === "webgl") { + return; + } + + assert_global(obj) obj = HTMLCanvasElement.prototype.getContext.call(c, val) assert_global(obj) }, "getContext " + val)
diff --git a/third_party/WebKit/LayoutTests/external/wpt/XMLHttpRequest/access-control-and-redirects.htm b/third_party/WebKit/LayoutTests/external/wpt/XMLHttpRequest/access-control-and-redirects.htm index 10c5e2f5..dcdf4004 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/XMLHttpRequest/access-control-and-redirects.htm +++ b/third_party/WebKit/LayoutTests/external/wpt/XMLHttpRequest/access-control-and-redirects.htm
@@ -16,7 +16,6 @@ assert_equals(xhr.responseText, "PASS: Cross-domain access allowed."); test.done(); } - function runAsync(test, url) { const xhr = new XMLHttpRequest(); @@ -28,7 +27,6 @@ xhr.send(); test.done(); } - test(t => { runSync(t, "resources/redirect-cors.py?location=" + get_host_info().HTTP_REMOTE_ORIGIN + "/XMLHttpRequest/resources/access-control-basic-allow.py") @@ -37,7 +35,6 @@ runAsync(t, "resources/redirect-cors.py?location=" + get_host_info().HTTP_REMOTE_ORIGIN + "/XMLHttpRequest/resources/access-control-basic-allow.py") }, "Local async redirect to remote origin"); - test(t => { runSync(t, get_host_info().HTTP_REMOTE_ORIGIN + "/XMLHttpRequest/resources/redirect-cors.py?location=" + get_host_info().HTTP_ORIGIN + @@ -48,7 +45,6 @@ "/XMLHttpRequest/resources/redirect-cors.py?location=" + get_host_info().HTTP_ORIGIN + "/XMLHttpRequest/resources/access-control-basic-allow.py&allow_origin=true") }, "Remote async redirect to local origin"); - test(t => { runSync(t, get_host_info().HTTP_REMOTE_ORIGIN + "/XMLHttpRequest/resources/redirect-cors.py?location=" + get_host_info().HTTP_REMOTE_ORIGIN +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces-expected.txt index 74040ad..681ed9db 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces-expected.txt
@@ -7,7 +7,7 @@ PASS BackgroundFetchManager interface object name PASS BackgroundFetchManager interface: existence and properties of interface prototype object PASS BackgroundFetchManager interface: existence and properties of interface prototype object's "constructor" property -PASS BackgroundFetchManager interface: operation fetch(DOMString,[object Object],[object Object],BackgroundFetchOptions) +PASS BackgroundFetchManager interface: operation fetch(DOMString, [object Object],[object Object], BackgroundFetchOptions) PASS BackgroundFetchManager interface: operation get(DOMString) PASS BackgroundFetchManager interface: operation getIds() PASS BackgroundFetchRegistration interface: existence and properties of interface object
diff --git a/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces-worker.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces-worker.https-expected.txt index ca4bf05..ad9c0a0 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces-worker.https-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces-worker.https-expected.txt
@@ -11,7 +11,7 @@ PASS BackgroundFetchManager interface object name PASS BackgroundFetchManager interface: existence and properties of interface prototype object PASS BackgroundFetchManager interface: existence and properties of interface prototype object's "constructor" property -PASS BackgroundFetchManager interface: operation fetch(DOMString,[object Object],[object Object],BackgroundFetchOptions) +PASS BackgroundFetchManager interface: operation fetch(DOMString, [object Object],[object Object], BackgroundFetchOptions) PASS BackgroundFetchManager interface: operation get(DOMString) PASS BackgroundFetchManager interface: operation getIds() PASS BackgroundFetchRegistration interface: existence and properties of interface object
diff --git a/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces.worker-expected.txt index 6434ce8..01308ef 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces.worker-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces.worker-expected.txt
@@ -8,7 +8,7 @@ PASS BackgroundFetchManager interface object name PASS BackgroundFetchManager interface: existence and properties of interface prototype object PASS BackgroundFetchManager interface: existence and properties of interface prototype object's "constructor" property -PASS BackgroundFetchManager interface: operation fetch(DOMString,[object Object],[object Object],BackgroundFetchOptions) +PASS BackgroundFetchManager interface: operation fetch(DOMString, [object Object],[object Object], BackgroundFetchOptions) PASS BackgroundFetchManager interface: operation get(DOMString) PASS BackgroundFetchManager interface: operation getIds() PASS BackgroundFetchRegistration interface: existence and properties of interface object
diff --git a/third_party/WebKit/LayoutTests/external/wpt/compat/green-ref.html b/third_party/WebKit/LayoutTests/external/wpt/compat/green-ref.html new file mode 100644 index 0000000..2671ff6 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/compat/green-ref.html
@@ -0,0 +1,6 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>A green 100x100 block</title> +<link rel="author" title="Xidorn Quan" href="me@upsuper.ort"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<div style="width: 100px; height: 100px; background: green;"></div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/compat/webkit-linear-gradient-line-bottom.html b/third_party/WebKit/LayoutTests/external/wpt/compat/webkit-linear-gradient-line-bottom.html new file mode 100644 index 0000000..21e1c894 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/compat/webkit-linear-gradient-line-bottom.html
@@ -0,0 +1,22 @@ +<!doctype html> +<title>-webkit-linear-gradient(bottom)</title> +<link rel="author" title="Xidorn Quan" href="me@upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://compat.spec.whatwg.org/#css-gradients-webkit-linear-gradient"> +<meta name="assert" content="'bottom' in -webkit-linear-gradient is equivalent to 'to top' in modern syntax"> +<link rel="match" href="green-ref.html"> +<style> + #outer { + width: 100px; + height: 100px; + overflow: hidden; + } + #inner { + width: 100px; + height: 200px; + background-image: -webkit-linear-gradient(bottom, red 50%, green 50%); + } +</style> +<div id="outer"> + <div id="inner"></div> +</div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/compat/webkit-linear-gradient-line-left.html b/third_party/WebKit/LayoutTests/external/wpt/compat/webkit-linear-gradient-line-left.html new file mode 100644 index 0000000..b0e13c1 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/compat/webkit-linear-gradient-line-left.html
@@ -0,0 +1,22 @@ +<!doctype html> +<title>-webkit-linear-gradient(left)</title> +<link rel="author" title="Xidorn Quan" href="me@upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://compat.spec.whatwg.org/#css-gradients-webkit-linear-gradient"> +<meta name="assert" content="'left' in -webkit-linear-gradient is equivalent to 'to right' in modern syntax"> +<link rel="match" href="green-ref.html"> +<style> + #outer { + width: 100px; + height: 100px; + overflow: hidden; + } + #inner { + width: 200px; + height: 100px; + background-image: -webkit-linear-gradient(left, green 50%, red 50%); + } +</style> +<div id="outer"> + <div id="inner"></div> +</div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/compat/webkit-linear-gradient-line-right.html b/third_party/WebKit/LayoutTests/external/wpt/compat/webkit-linear-gradient-line-right.html new file mode 100644 index 0000000..0f1a4b9 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/compat/webkit-linear-gradient-line-right.html
@@ -0,0 +1,22 @@ +<!doctype html> +<title>-webkit-linear-gradient(right)</title> +<link rel="author" title="Xidorn Quan" href="me@upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://compat.spec.whatwg.org/#css-gradients-webkit-linear-gradient"> +<meta name="assert" content="'right' in -webkit-linear-gradient is equivalent to 'to left' in modern syntax"> +<link rel="match" href="green-ref.html"> +<style> + #outer { + width: 100px; + height: 100px; + overflow: hidden; + } + #inner { + width: 200px; + height: 100px; + background-image: -webkit-linear-gradient(right, red 50%, green 50%); + } +</style> +<div id="outer"> + <div id="inner"></div> +</div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/compat/webkit-linear-gradient-line-top.html b/third_party/WebKit/LayoutTests/external/wpt/compat/webkit-linear-gradient-line-top.html new file mode 100644 index 0000000..579d882 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/compat/webkit-linear-gradient-line-top.html
@@ -0,0 +1,22 @@ +<!doctype html> +<title>-webkit-linear-gradient(top)</title> +<link rel="author" title="Xidorn Quan" href="me@upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://compat.spec.whatwg.org/#css-gradients-webkit-linear-gradient"> +<meta name="assert" content="'top' in -webkit-linear-gradient is equivalent to 'to bottom' in modern syntax"> +<link rel="match" href="green-ref.html"> +<style> + #outer { + width: 100px; + height: 100px; + overflow: hidden; + } + #inner { + width: 100px; + height: 200px; + background-image: -webkit-linear-gradient(top, green 50%, red 50%); + } +</style> +<div id="outer"> + <div id="inner"></div> +</div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/securitypolicyviolation/idl-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/securitypolicyviolation/idl-expected.txt index ccc4c579..57e9e4c 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/securitypolicyviolation/idl-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/securitypolicyviolation/idl-expected.txt
@@ -17,16 +17,16 @@ PASS SecurityPolicyViolationEvent interface: attribute columnNumber PASS SecurityPolicyViolationEvent must be primary interface of new SecurityPolicyViolationEvent({}) FAIL Stringification of new SecurityPolicyViolationEvent({}) Cannot read property 'has_stringifier' of undefined -PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "documentURI" with the proper type (0) -PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "referrer" with the proper type (1) -PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "blockedURI" with the proper type (2) -PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "violatedDirective" with the proper type (3) -PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "effectiveDirective" with the proper type (4) -PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "originalPolicy" with the proper type (5) -PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "sourceFile" with the proper type (6) -PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "disposition" with the proper type (7) -PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "statusCode" with the proper type (8) -PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "lineNumber" with the proper type (9) -PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "columnNumber" with the proper type (10) +PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "documentURI" with the proper type +PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "referrer" with the proper type +PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "blockedURI" with the proper type +PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "violatedDirective" with the proper type +PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "effectiveDirective" with the proper type +PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "originalPolicy" with the proper type +PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "sourceFile" with the proper type +PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "disposition" with the proper type +PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "statusCode" with the proper type +PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "lineNumber" with the proper type +PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "columnNumber" with the proper type Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css-fonts/variations/font-parse-numeric-stretch-style-weight.html b/third_party/WebKit/LayoutTests/external/wpt/css-fonts/variations/font-parse-numeric-stretch-style-weight.html index 53cef20..5152424 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css-fonts/variations/font-parse-numeric-stretch-style-weight.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css-fonts/variations/font-parse-numeric-stretch-style-weight.html
@@ -21,12 +21,15 @@ 'calc(100 + 300)', 'calc(0.2 + 205.5)', ], - 'stretch': ['51%', '199%', 'calc(10% + 20%)'] + 'stretch': ['51%', '199%', 'calc(10% + 20%)'], + 'style' : [ 'normal', 'italic', 'oblique', 'oblique 50deg', 'oblique -90deg', 'oblique 90deg', + 'oblique calc(30deg + 20deg)' ] }; var styleInvalidTests = { 'weight': ['100 400', 'calc(0 - 100)', 'calc(200 + 801)'], - 'stretch': ['100% 110%', '0%', '100% 150%', 'calc(1 + 10%)'] + 'stretch': ['100% 110%', '0%', '100% 150%', 'calc(1 + 10%)'], + 'style' : [ 'normal 10deg', 'italic 10deg', 'oblique -91deg', 'oblique 91deg', 'oblique calc(90deg + 20deg)'] }; function testParseStyle() { @@ -70,6 +73,13 @@ ['ultra-condensed', 'ultra-condensed'], ['ultra-expanded', 'ultra-expanded'], ], + 'style' : [ + [ "normal", "normal" ], + [ "italic", "italic" ], + [ "oblique", "oblique" ], + [ "oblique 10deg", "oblique 10deg" ], + [ "oblique 10deg 20deg", "oblique 10deg 20deg" ] + ] }; var faceInvalidTests = { @@ -87,9 +97,11 @@ 'a b c', ], 'stretch': [ - '0%', '60% 70% 80%', 'a%', 'a b c', '0.1', '-60% 80%', 'ultra-expannnned', - '50% 0' + '-0.5%', '-1%', '0%', 'calc(0% - 10%)', '60% 70% 80%', 'a%', 'a b c', '0.1', + '-60% 80%', 'ultra-expannnned', '50% 0' ], + 'style' : [ 'oblique 100deg', 'oblique italic', 'oblique -91deg', 'oblique 0', + 'oblique 10', 'iiitalic', '90deg', '11', 'italic 90deg' ] }; function testParseFace() {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-fonts-3/OWNERS b/third_party/WebKit/LayoutTests/external/wpt/css/css-fonts-3/OWNERS new file mode 100644 index 0000000..7da8d64 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-fonts-3/OWNERS
@@ -0,0 +1,2 @@ +drott@chromium.org +kojii@chromium.org
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/geometry-1/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/geometry-1/interfaces-expected.txt index 0a3f72c..07a93ad 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/geometry-1/interfaces-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/geometry-1/interfaces-expected.txt
@@ -14,13 +14,13 @@ PASS DOMPointReadOnly interface: operation matrixTransform(DOMMatrixInit) PASS DOMPointReadOnly must be primary interface of new DOMPointReadOnly() PASS Stringification of new DOMPointReadOnly() -PASS DOMPointReadOnly interface: new DOMPointReadOnly() must inherit property "fromPoint" with the proper type (0) +PASS DOMPointReadOnly interface: new DOMPointReadOnly() must inherit property "fromPoint(DOMPointInit)" with the proper type PASS DOMPointReadOnly interface: calling fromPoint(DOMPointInit) on new DOMPointReadOnly() with too few arguments must throw TypeError -PASS DOMPointReadOnly interface: new DOMPointReadOnly() must inherit property "x" with the proper type (1) -PASS DOMPointReadOnly interface: new DOMPointReadOnly() must inherit property "y" with the proper type (2) -PASS DOMPointReadOnly interface: new DOMPointReadOnly() must inherit property "z" with the proper type (3) -PASS DOMPointReadOnly interface: new DOMPointReadOnly() must inherit property "w" with the proper type (4) -PASS DOMPointReadOnly interface: new DOMPointReadOnly() must inherit property "matrixTransform" with the proper type (5) +PASS DOMPointReadOnly interface: new DOMPointReadOnly() must inherit property "x" with the proper type +PASS DOMPointReadOnly interface: new DOMPointReadOnly() must inherit property "y" with the proper type +PASS DOMPointReadOnly interface: new DOMPointReadOnly() must inherit property "z" with the proper type +PASS DOMPointReadOnly interface: new DOMPointReadOnly() must inherit property "w" with the proper type +PASS DOMPointReadOnly interface: new DOMPointReadOnly() must inherit property "matrixTransform(DOMMatrixInit)" with the proper type PASS DOMPointReadOnly interface: calling matrixTransform(DOMMatrixInit) on new DOMPointReadOnly() with too few arguments must throw TypeError PASS DOMPoint interface: existence and properties of interface object PASS DOMPoint interface object length @@ -35,19 +35,19 @@ PASS DOMPoint interface: attribute w PASS DOMPoint must be primary interface of new DOMPoint() PASS Stringification of new DOMPoint() -PASS DOMPoint interface: new DOMPoint() must inherit property "fromPoint" with the proper type (0) +PASS DOMPoint interface: new DOMPoint() must inherit property "fromPoint(DOMPointInit)" with the proper type PASS DOMPoint interface: calling fromPoint(DOMPointInit) on new DOMPoint() with too few arguments must throw TypeError -PASS DOMPoint interface: new DOMPoint() must inherit property "x" with the proper type (1) -PASS DOMPoint interface: new DOMPoint() must inherit property "y" with the proper type (2) -PASS DOMPoint interface: new DOMPoint() must inherit property "z" with the proper type (3) -PASS DOMPoint interface: new DOMPoint() must inherit property "w" with the proper type (4) -PASS DOMPointReadOnly interface: new DOMPoint() must inherit property "fromPoint" with the proper type (0) +PASS DOMPoint interface: new DOMPoint() must inherit property "x" with the proper type +PASS DOMPoint interface: new DOMPoint() must inherit property "y" with the proper type +PASS DOMPoint interface: new DOMPoint() must inherit property "z" with the proper type +PASS DOMPoint interface: new DOMPoint() must inherit property "w" with the proper type +PASS DOMPointReadOnly interface: new DOMPoint() must inherit property "fromPoint(DOMPointInit)" with the proper type PASS DOMPointReadOnly interface: calling fromPoint(DOMPointInit) on new DOMPoint() with too few arguments must throw TypeError -PASS DOMPointReadOnly interface: new DOMPoint() must inherit property "x" with the proper type (1) -PASS DOMPointReadOnly interface: new DOMPoint() must inherit property "y" with the proper type (2) -PASS DOMPointReadOnly interface: new DOMPoint() must inherit property "z" with the proper type (3) -PASS DOMPointReadOnly interface: new DOMPoint() must inherit property "w" with the proper type (4) -PASS DOMPointReadOnly interface: new DOMPoint() must inherit property "matrixTransform" with the proper type (5) +PASS DOMPointReadOnly interface: new DOMPoint() must inherit property "x" with the proper type +PASS DOMPointReadOnly interface: new DOMPoint() must inherit property "y" with the proper type +PASS DOMPointReadOnly interface: new DOMPoint() must inherit property "z" with the proper type +PASS DOMPointReadOnly interface: new DOMPoint() must inherit property "w" with the proper type +PASS DOMPointReadOnly interface: new DOMPoint() must inherit property "matrixTransform(DOMMatrixInit)" with the proper type PASS DOMPointReadOnly interface: calling matrixTransform(DOMMatrixInit) on new DOMPoint() with too few arguments must throw TypeError PASS DOMRectReadOnly interface: existence and properties of interface object PASS DOMRectReadOnly interface object length @@ -65,16 +65,16 @@ PASS DOMRectReadOnly interface: attribute left PASS DOMRectReadOnly must be primary interface of new DOMRectReadOnly() PASS Stringification of new DOMRectReadOnly() -PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "fromRect" with the proper type (0) +PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "fromRect(DOMRectInit)" with the proper type PASS DOMRectReadOnly interface: calling fromRect(DOMRectInit) on new DOMRectReadOnly() with too few arguments must throw TypeError -PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "x" with the proper type (1) -PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "y" with the proper type (2) -PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "width" with the proper type (3) -PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "height" with the proper type (4) -PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "top" with the proper type (5) -PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "right" with the proper type (6) -PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "bottom" with the proper type (7) -PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "left" with the proper type (8) +PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "x" with the proper type +PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "y" with the proper type +PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "width" with the proper type +PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "height" with the proper type +PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "top" with the proper type +PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "right" with the proper type +PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "bottom" with the proper type +PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "left" with the proper type PASS DOMRect interface: existence and properties of interface object PASS DOMRect interface object length PASS DOMRect interface object name @@ -88,25 +88,25 @@ PASS DOMRect interface: attribute height PASS DOMRect must be primary interface of new DOMRect() PASS Stringification of new DOMRect() -PASS DOMRect interface: new DOMRect() must inherit property "fromRect" with the proper type (0) +PASS DOMRect interface: new DOMRect() must inherit property "fromRect(DOMRectInit)" with the proper type PASS DOMRect interface: calling fromRect(DOMRectInit) on new DOMRect() with too few arguments must throw TypeError -PASS DOMRect interface: new DOMRect() must inherit property "x" with the proper type (1) -PASS DOMRect interface: new DOMRect() must inherit property "y" with the proper type (2) -PASS DOMRect interface: new DOMRect() must inherit property "width" with the proper type (3) -PASS DOMRect interface: new DOMRect() must inherit property "height" with the proper type (4) -PASS DOMRectReadOnly interface: new DOMRect() must inherit property "fromRect" with the proper type (0) +PASS DOMRect interface: new DOMRect() must inherit property "x" with the proper type +PASS DOMRect interface: new DOMRect() must inherit property "y" with the proper type +PASS DOMRect interface: new DOMRect() must inherit property "width" with the proper type +PASS DOMRect interface: new DOMRect() must inherit property "height" with the proper type +PASS DOMRectReadOnly interface: new DOMRect() must inherit property "fromRect(DOMRectInit)" with the proper type PASS DOMRectReadOnly interface: calling fromRect(DOMRectInit) on new DOMRect() with too few arguments must throw TypeError -PASS DOMRectReadOnly interface: new DOMRect() must inherit property "x" with the proper type (1) -PASS DOMRectReadOnly interface: new DOMRect() must inherit property "y" with the proper type (2) -PASS DOMRectReadOnly interface: new DOMRect() must inherit property "width" with the proper type (3) -PASS DOMRectReadOnly interface: new DOMRect() must inherit property "height" with the proper type (4) -PASS DOMRectReadOnly interface: new DOMRect() must inherit property "top" with the proper type (5) -PASS DOMRectReadOnly interface: new DOMRect() must inherit property "right" with the proper type (6) -PASS DOMRectReadOnly interface: new DOMRect() must inherit property "bottom" with the proper type (7) -PASS DOMRectReadOnly interface: new DOMRect() must inherit property "left" with the proper type (8) +PASS DOMRectReadOnly interface: new DOMRect() must inherit property "x" with the proper type +PASS DOMRectReadOnly interface: new DOMRect() must inherit property "y" with the proper type +PASS DOMRectReadOnly interface: new DOMRect() must inherit property "width" with the proper type +PASS DOMRectReadOnly interface: new DOMRect() must inherit property "height" with the proper type +PASS DOMRectReadOnly interface: new DOMRect() must inherit property "top" with the proper type +PASS DOMRectReadOnly interface: new DOMRect() must inherit property "right" with the proper type +PASS DOMRectReadOnly interface: new DOMRect() must inherit property "bottom" with the proper type +PASS DOMRectReadOnly interface: new DOMRect() must inherit property "left" with the proper type PASS Stringification of [object DOMRectList] -PASS DOMRectList interface: [object DOMRectList] must inherit property "length" with the proper type (0) -PASS DOMRectList interface: [object DOMRectList] must inherit property "item" with the proper type (1) +PASS DOMRectList interface: [object DOMRectList] must inherit property "length" with the proper type +PASS DOMRectList interface: [object DOMRectList] must inherit property "item(unsigned long)" with the proper type PASS DOMRectList interface: calling item(unsigned long) on [object DOMRectList] with too few arguments must throw TypeError PASS DOMQuad interface: existence and properties of interface object PASS DOMQuad interface object length @@ -122,15 +122,15 @@ PASS DOMQuad interface: operation getBounds() PASS DOMQuad must be primary interface of new DOMQuad() PASS Stringification of new DOMQuad() -PASS DOMQuad interface: new DOMQuad() must inherit property "fromRect" with the proper type (0) +PASS DOMQuad interface: new DOMQuad() must inherit property "fromRect(DOMRectInit)" with the proper type PASS DOMQuad interface: calling fromRect(DOMRectInit) on new DOMQuad() with too few arguments must throw TypeError -PASS DOMQuad interface: new DOMQuad() must inherit property "fromQuad" with the proper type (1) +PASS DOMQuad interface: new DOMQuad() must inherit property "fromQuad(DOMQuadInit)" with the proper type PASS DOMQuad interface: calling fromQuad(DOMQuadInit) on new DOMQuad() with too few arguments must throw TypeError -PASS DOMQuad interface: new DOMQuad() must inherit property "p1" with the proper type (2) -PASS DOMQuad interface: new DOMQuad() must inherit property "p2" with the proper type (3) -PASS DOMQuad interface: new DOMQuad() must inherit property "p3" with the proper type (4) -PASS DOMQuad interface: new DOMQuad() must inherit property "p4" with the proper type (5) -PASS DOMQuad interface: new DOMQuad() must inherit property "getBounds" with the proper type (6) +PASS DOMQuad interface: new DOMQuad() must inherit property "p1" with the proper type +PASS DOMQuad interface: new DOMQuad() must inherit property "p2" with the proper type +PASS DOMQuad interface: new DOMQuad() must inherit property "p3" with the proper type +PASS DOMQuad interface: new DOMQuad() must inherit property "p4" with the proper type +PASS DOMQuad interface: new DOMQuad() must inherit property "getBounds()" with the proper type PASS DOMMatrixReadOnly interface: existence and properties of interface object PASS DOMMatrixReadOnly interface object length PASS DOMMatrixReadOnly interface object name @@ -163,12 +163,12 @@ PASS DOMMatrixReadOnly interface: attribute m44 PASS DOMMatrixReadOnly interface: attribute is2D PASS DOMMatrixReadOnly interface: attribute isIdentity -PASS DOMMatrixReadOnly interface: operation translate(unrestricted double,unrestricted double,unrestricted double) -PASS DOMMatrixReadOnly interface: operation scale(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) -PASS DOMMatrixReadOnly interface: operation scale3d(unrestricted double,unrestricted double,unrestricted double,unrestricted double) -PASS DOMMatrixReadOnly interface: operation rotate(unrestricted double,unrestricted double,unrestricted double) -PASS DOMMatrixReadOnly interface: operation rotateFromVector(unrestricted double,unrestricted double) -PASS DOMMatrixReadOnly interface: operation rotateAxisAngle(unrestricted double,unrestricted double,unrestricted double,unrestricted double) +PASS DOMMatrixReadOnly interface: operation translate(unrestricted double, unrestricted double, unrestricted double) +PASS DOMMatrixReadOnly interface: operation scale(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) +PASS DOMMatrixReadOnly interface: operation scale3d(unrestricted double, unrestricted double, unrestricted double, unrestricted double) +PASS DOMMatrixReadOnly interface: operation rotate(unrestricted double, unrestricted double, unrestricted double) +PASS DOMMatrixReadOnly interface: operation rotateFromVector(unrestricted double, unrestricted double) +PASS DOMMatrixReadOnly interface: operation rotateAxisAngle(unrestricted double, unrestricted double, unrestricted double, unrestricted double) PASS DOMMatrixReadOnly interface: operation skewX(unrestricted double) PASS DOMMatrixReadOnly interface: operation skewY(unrestricted double) PASS DOMMatrixReadOnly interface: operation multiply(DOMMatrixInit) @@ -181,118 +181,118 @@ PASS DOMMatrixReadOnly interface: stringifier PASS DOMMatrixReadOnly must be primary interface of new DOMMatrixReadOnly() PASS Stringification of new DOMMatrixReadOnly() -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "fromMatrix" with the proper type (0) +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "fromMatrix(DOMMatrixInit)" with the proper type PASS DOMMatrixReadOnly interface: calling fromMatrix(DOMMatrixInit) on new DOMMatrixReadOnly() with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "fromFloat32Array" with the proper type (1) +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "fromFloat32Array(Float32Array)" with the proper type PASS DOMMatrixReadOnly interface: calling fromFloat32Array(Float32Array) on new DOMMatrixReadOnly() with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "fromFloat64Array" with the proper type (2) +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "fromFloat64Array(Float64Array)" with the proper type PASS DOMMatrixReadOnly interface: calling fromFloat64Array(Float64Array) on new DOMMatrixReadOnly() with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "a" with the proper type (3) -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "b" with the proper type (4) -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "c" with the proper type (5) -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "d" with the proper type (6) -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "e" with the proper type (7) -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "f" with the proper type (8) -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m11" with the proper type (9) -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m12" with the proper type (10) -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m13" with the proper type (11) -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m14" with the proper type (12) -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m21" with the proper type (13) -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m22" with the proper type (14) -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m23" with the proper type (15) -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m24" with the proper type (16) -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m31" with the proper type (17) -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m32" with the proper type (18) -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m33" with the proper type (19) -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m34" with the proper type (20) -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m41" with the proper type (21) -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m42" with the proper type (22) -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m43" with the proper type (23) -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m44" with the proper type (24) -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "is2D" with the proper type (25) -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "isIdentity" with the proper type (26) -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "translate" with the proper type (27) -PASS DOMMatrixReadOnly interface: calling translate(unrestricted double,unrestricted double,unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "scale" with the proper type (28) -PASS DOMMatrixReadOnly interface: calling scale(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "scale3d" with the proper type (29) -PASS DOMMatrixReadOnly interface: calling scale3d(unrestricted double,unrestricted double,unrestricted double,unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "rotate" with the proper type (30) -PASS DOMMatrixReadOnly interface: calling rotate(unrestricted double,unrestricted double,unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "rotateFromVector" with the proper type (31) -PASS DOMMatrixReadOnly interface: calling rotateFromVector(unrestricted double,unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "rotateAxisAngle" with the proper type (32) -PASS DOMMatrixReadOnly interface: calling rotateAxisAngle(unrestricted double,unrestricted double,unrestricted double,unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "skewX" with the proper type (33) +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "a" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "b" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "c" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "d" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "e" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "f" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m11" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m12" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m13" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m14" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m21" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m22" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m23" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m24" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m31" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m32" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m33" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m34" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m41" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m42" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m43" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m44" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "is2D" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "isIdentity" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "translate(unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrixReadOnly interface: calling translate(unrestricted double, unrestricted double, unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "scale(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrixReadOnly interface: calling scale(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "scale3d(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrixReadOnly interface: calling scale3d(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "rotate(unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrixReadOnly interface: calling rotate(unrestricted double, unrestricted double, unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "rotateFromVector(unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrixReadOnly interface: calling rotateFromVector(unrestricted double, unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "rotateAxisAngle(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrixReadOnly interface: calling rotateAxisAngle(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "skewX(unrestricted double)" with the proper type PASS DOMMatrixReadOnly interface: calling skewX(unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "skewY" with the proper type (34) +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "skewY(unrestricted double)" with the proper type PASS DOMMatrixReadOnly interface: calling skewY(unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "multiply" with the proper type (35) +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "multiply(DOMMatrixInit)" with the proper type PASS DOMMatrixReadOnly interface: calling multiply(DOMMatrixInit) on new DOMMatrixReadOnly() with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "flipX" with the proper type (36) -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "flipY" with the proper type (37) -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "inverse" with the proper type (38) -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "transformPoint" with the proper type (39) +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "flipX()" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "flipY()" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "inverse()" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "transformPoint(DOMPointInit)" with the proper type PASS DOMMatrixReadOnly interface: calling transformPoint(DOMPointInit) on new DOMMatrixReadOnly() with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "toFloat32Array" with the proper type (40) -PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "toFloat64Array" with the proper type (41) +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "toFloat32Array()" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "toFloat64Array()" with the proper type PASS DOMMatrixReadOnly must be primary interface of DOMMatrixReadOnly.fromMatrix({is2D: false}) PASS Stringification of DOMMatrixReadOnly.fromMatrix({is2D: false}) -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "fromMatrix" with the proper type (0) +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "fromMatrix(DOMMatrixInit)" with the proper type PASS DOMMatrixReadOnly interface: calling fromMatrix(DOMMatrixInit) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "fromFloat32Array" with the proper type (1) +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "fromFloat32Array(Float32Array)" with the proper type PASS DOMMatrixReadOnly interface: calling fromFloat32Array(Float32Array) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "fromFloat64Array" with the proper type (2) +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "fromFloat64Array(Float64Array)" with the proper type PASS DOMMatrixReadOnly interface: calling fromFloat64Array(Float64Array) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "a" with the proper type (3) -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "b" with the proper type (4) -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "c" with the proper type (5) -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "d" with the proper type (6) -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "e" with the proper type (7) -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "f" with the proper type (8) -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m11" with the proper type (9) -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m12" with the proper type (10) -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m13" with the proper type (11) -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m14" with the proper type (12) -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m21" with the proper type (13) -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m22" with the proper type (14) -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m23" with the proper type (15) -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m24" with the proper type (16) -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m31" with the proper type (17) -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m32" with the proper type (18) -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m33" with the proper type (19) -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m34" with the proper type (20) -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m41" with the proper type (21) -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m42" with the proper type (22) -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m43" with the proper type (23) -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m44" with the proper type (24) -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "is2D" with the proper type (25) -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "isIdentity" with the proper type (26) -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "translate" with the proper type (27) -PASS DOMMatrixReadOnly interface: calling translate(unrestricted double,unrestricted double,unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "scale" with the proper type (28) -PASS DOMMatrixReadOnly interface: calling scale(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "scale3d" with the proper type (29) -PASS DOMMatrixReadOnly interface: calling scale3d(unrestricted double,unrestricted double,unrestricted double,unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "rotate" with the proper type (30) -PASS DOMMatrixReadOnly interface: calling rotate(unrestricted double,unrestricted double,unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "rotateFromVector" with the proper type (31) -PASS DOMMatrixReadOnly interface: calling rotateFromVector(unrestricted double,unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "rotateAxisAngle" with the proper type (32) -PASS DOMMatrixReadOnly interface: calling rotateAxisAngle(unrestricted double,unrestricted double,unrestricted double,unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "skewX" with the proper type (33) +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "a" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "b" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "c" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "d" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "e" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "f" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m11" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m12" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m13" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m14" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m21" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m22" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m23" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m24" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m31" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m32" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m33" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m34" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m41" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m42" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m43" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m44" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "is2D" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "isIdentity" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "translate(unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrixReadOnly interface: calling translate(unrestricted double, unrestricted double, unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "scale(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrixReadOnly interface: calling scale(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "scale3d(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrixReadOnly interface: calling scale3d(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "rotate(unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrixReadOnly interface: calling rotate(unrestricted double, unrestricted double, unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "rotateFromVector(unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrixReadOnly interface: calling rotateFromVector(unrestricted double, unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "rotateAxisAngle(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrixReadOnly interface: calling rotateAxisAngle(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "skewX(unrestricted double)" with the proper type PASS DOMMatrixReadOnly interface: calling skewX(unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "skewY" with the proper type (34) +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "skewY(unrestricted double)" with the proper type PASS DOMMatrixReadOnly interface: calling skewY(unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "multiply" with the proper type (35) +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "multiply(DOMMatrixInit)" with the proper type PASS DOMMatrixReadOnly interface: calling multiply(DOMMatrixInit) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "flipX" with the proper type (36) -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "flipY" with the proper type (37) -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "inverse" with the proper type (38) -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "transformPoint" with the proper type (39) +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "flipX()" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "flipY()" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "inverse()" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "transformPoint(DOMPointInit)" with the proper type PASS DOMMatrixReadOnly interface: calling transformPoint(DOMPointInit) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "toFloat32Array" with the proper type (40) -PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "toFloat64Array" with the proper type (41) +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "toFloat32Array()" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "toFloat64Array()" with the proper type PASS DOMMatrix interface: existence and properties of interface object PASS DOMMatrix interface object length PASS DOMMatrix interface object name @@ -326,231 +326,231 @@ PASS DOMMatrix interface: attribute m44 PASS DOMMatrix interface: operation multiplySelf(DOMMatrixInit) PASS DOMMatrix interface: operation preMultiplySelf(DOMMatrixInit) -PASS DOMMatrix interface: operation translateSelf(unrestricted double,unrestricted double,unrestricted double) -PASS DOMMatrix interface: operation scaleSelf(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) -PASS DOMMatrix interface: operation scale3dSelf(unrestricted double,unrestricted double,unrestricted double,unrestricted double) -PASS DOMMatrix interface: operation rotateSelf(unrestricted double,unrestricted double,unrestricted double) -PASS DOMMatrix interface: operation rotateFromVectorSelf(unrestricted double,unrestricted double) -PASS DOMMatrix interface: operation rotateAxisAngleSelf(unrestricted double,unrestricted double,unrestricted double,unrestricted double) +PASS DOMMatrix interface: operation translateSelf(unrestricted double, unrestricted double, unrestricted double) +PASS DOMMatrix interface: operation scaleSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) +PASS DOMMatrix interface: operation scale3dSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double) +PASS DOMMatrix interface: operation rotateSelf(unrestricted double, unrestricted double, unrestricted double) +PASS DOMMatrix interface: operation rotateFromVectorSelf(unrestricted double, unrestricted double) +PASS DOMMatrix interface: operation rotateAxisAngleSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double) PASS DOMMatrix interface: operation skewXSelf(unrestricted double) PASS DOMMatrix interface: operation skewYSelf(unrestricted double) PASS DOMMatrix interface: operation invertSelf() PASS DOMMatrix interface: operation setMatrixValue(DOMString) PASS DOMMatrix must be primary interface of new DOMMatrix() PASS Stringification of new DOMMatrix() -PASS DOMMatrix interface: new DOMMatrix() must inherit property "fromMatrix" with the proper type (0) +PASS DOMMatrix interface: new DOMMatrix() must inherit property "fromMatrix(DOMMatrixInit)" with the proper type PASS DOMMatrix interface: calling fromMatrix(DOMMatrixInit) on new DOMMatrix() with too few arguments must throw TypeError -PASS DOMMatrix interface: new DOMMatrix() must inherit property "fromFloat32Array" with the proper type (1) +PASS DOMMatrix interface: new DOMMatrix() must inherit property "fromFloat32Array(Float32Array)" with the proper type PASS DOMMatrix interface: calling fromFloat32Array(Float32Array) on new DOMMatrix() with too few arguments must throw TypeError -PASS DOMMatrix interface: new DOMMatrix() must inherit property "fromFloat64Array" with the proper type (2) +PASS DOMMatrix interface: new DOMMatrix() must inherit property "fromFloat64Array(Float64Array)" with the proper type PASS DOMMatrix interface: calling fromFloat64Array(Float64Array) on new DOMMatrix() with too few arguments must throw TypeError -PASS DOMMatrix interface: new DOMMatrix() must inherit property "a" with the proper type (3) -PASS DOMMatrix interface: new DOMMatrix() must inherit property "b" with the proper type (4) -PASS DOMMatrix interface: new DOMMatrix() must inherit property "c" with the proper type (5) -PASS DOMMatrix interface: new DOMMatrix() must inherit property "d" with the proper type (6) -PASS DOMMatrix interface: new DOMMatrix() must inherit property "e" with the proper type (7) -PASS DOMMatrix interface: new DOMMatrix() must inherit property "f" with the proper type (8) -PASS DOMMatrix interface: new DOMMatrix() must inherit property "m11" with the proper type (9) -PASS DOMMatrix interface: new DOMMatrix() must inherit property "m12" with the proper type (10) -PASS DOMMatrix interface: new DOMMatrix() must inherit property "m13" with the proper type (11) -PASS DOMMatrix interface: new DOMMatrix() must inherit property "m14" with the proper type (12) -PASS DOMMatrix interface: new DOMMatrix() must inherit property "m21" with the proper type (13) -PASS DOMMatrix interface: new DOMMatrix() must inherit property "m22" with the proper type (14) -PASS DOMMatrix interface: new DOMMatrix() must inherit property "m23" with the proper type (15) -PASS DOMMatrix interface: new DOMMatrix() must inherit property "m24" with the proper type (16) -PASS DOMMatrix interface: new DOMMatrix() must inherit property "m31" with the proper type (17) -PASS DOMMatrix interface: new DOMMatrix() must inherit property "m32" with the proper type (18) -PASS DOMMatrix interface: new DOMMatrix() must inherit property "m33" with the proper type (19) -PASS DOMMatrix interface: new DOMMatrix() must inherit property "m34" with the proper type (20) -PASS DOMMatrix interface: new DOMMatrix() must inherit property "m41" with the proper type (21) -PASS DOMMatrix interface: new DOMMatrix() must inherit property "m42" with the proper type (22) -PASS DOMMatrix interface: new DOMMatrix() must inherit property "m43" with the proper type (23) -PASS DOMMatrix interface: new DOMMatrix() must inherit property "m44" with the proper type (24) -PASS DOMMatrix interface: new DOMMatrix() must inherit property "multiplySelf" with the proper type (25) +PASS DOMMatrix interface: new DOMMatrix() must inherit property "a" with the proper type +PASS DOMMatrix interface: new DOMMatrix() must inherit property "b" with the proper type +PASS DOMMatrix interface: new DOMMatrix() must inherit property "c" with the proper type +PASS DOMMatrix interface: new DOMMatrix() must inherit property "d" with the proper type +PASS DOMMatrix interface: new DOMMatrix() must inherit property "e" with the proper type +PASS DOMMatrix interface: new DOMMatrix() must inherit property "f" with the proper type +PASS DOMMatrix interface: new DOMMatrix() must inherit property "m11" with the proper type +PASS DOMMatrix interface: new DOMMatrix() must inherit property "m12" with the proper type +PASS DOMMatrix interface: new DOMMatrix() must inherit property "m13" with the proper type +PASS DOMMatrix interface: new DOMMatrix() must inherit property "m14" with the proper type +PASS DOMMatrix interface: new DOMMatrix() must inherit property "m21" with the proper type +PASS DOMMatrix interface: new DOMMatrix() must inherit property "m22" with the proper type +PASS DOMMatrix interface: new DOMMatrix() must inherit property "m23" with the proper type +PASS DOMMatrix interface: new DOMMatrix() must inherit property "m24" with the proper type +PASS DOMMatrix interface: new DOMMatrix() must inherit property "m31" with the proper type +PASS DOMMatrix interface: new DOMMatrix() must inherit property "m32" with the proper type +PASS DOMMatrix interface: new DOMMatrix() must inherit property "m33" with the proper type +PASS DOMMatrix interface: new DOMMatrix() must inherit property "m34" with the proper type +PASS DOMMatrix interface: new DOMMatrix() must inherit property "m41" with the proper type +PASS DOMMatrix interface: new DOMMatrix() must inherit property "m42" with the proper type +PASS DOMMatrix interface: new DOMMatrix() must inherit property "m43" with the proper type +PASS DOMMatrix interface: new DOMMatrix() must inherit property "m44" with the proper type +PASS DOMMatrix interface: new DOMMatrix() must inherit property "multiplySelf(DOMMatrixInit)" with the proper type PASS DOMMatrix interface: calling multiplySelf(DOMMatrixInit) on new DOMMatrix() with too few arguments must throw TypeError -PASS DOMMatrix interface: new DOMMatrix() must inherit property "preMultiplySelf" with the proper type (26) +PASS DOMMatrix interface: new DOMMatrix() must inherit property "preMultiplySelf(DOMMatrixInit)" with the proper type PASS DOMMatrix interface: calling preMultiplySelf(DOMMatrixInit) on new DOMMatrix() with too few arguments must throw TypeError -PASS DOMMatrix interface: new DOMMatrix() must inherit property "translateSelf" with the proper type (27) -PASS DOMMatrix interface: calling translateSelf(unrestricted double,unrestricted double,unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError -PASS DOMMatrix interface: new DOMMatrix() must inherit property "scaleSelf" with the proper type (28) -PASS DOMMatrix interface: calling scaleSelf(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError -PASS DOMMatrix interface: new DOMMatrix() must inherit property "scale3dSelf" with the proper type (29) -PASS DOMMatrix interface: calling scale3dSelf(unrestricted double,unrestricted double,unrestricted double,unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError -PASS DOMMatrix interface: new DOMMatrix() must inherit property "rotateSelf" with the proper type (30) -PASS DOMMatrix interface: calling rotateSelf(unrestricted double,unrestricted double,unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError -PASS DOMMatrix interface: new DOMMatrix() must inherit property "rotateFromVectorSelf" with the proper type (31) -PASS DOMMatrix interface: calling rotateFromVectorSelf(unrestricted double,unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError -PASS DOMMatrix interface: new DOMMatrix() must inherit property "rotateAxisAngleSelf" with the proper type (32) -PASS DOMMatrix interface: calling rotateAxisAngleSelf(unrestricted double,unrestricted double,unrestricted double,unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError -PASS DOMMatrix interface: new DOMMatrix() must inherit property "skewXSelf" with the proper type (33) +PASS DOMMatrix interface: new DOMMatrix() must inherit property "translateSelf(unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrix interface: calling translateSelf(unrestricted double, unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError +PASS DOMMatrix interface: new DOMMatrix() must inherit property "scaleSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrix interface: calling scaleSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError +PASS DOMMatrix interface: new DOMMatrix() must inherit property "scale3dSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrix interface: calling scale3dSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError +PASS DOMMatrix interface: new DOMMatrix() must inherit property "rotateSelf(unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrix interface: calling rotateSelf(unrestricted double, unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError +PASS DOMMatrix interface: new DOMMatrix() must inherit property "rotateFromVectorSelf(unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrix interface: calling rotateFromVectorSelf(unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError +PASS DOMMatrix interface: new DOMMatrix() must inherit property "rotateAxisAngleSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrix interface: calling rotateAxisAngleSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError +PASS DOMMatrix interface: new DOMMatrix() must inherit property "skewXSelf(unrestricted double)" with the proper type PASS DOMMatrix interface: calling skewXSelf(unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError -PASS DOMMatrix interface: new DOMMatrix() must inherit property "skewYSelf" with the proper type (34) +PASS DOMMatrix interface: new DOMMatrix() must inherit property "skewYSelf(unrestricted double)" with the proper type PASS DOMMatrix interface: calling skewYSelf(unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError -PASS DOMMatrix interface: new DOMMatrix() must inherit property "invertSelf" with the proper type (35) -PASS DOMMatrix interface: new DOMMatrix() must inherit property "setMatrixValue" with the proper type (36) +PASS DOMMatrix interface: new DOMMatrix() must inherit property "invertSelf()" with the proper type +PASS DOMMatrix interface: new DOMMatrix() must inherit property "setMatrixValue(DOMString)" with the proper type PASS DOMMatrix interface: calling setMatrixValue(DOMString) on new DOMMatrix() with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "fromMatrix" with the proper type (0) +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "fromMatrix(DOMMatrixInit)" with the proper type PASS DOMMatrixReadOnly interface: calling fromMatrix(DOMMatrixInit) on new DOMMatrix() with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "fromFloat32Array" with the proper type (1) +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "fromFloat32Array(Float32Array)" with the proper type PASS DOMMatrixReadOnly interface: calling fromFloat32Array(Float32Array) on new DOMMatrix() with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "fromFloat64Array" with the proper type (2) +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "fromFloat64Array(Float64Array)" with the proper type PASS DOMMatrixReadOnly interface: calling fromFloat64Array(Float64Array) on new DOMMatrix() with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "a" with the proper type (3) -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "b" with the proper type (4) -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "c" with the proper type (5) -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "d" with the proper type (6) -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "e" with the proper type (7) -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "f" with the proper type (8) -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m11" with the proper type (9) -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m12" with the proper type (10) -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m13" with the proper type (11) -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m14" with the proper type (12) -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m21" with the proper type (13) -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m22" with the proper type (14) -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m23" with the proper type (15) -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m24" with the proper type (16) -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m31" with the proper type (17) -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m32" with the proper type (18) -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m33" with the proper type (19) -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m34" with the proper type (20) -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m41" with the proper type (21) -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m42" with the proper type (22) -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m43" with the proper type (23) -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m44" with the proper type (24) -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "is2D" with the proper type (25) -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "isIdentity" with the proper type (26) -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "translate" with the proper type (27) -PASS DOMMatrixReadOnly interface: calling translate(unrestricted double,unrestricted double,unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "scale" with the proper type (28) -PASS DOMMatrixReadOnly interface: calling scale(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "scale3d" with the proper type (29) -PASS DOMMatrixReadOnly interface: calling scale3d(unrestricted double,unrestricted double,unrestricted double,unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "rotate" with the proper type (30) -PASS DOMMatrixReadOnly interface: calling rotate(unrestricted double,unrestricted double,unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "rotateFromVector" with the proper type (31) -PASS DOMMatrixReadOnly interface: calling rotateFromVector(unrestricted double,unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "rotateAxisAngle" with the proper type (32) -PASS DOMMatrixReadOnly interface: calling rotateAxisAngle(unrestricted double,unrestricted double,unrestricted double,unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "skewX" with the proper type (33) +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "a" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "b" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "c" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "d" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "e" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "f" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m11" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m12" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m13" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m14" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m21" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m22" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m23" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m24" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m31" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m32" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m33" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m34" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m41" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m42" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m43" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m44" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "is2D" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "isIdentity" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "translate(unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrixReadOnly interface: calling translate(unrestricted double, unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "scale(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrixReadOnly interface: calling scale(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "scale3d(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrixReadOnly interface: calling scale3d(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "rotate(unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrixReadOnly interface: calling rotate(unrestricted double, unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "rotateFromVector(unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrixReadOnly interface: calling rotateFromVector(unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "rotateAxisAngle(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrixReadOnly interface: calling rotateAxisAngle(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "skewX(unrestricted double)" with the proper type PASS DOMMatrixReadOnly interface: calling skewX(unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "skewY" with the proper type (34) +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "skewY(unrestricted double)" with the proper type PASS DOMMatrixReadOnly interface: calling skewY(unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "multiply" with the proper type (35) +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "multiply(DOMMatrixInit)" with the proper type PASS DOMMatrixReadOnly interface: calling multiply(DOMMatrixInit) on new DOMMatrix() with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "flipX" with the proper type (36) -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "flipY" with the proper type (37) -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "inverse" with the proper type (38) -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "transformPoint" with the proper type (39) +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "flipX()" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "flipY()" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "inverse()" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "transformPoint(DOMPointInit)" with the proper type PASS DOMMatrixReadOnly interface: calling transformPoint(DOMPointInit) on new DOMMatrix() with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "toFloat32Array" with the proper type (40) -PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "toFloat64Array" with the proper type (41) +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "toFloat32Array()" with the proper type +PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "toFloat64Array()" with the proper type PASS DOMMatrix must be primary interface of DOMMatrix.fromMatrix({is2D: false}) PASS Stringification of DOMMatrix.fromMatrix({is2D: false}) -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "fromMatrix" with the proper type (0) +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "fromMatrix(DOMMatrixInit)" with the proper type PASS DOMMatrix interface: calling fromMatrix(DOMMatrixInit) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "fromFloat32Array" with the proper type (1) +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "fromFloat32Array(Float32Array)" with the proper type PASS DOMMatrix interface: calling fromFloat32Array(Float32Array) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "fromFloat64Array" with the proper type (2) +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "fromFloat64Array(Float64Array)" with the proper type PASS DOMMatrix interface: calling fromFloat64Array(Float64Array) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "a" with the proper type (3) -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "b" with the proper type (4) -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "c" with the proper type (5) -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "d" with the proper type (6) -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "e" with the proper type (7) -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "f" with the proper type (8) -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m11" with the proper type (9) -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m12" with the proper type (10) -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m13" with the proper type (11) -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m14" with the proper type (12) -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m21" with the proper type (13) -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m22" with the proper type (14) -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m23" with the proper type (15) -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m24" with the proper type (16) -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m31" with the proper type (17) -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m32" with the proper type (18) -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m33" with the proper type (19) -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m34" with the proper type (20) -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m41" with the proper type (21) -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m42" with the proper type (22) -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m43" with the proper type (23) -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m44" with the proper type (24) -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "multiplySelf" with the proper type (25) +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "a" with the proper type +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "b" with the proper type +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "c" with the proper type +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "d" with the proper type +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "e" with the proper type +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "f" with the proper type +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m11" with the proper type +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m12" with the proper type +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m13" with the proper type +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m14" with the proper type +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m21" with the proper type +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m22" with the proper type +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m23" with the proper type +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m24" with the proper type +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m31" with the proper type +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m32" with the proper type +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m33" with the proper type +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m34" with the proper type +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m41" with the proper type +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m42" with the proper type +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m43" with the proper type +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m44" with the proper type +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "multiplySelf(DOMMatrixInit)" with the proper type PASS DOMMatrix interface: calling multiplySelf(DOMMatrixInit) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "preMultiplySelf" with the proper type (26) +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "preMultiplySelf(DOMMatrixInit)" with the proper type PASS DOMMatrix interface: calling preMultiplySelf(DOMMatrixInit) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "translateSelf" with the proper type (27) -PASS DOMMatrix interface: calling translateSelf(unrestricted double,unrestricted double,unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "scaleSelf" with the proper type (28) -PASS DOMMatrix interface: calling scaleSelf(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "scale3dSelf" with the proper type (29) -PASS DOMMatrix interface: calling scale3dSelf(unrestricted double,unrestricted double,unrestricted double,unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "rotateSelf" with the proper type (30) -PASS DOMMatrix interface: calling rotateSelf(unrestricted double,unrestricted double,unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "rotateFromVectorSelf" with the proper type (31) -PASS DOMMatrix interface: calling rotateFromVectorSelf(unrestricted double,unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "rotateAxisAngleSelf" with the proper type (32) -PASS DOMMatrix interface: calling rotateAxisAngleSelf(unrestricted double,unrestricted double,unrestricted double,unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "skewXSelf" with the proper type (33) +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "translateSelf(unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrix interface: calling translateSelf(unrestricted double, unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "scaleSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrix interface: calling scaleSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "scale3dSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrix interface: calling scale3dSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "rotateSelf(unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrix interface: calling rotateSelf(unrestricted double, unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "rotateFromVectorSelf(unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrix interface: calling rotateFromVectorSelf(unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "rotateAxisAngleSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrix interface: calling rotateAxisAngleSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "skewXSelf(unrestricted double)" with the proper type PASS DOMMatrix interface: calling skewXSelf(unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "skewYSelf" with the proper type (34) +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "skewYSelf(unrestricted double)" with the proper type PASS DOMMatrix interface: calling skewYSelf(unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "invertSelf" with the proper type (35) -PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "setMatrixValue" with the proper type (36) +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "invertSelf()" with the proper type +PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "setMatrixValue(DOMString)" with the proper type PASS DOMMatrix interface: calling setMatrixValue(DOMString) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "fromMatrix" with the proper type (0) +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "fromMatrix(DOMMatrixInit)" with the proper type PASS DOMMatrixReadOnly interface: calling fromMatrix(DOMMatrixInit) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "fromFloat32Array" with the proper type (1) +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "fromFloat32Array(Float32Array)" with the proper type PASS DOMMatrixReadOnly interface: calling fromFloat32Array(Float32Array) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "fromFloat64Array" with the proper type (2) +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "fromFloat64Array(Float64Array)" with the proper type PASS DOMMatrixReadOnly interface: calling fromFloat64Array(Float64Array) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "a" with the proper type (3) -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "b" with the proper type (4) -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "c" with the proper type (5) -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "d" with the proper type (6) -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "e" with the proper type (7) -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "f" with the proper type (8) -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m11" with the proper type (9) -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m12" with the proper type (10) -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m13" with the proper type (11) -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m14" with the proper type (12) -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m21" with the proper type (13) -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m22" with the proper type (14) -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m23" with the proper type (15) -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m24" with the proper type (16) -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m31" with the proper type (17) -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m32" with the proper type (18) -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m33" with the proper type (19) -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m34" with the proper type (20) -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m41" with the proper type (21) -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m42" with the proper type (22) -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m43" with the proper type (23) -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m44" with the proper type (24) -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "is2D" with the proper type (25) -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "isIdentity" with the proper type (26) -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "translate" with the proper type (27) -PASS DOMMatrixReadOnly interface: calling translate(unrestricted double,unrestricted double,unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "scale" with the proper type (28) -PASS DOMMatrixReadOnly interface: calling scale(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "scale3d" with the proper type (29) -PASS DOMMatrixReadOnly interface: calling scale3d(unrestricted double,unrestricted double,unrestricted double,unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "rotate" with the proper type (30) -PASS DOMMatrixReadOnly interface: calling rotate(unrestricted double,unrestricted double,unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "rotateFromVector" with the proper type (31) -PASS DOMMatrixReadOnly interface: calling rotateFromVector(unrestricted double,unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "rotateAxisAngle" with the proper type (32) -PASS DOMMatrixReadOnly interface: calling rotateAxisAngle(unrestricted double,unrestricted double,unrestricted double,unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "skewX" with the proper type (33) +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "a" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "b" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "c" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "d" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "e" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "f" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m11" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m12" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m13" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m14" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m21" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m22" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m23" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m24" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m31" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m32" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m33" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m34" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m41" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m42" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m43" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m44" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "is2D" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "isIdentity" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "translate(unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrixReadOnly interface: calling translate(unrestricted double, unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "scale(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrixReadOnly interface: calling scale(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "scale3d(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrixReadOnly interface: calling scale3d(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "rotate(unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrixReadOnly interface: calling rotate(unrestricted double, unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "rotateFromVector(unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrixReadOnly interface: calling rotateFromVector(unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "rotateAxisAngle(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS DOMMatrixReadOnly interface: calling rotateAxisAngle(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "skewX(unrestricted double)" with the proper type PASS DOMMatrixReadOnly interface: calling skewX(unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "skewY" with the proper type (34) +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "skewY(unrestricted double)" with the proper type PASS DOMMatrixReadOnly interface: calling skewY(unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "multiply" with the proper type (35) +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "multiply(DOMMatrixInit)" with the proper type PASS DOMMatrixReadOnly interface: calling multiply(DOMMatrixInit) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "flipX" with the proper type (36) -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "flipY" with the proper type (37) -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "inverse" with the proper type (38) -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "transformPoint" with the proper type (39) +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "flipX()" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "flipY()" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "inverse()" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "transformPoint(DOMPointInit)" with the proper type PASS DOMMatrixReadOnly interface: calling transformPoint(DOMPointInit) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "toFloat32Array" with the proper type (40) -PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "toFloat64Array" with the proper type (41) +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "toFloat32Array()" with the proper type +PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "toFloat64Array()" with the proper type Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/motion-1/animation/offset-anchor-interpolation.html b/third_party/WebKit/LayoutTests/external/wpt/css/motion-1/animation/offset-anchor-interpolation.html new file mode 100644 index 0000000..414a0bd0d --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/motion-1/animation/offset-anchor-interpolation.html
@@ -0,0 +1,72 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <title>offset-anchor interpolation</title> + <link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> + <link rel="help" href="https://drafts.fxtf.org/motion-1/#offset-anchor-property"> + <meta name="assert" content="offset-anchor supports <position> animation."> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="resources/interpolation-testcommon.js"></script> + <style> + body { + width: 500px; + height: 500px; + transform: rotate(0deg); + } + div { + width: 10px; + height: 10px; + } + </style> + </head> + <body> + <script> + test_interpolation({ + property: 'offset-anchor', + from: '220px 240px', + to: '300px 400px', + }, [ + {at: -1, expect: '140px 80px'}, + {at: 0, expect: '220px 240px'}, + {at: 0.125, expect: '230px 260px'}, + {at: 0.875, expect: '290px 380px'}, + {at: 1, expect: '300px 400px'}, + {at: 2, expect: '380px 560px'} + ]); + + test_interpolation({ + property: 'offset-anchor', + from: 'left 480px top 400px', + to: 'right -140% bottom -60%', + }, [ + {at: -1, expect: 'calc(960px - 240%) calc(800px - 160%)'}, + {at: 0, expect: 'left 480px top 400px'}, + {at: 0.125, expect: 'calc(420px + 30%) calc(350px + 20%)'}, + {at: 0.875, expect: 'calc(210% + 60px) calc(140% + 50px)'}, + {at: 1, expect: 'right -140% bottom -60%'}, + {at: 2, expect: 'calc(480% - 480px) calc(320% - 400px)'} + ]); + + test_interpolation({ + property: 'offset-anchor', + from: 'left top', + to: 'left 8px bottom 20%', + }, [ + {at: -1, expect: '-8px -80%'}, + {at: 0, expect: 'left top'}, + {at: 0.125, expect: '1px 10%'}, + {at: 0.875, expect: '7px 70%'}, + {at: 1, expect: 'left 8px bottom 20%'}, + {at: 2, expect: '16px 160%'} + ]); + + test_no_interpolation({ + property: 'offset-anchor', + from: 'right 10px top 20%', + to: 'auto' + }); + </script> + </body> +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/motion-1/animation/offset-distance-interpolation.html b/third_party/WebKit/LayoutTests/external/wpt/css/motion-1/animation/offset-distance-interpolation.html new file mode 100644 index 0000000..a56878a0 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/motion-1/animation/offset-distance-interpolation.html
@@ -0,0 +1,55 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <title>offset-distance interpolation</title> + <link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> + <link rel="help" href="https://drafts.fxtf.org/motion-1/#offset-distance-property"> + <meta name="assert" content="offset-distance supports animation."> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="resources/interpolation-testcommon.js"></script> + </head> + <body> + <script> + test_interpolation({ + property: 'offset-distance', + from: '-30px', + to: '50px', + }, [ + {at: -1, expect: '-110px'}, + {at: 0, expect: '-30px'}, + {at: 0.125, expect: '-20px'}, + {at: 0.875, expect: '40px'}, + {at: 1, expect: '50px'}, + {at: 2, expect: '130px'} + ]); + + test_interpolation({ + property: 'offset-distance', + from: '20%', + to: '100%', + }, [ + {at: -1, expect: '-60%'}, + {at: 0, expect: '20%'}, + {at: 0.125, expect: '30%'}, + {at: 0.875, expect: '90%'}, + {at: 1, expect: '100%'}, + {at: 2, expect: '180%'} + ]); + + test_interpolation({ + property: 'offset-distance', + from: 'calc(20% - 30px)', + to: 'calc(50px + 100%)', + }, [ + {at: -1, expect: 'calc(-110px + -60%)'}, + {at: 0, expect: 'calc(20% - 30px)'}, + {at: 0.125, expect: 'calc(-20px + 30%)'}, + {at: 0.875, expect: 'calc(40px + 90%)'}, + {at: 1, expect: 'calc(50px + 100%)'}, + {at: 2, expect: 'calc(130px + 180%)'} + ]); + </script> + </body> +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/motion-1/animation/offset-position-interpolation.html b/third_party/WebKit/LayoutTests/external/wpt/css/motion-1/animation/offset-position-interpolation.html new file mode 100644 index 0000000..c31034d --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/motion-1/animation/offset-position-interpolation.html
@@ -0,0 +1,72 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <title>offset-position interpolation</title> + <link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> + <link rel="help" href="https://drafts.fxtf.org/motion-1/#offset-position-property"> + <meta name="assert" content="offset-position supports <position> animation."> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="resources/interpolation-testcommon.js"></script> + <style> + body { + width: 500px; + height: 500px; + transform: rotate(0deg); + } + div { + width: 10px; + height: 10px; + } + </style> + </head> + <body> + <script> + test_interpolation({ + property: 'offset-position', + from: '220px 240px', + to: '300px 400px', + }, [ + {at: -1, expect: '140px 80px'}, + {at: 0, expect: '220px 240px'}, + {at: 0.125, expect: '230px 260px'}, + {at: 0.875, expect: '290px 380px'}, + {at: 1, expect: '300px 400px'}, + {at: 2, expect: '380px 560px'} + ]); + + test_interpolation({ + property: 'offset-position', + from: 'left 480px top 400px', + to: 'right -140% bottom -60%', + }, [ + {at: -1, expect: 'calc(960px - 240%) calc(800px - 160%)'}, + {at: 0, expect: 'left 480px top 400px'}, + {at: 0.125, expect: 'calc(420px + 30%) calc(350px + 20%)'}, + {at: 0.875, expect: 'calc(210% + 60px) calc(140% + 50px)'}, + {at: 1, expect: 'right -140% bottom -60%'}, + {at: 2, expect: 'calc(480% - 480px) calc(320% - 400px)'} + ]); + + test_interpolation({ + property: 'offset-position', + from: 'left top', + to: 'left 8px bottom 20%', + }, [ + {at: -1, expect: '-8px -80%'}, + {at: 0, expect: 'left top'}, + {at: 0.125, expect: '1px 10%'}, + {at: 0.875, expect: '7px 70%'}, + {at: 1, expect: 'left 8px bottom 20%'}, + {at: 2, expect: '16px 160%'} + ]); + + test_no_interpolation({ + property: 'offset-position', + from: 'right 10px top 20%', + to: 'auto' + }); + </script> + </body> +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/motion-1/animation/offset-rotate-interpolation.html b/third_party/WebKit/LayoutTests/external/wpt/css/motion-1/animation/offset-rotate-interpolation.html new file mode 100644 index 0000000..a73c1a4 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/motion-1/animation/offset-rotate-interpolation.html
@@ -0,0 +1,55 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <title>offset-rotate interpolation</title> + <link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> + <link rel="help" href="https://drafts.fxtf.org/motion-1/#offset-rotate-property"> + <meta name="assert" content="offset-rotate supports animation."> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="resources/interpolation-testcommon.js"></script> + </head> + <body> + <script> + test_interpolation({ + property: 'offset-rotate', + from: '100deg', + to: '180deg', + }, [ + {at: -1, expect: '20deg'}, + {at: 0, expect: '100deg'}, + {at: 0.125, expect: '110deg'}, + {at: 0.875, expect: '170deg'}, + {at: 1, expect: '180deg'}, + {at: 2, expect: '260deg'} + ]); + + test_interpolation({ + property: 'offset-rotate', + from: 'auto 100deg', + to: 'reverse', + }, [ + {at: -1, expect: 'auto 20deg'}, + {at: 0, expect: 'auto 100deg'}, + {at: 0.125, expect: 'auto 110deg'}, + {at: 0.875, expect: 'auto 170deg'}, + {at: 1, expect: 'reverse'}, + {at: 2, expect: 'auto 260deg'} + ]); + + // No interpolation between auto/reverse and angle. + test_no_interpolation({ + property: 'offset-rotate', + from: 'reverse 90deg', + to: '360deg', + }); + + test_no_interpolation({ + property: 'offset-rotate', + from: '6rad', + to: 'auto', + }); + </script> + </body> +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/motion-1/animation/resources/interpolation-testcommon.js b/third_party/WebKit/LayoutTests/external/wpt/css/motion-1/animation/resources/interpolation-testcommon.js new file mode 100644 index 0000000..be86c43 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/motion-1/animation/resources/interpolation-testcommon.js
@@ -0,0 +1,65 @@ +'use strict'; +function test_interpolation(settings, expectations) { + // Returns a timing function that at 0.5 evaluates to progress. + function timingFunction(progress) { + if (progress === 0) + return 'steps(1, end)'; + if (progress === 1) + return 'steps(1, start)'; + var y = (8 * progress - 1) / 6; + return 'cubic-bezier(0, ' + y + ', 1, ' + y + ')'; + } + + test(function(){ + assert_true(CSS.supports(settings.property, settings.from), 'Value "' + settings.from + '" is supported by ' + settings.property); + assert_true(CSS.supports(settings.property, settings.to), 'Value "' + settings.to + '" is supported by ' + settings.property); + }, '"' + settings.from + '" and "' + settings.to + '" are valid ' + settings.property + ' values'); + + for (var i = 0; i < expectations.length; ++i) { + var progress = expectations[i].at; + var expectation = expectations[i].expect; + var animationId = 'anim' + i; + var targetId = 'target' + i; + var referenceId = 'reference' + i; + + test(function(){ + assert_true(CSS.supports(settings.property, expectation), 'Value "' + expectation + '" is supported by ' + settings.property); + + var stylesheet = document.createElement('style'); + stylesheet.textContent = + '#' + targetId + ' {\n' + + ' animation: 2s ' + timingFunction(progress) + ' -1s paused ' + animationId + ';\n' + + '}\n' + + '@keyframes ' + animationId + ' {\n' + + ' 0% { ' + settings.property + ': ' + settings.from + '; }\n' + + ' 100% { ' + settings.property + ': ' + settings.to + '; }\n' + + '}\n' + + '#' + referenceId + ' {\n' + + ' ' + settings.property + ': ' + expectation + ';\n' + + '}\n'; + document.head.appendChild(stylesheet); + + var target = document.createElement('div'); + target.id = targetId; + document.body.appendChild(target); + + var reference = document.createElement('div'); + reference.id = referenceId; + document.body.appendChild(reference); + reference.style = ''; + + assert_equals(getComputedStyle(target)[settings.property], getComputedStyle(reference)[settings.property]); + }, 'Animation between "' + settings.from + '" and "' + settings.to + '" at progress ' + progress); + } +} + +function test_no_interpolation(settings) { + var expectatFrom = [-1, 0, 0.125].map(function (progress) { + return {at: progress, expect: settings.from}; + }); + var expectatTo = [0.875, 1, 2].map(function (progress) { + return {at: progress, expect: settings.to}; + }); + + test_interpolation(settings, expectatFrom.concat(expectatTo)); +}
diff --git a/third_party/WebKit/LayoutTests/external/wpt/cssom-view/scrollIntoView-empty-args.html b/third_party/WebKit/LayoutTests/external/wpt/cssom-view/scrollIntoView-empty-args.html index 8ffd68a..3ea8cfc 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/cssom-view/scrollIntoView-empty-args.html +++ b/third_party/WebKit/LayoutTests/external/wpt/cssom-view/scrollIntoView-empty-args.html
@@ -2,49 +2,82 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <title>Check End Position of scrollIntoView when arg is not fully specified</title> -<div id="container" style="height: 2500px; width: 2500px;"> - <div id="content" style="height: 500px; width: 500px;margin-left: 1000px; margin-right: 1000px; margin-top: 1000px;margin-bottom: 1000px;background-color: red"> - </div> + +<style> + #container { + position: relative; + height: 1000px; + width: 800px; + overflow: scroll; + } + + #content { + position: absolute; + height: 500px; + width: 400px; + left: 1000px; + top: 1000px; + background-color: red; + } +</style> + +<div id="container"> + <div id="filler" style="height: 2500px; width: 2500px"></div> + <div id="content">I must become visible</div> </div> + <script> -add_completion_callback(() => document.getElementById("container").remove()); -var content_height = 500; -var content_width = 500; -var window_height = document.documentElement.clientHeight; -var window_width = document.documentElement.clientWidth; -var content = document.getElementById("content"); + add_completion_callback(() => document.getElementById("container").remove()); + var content = document.getElementById("content"); + var container = document.getElementById("container"); -function instantScrollToTestArgs(arg, expected_x, expected_y) { - window.scrollTo(0, 0); - assert_not_equals(window.scrollX, expected_x); - assert_not_equals(window.scrollY, expected_y); - if (arg == "omitted") - content.scrollIntoView(); - else - content.scrollIntoView(arg); - assert_approx_equals(window.scrollX, expected_x, 1); - assert_approx_equals(window.scrollY, expected_y, 1); -} + var remaining_width = container.clientWidth - content.clientWidth; + var remaining_height = container.clientHeight - content.clientHeight; -test(t => { + function instantScrollToTestArgs(arg, expected_x, expected_y) { + test(t => { + container.scrollTop = container.scrollLeft = 0; + + assert_not_equals(container.scrollLeft, expected_x); + assert_not_equals(container.scrollTop, expected_y); + if (arg == "omitted") + content.scrollIntoView(); + else + content.scrollIntoView(arg); + assert_approx_equals(container.scrollTop, expected_y, 1, "verify scroll top"); + assert_approx_equals(container.scrollLeft, expected_x, 1, "verify scroll left"); + + }, "scrollIntoView should behave correctly when the arg is " + arg); + } + + // expected alignment: inline => nearest, block => start instantScrollToTestArgs("omitted", - content.offsetLeft + content_width - window_width, + content.offsetLeft - remaining_width, content.offsetTop); + + // expected alignment: inline => nearest, block => start instantScrollToTestArgs(true, - content.offsetLeft + content_width - window_width, + content.offsetLeft - remaining_width, content.offsetTop); + + // expected alignment: inline => nearest, block => end instantScrollToTestArgs(false, - content.offsetLeft + content_width - window_width, - content.offsetTop + content_height - window_height); + content.offsetLeft - remaining_width, + content.offsetTop - remaining_height); + + // expected alignment: inline => center, block => center instantScrollToTestArgs({}, - content.offsetLeft + (content_width - window_width) / 2, - content.offsetTop + (content_height - window_height) / 2); + content.offsetLeft - remaining_width / 2, + content.offsetTop - remaining_height / 2); + + // expected alignment: inline => center, block => center instantScrollToTestArgs(null, - content.offsetLeft + (content_width - window_width) / 2, - content.offsetTop + (content_height - window_height) / 2); + content.offsetLeft - remaining_width / 2, + content.offsetTop - remaining_height / 2); + + // expected alignment: inline => nearest, block => start instantScrollToTestArgs(undefined, - content.offsetLeft + content_width - window_width, + content.offsetLeft - remaining_width, content.offsetTop); -}, "scrollIntoView should behave correctly when the arg is not fully specified as ScrollIntoViewOptions"); </script> \ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/cssom/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/cssom/interfaces-expected.txt index 884990cd..bc49385a 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/cssom/interfaces-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/cssom/interfaces-expected.txt
@@ -1,12 +1,12 @@ This is a testharness.js-based test. Found 191 tests; 165 PASS, 26 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS Document interface: attribute styleSheets -PASS Document interface: document must inherit property "styleSheets" with the proper type (0) -PASS Document interface: new Document() must inherit property "styleSheets" with the proper type (0) +PASS Document interface: document must inherit property "styleSheets" with the proper type +PASS Document interface: new Document() must inherit property "styleSheets" with the proper type PASS ProcessingInstruction interface: attribute sheet PASS HTMLElement interface: attribute style PASS SVGElement interface: attribute style -PASS Window interface: operation getComputedStyle(Element,DOMString) +PASS Window interface: operation getComputedStyle(Element, DOMString) PASS MediaList interface: existence and properties of interface object PASS MediaList interface object length PASS MediaList interface object name @@ -37,25 +37,25 @@ PASS CSSStyleSheet interface: existence and properties of interface prototype object's "constructor" property PASS CSSStyleSheet interface: attribute ownerRule PASS CSSStyleSheet interface: attribute cssRules -FAIL CSSStyleSheet interface: operation insertRule(DOMString,unsigned long) assert_equals: property has wrong .length expected 2 but got 1 +FAIL CSSStyleSheet interface: operation insertRule(DOMString, unsigned long) assert_equals: property has wrong .length expected 2 but got 1 PASS CSSStyleSheet interface: operation deleteRule(unsigned long) PASS CSSStyleSheet must be primary interface of style_element.sheet PASS Stringification of style_element.sheet -PASS CSSStyleSheet interface: style_element.sheet must inherit property "ownerRule" with the proper type (0) -PASS CSSStyleSheet interface: style_element.sheet must inherit property "cssRules" with the proper type (1) -PASS CSSStyleSheet interface: style_element.sheet must inherit property "insertRule" with the proper type (2) -FAIL CSSStyleSheet interface: calling insertRule(DOMString,unsigned long) on style_element.sheet with too few arguments must throw TypeError assert_throws: Called with 1 arguments function "function () { +PASS CSSStyleSheet interface: style_element.sheet must inherit property "ownerRule" with the proper type +PASS CSSStyleSheet interface: style_element.sheet must inherit property "cssRules" with the proper type +PASS CSSStyleSheet interface: style_element.sheet must inherit property "insertRule(DOMString, unsigned long)" with the proper type +FAIL CSSStyleSheet interface: calling insertRule(DOMString, unsigned long) on style_element.sheet with too few arguments must throw TypeError assert_throws: Called with 1 arguments function "function () { fn.apply(obj, args); }" threw object "SyntaxError: Failed to execute 'insertRule' on 'CSSStyleSheet': Failed to parse the rule 'foo'." ("SyntaxError") expected object "TypeError" ("TypeError") -PASS CSSStyleSheet interface: style_element.sheet must inherit property "deleteRule" with the proper type (3) +PASS CSSStyleSheet interface: style_element.sheet must inherit property "deleteRule(unsigned long)" with the proper type PASS CSSStyleSheet interface: calling deleteRule(unsigned long) on style_element.sheet with too few arguments must throw TypeError -PASS StyleSheet interface: style_element.sheet must inherit property "type" with the proper type (0) -PASS StyleSheet interface: style_element.sheet must inherit property "href" with the proper type (1) -PASS StyleSheet interface: style_element.sheet must inherit property "ownerNode" with the proper type (2) -PASS StyleSheet interface: style_element.sheet must inherit property "parentStyleSheet" with the proper type (3) -PASS StyleSheet interface: style_element.sheet must inherit property "title" with the proper type (4) -PASS StyleSheet interface: style_element.sheet must inherit property "media" with the proper type (5) -PASS StyleSheet interface: style_element.sheet must inherit property "disabled" with the proper type (6) +PASS StyleSheet interface: style_element.sheet must inherit property "type" with the proper type +PASS StyleSheet interface: style_element.sheet must inherit property "href" with the proper type +PASS StyleSheet interface: style_element.sheet must inherit property "ownerNode" with the proper type +PASS StyleSheet interface: style_element.sheet must inherit property "parentStyleSheet" with the proper type +PASS StyleSheet interface: style_element.sheet must inherit property "title" with the proper type +PASS StyleSheet interface: style_element.sheet must inherit property "media" with the proper type +PASS StyleSheet interface: style_element.sheet must inherit property "disabled" with the proper type PASS StyleSheetList interface: existence and properties of interface object PASS StyleSheetList interface object length PASS StyleSheetList interface object name @@ -65,9 +65,9 @@ PASS StyleSheetList interface: attribute length PASS StyleSheetList must be primary interface of document.styleSheets PASS Stringification of document.styleSheets -PASS StyleSheetList interface: document.styleSheets must inherit property "item" with the proper type (0) +PASS StyleSheetList interface: document.styleSheets must inherit property "item(unsigned long)" with the proper type PASS StyleSheetList interface: calling item(unsigned long) on document.styleSheets with too few arguments must throw TypeError -PASS StyleSheetList interface: document.styleSheets must inherit property "length" with the proper type (1) +PASS StyleSheetList interface: document.styleSheets must inherit property "length" with the proper type PASS CSSRuleList interface: existence and properties of interface object PASS CSSRuleList interface object length PASS CSSRuleList interface object name @@ -77,9 +77,9 @@ PASS CSSRuleList interface: attribute length PASS CSSRuleList must be primary interface of style_element.sheet.cssRules PASS Stringification of style_element.sheet.cssRules -PASS CSSRuleList interface: style_element.sheet.cssRules must inherit property "item" with the proper type (0) +PASS CSSRuleList interface: style_element.sheet.cssRules must inherit property "item(unsigned long)" with the proper type PASS CSSRuleList interface: calling item(unsigned long) on style_element.sheet.cssRules with too few arguments must throw TypeError -PASS CSSRuleList interface: style_element.sheet.cssRules must inherit property "length" with the proper type (1) +PASS CSSRuleList interface: style_element.sheet.cssRules must inherit property "length" with the proper type PASS CSSRule interface: existence and properties of interface object PASS CSSRule interface object length PASS CSSRule interface object name @@ -114,20 +114,20 @@ PASS CSSStyleRule interface: attribute style PASS CSSStyleRule must be primary interface of style_element.sheet.cssRules[0] PASS Stringification of style_element.sheet.cssRules[0] -PASS CSSStyleRule interface: style_element.sheet.cssRules[0] must inherit property "selectorText" with the proper type (0) -PASS CSSStyleRule interface: style_element.sheet.cssRules[0] must inherit property "style" with the proper type (1) -PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "STYLE_RULE" with the proper type (0) -PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "CHARSET_RULE" with the proper type (1) -PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "IMPORT_RULE" with the proper type (2) -PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "MEDIA_RULE" with the proper type (3) -PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "FONT_FACE_RULE" with the proper type (4) -PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "PAGE_RULE" with the proper type (5) -FAIL CSSRule interface: style_element.sheet.cssRules[0] must inherit property "MARGIN_RULE" with the proper type (6) assert_inherits: property "MARGIN_RULE" not found in prototype chain -PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "NAMESPACE_RULE" with the proper type (7) -PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "type" with the proper type (8) -PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "cssText" with the proper type (9) -PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "parentRule" with the proper type (10) -PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "parentStyleSheet" with the proper type (11) +PASS CSSStyleRule interface: style_element.sheet.cssRules[0] must inherit property "selectorText" with the proper type +PASS CSSStyleRule interface: style_element.sheet.cssRules[0] must inherit property "style" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "STYLE_RULE" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "CHARSET_RULE" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "IMPORT_RULE" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "MEDIA_RULE" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "FONT_FACE_RULE" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "PAGE_RULE" with the proper type +FAIL CSSRule interface: style_element.sheet.cssRules[0] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain +PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "NAMESPACE_RULE" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "type" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "cssText" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "parentRule" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "parentStyleSheet" with the proper type PASS CSSImportRule interface: existence and properties of interface object PASS CSSImportRule interface object length PASS CSSImportRule interface object name @@ -142,7 +142,7 @@ PASS CSSGroupingRule interface: existence and properties of interface prototype object PASS CSSGroupingRule interface: existence and properties of interface prototype object's "constructor" property PASS CSSGroupingRule interface: attribute cssRules -PASS CSSGroupingRule interface: operation insertRule(DOMString,unsigned long) +PASS CSSGroupingRule interface: operation insertRule(DOMString, unsigned long) PASS CSSGroupingRule interface: operation deleteRule(unsigned long) FAIL CSSMediaRule interface: existence and properties of interface object assert_equals: prototype of CSSMediaRule is not CSSGroupingRule expected function "function CSSGroupingRule() { [native code] }" but got function "function CSSConditionRule() { [native code] }" PASS CSSMediaRule interface object length @@ -181,9 +181,9 @@ PASS CSSStyleDeclaration interface: operation item(unsigned long) PASS CSSStyleDeclaration interface: operation getPropertyValue(DOMString) PASS CSSStyleDeclaration interface: operation getPropertyPriority(DOMString) -PASS CSSStyleDeclaration interface: operation setProperty(DOMString,DOMString,DOMString) -FAIL CSSStyleDeclaration interface: operation setPropertyValue(DOMString,DOMString) assert_own_property: interface prototype object missing non-static operation expected property "setPropertyValue" missing -FAIL CSSStyleDeclaration interface: operation setPropertyPriority(DOMString,DOMString) assert_own_property: interface prototype object missing non-static operation expected property "setPropertyPriority" missing +PASS CSSStyleDeclaration interface: operation setProperty(DOMString, DOMString, DOMString) +FAIL CSSStyleDeclaration interface: operation setPropertyValue(DOMString, DOMString) assert_own_property: interface prototype object missing non-static operation expected property "setPropertyValue" missing +FAIL CSSStyleDeclaration interface: operation setPropertyPriority(DOMString, DOMString) assert_own_property: interface prototype object missing non-static operation expected property "setPropertyPriority" missing PASS CSSStyleDeclaration interface: operation removeProperty(DOMString) PASS CSSStyleDeclaration interface: attribute parentRule PASS CSSStyleDeclaration interface: attribute cssFloat
diff --git a/third_party/WebKit/LayoutTests/external/wpt/dom/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/dom/interfaces-expected.txt index d102b79..13e41f99 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/dom/interfaces-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/dom/interfaces-expected.txt
@@ -25,92 +25,92 @@ PASS Event interface: operation preventDefault() PASS Event interface: attribute defaultPrevented PASS Event interface: attribute timeStamp -PASS Event interface: operation initEvent(DOMString,boolean,boolean) +PASS Event interface: operation initEvent(DOMString, boolean, boolean) PASS Event must be primary interface of document.createEvent("Event") PASS Stringification of document.createEvent("Event") -PASS Event interface: document.createEvent("Event") must inherit property "type" with the proper type (0) -PASS Event interface: document.createEvent("Event") must inherit property "target" with the proper type (1) -PASS Event interface: document.createEvent("Event") must inherit property "currentTarget" with the proper type (2) -PASS Event interface: document.createEvent("Event") must inherit property "NONE" with the proper type (3) -PASS Event interface: document.createEvent("Event") must inherit property "CAPTURING_PHASE" with the proper type (4) -PASS Event interface: document.createEvent("Event") must inherit property "AT_TARGET" with the proper type (5) -PASS Event interface: document.createEvent("Event") must inherit property "BUBBLING_PHASE" with the proper type (6) -PASS Event interface: document.createEvent("Event") must inherit property "eventPhase" with the proper type (7) -PASS Event interface: document.createEvent("Event") must inherit property "stopPropagation" with the proper type (8) -PASS Event interface: document.createEvent("Event") must inherit property "stopImmediatePropagation" with the proper type (9) -PASS Event interface: document.createEvent("Event") must inherit property "bubbles" with the proper type (10) -PASS Event interface: document.createEvent("Event") must inherit property "cancelable" with the proper type (11) -PASS Event interface: document.createEvent("Event") must inherit property "preventDefault" with the proper type (12) -PASS Event interface: document.createEvent("Event") must inherit property "defaultPrevented" with the proper type (13) +PASS Event interface: document.createEvent("Event") must inherit property "type" with the proper type +PASS Event interface: document.createEvent("Event") must inherit property "target" with the proper type +PASS Event interface: document.createEvent("Event") must inherit property "currentTarget" with the proper type +PASS Event interface: document.createEvent("Event") must inherit property "NONE" with the proper type +PASS Event interface: document.createEvent("Event") must inherit property "CAPTURING_PHASE" with the proper type +PASS Event interface: document.createEvent("Event") must inherit property "AT_TARGET" with the proper type +PASS Event interface: document.createEvent("Event") must inherit property "BUBBLING_PHASE" with the proper type +PASS Event interface: document.createEvent("Event") must inherit property "eventPhase" with the proper type +PASS Event interface: document.createEvent("Event") must inherit property "stopPropagation()" with the proper type +PASS Event interface: document.createEvent("Event") must inherit property "stopImmediatePropagation()" with the proper type +PASS Event interface: document.createEvent("Event") must inherit property "bubbles" with the proper type +PASS Event interface: document.createEvent("Event") must inherit property "cancelable" with the proper type +PASS Event interface: document.createEvent("Event") must inherit property "preventDefault()" with the proper type +PASS Event interface: document.createEvent("Event") must inherit property "defaultPrevented" with the proper type PASS Event interface: document.createEvent("Event") must have own property "isTrusted" -PASS Event interface: document.createEvent("Event") must inherit property "timeStamp" with the proper type (15) -PASS Event interface: document.createEvent("Event") must inherit property "initEvent" with the proper type (16) -PASS Event interface: calling initEvent(DOMString,boolean,boolean) on document.createEvent("Event") with too few arguments must throw TypeError +PASS Event interface: document.createEvent("Event") must inherit property "timeStamp" with the proper type +PASS Event interface: document.createEvent("Event") must inherit property "initEvent(DOMString, boolean, boolean)" with the proper type +PASS Event interface: calling initEvent(DOMString, boolean, boolean) on document.createEvent("Event") with too few arguments must throw TypeError PASS Event must be primary interface of new Event("foo") PASS Stringification of new Event("foo") -PASS Event interface: new Event("foo") must inherit property "type" with the proper type (0) -PASS Event interface: new Event("foo") must inherit property "target" with the proper type (1) -PASS Event interface: new Event("foo") must inherit property "currentTarget" with the proper type (2) -PASS Event interface: new Event("foo") must inherit property "NONE" with the proper type (3) -PASS Event interface: new Event("foo") must inherit property "CAPTURING_PHASE" with the proper type (4) -PASS Event interface: new Event("foo") must inherit property "AT_TARGET" with the proper type (5) -PASS Event interface: new Event("foo") must inherit property "BUBBLING_PHASE" with the proper type (6) -PASS Event interface: new Event("foo") must inherit property "eventPhase" with the proper type (7) -PASS Event interface: new Event("foo") must inherit property "stopPropagation" with the proper type (8) -PASS Event interface: new Event("foo") must inherit property "stopImmediatePropagation" with the proper type (9) -PASS Event interface: new Event("foo") must inherit property "bubbles" with the proper type (10) -PASS Event interface: new Event("foo") must inherit property "cancelable" with the proper type (11) -PASS Event interface: new Event("foo") must inherit property "preventDefault" with the proper type (12) -PASS Event interface: new Event("foo") must inherit property "defaultPrevented" with the proper type (13) +PASS Event interface: new Event("foo") must inherit property "type" with the proper type +PASS Event interface: new Event("foo") must inherit property "target" with the proper type +PASS Event interface: new Event("foo") must inherit property "currentTarget" with the proper type +PASS Event interface: new Event("foo") must inherit property "NONE" with the proper type +PASS Event interface: new Event("foo") must inherit property "CAPTURING_PHASE" with the proper type +PASS Event interface: new Event("foo") must inherit property "AT_TARGET" with the proper type +PASS Event interface: new Event("foo") must inherit property "BUBBLING_PHASE" with the proper type +PASS Event interface: new Event("foo") must inherit property "eventPhase" with the proper type +PASS Event interface: new Event("foo") must inherit property "stopPropagation()" with the proper type +PASS Event interface: new Event("foo") must inherit property "stopImmediatePropagation()" with the proper type +PASS Event interface: new Event("foo") must inherit property "bubbles" with the proper type +PASS Event interface: new Event("foo") must inherit property "cancelable" with the proper type +PASS Event interface: new Event("foo") must inherit property "preventDefault()" with the proper type +PASS Event interface: new Event("foo") must inherit property "defaultPrevented" with the proper type PASS Event interface: new Event("foo") must have own property "isTrusted" -PASS Event interface: new Event("foo") must inherit property "timeStamp" with the proper type (15) -PASS Event interface: new Event("foo") must inherit property "initEvent" with the proper type (16) -PASS Event interface: calling initEvent(DOMString,boolean,boolean) on new Event("foo") with too few arguments must throw TypeError +PASS Event interface: new Event("foo") must inherit property "timeStamp" with the proper type +PASS Event interface: new Event("foo") must inherit property "initEvent(DOMString, boolean, boolean)" with the proper type +PASS Event interface: calling initEvent(DOMString, boolean, boolean) on new Event("foo") with too few arguments must throw TypeError PASS CustomEvent interface: existence and properties of interface object PASS CustomEvent interface object length PASS CustomEvent interface object name PASS CustomEvent interface: existence and properties of interface prototype object PASS CustomEvent interface: existence and properties of interface prototype object's "constructor" property PASS CustomEvent interface: attribute detail -PASS CustomEvent interface: operation initCustomEvent(DOMString,boolean,boolean,any) +PASS CustomEvent interface: operation initCustomEvent(DOMString, boolean, boolean, any) PASS CustomEvent must be primary interface of new CustomEvent("foo") PASS Stringification of new CustomEvent("foo") -PASS CustomEvent interface: new CustomEvent("foo") must inherit property "detail" with the proper type (0) -PASS CustomEvent interface: new CustomEvent("foo") must inherit property "initCustomEvent" with the proper type (1) -PASS CustomEvent interface: calling initCustomEvent(DOMString,boolean,boolean,any) on new CustomEvent("foo") with too few arguments must throw TypeError -PASS Event interface: new CustomEvent("foo") must inherit property "type" with the proper type (0) -PASS Event interface: new CustomEvent("foo") must inherit property "target" with the proper type (1) -PASS Event interface: new CustomEvent("foo") must inherit property "currentTarget" with the proper type (2) -PASS Event interface: new CustomEvent("foo") must inherit property "NONE" with the proper type (3) -PASS Event interface: new CustomEvent("foo") must inherit property "CAPTURING_PHASE" with the proper type (4) -PASS Event interface: new CustomEvent("foo") must inherit property "AT_TARGET" with the proper type (5) -PASS Event interface: new CustomEvent("foo") must inherit property "BUBBLING_PHASE" with the proper type (6) -PASS Event interface: new CustomEvent("foo") must inherit property "eventPhase" with the proper type (7) -PASS Event interface: new CustomEvent("foo") must inherit property "stopPropagation" with the proper type (8) -PASS Event interface: new CustomEvent("foo") must inherit property "stopImmediatePropagation" with the proper type (9) -PASS Event interface: new CustomEvent("foo") must inherit property "bubbles" with the proper type (10) -PASS Event interface: new CustomEvent("foo") must inherit property "cancelable" with the proper type (11) -PASS Event interface: new CustomEvent("foo") must inherit property "preventDefault" with the proper type (12) -PASS Event interface: new CustomEvent("foo") must inherit property "defaultPrevented" with the proper type (13) +PASS CustomEvent interface: new CustomEvent("foo") must inherit property "detail" with the proper type +PASS CustomEvent interface: new CustomEvent("foo") must inherit property "initCustomEvent(DOMString, boolean, boolean, any)" with the proper type +PASS CustomEvent interface: calling initCustomEvent(DOMString, boolean, boolean, any) on new CustomEvent("foo") with too few arguments must throw TypeError +PASS Event interface: new CustomEvent("foo") must inherit property "type" with the proper type +PASS Event interface: new CustomEvent("foo") must inherit property "target" with the proper type +PASS Event interface: new CustomEvent("foo") must inherit property "currentTarget" with the proper type +PASS Event interface: new CustomEvent("foo") must inherit property "NONE" with the proper type +PASS Event interface: new CustomEvent("foo") must inherit property "CAPTURING_PHASE" with the proper type +PASS Event interface: new CustomEvent("foo") must inherit property "AT_TARGET" with the proper type +PASS Event interface: new CustomEvent("foo") must inherit property "BUBBLING_PHASE" with the proper type +PASS Event interface: new CustomEvent("foo") must inherit property "eventPhase" with the proper type +PASS Event interface: new CustomEvent("foo") must inherit property "stopPropagation()" with the proper type +PASS Event interface: new CustomEvent("foo") must inherit property "stopImmediatePropagation()" with the proper type +PASS Event interface: new CustomEvent("foo") must inherit property "bubbles" with the proper type +PASS Event interface: new CustomEvent("foo") must inherit property "cancelable" with the proper type +PASS Event interface: new CustomEvent("foo") must inherit property "preventDefault()" with the proper type +PASS Event interface: new CustomEvent("foo") must inherit property "defaultPrevented" with the proper type PASS Event interface: new CustomEvent("foo") must have own property "isTrusted" -PASS Event interface: new CustomEvent("foo") must inherit property "timeStamp" with the proper type (15) -PASS Event interface: new CustomEvent("foo") must inherit property "initEvent" with the proper type (16) -PASS Event interface: calling initEvent(DOMString,boolean,boolean) on new CustomEvent("foo") with too few arguments must throw TypeError +PASS Event interface: new CustomEvent("foo") must inherit property "timeStamp" with the proper type +PASS Event interface: new CustomEvent("foo") must inherit property "initEvent(DOMString, boolean, boolean)" with the proper type +PASS Event interface: calling initEvent(DOMString, boolean, boolean) on new CustomEvent("foo") with too few arguments must throw TypeError PASS EventTarget interface: existence and properties of interface object PASS EventTarget interface object length PASS EventTarget interface object name PASS EventTarget interface: existence and properties of interface prototype object PASS EventTarget interface: existence and properties of interface prototype object's "constructor" property -PASS EventTarget interface: operation addEventListener(DOMString,EventListener,[object Object],[object Object]) -PASS EventTarget interface: operation removeEventListener(DOMString,EventListener,[object Object],[object Object]) +PASS EventTarget interface: operation addEventListener(DOMString, EventListener, [object Object],[object Object]) +PASS EventTarget interface: operation removeEventListener(DOMString, EventListener, [object Object],[object Object]) PASS EventTarget interface: operation dispatchEvent(Event) FAIL EventTarget must be primary interface of new EventTarget() assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor" FAIL Stringification of new EventTarget() assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor" -FAIL EventTarget interface: new EventTarget() must inherit property "addEventListener" with the proper type (0) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor" -FAIL EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on new EventTarget() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor" -FAIL EventTarget interface: new EventTarget() must inherit property "removeEventListener" with the proper type (1) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor" -FAIL EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on new EventTarget() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor" -FAIL EventTarget interface: new EventTarget() must inherit property "dispatchEvent" with the proper type (2) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor" +FAIL EventTarget interface: new EventTarget() must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor" +FAIL EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on new EventTarget() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor" +FAIL EventTarget interface: new EventTarget() must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor" +FAIL EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on new EventTarget() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor" +FAIL EventTarget interface: new EventTarget() must inherit property "dispatchEvent(Event)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor" FAIL EventTarget interface: calling dispatchEvent(Event) on new EventTarget() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor" PASS EventListener interface: existence and properties of interface object PASS EventListener interface: existence and properties of interface prototype object @@ -125,8 +125,8 @@ FAIL AbortController interface: operation abort() assert_own_property: self does not have own property "AbortController" expected property "AbortController" missing FAIL AbortController must be primary interface of new AbortController() assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined" FAIL Stringification of new AbortController() assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined" -FAIL AbortController interface: new AbortController() must inherit property "signal" with the proper type (0) assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined" -FAIL AbortController interface: new AbortController() must inherit property "abort" with the proper type (1) assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined" +FAIL AbortController interface: new AbortController() must inherit property "signal" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined" +FAIL AbortController interface: new AbortController() must inherit property "abort()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined" FAIL AbortSignal interface: existence and properties of interface object assert_own_property: self does not have own property "AbortSignal" expected property "AbortSignal" missing FAIL AbortSignal interface object length assert_own_property: self does not have own property "AbortSignal" expected property "AbortSignal" missing FAIL AbortSignal interface object name assert_own_property: self does not have own property "AbortSignal" expected property "AbortSignal" missing @@ -136,13 +136,13 @@ FAIL AbortSignal interface: attribute onabort assert_own_property: self does not have own property "AbortSignal" expected property "AbortSignal" missing FAIL AbortSignal must be primary interface of new AbortController().signal assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined" FAIL Stringification of new AbortController().signal assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined" -FAIL AbortSignal interface: new AbortController().signal must inherit property "aborted" with the proper type (0) assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined" -FAIL AbortSignal interface: new AbortController().signal must inherit property "onabort" with the proper type (1) assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined" -FAIL EventTarget interface: new AbortController().signal must inherit property "addEventListener" with the proper type (0) assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined" -FAIL EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on new AbortController().signal with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined" -FAIL EventTarget interface: new AbortController().signal must inherit property "removeEventListener" with the proper type (1) assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined" -FAIL EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on new AbortController().signal with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined" -FAIL EventTarget interface: new AbortController().signal must inherit property "dispatchEvent" with the proper type (2) assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined" +FAIL AbortSignal interface: new AbortController().signal must inherit property "aborted" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined" +FAIL AbortSignal interface: new AbortController().signal must inherit property "onabort" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined" +FAIL EventTarget interface: new AbortController().signal must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined" +FAIL EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on new AbortController().signal with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined" +FAIL EventTarget interface: new AbortController().signal must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined" +FAIL EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on new AbortController().signal with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined" +FAIL EventTarget interface: new AbortController().signal must inherit property "dispatchEvent(Event)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined" FAIL EventTarget interface: calling dispatchEvent(Event) on new AbortController().signal with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined" PASS NodeList interface: existence and properties of interface object PASS NodeList interface object length @@ -153,9 +153,9 @@ PASS NodeList interface: attribute length PASS NodeList must be primary interface of document.querySelectorAll("script") PASS Stringification of document.querySelectorAll("script") -PASS NodeList interface: document.querySelectorAll("script") must inherit property "item" with the proper type (0) +PASS NodeList interface: document.querySelectorAll("script") must inherit property "item(unsigned long)" with the proper type PASS NodeList interface: calling item(unsigned long) on document.querySelectorAll("script") with too few arguments must throw TypeError -PASS NodeList interface: document.querySelectorAll("script") must inherit property "length" with the proper type (1) +PASS NodeList interface: document.querySelectorAll("script") must inherit property "length" with the proper type PASS HTMLCollection interface: existence and properties of interface object PASS HTMLCollection interface object length PASS HTMLCollection interface object name @@ -166,17 +166,17 @@ PASS HTMLCollection interface: operation namedItem(DOMString) PASS HTMLCollection must be primary interface of document.body.children PASS Stringification of document.body.children -PASS HTMLCollection interface: document.body.children must inherit property "length" with the proper type (0) -PASS HTMLCollection interface: document.body.children must inherit property "item" with the proper type (1) +PASS HTMLCollection interface: document.body.children must inherit property "length" with the proper type +PASS HTMLCollection interface: document.body.children must inherit property "item(unsigned long)" with the proper type PASS HTMLCollection interface: calling item(unsigned long) on document.body.children with too few arguments must throw TypeError -PASS HTMLCollection interface: document.body.children must inherit property "namedItem" with the proper type (2) +PASS HTMLCollection interface: document.body.children must inherit property "namedItem(DOMString)" with the proper type PASS HTMLCollection interface: calling namedItem(DOMString) on document.body.children with too few arguments must throw TypeError PASS MutationObserver interface: existence and properties of interface object PASS MutationObserver interface object length PASS MutationObserver interface object name PASS MutationObserver interface: existence and properties of interface prototype object PASS MutationObserver interface: existence and properties of interface prototype object's "constructor" property -PASS MutationObserver interface: operation observe(Node,MutationObserverInit) +PASS MutationObserver interface: operation observe(Node, MutationObserverInit) PASS MutationObserver interface: operation disconnect() PASS MutationObserver interface: operation takeRecords() PASS MutationRecord interface: existence and properties of interface object @@ -259,9 +259,9 @@ PASS Node interface: operation lookupPrefix(DOMString) PASS Node interface: operation lookupNamespaceURI(DOMString) PASS Node interface: operation isDefaultNamespace(DOMString) -PASS Node interface: operation insertBefore(Node,Node) +PASS Node interface: operation insertBefore(Node, Node) PASS Node interface: operation appendChild(Node) -PASS Node interface: operation replaceChild(Node,Node) +PASS Node interface: operation replaceChild(Node, Node) PASS Node interface: operation removeChild(Node) PASS Document interface: existence and properties of interface object PASS Document interface object length @@ -280,23 +280,23 @@ PASS Document interface: attribute doctype PASS Document interface: attribute documentElement PASS Document interface: operation getElementsByTagName(DOMString) -PASS Document interface: operation getElementsByTagNameNS(DOMString,DOMString) +PASS Document interface: operation getElementsByTagNameNS(DOMString, DOMString) PASS Document interface: operation getElementsByClassName(DOMString) -PASS Document interface: operation createElement(DOMString,ElementCreationOptions) -PASS Document interface: operation createElementNS(DOMString,DOMString,ElementCreationOptions) +PASS Document interface: operation createElement(DOMString, ElementCreationOptions) +PASS Document interface: operation createElementNS(DOMString, DOMString, ElementCreationOptions) PASS Document interface: operation createDocumentFragment() PASS Document interface: operation createTextNode(DOMString) PASS Document interface: operation createCDATASection(DOMString) PASS Document interface: operation createComment(DOMString) -PASS Document interface: operation createProcessingInstruction(DOMString,DOMString) -PASS Document interface: operation importNode(Node,boolean) +PASS Document interface: operation createProcessingInstruction(DOMString, DOMString) +PASS Document interface: operation importNode(Node, boolean) PASS Document interface: operation adoptNode(Node) PASS Document interface: operation createAttribute(DOMString) -PASS Document interface: operation createAttributeNS(DOMString,DOMString) +PASS Document interface: operation createAttributeNS(DOMString, DOMString) PASS Document interface: operation createEvent(DOMString) PASS Document interface: operation createRange() -PASS Document interface: operation createNodeIterator(Node,unsigned long,NodeFilter) -PASS Document interface: operation createTreeWalker(Node,unsigned long,NodeFilter) +PASS Document interface: operation createNodeIterator(Node, unsigned long, NodeFilter) +PASS Document interface: operation createTreeWalker(Node, unsigned long, NodeFilter) PASS Document interface: operation getElementById(DOMString) PASS Document interface: attribute children PASS Document interface: attribute firstElementChild @@ -308,130 +308,130 @@ PASS Document interface: operation querySelectorAll(DOMString) PASS Document must be primary interface of new Document() PASS Stringification of new Document() -PASS Document interface: new Document() must inherit property "implementation" with the proper type (0) -PASS Document interface: new Document() must inherit property "URL" with the proper type (1) -PASS Document interface: new Document() must inherit property "documentURI" with the proper type (2) -PASS Document interface: new Document() must inherit property "origin" with the proper type (3) -PASS Document interface: new Document() must inherit property "compatMode" with the proper type (4) -PASS Document interface: new Document() must inherit property "characterSet" with the proper type (5) -PASS Document interface: new Document() must inherit property "charset" with the proper type (6) -PASS Document interface: new Document() must inherit property "inputEncoding" with the proper type (7) -PASS Document interface: new Document() must inherit property "contentType" with the proper type (8) -PASS Document interface: new Document() must inherit property "doctype" with the proper type (9) -PASS Document interface: new Document() must inherit property "documentElement" with the proper type (10) -PASS Document interface: new Document() must inherit property "getElementsByTagName" with the proper type (11) +PASS Document interface: new Document() must inherit property "implementation" with the proper type +PASS Document interface: new Document() must inherit property "URL" with the proper type +PASS Document interface: new Document() must inherit property "documentURI" with the proper type +PASS Document interface: new Document() must inherit property "origin" with the proper type +PASS Document interface: new Document() must inherit property "compatMode" with the proper type +PASS Document interface: new Document() must inherit property "characterSet" with the proper type +PASS Document interface: new Document() must inherit property "charset" with the proper type +PASS Document interface: new Document() must inherit property "inputEncoding" with the proper type +PASS Document interface: new Document() must inherit property "contentType" with the proper type +PASS Document interface: new Document() must inherit property "doctype" with the proper type +PASS Document interface: new Document() must inherit property "documentElement" with the proper type +PASS Document interface: new Document() must inherit property "getElementsByTagName(DOMString)" with the proper type PASS Document interface: calling getElementsByTagName(DOMString) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "getElementsByTagNameNS" with the proper type (12) -PASS Document interface: calling getElementsByTagNameNS(DOMString,DOMString) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "getElementsByClassName" with the proper type (13) +PASS Document interface: new Document() must inherit property "getElementsByTagNameNS(DOMString, DOMString)" with the proper type +PASS Document interface: calling getElementsByTagNameNS(DOMString, DOMString) on new Document() with too few arguments must throw TypeError +PASS Document interface: new Document() must inherit property "getElementsByClassName(DOMString)" with the proper type PASS Document interface: calling getElementsByClassName(DOMString) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "createElement" with the proper type (14) -PASS Document interface: calling createElement(DOMString,ElementCreationOptions) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "createElementNS" with the proper type (15) -PASS Document interface: calling createElementNS(DOMString,DOMString,ElementCreationOptions) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "createDocumentFragment" with the proper type (16) -PASS Document interface: new Document() must inherit property "createTextNode" with the proper type (17) +PASS Document interface: new Document() must inherit property "createElement(DOMString, ElementCreationOptions)" with the proper type +PASS Document interface: calling createElement(DOMString, ElementCreationOptions) on new Document() with too few arguments must throw TypeError +PASS Document interface: new Document() must inherit property "createElementNS(DOMString, DOMString, ElementCreationOptions)" with the proper type +PASS Document interface: calling createElementNS(DOMString, DOMString, ElementCreationOptions) on new Document() with too few arguments must throw TypeError +PASS Document interface: new Document() must inherit property "createDocumentFragment()" with the proper type +PASS Document interface: new Document() must inherit property "createTextNode(DOMString)" with the proper type PASS Document interface: calling createTextNode(DOMString) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "createCDATASection" with the proper type (18) +PASS Document interface: new Document() must inherit property "createCDATASection(DOMString)" with the proper type PASS Document interface: calling createCDATASection(DOMString) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "createComment" with the proper type (19) +PASS Document interface: new Document() must inherit property "createComment(DOMString)" with the proper type PASS Document interface: calling createComment(DOMString) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "createProcessingInstruction" with the proper type (20) -PASS Document interface: calling createProcessingInstruction(DOMString,DOMString) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "importNode" with the proper type (21) -PASS Document interface: calling importNode(Node,boolean) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "adoptNode" with the proper type (22) +PASS Document interface: new Document() must inherit property "createProcessingInstruction(DOMString, DOMString)" with the proper type +PASS Document interface: calling createProcessingInstruction(DOMString, DOMString) on new Document() with too few arguments must throw TypeError +PASS Document interface: new Document() must inherit property "importNode(Node, boolean)" with the proper type +PASS Document interface: calling importNode(Node, boolean) on new Document() with too few arguments must throw TypeError +PASS Document interface: new Document() must inherit property "adoptNode(Node)" with the proper type PASS Document interface: calling adoptNode(Node) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "createAttribute" with the proper type (23) +PASS Document interface: new Document() must inherit property "createAttribute(DOMString)" with the proper type PASS Document interface: calling createAttribute(DOMString) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "createAttributeNS" with the proper type (24) -PASS Document interface: calling createAttributeNS(DOMString,DOMString) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "createEvent" with the proper type (25) +PASS Document interface: new Document() must inherit property "createAttributeNS(DOMString, DOMString)" with the proper type +PASS Document interface: calling createAttributeNS(DOMString, DOMString) on new Document() with too few arguments must throw TypeError +PASS Document interface: new Document() must inherit property "createEvent(DOMString)" with the proper type PASS Document interface: calling createEvent(DOMString) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "createRange" with the proper type (26) -PASS Document interface: new Document() must inherit property "createNodeIterator" with the proper type (27) -PASS Document interface: calling createNodeIterator(Node,unsigned long,NodeFilter) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "createTreeWalker" with the proper type (28) -PASS Document interface: calling createTreeWalker(Node,unsigned long,NodeFilter) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "getElementById" with the proper type (29) +PASS Document interface: new Document() must inherit property "createRange()" with the proper type +PASS Document interface: new Document() must inherit property "createNodeIterator(Node, unsigned long, NodeFilter)" with the proper type +PASS Document interface: calling createNodeIterator(Node, unsigned long, NodeFilter) on new Document() with too few arguments must throw TypeError +PASS Document interface: new Document() must inherit property "createTreeWalker(Node, unsigned long, NodeFilter)" with the proper type +PASS Document interface: calling createTreeWalker(Node, unsigned long, NodeFilter) on new Document() with too few arguments must throw TypeError +PASS Document interface: new Document() must inherit property "getElementById(DOMString)" with the proper type PASS Document interface: calling getElementById(DOMString) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "children" with the proper type (30) -PASS Document interface: new Document() must inherit property "firstElementChild" with the proper type (31) -PASS Document interface: new Document() must inherit property "lastElementChild" with the proper type (32) -PASS Document interface: new Document() must inherit property "childElementCount" with the proper type (33) -PASS Document interface: new Document() must inherit property "prepend" with the proper type (34) +PASS Document interface: new Document() must inherit property "children" with the proper type +PASS Document interface: new Document() must inherit property "firstElementChild" with the proper type +PASS Document interface: new Document() must inherit property "lastElementChild" with the proper type +PASS Document interface: new Document() must inherit property "childElementCount" with the proper type +PASS Document interface: new Document() must inherit property "prepend([object Object],[object Object])" with the proper type PASS Document interface: calling prepend([object Object],[object Object]) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "append" with the proper type (35) +PASS Document interface: new Document() must inherit property "append([object Object],[object Object])" with the proper type PASS Document interface: calling append([object Object],[object Object]) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "querySelector" with the proper type (36) +PASS Document interface: new Document() must inherit property "querySelector(DOMString)" with the proper type PASS Document interface: calling querySelector(DOMString) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "querySelectorAll" with the proper type (37) +PASS Document interface: new Document() must inherit property "querySelectorAll(DOMString)" with the proper type PASS Document interface: calling querySelectorAll(DOMString) on new Document() with too few arguments must throw TypeError -PASS Node interface: new Document() must inherit property "ELEMENT_NODE" with the proper type (0) -PASS Node interface: new Document() must inherit property "ATTRIBUTE_NODE" with the proper type (1) -PASS Node interface: new Document() must inherit property "TEXT_NODE" with the proper type (2) -PASS Node interface: new Document() must inherit property "CDATA_SECTION_NODE" with the proper type (3) -PASS Node interface: new Document() must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) -PASS Node interface: new Document() must inherit property "ENTITY_NODE" with the proper type (5) -PASS Node interface: new Document() must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) -PASS Node interface: new Document() must inherit property "COMMENT_NODE" with the proper type (7) -PASS Node interface: new Document() must inherit property "DOCUMENT_NODE" with the proper type (8) -PASS Node interface: new Document() must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) -PASS Node interface: new Document() must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) -PASS Node interface: new Document() must inherit property "NOTATION_NODE" with the proper type (11) -PASS Node interface: new Document() must inherit property "nodeType" with the proper type (12) -PASS Node interface: new Document() must inherit property "nodeName" with the proper type (13) -PASS Node interface: new Document() must inherit property "baseURI" with the proper type (14) -PASS Node interface: new Document() must inherit property "isConnected" with the proper type (15) -PASS Node interface: new Document() must inherit property "ownerDocument" with the proper type (16) -PASS Node interface: new Document() must inherit property "getRootNode" with the proper type (17) +PASS Node interface: new Document() must inherit property "ELEMENT_NODE" with the proper type +PASS Node interface: new Document() must inherit property "ATTRIBUTE_NODE" with the proper type +PASS Node interface: new Document() must inherit property "TEXT_NODE" with the proper type +PASS Node interface: new Document() must inherit property "CDATA_SECTION_NODE" with the proper type +PASS Node interface: new Document() must inherit property "ENTITY_REFERENCE_NODE" with the proper type +PASS Node interface: new Document() must inherit property "ENTITY_NODE" with the proper type +PASS Node interface: new Document() must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type +PASS Node interface: new Document() must inherit property "COMMENT_NODE" with the proper type +PASS Node interface: new Document() must inherit property "DOCUMENT_NODE" with the proper type +PASS Node interface: new Document() must inherit property "DOCUMENT_TYPE_NODE" with the proper type +PASS Node interface: new Document() must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type +PASS Node interface: new Document() must inherit property "NOTATION_NODE" with the proper type +PASS Node interface: new Document() must inherit property "nodeType" with the proper type +PASS Node interface: new Document() must inherit property "nodeName" with the proper type +PASS Node interface: new Document() must inherit property "baseURI" with the proper type +PASS Node interface: new Document() must inherit property "isConnected" with the proper type +PASS Node interface: new Document() must inherit property "ownerDocument" with the proper type +PASS Node interface: new Document() must inherit property "getRootNode(GetRootNodeOptions)" with the proper type PASS Node interface: calling getRootNode(GetRootNodeOptions) on new Document() with too few arguments must throw TypeError -PASS Node interface: new Document() must inherit property "parentNode" with the proper type (18) -PASS Node interface: new Document() must inherit property "parentElement" with the proper type (19) -PASS Node interface: new Document() must inherit property "hasChildNodes" with the proper type (20) -PASS Node interface: new Document() must inherit property "childNodes" with the proper type (21) -PASS Node interface: new Document() must inherit property "firstChild" with the proper type (22) -PASS Node interface: new Document() must inherit property "lastChild" with the proper type (23) -PASS Node interface: new Document() must inherit property "previousSibling" with the proper type (24) -PASS Node interface: new Document() must inherit property "nextSibling" with the proper type (25) -PASS Node interface: new Document() must inherit property "nodeValue" with the proper type (26) -PASS Node interface: new Document() must inherit property "textContent" with the proper type (27) -PASS Node interface: new Document() must inherit property "normalize" with the proper type (28) -PASS Node interface: new Document() must inherit property "cloneNode" with the proper type (29) +PASS Node interface: new Document() must inherit property "parentNode" with the proper type +PASS Node interface: new Document() must inherit property "parentElement" with the proper type +PASS Node interface: new Document() must inherit property "hasChildNodes()" with the proper type +PASS Node interface: new Document() must inherit property "childNodes" with the proper type +PASS Node interface: new Document() must inherit property "firstChild" with the proper type +PASS Node interface: new Document() must inherit property "lastChild" with the proper type +PASS Node interface: new Document() must inherit property "previousSibling" with the proper type +PASS Node interface: new Document() must inherit property "nextSibling" with the proper type +PASS Node interface: new Document() must inherit property "nodeValue" with the proper type +PASS Node interface: new Document() must inherit property "textContent" with the proper type +PASS Node interface: new Document() must inherit property "normalize()" with the proper type +PASS Node interface: new Document() must inherit property "cloneNode(boolean)" with the proper type PASS Node interface: calling cloneNode(boolean) on new Document() with too few arguments must throw TypeError -PASS Node interface: new Document() must inherit property "isEqualNode" with the proper type (30) +PASS Node interface: new Document() must inherit property "isEqualNode(Node)" with the proper type PASS Node interface: calling isEqualNode(Node) on new Document() with too few arguments must throw TypeError -PASS Node interface: new Document() must inherit property "isSameNode" with the proper type (31) +PASS Node interface: new Document() must inherit property "isSameNode(Node)" with the proper type PASS Node interface: calling isSameNode(Node) on new Document() with too few arguments must throw TypeError -PASS Node interface: new Document() must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) -PASS Node interface: new Document() must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) -PASS Node interface: new Document() must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) -PASS Node interface: new Document() must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) -PASS Node interface: new Document() must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) -PASS Node interface: new Document() must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) -PASS Node interface: new Document() must inherit property "compareDocumentPosition" with the proper type (38) +PASS Node interface: new Document() must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type +PASS Node interface: new Document() must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type +PASS Node interface: new Document() must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type +PASS Node interface: new Document() must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type +PASS Node interface: new Document() must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type +PASS Node interface: new Document() must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type +PASS Node interface: new Document() must inherit property "compareDocumentPosition(Node)" with the proper type PASS Node interface: calling compareDocumentPosition(Node) on new Document() with too few arguments must throw TypeError -PASS Node interface: new Document() must inherit property "contains" with the proper type (39) +PASS Node interface: new Document() must inherit property "contains(Node)" with the proper type PASS Node interface: calling contains(Node) on new Document() with too few arguments must throw TypeError -PASS Node interface: new Document() must inherit property "lookupPrefix" with the proper type (40) +PASS Node interface: new Document() must inherit property "lookupPrefix(DOMString)" with the proper type PASS Node interface: calling lookupPrefix(DOMString) on new Document() with too few arguments must throw TypeError -PASS Node interface: new Document() must inherit property "lookupNamespaceURI" with the proper type (41) +PASS Node interface: new Document() must inherit property "lookupNamespaceURI(DOMString)" with the proper type PASS Node interface: calling lookupNamespaceURI(DOMString) on new Document() with too few arguments must throw TypeError -PASS Node interface: new Document() must inherit property "isDefaultNamespace" with the proper type (42) +PASS Node interface: new Document() must inherit property "isDefaultNamespace(DOMString)" with the proper type PASS Node interface: calling isDefaultNamespace(DOMString) on new Document() with too few arguments must throw TypeError -PASS Node interface: new Document() must inherit property "insertBefore" with the proper type (43) -PASS Node interface: calling insertBefore(Node,Node) on new Document() with too few arguments must throw TypeError -PASS Node interface: new Document() must inherit property "appendChild" with the proper type (44) +PASS Node interface: new Document() must inherit property "insertBefore(Node, Node)" with the proper type +PASS Node interface: calling insertBefore(Node, Node) on new Document() with too few arguments must throw TypeError +PASS Node interface: new Document() must inherit property "appendChild(Node)" with the proper type PASS Node interface: calling appendChild(Node) on new Document() with too few arguments must throw TypeError -PASS Node interface: new Document() must inherit property "replaceChild" with the proper type (45) -PASS Node interface: calling replaceChild(Node,Node) on new Document() with too few arguments must throw TypeError -PASS Node interface: new Document() must inherit property "removeChild" with the proper type (46) +PASS Node interface: new Document() must inherit property "replaceChild(Node, Node)" with the proper type +PASS Node interface: calling replaceChild(Node, Node) on new Document() with too few arguments must throw TypeError +PASS Node interface: new Document() must inherit property "removeChild(Node)" with the proper type PASS Node interface: calling removeChild(Node) on new Document() with too few arguments must throw TypeError -PASS EventTarget interface: new Document() must inherit property "addEventListener" with the proper type (0) -PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on new Document() with too few arguments must throw TypeError -PASS EventTarget interface: new Document() must inherit property "removeEventListener" with the proper type (1) -PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on new Document() with too few arguments must throw TypeError -PASS EventTarget interface: new Document() must inherit property "dispatchEvent" with the proper type (2) +PASS EventTarget interface: new Document() must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on new Document() with too few arguments must throw TypeError +PASS EventTarget interface: new Document() must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on new Document() with too few arguments must throw TypeError +PASS EventTarget interface: new Document() must inherit property "dispatchEvent(Event)" with the proper type PASS EventTarget interface: calling dispatchEvent(Event) on new Document() with too few arguments must throw TypeError PASS XMLDocument interface: existence and properties of interface object PASS XMLDocument interface object length @@ -440,149 +440,149 @@ PASS XMLDocument interface: existence and properties of interface prototype object's "constructor" property PASS XMLDocument must be primary interface of xmlDoc PASS Stringification of xmlDoc -PASS Document interface: xmlDoc must inherit property "implementation" with the proper type (0) -PASS Document interface: xmlDoc must inherit property "URL" with the proper type (1) -PASS Document interface: xmlDoc must inherit property "documentURI" with the proper type (2) -PASS Document interface: xmlDoc must inherit property "origin" with the proper type (3) -PASS Document interface: xmlDoc must inherit property "compatMode" with the proper type (4) -PASS Document interface: xmlDoc must inherit property "characterSet" with the proper type (5) -PASS Document interface: xmlDoc must inherit property "charset" with the proper type (6) -PASS Document interface: xmlDoc must inherit property "inputEncoding" with the proper type (7) -PASS Document interface: xmlDoc must inherit property "contentType" with the proper type (8) -PASS Document interface: xmlDoc must inherit property "doctype" with the proper type (9) -PASS Document interface: xmlDoc must inherit property "documentElement" with the proper type (10) -PASS Document interface: xmlDoc must inherit property "getElementsByTagName" with the proper type (11) +PASS Document interface: xmlDoc must inherit property "implementation" with the proper type +PASS Document interface: xmlDoc must inherit property "URL" with the proper type +PASS Document interface: xmlDoc must inherit property "documentURI" with the proper type +PASS Document interface: xmlDoc must inherit property "origin" with the proper type +PASS Document interface: xmlDoc must inherit property "compatMode" with the proper type +PASS Document interface: xmlDoc must inherit property "characterSet" with the proper type +PASS Document interface: xmlDoc must inherit property "charset" with the proper type +PASS Document interface: xmlDoc must inherit property "inputEncoding" with the proper type +PASS Document interface: xmlDoc must inherit property "contentType" with the proper type +PASS Document interface: xmlDoc must inherit property "doctype" with the proper type +PASS Document interface: xmlDoc must inherit property "documentElement" with the proper type +PASS Document interface: xmlDoc must inherit property "getElementsByTagName(DOMString)" with the proper type PASS Document interface: calling getElementsByTagName(DOMString) on xmlDoc with too few arguments must throw TypeError -PASS Document interface: xmlDoc must inherit property "getElementsByTagNameNS" with the proper type (12) -PASS Document interface: calling getElementsByTagNameNS(DOMString,DOMString) on xmlDoc with too few arguments must throw TypeError -PASS Document interface: xmlDoc must inherit property "getElementsByClassName" with the proper type (13) +PASS Document interface: xmlDoc must inherit property "getElementsByTagNameNS(DOMString, DOMString)" with the proper type +PASS Document interface: calling getElementsByTagNameNS(DOMString, DOMString) on xmlDoc with too few arguments must throw TypeError +PASS Document interface: xmlDoc must inherit property "getElementsByClassName(DOMString)" with the proper type PASS Document interface: calling getElementsByClassName(DOMString) on xmlDoc with too few arguments must throw TypeError -PASS Document interface: xmlDoc must inherit property "createElement" with the proper type (14) -PASS Document interface: calling createElement(DOMString,ElementCreationOptions) on xmlDoc with too few arguments must throw TypeError -PASS Document interface: xmlDoc must inherit property "createElementNS" with the proper type (15) -PASS Document interface: calling createElementNS(DOMString,DOMString,ElementCreationOptions) on xmlDoc with too few arguments must throw TypeError -PASS Document interface: xmlDoc must inherit property "createDocumentFragment" with the proper type (16) -PASS Document interface: xmlDoc must inherit property "createTextNode" with the proper type (17) +PASS Document interface: xmlDoc must inherit property "createElement(DOMString, ElementCreationOptions)" with the proper type +PASS Document interface: calling createElement(DOMString, ElementCreationOptions) on xmlDoc with too few arguments must throw TypeError +PASS Document interface: xmlDoc must inherit property "createElementNS(DOMString, DOMString, ElementCreationOptions)" with the proper type +PASS Document interface: calling createElementNS(DOMString, DOMString, ElementCreationOptions) on xmlDoc with too few arguments must throw TypeError +PASS Document interface: xmlDoc must inherit property "createDocumentFragment()" with the proper type +PASS Document interface: xmlDoc must inherit property "createTextNode(DOMString)" with the proper type PASS Document interface: calling createTextNode(DOMString) on xmlDoc with too few arguments must throw TypeError -PASS Document interface: xmlDoc must inherit property "createCDATASection" with the proper type (18) +PASS Document interface: xmlDoc must inherit property "createCDATASection(DOMString)" with the proper type PASS Document interface: calling createCDATASection(DOMString) on xmlDoc with too few arguments must throw TypeError -PASS Document interface: xmlDoc must inherit property "createComment" with the proper type (19) +PASS Document interface: xmlDoc must inherit property "createComment(DOMString)" with the proper type PASS Document interface: calling createComment(DOMString) on xmlDoc with too few arguments must throw TypeError -PASS Document interface: xmlDoc must inherit property "createProcessingInstruction" with the proper type (20) -PASS Document interface: calling createProcessingInstruction(DOMString,DOMString) on xmlDoc with too few arguments must throw TypeError -PASS Document interface: xmlDoc must inherit property "importNode" with the proper type (21) -PASS Document interface: calling importNode(Node,boolean) on xmlDoc with too few arguments must throw TypeError -PASS Document interface: xmlDoc must inherit property "adoptNode" with the proper type (22) +PASS Document interface: xmlDoc must inherit property "createProcessingInstruction(DOMString, DOMString)" with the proper type +PASS Document interface: calling createProcessingInstruction(DOMString, DOMString) on xmlDoc with too few arguments must throw TypeError +PASS Document interface: xmlDoc must inherit property "importNode(Node, boolean)" with the proper type +PASS Document interface: calling importNode(Node, boolean) on xmlDoc with too few arguments must throw TypeError +PASS Document interface: xmlDoc must inherit property "adoptNode(Node)" with the proper type PASS Document interface: calling adoptNode(Node) on xmlDoc with too few arguments must throw TypeError -PASS Document interface: xmlDoc must inherit property "createAttribute" with the proper type (23) +PASS Document interface: xmlDoc must inherit property "createAttribute(DOMString)" with the proper type PASS Document interface: calling createAttribute(DOMString) on xmlDoc with too few arguments must throw TypeError -PASS Document interface: xmlDoc must inherit property "createAttributeNS" with the proper type (24) -PASS Document interface: calling createAttributeNS(DOMString,DOMString) on xmlDoc with too few arguments must throw TypeError -PASS Document interface: xmlDoc must inherit property "createEvent" with the proper type (25) +PASS Document interface: xmlDoc must inherit property "createAttributeNS(DOMString, DOMString)" with the proper type +PASS Document interface: calling createAttributeNS(DOMString, DOMString) on xmlDoc with too few arguments must throw TypeError +PASS Document interface: xmlDoc must inherit property "createEvent(DOMString)" with the proper type PASS Document interface: calling createEvent(DOMString) on xmlDoc with too few arguments must throw TypeError -PASS Document interface: xmlDoc must inherit property "createRange" with the proper type (26) -PASS Document interface: xmlDoc must inherit property "createNodeIterator" with the proper type (27) -PASS Document interface: calling createNodeIterator(Node,unsigned long,NodeFilter) on xmlDoc with too few arguments must throw TypeError -PASS Document interface: xmlDoc must inherit property "createTreeWalker" with the proper type (28) -PASS Document interface: calling createTreeWalker(Node,unsigned long,NodeFilter) on xmlDoc with too few arguments must throw TypeError -PASS Document interface: xmlDoc must inherit property "getElementById" with the proper type (29) +PASS Document interface: xmlDoc must inherit property "createRange()" with the proper type +PASS Document interface: xmlDoc must inherit property "createNodeIterator(Node, unsigned long, NodeFilter)" with the proper type +PASS Document interface: calling createNodeIterator(Node, unsigned long, NodeFilter) on xmlDoc with too few arguments must throw TypeError +PASS Document interface: xmlDoc must inherit property "createTreeWalker(Node, unsigned long, NodeFilter)" with the proper type +PASS Document interface: calling createTreeWalker(Node, unsigned long, NodeFilter) on xmlDoc with too few arguments must throw TypeError +PASS Document interface: xmlDoc must inherit property "getElementById(DOMString)" with the proper type PASS Document interface: calling getElementById(DOMString) on xmlDoc with too few arguments must throw TypeError -PASS Document interface: xmlDoc must inherit property "children" with the proper type (30) -PASS Document interface: xmlDoc must inherit property "firstElementChild" with the proper type (31) -PASS Document interface: xmlDoc must inherit property "lastElementChild" with the proper type (32) -PASS Document interface: xmlDoc must inherit property "childElementCount" with the proper type (33) -PASS Document interface: xmlDoc must inherit property "prepend" with the proper type (34) +PASS Document interface: xmlDoc must inherit property "children" with the proper type +PASS Document interface: xmlDoc must inherit property "firstElementChild" with the proper type +PASS Document interface: xmlDoc must inherit property "lastElementChild" with the proper type +PASS Document interface: xmlDoc must inherit property "childElementCount" with the proper type +PASS Document interface: xmlDoc must inherit property "prepend([object Object],[object Object])" with the proper type PASS Document interface: calling prepend([object Object],[object Object]) on xmlDoc with too few arguments must throw TypeError -PASS Document interface: xmlDoc must inherit property "append" with the proper type (35) +PASS Document interface: xmlDoc must inherit property "append([object Object],[object Object])" with the proper type PASS Document interface: calling append([object Object],[object Object]) on xmlDoc with too few arguments must throw TypeError -PASS Document interface: xmlDoc must inherit property "querySelector" with the proper type (36) +PASS Document interface: xmlDoc must inherit property "querySelector(DOMString)" with the proper type PASS Document interface: calling querySelector(DOMString) on xmlDoc with too few arguments must throw TypeError -PASS Document interface: xmlDoc must inherit property "querySelectorAll" with the proper type (37) +PASS Document interface: xmlDoc must inherit property "querySelectorAll(DOMString)" with the proper type PASS Document interface: calling querySelectorAll(DOMString) on xmlDoc with too few arguments must throw TypeError -PASS Node interface: xmlDoc must inherit property "ELEMENT_NODE" with the proper type (0) -PASS Node interface: xmlDoc must inherit property "ATTRIBUTE_NODE" with the proper type (1) -PASS Node interface: xmlDoc must inherit property "TEXT_NODE" with the proper type (2) -PASS Node interface: xmlDoc must inherit property "CDATA_SECTION_NODE" with the proper type (3) -PASS Node interface: xmlDoc must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) -PASS Node interface: xmlDoc must inherit property "ENTITY_NODE" with the proper type (5) -PASS Node interface: xmlDoc must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) -PASS Node interface: xmlDoc must inherit property "COMMENT_NODE" with the proper type (7) -PASS Node interface: xmlDoc must inherit property "DOCUMENT_NODE" with the proper type (8) -PASS Node interface: xmlDoc must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) -PASS Node interface: xmlDoc must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) -PASS Node interface: xmlDoc must inherit property "NOTATION_NODE" with the proper type (11) -PASS Node interface: xmlDoc must inherit property "nodeType" with the proper type (12) -PASS Node interface: xmlDoc must inherit property "nodeName" with the proper type (13) -PASS Node interface: xmlDoc must inherit property "baseURI" with the proper type (14) -PASS Node interface: xmlDoc must inherit property "isConnected" with the proper type (15) -PASS Node interface: xmlDoc must inherit property "ownerDocument" with the proper type (16) -PASS Node interface: xmlDoc must inherit property "getRootNode" with the proper type (17) +PASS Node interface: xmlDoc must inherit property "ELEMENT_NODE" with the proper type +PASS Node interface: xmlDoc must inherit property "ATTRIBUTE_NODE" with the proper type +PASS Node interface: xmlDoc must inherit property "TEXT_NODE" with the proper type +PASS Node interface: xmlDoc must inherit property "CDATA_SECTION_NODE" with the proper type +PASS Node interface: xmlDoc must inherit property "ENTITY_REFERENCE_NODE" with the proper type +PASS Node interface: xmlDoc must inherit property "ENTITY_NODE" with the proper type +PASS Node interface: xmlDoc must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type +PASS Node interface: xmlDoc must inherit property "COMMENT_NODE" with the proper type +PASS Node interface: xmlDoc must inherit property "DOCUMENT_NODE" with the proper type +PASS Node interface: xmlDoc must inherit property "DOCUMENT_TYPE_NODE" with the proper type +PASS Node interface: xmlDoc must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type +PASS Node interface: xmlDoc must inherit property "NOTATION_NODE" with the proper type +PASS Node interface: xmlDoc must inherit property "nodeType" with the proper type +PASS Node interface: xmlDoc must inherit property "nodeName" with the proper type +PASS Node interface: xmlDoc must inherit property "baseURI" with the proper type +PASS Node interface: xmlDoc must inherit property "isConnected" with the proper type +PASS Node interface: xmlDoc must inherit property "ownerDocument" with the proper type +PASS Node interface: xmlDoc must inherit property "getRootNode(GetRootNodeOptions)" with the proper type PASS Node interface: calling getRootNode(GetRootNodeOptions) on xmlDoc with too few arguments must throw TypeError -PASS Node interface: xmlDoc must inherit property "parentNode" with the proper type (18) -PASS Node interface: xmlDoc must inherit property "parentElement" with the proper type (19) -PASS Node interface: xmlDoc must inherit property "hasChildNodes" with the proper type (20) -PASS Node interface: xmlDoc must inherit property "childNodes" with the proper type (21) -PASS Node interface: xmlDoc must inherit property "firstChild" with the proper type (22) -PASS Node interface: xmlDoc must inherit property "lastChild" with the proper type (23) -PASS Node interface: xmlDoc must inherit property "previousSibling" with the proper type (24) -PASS Node interface: xmlDoc must inherit property "nextSibling" with the proper type (25) -PASS Node interface: xmlDoc must inherit property "nodeValue" with the proper type (26) -PASS Node interface: xmlDoc must inherit property "textContent" with the proper type (27) -PASS Node interface: xmlDoc must inherit property "normalize" with the proper type (28) -PASS Node interface: xmlDoc must inherit property "cloneNode" with the proper type (29) +PASS Node interface: xmlDoc must inherit property "parentNode" with the proper type +PASS Node interface: xmlDoc must inherit property "parentElement" with the proper type +PASS Node interface: xmlDoc must inherit property "hasChildNodes()" with the proper type +PASS Node interface: xmlDoc must inherit property "childNodes" with the proper type +PASS Node interface: xmlDoc must inherit property "firstChild" with the proper type +PASS Node interface: xmlDoc must inherit property "lastChild" with the proper type +PASS Node interface: xmlDoc must inherit property "previousSibling" with the proper type +PASS Node interface: xmlDoc must inherit property "nextSibling" with the proper type +PASS Node interface: xmlDoc must inherit property "nodeValue" with the proper type +PASS Node interface: xmlDoc must inherit property "textContent" with the proper type +PASS Node interface: xmlDoc must inherit property "normalize()" with the proper type +PASS Node interface: xmlDoc must inherit property "cloneNode(boolean)" with the proper type PASS Node interface: calling cloneNode(boolean) on xmlDoc with too few arguments must throw TypeError -PASS Node interface: xmlDoc must inherit property "isEqualNode" with the proper type (30) +PASS Node interface: xmlDoc must inherit property "isEqualNode(Node)" with the proper type PASS Node interface: calling isEqualNode(Node) on xmlDoc with too few arguments must throw TypeError -PASS Node interface: xmlDoc must inherit property "isSameNode" with the proper type (31) +PASS Node interface: xmlDoc must inherit property "isSameNode(Node)" with the proper type PASS Node interface: calling isSameNode(Node) on xmlDoc with too few arguments must throw TypeError -PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) -PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) -PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) -PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) -PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) -PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) -PASS Node interface: xmlDoc must inherit property "compareDocumentPosition" with the proper type (38) +PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type +PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type +PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type +PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type +PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type +PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type +PASS Node interface: xmlDoc must inherit property "compareDocumentPosition(Node)" with the proper type PASS Node interface: calling compareDocumentPosition(Node) on xmlDoc with too few arguments must throw TypeError -PASS Node interface: xmlDoc must inherit property "contains" with the proper type (39) +PASS Node interface: xmlDoc must inherit property "contains(Node)" with the proper type PASS Node interface: calling contains(Node) on xmlDoc with too few arguments must throw TypeError -PASS Node interface: xmlDoc must inherit property "lookupPrefix" with the proper type (40) +PASS Node interface: xmlDoc must inherit property "lookupPrefix(DOMString)" with the proper type PASS Node interface: calling lookupPrefix(DOMString) on xmlDoc with too few arguments must throw TypeError -PASS Node interface: xmlDoc must inherit property "lookupNamespaceURI" with the proper type (41) +PASS Node interface: xmlDoc must inherit property "lookupNamespaceURI(DOMString)" with the proper type PASS Node interface: calling lookupNamespaceURI(DOMString) on xmlDoc with too few arguments must throw TypeError -PASS Node interface: xmlDoc must inherit property "isDefaultNamespace" with the proper type (42) +PASS Node interface: xmlDoc must inherit property "isDefaultNamespace(DOMString)" with the proper type PASS Node interface: calling isDefaultNamespace(DOMString) on xmlDoc with too few arguments must throw TypeError -PASS Node interface: xmlDoc must inherit property "insertBefore" with the proper type (43) -PASS Node interface: calling insertBefore(Node,Node) on xmlDoc with too few arguments must throw TypeError -PASS Node interface: xmlDoc must inherit property "appendChild" with the proper type (44) +PASS Node interface: xmlDoc must inherit property "insertBefore(Node, Node)" with the proper type +PASS Node interface: calling insertBefore(Node, Node) on xmlDoc with too few arguments must throw TypeError +PASS Node interface: xmlDoc must inherit property "appendChild(Node)" with the proper type PASS Node interface: calling appendChild(Node) on xmlDoc with too few arguments must throw TypeError -PASS Node interface: xmlDoc must inherit property "replaceChild" with the proper type (45) -PASS Node interface: calling replaceChild(Node,Node) on xmlDoc with too few arguments must throw TypeError -PASS Node interface: xmlDoc must inherit property "removeChild" with the proper type (46) +PASS Node interface: xmlDoc must inherit property "replaceChild(Node, Node)" with the proper type +PASS Node interface: calling replaceChild(Node, Node) on xmlDoc with too few arguments must throw TypeError +PASS Node interface: xmlDoc must inherit property "removeChild(Node)" with the proper type PASS Node interface: calling removeChild(Node) on xmlDoc with too few arguments must throw TypeError -PASS EventTarget interface: xmlDoc must inherit property "addEventListener" with the proper type (0) -PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on xmlDoc with too few arguments must throw TypeError -PASS EventTarget interface: xmlDoc must inherit property "removeEventListener" with the proper type (1) -PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on xmlDoc with too few arguments must throw TypeError -PASS EventTarget interface: xmlDoc must inherit property "dispatchEvent" with the proper type (2) +PASS EventTarget interface: xmlDoc must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on xmlDoc with too few arguments must throw TypeError +PASS EventTarget interface: xmlDoc must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on xmlDoc with too few arguments must throw TypeError +PASS EventTarget interface: xmlDoc must inherit property "dispatchEvent(Event)" with the proper type PASS EventTarget interface: calling dispatchEvent(Event) on xmlDoc with too few arguments must throw TypeError PASS DOMImplementation interface: existence and properties of interface object PASS DOMImplementation interface object length PASS DOMImplementation interface object name PASS DOMImplementation interface: existence and properties of interface prototype object PASS DOMImplementation interface: existence and properties of interface prototype object's "constructor" property -PASS DOMImplementation interface: operation createDocumentType(DOMString,DOMString,DOMString) -PASS DOMImplementation interface: operation createDocument(DOMString,DOMString,DocumentType) +PASS DOMImplementation interface: operation createDocumentType(DOMString, DOMString, DOMString) +PASS DOMImplementation interface: operation createDocument(DOMString, DOMString, DocumentType) PASS DOMImplementation interface: operation createHTMLDocument(DOMString) PASS DOMImplementation interface: operation hasFeature() PASS DOMImplementation must be primary interface of document.implementation PASS Stringification of document.implementation -PASS DOMImplementation interface: document.implementation must inherit property "createDocumentType" with the proper type (0) -PASS DOMImplementation interface: calling createDocumentType(DOMString,DOMString,DOMString) on document.implementation with too few arguments must throw TypeError -PASS DOMImplementation interface: document.implementation must inherit property "createDocument" with the proper type (1) -PASS DOMImplementation interface: calling createDocument(DOMString,DOMString,DocumentType) on document.implementation with too few arguments must throw TypeError -PASS DOMImplementation interface: document.implementation must inherit property "createHTMLDocument" with the proper type (2) +PASS DOMImplementation interface: document.implementation must inherit property "createDocumentType(DOMString, DOMString, DOMString)" with the proper type +PASS DOMImplementation interface: calling createDocumentType(DOMString, DOMString, DOMString) on document.implementation with too few arguments must throw TypeError +PASS DOMImplementation interface: document.implementation must inherit property "createDocument(DOMString, DOMString, DocumentType)" with the proper type +PASS DOMImplementation interface: calling createDocument(DOMString, DOMString, DocumentType) on document.implementation with too few arguments must throw TypeError +PASS DOMImplementation interface: document.implementation must inherit property "createHTMLDocument(DOMString)" with the proper type PASS DOMImplementation interface: calling createHTMLDocument(DOMString) on document.implementation with too few arguments must throw TypeError -PASS DOMImplementation interface: document.implementation must inherit property "hasFeature" with the proper type (3) +PASS DOMImplementation interface: document.implementation must inherit property "hasFeature()" with the proper type PASS DocumentType interface: existence and properties of interface object PASS DocumentType interface object length PASS DocumentType interface object name @@ -597,81 +597,81 @@ PASS DocumentType interface: operation remove() PASS DocumentType must be primary interface of document.doctype PASS Stringification of document.doctype -PASS DocumentType interface: document.doctype must inherit property "name" with the proper type (0) -PASS DocumentType interface: document.doctype must inherit property "publicId" with the proper type (1) -PASS DocumentType interface: document.doctype must inherit property "systemId" with the proper type (2) -PASS DocumentType interface: document.doctype must inherit property "before" with the proper type (3) +PASS DocumentType interface: document.doctype must inherit property "name" with the proper type +PASS DocumentType interface: document.doctype must inherit property "publicId" with the proper type +PASS DocumentType interface: document.doctype must inherit property "systemId" with the proper type +PASS DocumentType interface: document.doctype must inherit property "before([object Object],[object Object])" with the proper type PASS DocumentType interface: calling before([object Object],[object Object]) on document.doctype with too few arguments must throw TypeError -PASS DocumentType interface: document.doctype must inherit property "after" with the proper type (4) +PASS DocumentType interface: document.doctype must inherit property "after([object Object],[object Object])" with the proper type PASS DocumentType interface: calling after([object Object],[object Object]) on document.doctype with too few arguments must throw TypeError -PASS DocumentType interface: document.doctype must inherit property "replaceWith" with the proper type (5) +PASS DocumentType interface: document.doctype must inherit property "replaceWith([object Object],[object Object])" with the proper type PASS DocumentType interface: calling replaceWith([object Object],[object Object]) on document.doctype with too few arguments must throw TypeError -PASS DocumentType interface: document.doctype must inherit property "remove" with the proper type (6) -PASS Node interface: document.doctype must inherit property "ELEMENT_NODE" with the proper type (0) -PASS Node interface: document.doctype must inherit property "ATTRIBUTE_NODE" with the proper type (1) -PASS Node interface: document.doctype must inherit property "TEXT_NODE" with the proper type (2) -PASS Node interface: document.doctype must inherit property "CDATA_SECTION_NODE" with the proper type (3) -PASS Node interface: document.doctype must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) -PASS Node interface: document.doctype must inherit property "ENTITY_NODE" with the proper type (5) -PASS Node interface: document.doctype must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) -PASS Node interface: document.doctype must inherit property "COMMENT_NODE" with the proper type (7) -PASS Node interface: document.doctype must inherit property "DOCUMENT_NODE" with the proper type (8) -PASS Node interface: document.doctype must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) -PASS Node interface: document.doctype must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) -PASS Node interface: document.doctype must inherit property "NOTATION_NODE" with the proper type (11) -PASS Node interface: document.doctype must inherit property "nodeType" with the proper type (12) -PASS Node interface: document.doctype must inherit property "nodeName" with the proper type (13) -PASS Node interface: document.doctype must inherit property "baseURI" with the proper type (14) -PASS Node interface: document.doctype must inherit property "isConnected" with the proper type (15) -PASS Node interface: document.doctype must inherit property "ownerDocument" with the proper type (16) -PASS Node interface: document.doctype must inherit property "getRootNode" with the proper type (17) +PASS DocumentType interface: document.doctype must inherit property "remove()" with the proper type +PASS Node interface: document.doctype must inherit property "ELEMENT_NODE" with the proper type +PASS Node interface: document.doctype must inherit property "ATTRIBUTE_NODE" with the proper type +PASS Node interface: document.doctype must inherit property "TEXT_NODE" with the proper type +PASS Node interface: document.doctype must inherit property "CDATA_SECTION_NODE" with the proper type +PASS Node interface: document.doctype must inherit property "ENTITY_REFERENCE_NODE" with the proper type +PASS Node interface: document.doctype must inherit property "ENTITY_NODE" with the proper type +PASS Node interface: document.doctype must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type +PASS Node interface: document.doctype must inherit property "COMMENT_NODE" with the proper type +PASS Node interface: document.doctype must inherit property "DOCUMENT_NODE" with the proper type +PASS Node interface: document.doctype must inherit property "DOCUMENT_TYPE_NODE" with the proper type +PASS Node interface: document.doctype must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type +PASS Node interface: document.doctype must inherit property "NOTATION_NODE" with the proper type +PASS Node interface: document.doctype must inherit property "nodeType" with the proper type +PASS Node interface: document.doctype must inherit property "nodeName" with the proper type +PASS Node interface: document.doctype must inherit property "baseURI" with the proper type +PASS Node interface: document.doctype must inherit property "isConnected" with the proper type +PASS Node interface: document.doctype must inherit property "ownerDocument" with the proper type +PASS Node interface: document.doctype must inherit property "getRootNode(GetRootNodeOptions)" with the proper type PASS Node interface: calling getRootNode(GetRootNodeOptions) on document.doctype with too few arguments must throw TypeError -PASS Node interface: document.doctype must inherit property "parentNode" with the proper type (18) -PASS Node interface: document.doctype must inherit property "parentElement" with the proper type (19) -PASS Node interface: document.doctype must inherit property "hasChildNodes" with the proper type (20) -PASS Node interface: document.doctype must inherit property "childNodes" with the proper type (21) -PASS Node interface: document.doctype must inherit property "firstChild" with the proper type (22) -PASS Node interface: document.doctype must inherit property "lastChild" with the proper type (23) -PASS Node interface: document.doctype must inherit property "previousSibling" with the proper type (24) -PASS Node interface: document.doctype must inherit property "nextSibling" with the proper type (25) -PASS Node interface: document.doctype must inherit property "nodeValue" with the proper type (26) -PASS Node interface: document.doctype must inherit property "textContent" with the proper type (27) -PASS Node interface: document.doctype must inherit property "normalize" with the proper type (28) -PASS Node interface: document.doctype must inherit property "cloneNode" with the proper type (29) +PASS Node interface: document.doctype must inherit property "parentNode" with the proper type +PASS Node interface: document.doctype must inherit property "parentElement" with the proper type +PASS Node interface: document.doctype must inherit property "hasChildNodes()" with the proper type +PASS Node interface: document.doctype must inherit property "childNodes" with the proper type +PASS Node interface: document.doctype must inherit property "firstChild" with the proper type +PASS Node interface: document.doctype must inherit property "lastChild" with the proper type +PASS Node interface: document.doctype must inherit property "previousSibling" with the proper type +PASS Node interface: document.doctype must inherit property "nextSibling" with the proper type +PASS Node interface: document.doctype must inherit property "nodeValue" with the proper type +PASS Node interface: document.doctype must inherit property "textContent" with the proper type +PASS Node interface: document.doctype must inherit property "normalize()" with the proper type +PASS Node interface: document.doctype must inherit property "cloneNode(boolean)" with the proper type PASS Node interface: calling cloneNode(boolean) on document.doctype with too few arguments must throw TypeError -PASS Node interface: document.doctype must inherit property "isEqualNode" with the proper type (30) +PASS Node interface: document.doctype must inherit property "isEqualNode(Node)" with the proper type PASS Node interface: calling isEqualNode(Node) on document.doctype with too few arguments must throw TypeError -PASS Node interface: document.doctype must inherit property "isSameNode" with the proper type (31) +PASS Node interface: document.doctype must inherit property "isSameNode(Node)" with the proper type PASS Node interface: calling isSameNode(Node) on document.doctype with too few arguments must throw TypeError -PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) -PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) -PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) -PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) -PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) -PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) -PASS Node interface: document.doctype must inherit property "compareDocumentPosition" with the proper type (38) +PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type +PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type +PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type +PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type +PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type +PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type +PASS Node interface: document.doctype must inherit property "compareDocumentPosition(Node)" with the proper type PASS Node interface: calling compareDocumentPosition(Node) on document.doctype with too few arguments must throw TypeError -PASS Node interface: document.doctype must inherit property "contains" with the proper type (39) +PASS Node interface: document.doctype must inherit property "contains(Node)" with the proper type PASS Node interface: calling contains(Node) on document.doctype with too few arguments must throw TypeError -PASS Node interface: document.doctype must inherit property "lookupPrefix" with the proper type (40) +PASS Node interface: document.doctype must inherit property "lookupPrefix(DOMString)" with the proper type PASS Node interface: calling lookupPrefix(DOMString) on document.doctype with too few arguments must throw TypeError -PASS Node interface: document.doctype must inherit property "lookupNamespaceURI" with the proper type (41) +PASS Node interface: document.doctype must inherit property "lookupNamespaceURI(DOMString)" with the proper type PASS Node interface: calling lookupNamespaceURI(DOMString) on document.doctype with too few arguments must throw TypeError -PASS Node interface: document.doctype must inherit property "isDefaultNamespace" with the proper type (42) +PASS Node interface: document.doctype must inherit property "isDefaultNamespace(DOMString)" with the proper type PASS Node interface: calling isDefaultNamespace(DOMString) on document.doctype with too few arguments must throw TypeError -PASS Node interface: document.doctype must inherit property "insertBefore" with the proper type (43) -PASS Node interface: calling insertBefore(Node,Node) on document.doctype with too few arguments must throw TypeError -PASS Node interface: document.doctype must inherit property "appendChild" with the proper type (44) +PASS Node interface: document.doctype must inherit property "insertBefore(Node, Node)" with the proper type +PASS Node interface: calling insertBefore(Node, Node) on document.doctype with too few arguments must throw TypeError +PASS Node interface: document.doctype must inherit property "appendChild(Node)" with the proper type PASS Node interface: calling appendChild(Node) on document.doctype with too few arguments must throw TypeError -PASS Node interface: document.doctype must inherit property "replaceChild" with the proper type (45) -PASS Node interface: calling replaceChild(Node,Node) on document.doctype with too few arguments must throw TypeError -PASS Node interface: document.doctype must inherit property "removeChild" with the proper type (46) +PASS Node interface: document.doctype must inherit property "replaceChild(Node, Node)" with the proper type +PASS Node interface: calling replaceChild(Node, Node) on document.doctype with too few arguments must throw TypeError +PASS Node interface: document.doctype must inherit property "removeChild(Node)" with the proper type PASS Node interface: calling removeChild(Node) on document.doctype with too few arguments must throw TypeError -PASS EventTarget interface: document.doctype must inherit property "addEventListener" with the proper type (0) -PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on document.doctype with too few arguments must throw TypeError -PASS EventTarget interface: document.doctype must inherit property "removeEventListener" with the proper type (1) -PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on document.doctype with too few arguments must throw TypeError -PASS EventTarget interface: document.doctype must inherit property "dispatchEvent" with the proper type (2) +PASS EventTarget interface: document.doctype must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on document.doctype with too few arguments must throw TypeError +PASS EventTarget interface: document.doctype must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on document.doctype with too few arguments must throw TypeError +PASS EventTarget interface: document.doctype must inherit property "dispatchEvent(Event)" with the proper type PASS EventTarget interface: calling dispatchEvent(Event) on document.doctype with too few arguments must throw TypeError PASS DocumentFragment interface: existence and properties of interface object PASS DocumentFragment interface object length @@ -689,85 +689,85 @@ PASS DocumentFragment interface: operation querySelectorAll(DOMString) PASS DocumentFragment must be primary interface of document.createDocumentFragment() PASS Stringification of document.createDocumentFragment() -PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "getElementById" with the proper type (0) +PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "getElementById(DOMString)" with the proper type PASS DocumentFragment interface: calling getElementById(DOMString) on document.createDocumentFragment() with too few arguments must throw TypeError -PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "children" with the proper type (1) -PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "firstElementChild" with the proper type (2) -PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "lastElementChild" with the proper type (3) -PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "childElementCount" with the proper type (4) -PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "prepend" with the proper type (5) +PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "children" with the proper type +PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "firstElementChild" with the proper type +PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "lastElementChild" with the proper type +PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "childElementCount" with the proper type +PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "prepend([object Object],[object Object])" with the proper type PASS DocumentFragment interface: calling prepend([object Object],[object Object]) on document.createDocumentFragment() with too few arguments must throw TypeError -PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "append" with the proper type (6) +PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "append([object Object],[object Object])" with the proper type PASS DocumentFragment interface: calling append([object Object],[object Object]) on document.createDocumentFragment() with too few arguments must throw TypeError -PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "querySelector" with the proper type (7) +PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "querySelector(DOMString)" with the proper type PASS DocumentFragment interface: calling querySelector(DOMString) on document.createDocumentFragment() with too few arguments must throw TypeError -PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "querySelectorAll" with the proper type (8) +PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "querySelectorAll(DOMString)" with the proper type PASS DocumentFragment interface: calling querySelectorAll(DOMString) on document.createDocumentFragment() with too few arguments must throw TypeError -PASS Node interface: document.createDocumentFragment() must inherit property "ELEMENT_NODE" with the proper type (0) -PASS Node interface: document.createDocumentFragment() must inherit property "ATTRIBUTE_NODE" with the proper type (1) -PASS Node interface: document.createDocumentFragment() must inherit property "TEXT_NODE" with the proper type (2) -PASS Node interface: document.createDocumentFragment() must inherit property "CDATA_SECTION_NODE" with the proper type (3) -PASS Node interface: document.createDocumentFragment() must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) -PASS Node interface: document.createDocumentFragment() must inherit property "ENTITY_NODE" with the proper type (5) -PASS Node interface: document.createDocumentFragment() must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) -PASS Node interface: document.createDocumentFragment() must inherit property "COMMENT_NODE" with the proper type (7) -PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_NODE" with the proper type (8) -PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) -PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) -PASS Node interface: document.createDocumentFragment() must inherit property "NOTATION_NODE" with the proper type (11) -PASS Node interface: document.createDocumentFragment() must inherit property "nodeType" with the proper type (12) -PASS Node interface: document.createDocumentFragment() must inherit property "nodeName" with the proper type (13) -PASS Node interface: document.createDocumentFragment() must inherit property "baseURI" with the proper type (14) -PASS Node interface: document.createDocumentFragment() must inherit property "isConnected" with the proper type (15) -PASS Node interface: document.createDocumentFragment() must inherit property "ownerDocument" with the proper type (16) -PASS Node interface: document.createDocumentFragment() must inherit property "getRootNode" with the proper type (17) +PASS Node interface: document.createDocumentFragment() must inherit property "ELEMENT_NODE" with the proper type +PASS Node interface: document.createDocumentFragment() must inherit property "ATTRIBUTE_NODE" with the proper type +PASS Node interface: document.createDocumentFragment() must inherit property "TEXT_NODE" with the proper type +PASS Node interface: document.createDocumentFragment() must inherit property "CDATA_SECTION_NODE" with the proper type +PASS Node interface: document.createDocumentFragment() must inherit property "ENTITY_REFERENCE_NODE" with the proper type +PASS Node interface: document.createDocumentFragment() must inherit property "ENTITY_NODE" with the proper type +PASS Node interface: document.createDocumentFragment() must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type +PASS Node interface: document.createDocumentFragment() must inherit property "COMMENT_NODE" with the proper type +PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_NODE" with the proper type +PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_TYPE_NODE" with the proper type +PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type +PASS Node interface: document.createDocumentFragment() must inherit property "NOTATION_NODE" with the proper type +PASS Node interface: document.createDocumentFragment() must inherit property "nodeType" with the proper type +PASS Node interface: document.createDocumentFragment() must inherit property "nodeName" with the proper type +PASS Node interface: document.createDocumentFragment() must inherit property "baseURI" with the proper type +PASS Node interface: document.createDocumentFragment() must inherit property "isConnected" with the proper type +PASS Node interface: document.createDocumentFragment() must inherit property "ownerDocument" with the proper type +PASS Node interface: document.createDocumentFragment() must inherit property "getRootNode(GetRootNodeOptions)" with the proper type PASS Node interface: calling getRootNode(GetRootNodeOptions) on document.createDocumentFragment() with too few arguments must throw TypeError -PASS Node interface: document.createDocumentFragment() must inherit property "parentNode" with the proper type (18) -PASS Node interface: document.createDocumentFragment() must inherit property "parentElement" with the proper type (19) -PASS Node interface: document.createDocumentFragment() must inherit property "hasChildNodes" with the proper type (20) -PASS Node interface: document.createDocumentFragment() must inherit property "childNodes" with the proper type (21) -PASS Node interface: document.createDocumentFragment() must inherit property "firstChild" with the proper type (22) -PASS Node interface: document.createDocumentFragment() must inherit property "lastChild" with the proper type (23) -PASS Node interface: document.createDocumentFragment() must inherit property "previousSibling" with the proper type (24) -PASS Node interface: document.createDocumentFragment() must inherit property "nextSibling" with the proper type (25) -PASS Node interface: document.createDocumentFragment() must inherit property "nodeValue" with the proper type (26) -PASS Node interface: document.createDocumentFragment() must inherit property "textContent" with the proper type (27) -PASS Node interface: document.createDocumentFragment() must inherit property "normalize" with the proper type (28) -PASS Node interface: document.createDocumentFragment() must inherit property "cloneNode" with the proper type (29) +PASS Node interface: document.createDocumentFragment() must inherit property "parentNode" with the proper type +PASS Node interface: document.createDocumentFragment() must inherit property "parentElement" with the proper type +PASS Node interface: document.createDocumentFragment() must inherit property "hasChildNodes()" with the proper type +PASS Node interface: document.createDocumentFragment() must inherit property "childNodes" with the proper type +PASS Node interface: document.createDocumentFragment() must inherit property "firstChild" with the proper type +PASS Node interface: document.createDocumentFragment() must inherit property "lastChild" with the proper type +PASS Node interface: document.createDocumentFragment() must inherit property "previousSibling" with the proper type +PASS Node interface: document.createDocumentFragment() must inherit property "nextSibling" with the proper type +PASS Node interface: document.createDocumentFragment() must inherit property "nodeValue" with the proper type +PASS Node interface: document.createDocumentFragment() must inherit property "textContent" with the proper type +PASS Node interface: document.createDocumentFragment() must inherit property "normalize()" with the proper type +PASS Node interface: document.createDocumentFragment() must inherit property "cloneNode(boolean)" with the proper type PASS Node interface: calling cloneNode(boolean) on document.createDocumentFragment() with too few arguments must throw TypeError -PASS Node interface: document.createDocumentFragment() must inherit property "isEqualNode" with the proper type (30) +PASS Node interface: document.createDocumentFragment() must inherit property "isEqualNode(Node)" with the proper type PASS Node interface: calling isEqualNode(Node) on document.createDocumentFragment() with too few arguments must throw TypeError -PASS Node interface: document.createDocumentFragment() must inherit property "isSameNode" with the proper type (31) +PASS Node interface: document.createDocumentFragment() must inherit property "isSameNode(Node)" with the proper type PASS Node interface: calling isSameNode(Node) on document.createDocumentFragment() with too few arguments must throw TypeError -PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) -PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) -PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) -PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) -PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) -PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) -PASS Node interface: document.createDocumentFragment() must inherit property "compareDocumentPosition" with the proper type (38) +PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type +PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type +PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type +PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type +PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type +PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type +PASS Node interface: document.createDocumentFragment() must inherit property "compareDocumentPosition(Node)" with the proper type PASS Node interface: calling compareDocumentPosition(Node) on document.createDocumentFragment() with too few arguments must throw TypeError -PASS Node interface: document.createDocumentFragment() must inherit property "contains" with the proper type (39) +PASS Node interface: document.createDocumentFragment() must inherit property "contains(Node)" with the proper type PASS Node interface: calling contains(Node) on document.createDocumentFragment() with too few arguments must throw TypeError -PASS Node interface: document.createDocumentFragment() must inherit property "lookupPrefix" with the proper type (40) +PASS Node interface: document.createDocumentFragment() must inherit property "lookupPrefix(DOMString)" with the proper type PASS Node interface: calling lookupPrefix(DOMString) on document.createDocumentFragment() with too few arguments must throw TypeError -PASS Node interface: document.createDocumentFragment() must inherit property "lookupNamespaceURI" with the proper type (41) +PASS Node interface: document.createDocumentFragment() must inherit property "lookupNamespaceURI(DOMString)" with the proper type PASS Node interface: calling lookupNamespaceURI(DOMString) on document.createDocumentFragment() with too few arguments must throw TypeError -PASS Node interface: document.createDocumentFragment() must inherit property "isDefaultNamespace" with the proper type (42) +PASS Node interface: document.createDocumentFragment() must inherit property "isDefaultNamespace(DOMString)" with the proper type PASS Node interface: calling isDefaultNamespace(DOMString) on document.createDocumentFragment() with too few arguments must throw TypeError -PASS Node interface: document.createDocumentFragment() must inherit property "insertBefore" with the proper type (43) -PASS Node interface: calling insertBefore(Node,Node) on document.createDocumentFragment() with too few arguments must throw TypeError -PASS Node interface: document.createDocumentFragment() must inherit property "appendChild" with the proper type (44) +PASS Node interface: document.createDocumentFragment() must inherit property "insertBefore(Node, Node)" with the proper type +PASS Node interface: calling insertBefore(Node, Node) on document.createDocumentFragment() with too few arguments must throw TypeError +PASS Node interface: document.createDocumentFragment() must inherit property "appendChild(Node)" with the proper type PASS Node interface: calling appendChild(Node) on document.createDocumentFragment() with too few arguments must throw TypeError -PASS Node interface: document.createDocumentFragment() must inherit property "replaceChild" with the proper type (45) -PASS Node interface: calling replaceChild(Node,Node) on document.createDocumentFragment() with too few arguments must throw TypeError -PASS Node interface: document.createDocumentFragment() must inherit property "removeChild" with the proper type (46) +PASS Node interface: document.createDocumentFragment() must inherit property "replaceChild(Node, Node)" with the proper type +PASS Node interface: calling replaceChild(Node, Node) on document.createDocumentFragment() with too few arguments must throw TypeError +PASS Node interface: document.createDocumentFragment() must inherit property "removeChild(Node)" with the proper type PASS Node interface: calling removeChild(Node) on document.createDocumentFragment() with too few arguments must throw TypeError -PASS EventTarget interface: document.createDocumentFragment() must inherit property "addEventListener" with the proper type (0) -PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on document.createDocumentFragment() with too few arguments must throw TypeError -PASS EventTarget interface: document.createDocumentFragment() must inherit property "removeEventListener" with the proper type (1) -PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on document.createDocumentFragment() with too few arguments must throw TypeError -PASS EventTarget interface: document.createDocumentFragment() must inherit property "dispatchEvent" with the proper type (2) +PASS EventTarget interface: document.createDocumentFragment() must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on document.createDocumentFragment() with too few arguments must throw TypeError +PASS EventTarget interface: document.createDocumentFragment() must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on document.createDocumentFragment() with too few arguments must throw TypeError +PASS EventTarget interface: document.createDocumentFragment() must inherit property "dispatchEvent(Event)" with the proper type PASS EventTarget interface: calling dispatchEvent(Event) on document.createDocumentFragment() with too few arguments must throw TypeError PASS ShadowRoot interface: existence and properties of interface object PASS ShadowRoot interface object length @@ -793,15 +793,15 @@ PASS Element interface: attribute attributes PASS Element interface: operation getAttributeNames() PASS Element interface: operation getAttribute(DOMString) -PASS Element interface: operation getAttributeNS(DOMString,DOMString) -PASS Element interface: operation setAttribute(DOMString,DOMString) -PASS Element interface: operation setAttributeNS(DOMString,DOMString,DOMString) +PASS Element interface: operation getAttributeNS(DOMString, DOMString) +PASS Element interface: operation setAttribute(DOMString, DOMString) +PASS Element interface: operation setAttributeNS(DOMString, DOMString, DOMString) PASS Element interface: operation removeAttribute(DOMString) -PASS Element interface: operation removeAttributeNS(DOMString,DOMString) +PASS Element interface: operation removeAttributeNS(DOMString, DOMString) PASS Element interface: operation hasAttribute(DOMString) -PASS Element interface: operation hasAttributeNS(DOMString,DOMString) +PASS Element interface: operation hasAttributeNS(DOMString, DOMString) PASS Element interface: operation getAttributeNode(DOMString) -PASS Element interface: operation getAttributeNodeNS(DOMString,DOMString) +PASS Element interface: operation getAttributeNodeNS(DOMString, DOMString) PASS Element interface: operation setAttributeNode(Attr) PASS Element interface: operation setAttributeNodeNS(Attr) PASS Element interface: operation removeAttributeNode(Attr) @@ -811,10 +811,10 @@ PASS Element interface: operation matches(DOMString) PASS Element interface: operation webkitMatchesSelector(DOMString) PASS Element interface: operation getElementsByTagName(DOMString) -PASS Element interface: operation getElementsByTagNameNS(DOMString,DOMString) +PASS Element interface: operation getElementsByTagNameNS(DOMString, DOMString) PASS Element interface: operation getElementsByClassName(DOMString) -PASS Element interface: operation insertAdjacentElement(DOMString,Element) -PASS Element interface: operation insertAdjacentText(DOMString,DOMString) +PASS Element interface: operation insertAdjacentElement(DOMString, Element) +PASS Element interface: operation insertAdjacentText(DOMString, DOMString) PASS Element interface: attribute children PASS Element interface: attribute firstElementChild PASS Element interface: attribute lastElementChild @@ -832,149 +832,149 @@ PASS Element interface: attribute assignedSlot PASS Element must be primary interface of element PASS Stringification of element -PASS Element interface: element must inherit property "namespaceURI" with the proper type (0) -PASS Element interface: element must inherit property "prefix" with the proper type (1) -PASS Element interface: element must inherit property "localName" with the proper type (2) -PASS Element interface: element must inherit property "tagName" with the proper type (3) -PASS Element interface: element must inherit property "id" with the proper type (4) -PASS Element interface: element must inherit property "className" with the proper type (5) -PASS Element interface: element must inherit property "classList" with the proper type (6) -PASS Element interface: element must inherit property "slot" with the proper type (7) -PASS Element interface: element must inherit property "hasAttributes" with the proper type (8) -PASS Element interface: element must inherit property "attributes" with the proper type (9) -PASS Element interface: element must inherit property "getAttributeNames" with the proper type (10) -PASS Element interface: element must inherit property "getAttribute" with the proper type (11) +PASS Element interface: element must inherit property "namespaceURI" with the proper type +PASS Element interface: element must inherit property "prefix" with the proper type +PASS Element interface: element must inherit property "localName" with the proper type +PASS Element interface: element must inherit property "tagName" with the proper type +PASS Element interface: element must inherit property "id" with the proper type +PASS Element interface: element must inherit property "className" with the proper type +PASS Element interface: element must inherit property "classList" with the proper type +PASS Element interface: element must inherit property "slot" with the proper type +PASS Element interface: element must inherit property "hasAttributes()" with the proper type +PASS Element interface: element must inherit property "attributes" with the proper type +PASS Element interface: element must inherit property "getAttributeNames()" with the proper type +PASS Element interface: element must inherit property "getAttribute(DOMString)" with the proper type PASS Element interface: calling getAttribute(DOMString) on element with too few arguments must throw TypeError -PASS Element interface: element must inherit property "getAttributeNS" with the proper type (12) -PASS Element interface: calling getAttributeNS(DOMString,DOMString) on element with too few arguments must throw TypeError -PASS Element interface: element must inherit property "setAttribute" with the proper type (13) -PASS Element interface: calling setAttribute(DOMString,DOMString) on element with too few arguments must throw TypeError -PASS Element interface: element must inherit property "setAttributeNS" with the proper type (14) -PASS Element interface: calling setAttributeNS(DOMString,DOMString,DOMString) on element with too few arguments must throw TypeError -PASS Element interface: element must inherit property "removeAttribute" with the proper type (15) +PASS Element interface: element must inherit property "getAttributeNS(DOMString, DOMString)" with the proper type +PASS Element interface: calling getAttributeNS(DOMString, DOMString) on element with too few arguments must throw TypeError +PASS Element interface: element must inherit property "setAttribute(DOMString, DOMString)" with the proper type +PASS Element interface: calling setAttribute(DOMString, DOMString) on element with too few arguments must throw TypeError +PASS Element interface: element must inherit property "setAttributeNS(DOMString, DOMString, DOMString)" with the proper type +PASS Element interface: calling setAttributeNS(DOMString, DOMString, DOMString) on element with too few arguments must throw TypeError +PASS Element interface: element must inherit property "removeAttribute(DOMString)" with the proper type PASS Element interface: calling removeAttribute(DOMString) on element with too few arguments must throw TypeError -PASS Element interface: element must inherit property "removeAttributeNS" with the proper type (16) -PASS Element interface: calling removeAttributeNS(DOMString,DOMString) on element with too few arguments must throw TypeError -PASS Element interface: element must inherit property "hasAttribute" with the proper type (17) +PASS Element interface: element must inherit property "removeAttributeNS(DOMString, DOMString)" with the proper type +PASS Element interface: calling removeAttributeNS(DOMString, DOMString) on element with too few arguments must throw TypeError +PASS Element interface: element must inherit property "hasAttribute(DOMString)" with the proper type PASS Element interface: calling hasAttribute(DOMString) on element with too few arguments must throw TypeError -PASS Element interface: element must inherit property "hasAttributeNS" with the proper type (18) -PASS Element interface: calling hasAttributeNS(DOMString,DOMString) on element with too few arguments must throw TypeError -PASS Element interface: element must inherit property "getAttributeNode" with the proper type (19) +PASS Element interface: element must inherit property "hasAttributeNS(DOMString, DOMString)" with the proper type +PASS Element interface: calling hasAttributeNS(DOMString, DOMString) on element with too few arguments must throw TypeError +PASS Element interface: element must inherit property "getAttributeNode(DOMString)" with the proper type PASS Element interface: calling getAttributeNode(DOMString) on element with too few arguments must throw TypeError -PASS Element interface: element must inherit property "getAttributeNodeNS" with the proper type (20) -PASS Element interface: calling getAttributeNodeNS(DOMString,DOMString) on element with too few arguments must throw TypeError -PASS Element interface: element must inherit property "setAttributeNode" with the proper type (21) +PASS Element interface: element must inherit property "getAttributeNodeNS(DOMString, DOMString)" with the proper type +PASS Element interface: calling getAttributeNodeNS(DOMString, DOMString) on element with too few arguments must throw TypeError +PASS Element interface: element must inherit property "setAttributeNode(Attr)" with the proper type PASS Element interface: calling setAttributeNode(Attr) on element with too few arguments must throw TypeError -PASS Element interface: element must inherit property "setAttributeNodeNS" with the proper type (22) +PASS Element interface: element must inherit property "setAttributeNodeNS(Attr)" with the proper type PASS Element interface: calling setAttributeNodeNS(Attr) on element with too few arguments must throw TypeError -PASS Element interface: element must inherit property "removeAttributeNode" with the proper type (23) +PASS Element interface: element must inherit property "removeAttributeNode(Attr)" with the proper type PASS Element interface: calling removeAttributeNode(Attr) on element with too few arguments must throw TypeError -PASS Element interface: element must inherit property "attachShadow" with the proper type (24) +PASS Element interface: element must inherit property "attachShadow(ShadowRootInit)" with the proper type PASS Element interface: calling attachShadow(ShadowRootInit) on element with too few arguments must throw TypeError -PASS Element interface: element must inherit property "shadowRoot" with the proper type (25) -PASS Element interface: element must inherit property "closest" with the proper type (26) +PASS Element interface: element must inherit property "shadowRoot" with the proper type +PASS Element interface: element must inherit property "closest(DOMString)" with the proper type PASS Element interface: calling closest(DOMString) on element with too few arguments must throw TypeError -PASS Element interface: element must inherit property "matches" with the proper type (27) +PASS Element interface: element must inherit property "matches(DOMString)" with the proper type PASS Element interface: calling matches(DOMString) on element with too few arguments must throw TypeError -PASS Element interface: element must inherit property "webkitMatchesSelector" with the proper type (28) +PASS Element interface: element must inherit property "webkitMatchesSelector(DOMString)" with the proper type PASS Element interface: calling webkitMatchesSelector(DOMString) on element with too few arguments must throw TypeError -PASS Element interface: element must inherit property "getElementsByTagName" with the proper type (29) +PASS Element interface: element must inherit property "getElementsByTagName(DOMString)" with the proper type PASS Element interface: calling getElementsByTagName(DOMString) on element with too few arguments must throw TypeError -PASS Element interface: element must inherit property "getElementsByTagNameNS" with the proper type (30) -PASS Element interface: calling getElementsByTagNameNS(DOMString,DOMString) on element with too few arguments must throw TypeError -PASS Element interface: element must inherit property "getElementsByClassName" with the proper type (31) +PASS Element interface: element must inherit property "getElementsByTagNameNS(DOMString, DOMString)" with the proper type +PASS Element interface: calling getElementsByTagNameNS(DOMString, DOMString) on element with too few arguments must throw TypeError +PASS Element interface: element must inherit property "getElementsByClassName(DOMString)" with the proper type PASS Element interface: calling getElementsByClassName(DOMString) on element with too few arguments must throw TypeError -PASS Element interface: element must inherit property "insertAdjacentElement" with the proper type (32) -PASS Element interface: calling insertAdjacentElement(DOMString,Element) on element with too few arguments must throw TypeError -PASS Element interface: element must inherit property "insertAdjacentText" with the proper type (33) -PASS Element interface: calling insertAdjacentText(DOMString,DOMString) on element with too few arguments must throw TypeError -PASS Element interface: element must inherit property "children" with the proper type (34) -PASS Element interface: element must inherit property "firstElementChild" with the proper type (35) -PASS Element interface: element must inherit property "lastElementChild" with the proper type (36) -PASS Element interface: element must inherit property "childElementCount" with the proper type (37) -PASS Element interface: element must inherit property "prepend" with the proper type (38) +PASS Element interface: element must inherit property "insertAdjacentElement(DOMString, Element)" with the proper type +PASS Element interface: calling insertAdjacentElement(DOMString, Element) on element with too few arguments must throw TypeError +PASS Element interface: element must inherit property "insertAdjacentText(DOMString, DOMString)" with the proper type +PASS Element interface: calling insertAdjacentText(DOMString, DOMString) on element with too few arguments must throw TypeError +PASS Element interface: element must inherit property "children" with the proper type +PASS Element interface: element must inherit property "firstElementChild" with the proper type +PASS Element interface: element must inherit property "lastElementChild" with the proper type +PASS Element interface: element must inherit property "childElementCount" with the proper type +PASS Element interface: element must inherit property "prepend([object Object],[object Object])" with the proper type PASS Element interface: calling prepend([object Object],[object Object]) on element with too few arguments must throw TypeError -PASS Element interface: element must inherit property "append" with the proper type (39) +PASS Element interface: element must inherit property "append([object Object],[object Object])" with the proper type PASS Element interface: calling append([object Object],[object Object]) on element with too few arguments must throw TypeError -PASS Element interface: element must inherit property "querySelector" with the proper type (40) +PASS Element interface: element must inherit property "querySelector(DOMString)" with the proper type PASS Element interface: calling querySelector(DOMString) on element with too few arguments must throw TypeError -PASS Element interface: element must inherit property "querySelectorAll" with the proper type (41) +PASS Element interface: element must inherit property "querySelectorAll(DOMString)" with the proper type PASS Element interface: calling querySelectorAll(DOMString) on element with too few arguments must throw TypeError -PASS Element interface: element must inherit property "previousElementSibling" with the proper type (42) -PASS Element interface: element must inherit property "nextElementSibling" with the proper type (43) -PASS Element interface: element must inherit property "before" with the proper type (44) +PASS Element interface: element must inherit property "previousElementSibling" with the proper type +PASS Element interface: element must inherit property "nextElementSibling" with the proper type +PASS Element interface: element must inherit property "before([object Object],[object Object])" with the proper type PASS Element interface: calling before([object Object],[object Object]) on element with too few arguments must throw TypeError -PASS Element interface: element must inherit property "after" with the proper type (45) +PASS Element interface: element must inherit property "after([object Object],[object Object])" with the proper type PASS Element interface: calling after([object Object],[object Object]) on element with too few arguments must throw TypeError -PASS Element interface: element must inherit property "replaceWith" with the proper type (46) +PASS Element interface: element must inherit property "replaceWith([object Object],[object Object])" with the proper type PASS Element interface: calling replaceWith([object Object],[object Object]) on element with too few arguments must throw TypeError -PASS Element interface: element must inherit property "remove" with the proper type (47) -PASS Element interface: element must inherit property "assignedSlot" with the proper type (48) -PASS Node interface: element must inherit property "ELEMENT_NODE" with the proper type (0) -PASS Node interface: element must inherit property "ATTRIBUTE_NODE" with the proper type (1) -PASS Node interface: element must inherit property "TEXT_NODE" with the proper type (2) -PASS Node interface: element must inherit property "CDATA_SECTION_NODE" with the proper type (3) -PASS Node interface: element must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) -PASS Node interface: element must inherit property "ENTITY_NODE" with the proper type (5) -PASS Node interface: element must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) -PASS Node interface: element must inherit property "COMMENT_NODE" with the proper type (7) -PASS Node interface: element must inherit property "DOCUMENT_NODE" with the proper type (8) -PASS Node interface: element must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) -PASS Node interface: element must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) -PASS Node interface: element must inherit property "NOTATION_NODE" with the proper type (11) -PASS Node interface: element must inherit property "nodeType" with the proper type (12) -PASS Node interface: element must inherit property "nodeName" with the proper type (13) -PASS Node interface: element must inherit property "baseURI" with the proper type (14) -PASS Node interface: element must inherit property "isConnected" with the proper type (15) -PASS Node interface: element must inherit property "ownerDocument" with the proper type (16) -PASS Node interface: element must inherit property "getRootNode" with the proper type (17) +PASS Element interface: element must inherit property "remove()" with the proper type +PASS Element interface: element must inherit property "assignedSlot" with the proper type +PASS Node interface: element must inherit property "ELEMENT_NODE" with the proper type +PASS Node interface: element must inherit property "ATTRIBUTE_NODE" with the proper type +PASS Node interface: element must inherit property "TEXT_NODE" with the proper type +PASS Node interface: element must inherit property "CDATA_SECTION_NODE" with the proper type +PASS Node interface: element must inherit property "ENTITY_REFERENCE_NODE" with the proper type +PASS Node interface: element must inherit property "ENTITY_NODE" with the proper type +PASS Node interface: element must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type +PASS Node interface: element must inherit property "COMMENT_NODE" with the proper type +PASS Node interface: element must inherit property "DOCUMENT_NODE" with the proper type +PASS Node interface: element must inherit property "DOCUMENT_TYPE_NODE" with the proper type +PASS Node interface: element must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type +PASS Node interface: element must inherit property "NOTATION_NODE" with the proper type +PASS Node interface: element must inherit property "nodeType" with the proper type +PASS Node interface: element must inherit property "nodeName" with the proper type +PASS Node interface: element must inherit property "baseURI" with the proper type +PASS Node interface: element must inherit property "isConnected" with the proper type +PASS Node interface: element must inherit property "ownerDocument" with the proper type +PASS Node interface: element must inherit property "getRootNode(GetRootNodeOptions)" with the proper type PASS Node interface: calling getRootNode(GetRootNodeOptions) on element with too few arguments must throw TypeError -PASS Node interface: element must inherit property "parentNode" with the proper type (18) -PASS Node interface: element must inherit property "parentElement" with the proper type (19) -PASS Node interface: element must inherit property "hasChildNodes" with the proper type (20) -PASS Node interface: element must inherit property "childNodes" with the proper type (21) -PASS Node interface: element must inherit property "firstChild" with the proper type (22) -PASS Node interface: element must inherit property "lastChild" with the proper type (23) -PASS Node interface: element must inherit property "previousSibling" with the proper type (24) -PASS Node interface: element must inherit property "nextSibling" with the proper type (25) -PASS Node interface: element must inherit property "nodeValue" with the proper type (26) -PASS Node interface: element must inherit property "textContent" with the proper type (27) -PASS Node interface: element must inherit property "normalize" with the proper type (28) -PASS Node interface: element must inherit property "cloneNode" with the proper type (29) +PASS Node interface: element must inherit property "parentNode" with the proper type +PASS Node interface: element must inherit property "parentElement" with the proper type +PASS Node interface: element must inherit property "hasChildNodes()" with the proper type +PASS Node interface: element must inherit property "childNodes" with the proper type +PASS Node interface: element must inherit property "firstChild" with the proper type +PASS Node interface: element must inherit property "lastChild" with the proper type +PASS Node interface: element must inherit property "previousSibling" with the proper type +PASS Node interface: element must inherit property "nextSibling" with the proper type +PASS Node interface: element must inherit property "nodeValue" with the proper type +PASS Node interface: element must inherit property "textContent" with the proper type +PASS Node interface: element must inherit property "normalize()" with the proper type +PASS Node interface: element must inherit property "cloneNode(boolean)" with the proper type PASS Node interface: calling cloneNode(boolean) on element with too few arguments must throw TypeError -PASS Node interface: element must inherit property "isEqualNode" with the proper type (30) +PASS Node interface: element must inherit property "isEqualNode(Node)" with the proper type PASS Node interface: calling isEqualNode(Node) on element with too few arguments must throw TypeError -PASS Node interface: element must inherit property "isSameNode" with the proper type (31) +PASS Node interface: element must inherit property "isSameNode(Node)" with the proper type PASS Node interface: calling isSameNode(Node) on element with too few arguments must throw TypeError -PASS Node interface: element must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) -PASS Node interface: element must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) -PASS Node interface: element must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) -PASS Node interface: element must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) -PASS Node interface: element must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) -PASS Node interface: element must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) -PASS Node interface: element must inherit property "compareDocumentPosition" with the proper type (38) +PASS Node interface: element must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type +PASS Node interface: element must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type +PASS Node interface: element must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type +PASS Node interface: element must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type +PASS Node interface: element must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type +PASS Node interface: element must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type +PASS Node interface: element must inherit property "compareDocumentPosition(Node)" with the proper type PASS Node interface: calling compareDocumentPosition(Node) on element with too few arguments must throw TypeError -PASS Node interface: element must inherit property "contains" with the proper type (39) +PASS Node interface: element must inherit property "contains(Node)" with the proper type PASS Node interface: calling contains(Node) on element with too few arguments must throw TypeError -PASS Node interface: element must inherit property "lookupPrefix" with the proper type (40) +PASS Node interface: element must inherit property "lookupPrefix(DOMString)" with the proper type PASS Node interface: calling lookupPrefix(DOMString) on element with too few arguments must throw TypeError -PASS Node interface: element must inherit property "lookupNamespaceURI" with the proper type (41) +PASS Node interface: element must inherit property "lookupNamespaceURI(DOMString)" with the proper type PASS Node interface: calling lookupNamespaceURI(DOMString) on element with too few arguments must throw TypeError -PASS Node interface: element must inherit property "isDefaultNamespace" with the proper type (42) +PASS Node interface: element must inherit property "isDefaultNamespace(DOMString)" with the proper type PASS Node interface: calling isDefaultNamespace(DOMString) on element with too few arguments must throw TypeError -PASS Node interface: element must inherit property "insertBefore" with the proper type (43) -PASS Node interface: calling insertBefore(Node,Node) on element with too few arguments must throw TypeError -PASS Node interface: element must inherit property "appendChild" with the proper type (44) +PASS Node interface: element must inherit property "insertBefore(Node, Node)" with the proper type +PASS Node interface: calling insertBefore(Node, Node) on element with too few arguments must throw TypeError +PASS Node interface: element must inherit property "appendChild(Node)" with the proper type PASS Node interface: calling appendChild(Node) on element with too few arguments must throw TypeError -PASS Node interface: element must inherit property "replaceChild" with the proper type (45) -PASS Node interface: calling replaceChild(Node,Node) on element with too few arguments must throw TypeError -PASS Node interface: element must inherit property "removeChild" with the proper type (46) +PASS Node interface: element must inherit property "replaceChild(Node, Node)" with the proper type +PASS Node interface: calling replaceChild(Node, Node) on element with too few arguments must throw TypeError +PASS Node interface: element must inherit property "removeChild(Node)" with the proper type PASS Node interface: calling removeChild(Node) on element with too few arguments must throw TypeError -PASS EventTarget interface: element must inherit property "addEventListener" with the proper type (0) -PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on element with too few arguments must throw TypeError -PASS EventTarget interface: element must inherit property "removeEventListener" with the proper type (1) -PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on element with too few arguments must throw TypeError -PASS EventTarget interface: element must inherit property "dispatchEvent" with the proper type (2) +PASS EventTarget interface: element must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on element with too few arguments must throw TypeError +PASS EventTarget interface: element must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on element with too few arguments must throw TypeError +PASS EventTarget interface: element must inherit property "dispatchEvent(Event)" with the proper type PASS EventTarget interface: calling dispatchEvent(Event) on element with too few arguments must throw TypeError PASS NamedNodeMap interface: existence and properties of interface object PASS NamedNodeMap interface object length @@ -984,11 +984,11 @@ PASS NamedNodeMap interface: attribute length PASS NamedNodeMap interface: operation item(unsigned long) PASS NamedNodeMap interface: operation getNamedItem(DOMString) -PASS NamedNodeMap interface: operation getNamedItemNS(DOMString,DOMString) +PASS NamedNodeMap interface: operation getNamedItemNS(DOMString, DOMString) PASS NamedNodeMap interface: operation setNamedItem(Attr) PASS NamedNodeMap interface: operation setNamedItemNS(Attr) PASS NamedNodeMap interface: operation removeNamedItem(DOMString) -PASS NamedNodeMap interface: operation removeNamedItemNS(DOMString,DOMString) +PASS NamedNodeMap interface: operation removeNamedItemNS(DOMString, DOMString) PASS Attr interface: existence and properties of interface object PASS Attr interface object length PASS Attr interface object name @@ -1003,78 +1003,78 @@ PASS Attr interface: attribute specified PASS Attr must be primary interface of document.querySelector("[id]").attributes[0] PASS Stringification of document.querySelector("[id]").attributes[0] -PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "namespaceURI" with the proper type (0) -PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "prefix" with the proper type (1) -PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "localName" with the proper type (2) -PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "name" with the proper type (3) -PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "value" with the proper type (4) -PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "ownerElement" with the proper type (5) -PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "specified" with the proper type (6) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ELEMENT_NODE" with the proper type (0) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ATTRIBUTE_NODE" with the proper type (1) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "TEXT_NODE" with the proper type (2) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "CDATA_SECTION_NODE" with the proper type (3) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ENTITY_NODE" with the proper type (5) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "COMMENT_NODE" with the proper type (7) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_NODE" with the proper type (8) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "NOTATION_NODE" with the proper type (11) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "nodeType" with the proper type (12) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "nodeName" with the proper type (13) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "baseURI" with the proper type (14) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "isConnected" with the proper type (15) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ownerDocument" with the proper type (16) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "getRootNode" with the proper type (17) +PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "namespaceURI" with the proper type +PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "prefix" with the proper type +PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "localName" with the proper type +PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "name" with the proper type +PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "value" with the proper type +PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "ownerElement" with the proper type +PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "specified" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ELEMENT_NODE" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ATTRIBUTE_NODE" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "TEXT_NODE" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "CDATA_SECTION_NODE" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ENTITY_REFERENCE_NODE" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ENTITY_NODE" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "COMMENT_NODE" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_NODE" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_TYPE_NODE" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "NOTATION_NODE" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "nodeType" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "nodeName" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "baseURI" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "isConnected" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ownerDocument" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "getRootNode(GetRootNodeOptions)" with the proper type PASS Node interface: calling getRootNode(GetRootNodeOptions) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "parentNode" with the proper type (18) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "parentElement" with the proper type (19) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "hasChildNodes" with the proper type (20) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "childNodes" with the proper type (21) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "firstChild" with the proper type (22) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "lastChild" with the proper type (23) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "previousSibling" with the proper type (24) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "nextSibling" with the proper type (25) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "nodeValue" with the proper type (26) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "textContent" with the proper type (27) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "normalize" with the proper type (28) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "cloneNode" with the proper type (29) +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "parentNode" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "parentElement" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "hasChildNodes()" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "childNodes" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "firstChild" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "lastChild" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "previousSibling" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "nextSibling" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "nodeValue" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "textContent" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "normalize()" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "cloneNode(boolean)" with the proper type PASS Node interface: calling cloneNode(boolean) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "isEqualNode" with the proper type (30) +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "isEqualNode(Node)" with the proper type PASS Node interface: calling isEqualNode(Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "isSameNode" with the proper type (31) +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "isSameNode(Node)" with the proper type PASS Node interface: calling isSameNode(Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "compareDocumentPosition" with the proper type (38) +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "compareDocumentPosition(Node)" with the proper type PASS Node interface: calling compareDocumentPosition(Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "contains" with the proper type (39) +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "contains(Node)" with the proper type PASS Node interface: calling contains(Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "lookupPrefix" with the proper type (40) +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "lookupPrefix(DOMString)" with the proper type PASS Node interface: calling lookupPrefix(DOMString) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "lookupNamespaceURI" with the proper type (41) +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "lookupNamespaceURI(DOMString)" with the proper type PASS Node interface: calling lookupNamespaceURI(DOMString) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "isDefaultNamespace" with the proper type (42) +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "isDefaultNamespace(DOMString)" with the proper type PASS Node interface: calling isDefaultNamespace(DOMString) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "insertBefore" with the proper type (43) -PASS Node interface: calling insertBefore(Node,Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "appendChild" with the proper type (44) +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "insertBefore(Node, Node)" with the proper type +PASS Node interface: calling insertBefore(Node, Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "appendChild(Node)" with the proper type PASS Node interface: calling appendChild(Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "replaceChild" with the proper type (45) -PASS Node interface: calling replaceChild(Node,Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError -PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "removeChild" with the proper type (46) +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "replaceChild(Node, Node)" with the proper type +PASS Node interface: calling replaceChild(Node, Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError +PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "removeChild(Node)" with the proper type PASS Node interface: calling removeChild(Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError -PASS EventTarget interface: document.querySelector("[id]").attributes[0] must inherit property "addEventListener" with the proper type (0) -PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError -PASS EventTarget interface: document.querySelector("[id]").attributes[0] must inherit property "removeEventListener" with the proper type (1) -PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError -PASS EventTarget interface: document.querySelector("[id]").attributes[0] must inherit property "dispatchEvent" with the proper type (2) +PASS EventTarget interface: document.querySelector("[id]").attributes[0] must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError +PASS EventTarget interface: document.querySelector("[id]").attributes[0] must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError +PASS EventTarget interface: document.querySelector("[id]").attributes[0] must inherit property "dispatchEvent(Event)" with the proper type PASS EventTarget interface: calling dispatchEvent(Event) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError PASS CharacterData interface: existence and properties of interface object PASS CharacterData interface object length @@ -1083,11 +1083,11 @@ PASS CharacterData interface: existence and properties of interface prototype object's "constructor" property PASS CharacterData interface: attribute data PASS CharacterData interface: attribute length -PASS CharacterData interface: operation substringData(unsigned long,unsigned long) +PASS CharacterData interface: operation substringData(unsigned long, unsigned long) PASS CharacterData interface: operation appendData(DOMString) -PASS CharacterData interface: operation insertData(unsigned long,DOMString) -PASS CharacterData interface: operation deleteData(unsigned long,unsigned long) -PASS CharacterData interface: operation replaceData(unsigned long,unsigned long,DOMString) +PASS CharacterData interface: operation insertData(unsigned long, DOMString) +PASS CharacterData interface: operation deleteData(unsigned long, unsigned long) +PASS CharacterData interface: operation replaceData(unsigned long, unsigned long, DOMString) PASS CharacterData interface: attribute previousElementSibling PASS CharacterData interface: attribute nextElementSibling PASS CharacterData interface: operation before([object Object],[object Object]) @@ -1104,96 +1104,96 @@ PASS Text interface: attribute assignedSlot PASS Text must be primary interface of document.createTextNode("abc") PASS Stringification of document.createTextNode("abc") -PASS Text interface: document.createTextNode("abc") must inherit property "splitText" with the proper type (0) +PASS Text interface: document.createTextNode("abc") must inherit property "splitText(unsigned long)" with the proper type PASS Text interface: calling splitText(unsigned long) on document.createTextNode("abc") with too few arguments must throw TypeError -PASS Text interface: document.createTextNode("abc") must inherit property "wholeText" with the proper type (1) -PASS Text interface: document.createTextNode("abc") must inherit property "assignedSlot" with the proper type (2) -PASS CharacterData interface: document.createTextNode("abc") must inherit property "data" with the proper type (0) -PASS CharacterData interface: document.createTextNode("abc") must inherit property "length" with the proper type (1) -PASS CharacterData interface: document.createTextNode("abc") must inherit property "substringData" with the proper type (2) -PASS CharacterData interface: calling substringData(unsigned long,unsigned long) on document.createTextNode("abc") with too few arguments must throw TypeError -PASS CharacterData interface: document.createTextNode("abc") must inherit property "appendData" with the proper type (3) +PASS Text interface: document.createTextNode("abc") must inherit property "wholeText" with the proper type +PASS Text interface: document.createTextNode("abc") must inherit property "assignedSlot" with the proper type +PASS CharacterData interface: document.createTextNode("abc") must inherit property "data" with the proper type +PASS CharacterData interface: document.createTextNode("abc") must inherit property "length" with the proper type +PASS CharacterData interface: document.createTextNode("abc") must inherit property "substringData(unsigned long, unsigned long)" with the proper type +PASS CharacterData interface: calling substringData(unsigned long, unsigned long) on document.createTextNode("abc") with too few arguments must throw TypeError +PASS CharacterData interface: document.createTextNode("abc") must inherit property "appendData(DOMString)" with the proper type PASS CharacterData interface: calling appendData(DOMString) on document.createTextNode("abc") with too few arguments must throw TypeError -PASS CharacterData interface: document.createTextNode("abc") must inherit property "insertData" with the proper type (4) -PASS CharacterData interface: calling insertData(unsigned long,DOMString) on document.createTextNode("abc") with too few arguments must throw TypeError -PASS CharacterData interface: document.createTextNode("abc") must inherit property "deleteData" with the proper type (5) -PASS CharacterData interface: calling deleteData(unsigned long,unsigned long) on document.createTextNode("abc") with too few arguments must throw TypeError -PASS CharacterData interface: document.createTextNode("abc") must inherit property "replaceData" with the proper type (6) -PASS CharacterData interface: calling replaceData(unsigned long,unsigned long,DOMString) on document.createTextNode("abc") with too few arguments must throw TypeError -PASS CharacterData interface: document.createTextNode("abc") must inherit property "previousElementSibling" with the proper type (7) -PASS CharacterData interface: document.createTextNode("abc") must inherit property "nextElementSibling" with the proper type (8) -PASS CharacterData interface: document.createTextNode("abc") must inherit property "before" with the proper type (9) +PASS CharacterData interface: document.createTextNode("abc") must inherit property "insertData(unsigned long, DOMString)" with the proper type +PASS CharacterData interface: calling insertData(unsigned long, DOMString) on document.createTextNode("abc") with too few arguments must throw TypeError +PASS CharacterData interface: document.createTextNode("abc") must inherit property "deleteData(unsigned long, unsigned long)" with the proper type +PASS CharacterData interface: calling deleteData(unsigned long, unsigned long) on document.createTextNode("abc") with too few arguments must throw TypeError +PASS CharacterData interface: document.createTextNode("abc") must inherit property "replaceData(unsigned long, unsigned long, DOMString)" with the proper type +PASS CharacterData interface: calling replaceData(unsigned long, unsigned long, DOMString) on document.createTextNode("abc") with too few arguments must throw TypeError +PASS CharacterData interface: document.createTextNode("abc") must inherit property "previousElementSibling" with the proper type +PASS CharacterData interface: document.createTextNode("abc") must inherit property "nextElementSibling" with the proper type +PASS CharacterData interface: document.createTextNode("abc") must inherit property "before([object Object],[object Object])" with the proper type PASS CharacterData interface: calling before([object Object],[object Object]) on document.createTextNode("abc") with too few arguments must throw TypeError -PASS CharacterData interface: document.createTextNode("abc") must inherit property "after" with the proper type (10) +PASS CharacterData interface: document.createTextNode("abc") must inherit property "after([object Object],[object Object])" with the proper type PASS CharacterData interface: calling after([object Object],[object Object]) on document.createTextNode("abc") with too few arguments must throw TypeError -PASS CharacterData interface: document.createTextNode("abc") must inherit property "replaceWith" with the proper type (11) +PASS CharacterData interface: document.createTextNode("abc") must inherit property "replaceWith([object Object],[object Object])" with the proper type PASS CharacterData interface: calling replaceWith([object Object],[object Object]) on document.createTextNode("abc") with too few arguments must throw TypeError -PASS CharacterData interface: document.createTextNode("abc") must inherit property "remove" with the proper type (12) -PASS Node interface: document.createTextNode("abc") must inherit property "ELEMENT_NODE" with the proper type (0) -PASS Node interface: document.createTextNode("abc") must inherit property "ATTRIBUTE_NODE" with the proper type (1) -PASS Node interface: document.createTextNode("abc") must inherit property "TEXT_NODE" with the proper type (2) -PASS Node interface: document.createTextNode("abc") must inherit property "CDATA_SECTION_NODE" with the proper type (3) -PASS Node interface: document.createTextNode("abc") must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) -PASS Node interface: document.createTextNode("abc") must inherit property "ENTITY_NODE" with the proper type (5) -PASS Node interface: document.createTextNode("abc") must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) -PASS Node interface: document.createTextNode("abc") must inherit property "COMMENT_NODE" with the proper type (7) -PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_NODE" with the proper type (8) -PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) -PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) -PASS Node interface: document.createTextNode("abc") must inherit property "NOTATION_NODE" with the proper type (11) -PASS Node interface: document.createTextNode("abc") must inherit property "nodeType" with the proper type (12) -PASS Node interface: document.createTextNode("abc") must inherit property "nodeName" with the proper type (13) -PASS Node interface: document.createTextNode("abc") must inherit property "baseURI" with the proper type (14) -PASS Node interface: document.createTextNode("abc") must inherit property "isConnected" with the proper type (15) -PASS Node interface: document.createTextNode("abc") must inherit property "ownerDocument" with the proper type (16) -PASS Node interface: document.createTextNode("abc") must inherit property "getRootNode" with the proper type (17) +PASS CharacterData interface: document.createTextNode("abc") must inherit property "remove()" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "ELEMENT_NODE" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "ATTRIBUTE_NODE" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "TEXT_NODE" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "CDATA_SECTION_NODE" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "ENTITY_REFERENCE_NODE" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "ENTITY_NODE" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "COMMENT_NODE" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_NODE" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_TYPE_NODE" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "NOTATION_NODE" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "nodeType" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "nodeName" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "baseURI" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "isConnected" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "ownerDocument" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "getRootNode(GetRootNodeOptions)" with the proper type PASS Node interface: calling getRootNode(GetRootNodeOptions) on document.createTextNode("abc") with too few arguments must throw TypeError -PASS Node interface: document.createTextNode("abc") must inherit property "parentNode" with the proper type (18) -PASS Node interface: document.createTextNode("abc") must inherit property "parentElement" with the proper type (19) -PASS Node interface: document.createTextNode("abc") must inherit property "hasChildNodes" with the proper type (20) -PASS Node interface: document.createTextNode("abc") must inherit property "childNodes" with the proper type (21) -PASS Node interface: document.createTextNode("abc") must inherit property "firstChild" with the proper type (22) -PASS Node interface: document.createTextNode("abc") must inherit property "lastChild" with the proper type (23) -PASS Node interface: document.createTextNode("abc") must inherit property "previousSibling" with the proper type (24) -PASS Node interface: document.createTextNode("abc") must inherit property "nextSibling" with the proper type (25) -PASS Node interface: document.createTextNode("abc") must inherit property "nodeValue" with the proper type (26) -PASS Node interface: document.createTextNode("abc") must inherit property "textContent" with the proper type (27) -PASS Node interface: document.createTextNode("abc") must inherit property "normalize" with the proper type (28) -PASS Node interface: document.createTextNode("abc") must inherit property "cloneNode" with the proper type (29) +PASS Node interface: document.createTextNode("abc") must inherit property "parentNode" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "parentElement" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "hasChildNodes()" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "childNodes" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "firstChild" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "lastChild" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "previousSibling" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "nextSibling" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "nodeValue" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "textContent" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "normalize()" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "cloneNode(boolean)" with the proper type PASS Node interface: calling cloneNode(boolean) on document.createTextNode("abc") with too few arguments must throw TypeError -PASS Node interface: document.createTextNode("abc") must inherit property "isEqualNode" with the proper type (30) +PASS Node interface: document.createTextNode("abc") must inherit property "isEqualNode(Node)" with the proper type PASS Node interface: calling isEqualNode(Node) on document.createTextNode("abc") with too few arguments must throw TypeError -PASS Node interface: document.createTextNode("abc") must inherit property "isSameNode" with the proper type (31) +PASS Node interface: document.createTextNode("abc") must inherit property "isSameNode(Node)" with the proper type PASS Node interface: calling isSameNode(Node) on document.createTextNode("abc") with too few arguments must throw TypeError -PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) -PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) -PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) -PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) -PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) -PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) -PASS Node interface: document.createTextNode("abc") must inherit property "compareDocumentPosition" with the proper type (38) +PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type +PASS Node interface: document.createTextNode("abc") must inherit property "compareDocumentPosition(Node)" with the proper type PASS Node interface: calling compareDocumentPosition(Node) on document.createTextNode("abc") with too few arguments must throw TypeError -PASS Node interface: document.createTextNode("abc") must inherit property "contains" with the proper type (39) +PASS Node interface: document.createTextNode("abc") must inherit property "contains(Node)" with the proper type PASS Node interface: calling contains(Node) on document.createTextNode("abc") with too few arguments must throw TypeError -PASS Node interface: document.createTextNode("abc") must inherit property "lookupPrefix" with the proper type (40) +PASS Node interface: document.createTextNode("abc") must inherit property "lookupPrefix(DOMString)" with the proper type PASS Node interface: calling lookupPrefix(DOMString) on document.createTextNode("abc") with too few arguments must throw TypeError -PASS Node interface: document.createTextNode("abc") must inherit property "lookupNamespaceURI" with the proper type (41) +PASS Node interface: document.createTextNode("abc") must inherit property "lookupNamespaceURI(DOMString)" with the proper type PASS Node interface: calling lookupNamespaceURI(DOMString) on document.createTextNode("abc") with too few arguments must throw TypeError -PASS Node interface: document.createTextNode("abc") must inherit property "isDefaultNamespace" with the proper type (42) +PASS Node interface: document.createTextNode("abc") must inherit property "isDefaultNamespace(DOMString)" with the proper type PASS Node interface: calling isDefaultNamespace(DOMString) on document.createTextNode("abc") with too few arguments must throw TypeError -PASS Node interface: document.createTextNode("abc") must inherit property "insertBefore" with the proper type (43) -PASS Node interface: calling insertBefore(Node,Node) on document.createTextNode("abc") with too few arguments must throw TypeError -PASS Node interface: document.createTextNode("abc") must inherit property "appendChild" with the proper type (44) +PASS Node interface: document.createTextNode("abc") must inherit property "insertBefore(Node, Node)" with the proper type +PASS Node interface: calling insertBefore(Node, Node) on document.createTextNode("abc") with too few arguments must throw TypeError +PASS Node interface: document.createTextNode("abc") must inherit property "appendChild(Node)" with the proper type PASS Node interface: calling appendChild(Node) on document.createTextNode("abc") with too few arguments must throw TypeError -PASS Node interface: document.createTextNode("abc") must inherit property "replaceChild" with the proper type (45) -PASS Node interface: calling replaceChild(Node,Node) on document.createTextNode("abc") with too few arguments must throw TypeError -PASS Node interface: document.createTextNode("abc") must inherit property "removeChild" with the proper type (46) +PASS Node interface: document.createTextNode("abc") must inherit property "replaceChild(Node, Node)" with the proper type +PASS Node interface: calling replaceChild(Node, Node) on document.createTextNode("abc") with too few arguments must throw TypeError +PASS Node interface: document.createTextNode("abc") must inherit property "removeChild(Node)" with the proper type PASS Node interface: calling removeChild(Node) on document.createTextNode("abc") with too few arguments must throw TypeError -PASS EventTarget interface: document.createTextNode("abc") must inherit property "addEventListener" with the proper type (0) -PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on document.createTextNode("abc") with too few arguments must throw TypeError -PASS EventTarget interface: document.createTextNode("abc") must inherit property "removeEventListener" with the proper type (1) -PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on document.createTextNode("abc") with too few arguments must throw TypeError -PASS EventTarget interface: document.createTextNode("abc") must inherit property "dispatchEvent" with the proper type (2) +PASS EventTarget interface: document.createTextNode("abc") must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on document.createTextNode("abc") with too few arguments must throw TypeError +PASS EventTarget interface: document.createTextNode("abc") must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on document.createTextNode("abc") with too few arguments must throw TypeError +PASS EventTarget interface: document.createTextNode("abc") must inherit property "dispatchEvent(Event)" with the proper type PASS EventTarget interface: calling dispatchEvent(Event) on document.createTextNode("abc") with too few arguments must throw TypeError PASS CDATASection interface: existence and properties of interface object PASS CDATASection interface object length @@ -1208,93 +1208,93 @@ PASS ProcessingInstruction interface: attribute target PASS ProcessingInstruction must be primary interface of xmlDoc.createProcessingInstruction("abc", "def") PASS Stringification of xmlDoc.createProcessingInstruction("abc", "def") -PASS ProcessingInstruction interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "target" with the proper type (0) -PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "data" with the proper type (0) -PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "length" with the proper type (1) -PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "substringData" with the proper type (2) -PASS CharacterData interface: calling substringData(unsigned long,unsigned long) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError -PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "appendData" with the proper type (3) +PASS ProcessingInstruction interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "target" with the proper type +PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "data" with the proper type +PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "length" with the proper type +PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "substringData(unsigned long, unsigned long)" with the proper type +PASS CharacterData interface: calling substringData(unsigned long, unsigned long) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError +PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "appendData(DOMString)" with the proper type PASS CharacterData interface: calling appendData(DOMString) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError -PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "insertData" with the proper type (4) -PASS CharacterData interface: calling insertData(unsigned long,DOMString) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError -PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "deleteData" with the proper type (5) -PASS CharacterData interface: calling deleteData(unsigned long,unsigned long) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError -PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "replaceData" with the proper type (6) -PASS CharacterData interface: calling replaceData(unsigned long,unsigned long,DOMString) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError -PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "previousElementSibling" with the proper type (7) -PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nextElementSibling" with the proper type (8) -PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "before" with the proper type (9) +PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "insertData(unsigned long, DOMString)" with the proper type +PASS CharacterData interface: calling insertData(unsigned long, DOMString) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError +PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "deleteData(unsigned long, unsigned long)" with the proper type +PASS CharacterData interface: calling deleteData(unsigned long, unsigned long) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError +PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "replaceData(unsigned long, unsigned long, DOMString)" with the proper type +PASS CharacterData interface: calling replaceData(unsigned long, unsigned long, DOMString) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError +PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "previousElementSibling" with the proper type +PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nextElementSibling" with the proper type +PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "before([object Object],[object Object])" with the proper type PASS CharacterData interface: calling before([object Object],[object Object]) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError -PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "after" with the proper type (10) +PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "after([object Object],[object Object])" with the proper type PASS CharacterData interface: calling after([object Object],[object Object]) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError -PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "replaceWith" with the proper type (11) +PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "replaceWith([object Object],[object Object])" with the proper type PASS CharacterData interface: calling replaceWith([object Object],[object Object]) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError -PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "remove" with the proper type (12) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ELEMENT_NODE" with the proper type (0) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ATTRIBUTE_NODE" with the proper type (1) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "TEXT_NODE" with the proper type (2) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "CDATA_SECTION_NODE" with the proper type (3) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ENTITY_NODE" with the proper type (5) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "COMMENT_NODE" with the proper type (7) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_NODE" with the proper type (8) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "NOTATION_NODE" with the proper type (11) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nodeType" with the proper type (12) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nodeName" with the proper type (13) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "baseURI" with the proper type (14) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "isConnected" with the proper type (15) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ownerDocument" with the proper type (16) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "getRootNode" with the proper type (17) +PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "remove()" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ELEMENT_NODE" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ATTRIBUTE_NODE" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "TEXT_NODE" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "CDATA_SECTION_NODE" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ENTITY_REFERENCE_NODE" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ENTITY_NODE" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "COMMENT_NODE" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_NODE" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_TYPE_NODE" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "NOTATION_NODE" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nodeType" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nodeName" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "baseURI" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "isConnected" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ownerDocument" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "getRootNode(GetRootNodeOptions)" with the proper type PASS Node interface: calling getRootNode(GetRootNodeOptions) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "parentNode" with the proper type (18) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "parentElement" with the proper type (19) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "hasChildNodes" with the proper type (20) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "childNodes" with the proper type (21) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "firstChild" with the proper type (22) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "lastChild" with the proper type (23) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "previousSibling" with the proper type (24) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nextSibling" with the proper type (25) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nodeValue" with the proper type (26) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "textContent" with the proper type (27) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "normalize" with the proper type (28) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "cloneNode" with the proper type (29) +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "parentNode" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "parentElement" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "hasChildNodes()" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "childNodes" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "firstChild" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "lastChild" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "previousSibling" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nextSibling" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nodeValue" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "textContent" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "normalize()" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "cloneNode(boolean)" with the proper type PASS Node interface: calling cloneNode(boolean) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "isEqualNode" with the proper type (30) +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "isEqualNode(Node)" with the proper type PASS Node interface: calling isEqualNode(Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "isSameNode" with the proper type (31) +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "isSameNode(Node)" with the proper type PASS Node interface: calling isSameNode(Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "compareDocumentPosition" with the proper type (38) +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "compareDocumentPosition(Node)" with the proper type PASS Node interface: calling compareDocumentPosition(Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "contains" with the proper type (39) +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "contains(Node)" with the proper type PASS Node interface: calling contains(Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "lookupPrefix" with the proper type (40) +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "lookupPrefix(DOMString)" with the proper type PASS Node interface: calling lookupPrefix(DOMString) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "lookupNamespaceURI" with the proper type (41) +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "lookupNamespaceURI(DOMString)" with the proper type PASS Node interface: calling lookupNamespaceURI(DOMString) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "isDefaultNamespace" with the proper type (42) +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "isDefaultNamespace(DOMString)" with the proper type PASS Node interface: calling isDefaultNamespace(DOMString) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "insertBefore" with the proper type (43) -PASS Node interface: calling insertBefore(Node,Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "appendChild" with the proper type (44) +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "insertBefore(Node, Node)" with the proper type +PASS Node interface: calling insertBefore(Node, Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "appendChild(Node)" with the proper type PASS Node interface: calling appendChild(Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "replaceChild" with the proper type (45) -PASS Node interface: calling replaceChild(Node,Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError -PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "removeChild" with the proper type (46) +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "replaceChild(Node, Node)" with the proper type +PASS Node interface: calling replaceChild(Node, Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError +PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "removeChild(Node)" with the proper type PASS Node interface: calling removeChild(Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError -PASS EventTarget interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "addEventListener" with the proper type (0) -PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError -PASS EventTarget interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "removeEventListener" with the proper type (1) -PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError -PASS EventTarget interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "dispatchEvent" with the proper type (2) +PASS EventTarget interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError +PASS EventTarget interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError +PASS EventTarget interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "dispatchEvent(Event)" with the proper type PASS EventTarget interface: calling dispatchEvent(Event) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError PASS Comment interface: existence and properties of interface object PASS Comment interface object length @@ -1303,92 +1303,92 @@ PASS Comment interface: existence and properties of interface prototype object's "constructor" property PASS Comment must be primary interface of document.createComment("abc") PASS Stringification of document.createComment("abc") -PASS CharacterData interface: document.createComment("abc") must inherit property "data" with the proper type (0) -PASS CharacterData interface: document.createComment("abc") must inherit property "length" with the proper type (1) -PASS CharacterData interface: document.createComment("abc") must inherit property "substringData" with the proper type (2) -PASS CharacterData interface: calling substringData(unsigned long,unsigned long) on document.createComment("abc") with too few arguments must throw TypeError -PASS CharacterData interface: document.createComment("abc") must inherit property "appendData" with the proper type (3) +PASS CharacterData interface: document.createComment("abc") must inherit property "data" with the proper type +PASS CharacterData interface: document.createComment("abc") must inherit property "length" with the proper type +PASS CharacterData interface: document.createComment("abc") must inherit property "substringData(unsigned long, unsigned long)" with the proper type +PASS CharacterData interface: calling substringData(unsigned long, unsigned long) on document.createComment("abc") with too few arguments must throw TypeError +PASS CharacterData interface: document.createComment("abc") must inherit property "appendData(DOMString)" with the proper type PASS CharacterData interface: calling appendData(DOMString) on document.createComment("abc") with too few arguments must throw TypeError -PASS CharacterData interface: document.createComment("abc") must inherit property "insertData" with the proper type (4) -PASS CharacterData interface: calling insertData(unsigned long,DOMString) on document.createComment("abc") with too few arguments must throw TypeError -PASS CharacterData interface: document.createComment("abc") must inherit property "deleteData" with the proper type (5) -PASS CharacterData interface: calling deleteData(unsigned long,unsigned long) on document.createComment("abc") with too few arguments must throw TypeError -PASS CharacterData interface: document.createComment("abc") must inherit property "replaceData" with the proper type (6) -PASS CharacterData interface: calling replaceData(unsigned long,unsigned long,DOMString) on document.createComment("abc") with too few arguments must throw TypeError -PASS CharacterData interface: document.createComment("abc") must inherit property "previousElementSibling" with the proper type (7) -PASS CharacterData interface: document.createComment("abc") must inherit property "nextElementSibling" with the proper type (8) -PASS CharacterData interface: document.createComment("abc") must inherit property "before" with the proper type (9) +PASS CharacterData interface: document.createComment("abc") must inherit property "insertData(unsigned long, DOMString)" with the proper type +PASS CharacterData interface: calling insertData(unsigned long, DOMString) on document.createComment("abc") with too few arguments must throw TypeError +PASS CharacterData interface: document.createComment("abc") must inherit property "deleteData(unsigned long, unsigned long)" with the proper type +PASS CharacterData interface: calling deleteData(unsigned long, unsigned long) on document.createComment("abc") with too few arguments must throw TypeError +PASS CharacterData interface: document.createComment("abc") must inherit property "replaceData(unsigned long, unsigned long, DOMString)" with the proper type +PASS CharacterData interface: calling replaceData(unsigned long, unsigned long, DOMString) on document.createComment("abc") with too few arguments must throw TypeError +PASS CharacterData interface: document.createComment("abc") must inherit property "previousElementSibling" with the proper type +PASS CharacterData interface: document.createComment("abc") must inherit property "nextElementSibling" with the proper type +PASS CharacterData interface: document.createComment("abc") must inherit property "before([object Object],[object Object])" with the proper type PASS CharacterData interface: calling before([object Object],[object Object]) on document.createComment("abc") with too few arguments must throw TypeError -PASS CharacterData interface: document.createComment("abc") must inherit property "after" with the proper type (10) +PASS CharacterData interface: document.createComment("abc") must inherit property "after([object Object],[object Object])" with the proper type PASS CharacterData interface: calling after([object Object],[object Object]) on document.createComment("abc") with too few arguments must throw TypeError -PASS CharacterData interface: document.createComment("abc") must inherit property "replaceWith" with the proper type (11) +PASS CharacterData interface: document.createComment("abc") must inherit property "replaceWith([object Object],[object Object])" with the proper type PASS CharacterData interface: calling replaceWith([object Object],[object Object]) on document.createComment("abc") with too few arguments must throw TypeError -PASS CharacterData interface: document.createComment("abc") must inherit property "remove" with the proper type (12) -PASS Node interface: document.createComment("abc") must inherit property "ELEMENT_NODE" with the proper type (0) -PASS Node interface: document.createComment("abc") must inherit property "ATTRIBUTE_NODE" with the proper type (1) -PASS Node interface: document.createComment("abc") must inherit property "TEXT_NODE" with the proper type (2) -PASS Node interface: document.createComment("abc") must inherit property "CDATA_SECTION_NODE" with the proper type (3) -PASS Node interface: document.createComment("abc") must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) -PASS Node interface: document.createComment("abc") must inherit property "ENTITY_NODE" with the proper type (5) -PASS Node interface: document.createComment("abc") must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) -PASS Node interface: document.createComment("abc") must inherit property "COMMENT_NODE" with the proper type (7) -PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_NODE" with the proper type (8) -PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) -PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) -PASS Node interface: document.createComment("abc") must inherit property "NOTATION_NODE" with the proper type (11) -PASS Node interface: document.createComment("abc") must inherit property "nodeType" with the proper type (12) -PASS Node interface: document.createComment("abc") must inherit property "nodeName" with the proper type (13) -PASS Node interface: document.createComment("abc") must inherit property "baseURI" with the proper type (14) -PASS Node interface: document.createComment("abc") must inherit property "isConnected" with the proper type (15) -PASS Node interface: document.createComment("abc") must inherit property "ownerDocument" with the proper type (16) -PASS Node interface: document.createComment("abc") must inherit property "getRootNode" with the proper type (17) +PASS CharacterData interface: document.createComment("abc") must inherit property "remove()" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "ELEMENT_NODE" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "ATTRIBUTE_NODE" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "TEXT_NODE" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "CDATA_SECTION_NODE" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "ENTITY_REFERENCE_NODE" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "ENTITY_NODE" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "COMMENT_NODE" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_NODE" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_TYPE_NODE" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "NOTATION_NODE" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "nodeType" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "nodeName" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "baseURI" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "isConnected" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "ownerDocument" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "getRootNode(GetRootNodeOptions)" with the proper type PASS Node interface: calling getRootNode(GetRootNodeOptions) on document.createComment("abc") with too few arguments must throw TypeError -PASS Node interface: document.createComment("abc") must inherit property "parentNode" with the proper type (18) -PASS Node interface: document.createComment("abc") must inherit property "parentElement" with the proper type (19) -PASS Node interface: document.createComment("abc") must inherit property "hasChildNodes" with the proper type (20) -PASS Node interface: document.createComment("abc") must inherit property "childNodes" with the proper type (21) -PASS Node interface: document.createComment("abc") must inherit property "firstChild" with the proper type (22) -PASS Node interface: document.createComment("abc") must inherit property "lastChild" with the proper type (23) -PASS Node interface: document.createComment("abc") must inherit property "previousSibling" with the proper type (24) -PASS Node interface: document.createComment("abc") must inherit property "nextSibling" with the proper type (25) -PASS Node interface: document.createComment("abc") must inherit property "nodeValue" with the proper type (26) -PASS Node interface: document.createComment("abc") must inherit property "textContent" with the proper type (27) -PASS Node interface: document.createComment("abc") must inherit property "normalize" with the proper type (28) -PASS Node interface: document.createComment("abc") must inherit property "cloneNode" with the proper type (29) +PASS Node interface: document.createComment("abc") must inherit property "parentNode" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "parentElement" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "hasChildNodes()" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "childNodes" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "firstChild" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "lastChild" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "previousSibling" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "nextSibling" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "nodeValue" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "textContent" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "normalize()" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "cloneNode(boolean)" with the proper type PASS Node interface: calling cloneNode(boolean) on document.createComment("abc") with too few arguments must throw TypeError -PASS Node interface: document.createComment("abc") must inherit property "isEqualNode" with the proper type (30) +PASS Node interface: document.createComment("abc") must inherit property "isEqualNode(Node)" with the proper type PASS Node interface: calling isEqualNode(Node) on document.createComment("abc") with too few arguments must throw TypeError -PASS Node interface: document.createComment("abc") must inherit property "isSameNode" with the proper type (31) +PASS Node interface: document.createComment("abc") must inherit property "isSameNode(Node)" with the proper type PASS Node interface: calling isSameNode(Node) on document.createComment("abc") with too few arguments must throw TypeError -PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) -PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) -PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) -PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) -PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) -PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) -PASS Node interface: document.createComment("abc") must inherit property "compareDocumentPosition" with the proper type (38) +PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type +PASS Node interface: document.createComment("abc") must inherit property "compareDocumentPosition(Node)" with the proper type PASS Node interface: calling compareDocumentPosition(Node) on document.createComment("abc") with too few arguments must throw TypeError -PASS Node interface: document.createComment("abc") must inherit property "contains" with the proper type (39) +PASS Node interface: document.createComment("abc") must inherit property "contains(Node)" with the proper type PASS Node interface: calling contains(Node) on document.createComment("abc") with too few arguments must throw TypeError -PASS Node interface: document.createComment("abc") must inherit property "lookupPrefix" with the proper type (40) +PASS Node interface: document.createComment("abc") must inherit property "lookupPrefix(DOMString)" with the proper type PASS Node interface: calling lookupPrefix(DOMString) on document.createComment("abc") with too few arguments must throw TypeError -PASS Node interface: document.createComment("abc") must inherit property "lookupNamespaceURI" with the proper type (41) +PASS Node interface: document.createComment("abc") must inherit property "lookupNamespaceURI(DOMString)" with the proper type PASS Node interface: calling lookupNamespaceURI(DOMString) on document.createComment("abc") with too few arguments must throw TypeError -PASS Node interface: document.createComment("abc") must inherit property "isDefaultNamespace" with the proper type (42) +PASS Node interface: document.createComment("abc") must inherit property "isDefaultNamespace(DOMString)" with the proper type PASS Node interface: calling isDefaultNamespace(DOMString) on document.createComment("abc") with too few arguments must throw TypeError -PASS Node interface: document.createComment("abc") must inherit property "insertBefore" with the proper type (43) -PASS Node interface: calling insertBefore(Node,Node) on document.createComment("abc") with too few arguments must throw TypeError -PASS Node interface: document.createComment("abc") must inherit property "appendChild" with the proper type (44) +PASS Node interface: document.createComment("abc") must inherit property "insertBefore(Node, Node)" with the proper type +PASS Node interface: calling insertBefore(Node, Node) on document.createComment("abc") with too few arguments must throw TypeError +PASS Node interface: document.createComment("abc") must inherit property "appendChild(Node)" with the proper type PASS Node interface: calling appendChild(Node) on document.createComment("abc") with too few arguments must throw TypeError -PASS Node interface: document.createComment("abc") must inherit property "replaceChild" with the proper type (45) -PASS Node interface: calling replaceChild(Node,Node) on document.createComment("abc") with too few arguments must throw TypeError -PASS Node interface: document.createComment("abc") must inherit property "removeChild" with the proper type (46) +PASS Node interface: document.createComment("abc") must inherit property "replaceChild(Node, Node)" with the proper type +PASS Node interface: calling replaceChild(Node, Node) on document.createComment("abc") with too few arguments must throw TypeError +PASS Node interface: document.createComment("abc") must inherit property "removeChild(Node)" with the proper type PASS Node interface: calling removeChild(Node) on document.createComment("abc") with too few arguments must throw TypeError -PASS EventTarget interface: document.createComment("abc") must inherit property "addEventListener" with the proper type (0) -PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on document.createComment("abc") with too few arguments must throw TypeError -PASS EventTarget interface: document.createComment("abc") must inherit property "removeEventListener" with the proper type (1) -PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on document.createComment("abc") with too few arguments must throw TypeError -PASS EventTarget interface: document.createComment("abc") must inherit property "dispatchEvent" with the proper type (2) +PASS EventTarget interface: document.createComment("abc") must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on document.createComment("abc") with too few arguments must throw TypeError +PASS EventTarget interface: document.createComment("abc") must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on document.createComment("abc") with too few arguments must throw TypeError +PASS EventTarget interface: document.createComment("abc") must inherit property "dispatchEvent(Event)" with the proper type PASS EventTarget interface: calling dispatchEvent(Event) on document.createComment("abc") with too few arguments must throw TypeError PASS Range interface: existence and properties of interface object PASS Range interface object length @@ -1401,8 +1401,8 @@ PASS Range interface: attribute endOffset PASS Range interface: attribute collapsed PASS Range interface: attribute commonAncestorContainer -PASS Range interface: operation setStart(Node,unsigned long) -PASS Range interface: operation setEnd(Node,unsigned long) +PASS Range interface: operation setStart(Node, unsigned long) +PASS Range interface: operation setEnd(Node, unsigned long) PASS Range interface: operation setStartBefore(Node) PASS Range interface: operation setStartAfter(Node) PASS Range interface: operation setEndBefore(Node) @@ -1418,7 +1418,7 @@ PASS Range interface: constant END_TO_END on interface prototype object PASS Range interface: constant END_TO_START on interface object PASS Range interface: constant END_TO_START on interface prototype object -PASS Range interface: operation compareBoundaryPoints(unsigned short,Range) +PASS Range interface: operation compareBoundaryPoints(unsigned short, Range) PASS Range interface: operation deleteContents() PASS Range interface: operation extractContents() PASS Range interface: operation cloneContents() @@ -1426,103 +1426,103 @@ PASS Range interface: operation surroundContents(Node) PASS Range interface: operation cloneRange() PASS Range interface: operation detach() -PASS Range interface: operation isPointInRange(Node,unsigned long) -PASS Range interface: operation comparePoint(Node,unsigned long) +PASS Range interface: operation isPointInRange(Node, unsigned long) +PASS Range interface: operation comparePoint(Node, unsigned long) PASS Range interface: operation intersectsNode(Node) PASS Range interface: stringifier PASS Range must be primary interface of document.createRange() PASS Stringification of document.createRange() -PASS Range interface: document.createRange() must inherit property "startContainer" with the proper type (0) -PASS Range interface: document.createRange() must inherit property "startOffset" with the proper type (1) -PASS Range interface: document.createRange() must inherit property "endContainer" with the proper type (2) -PASS Range interface: document.createRange() must inherit property "endOffset" with the proper type (3) -PASS Range interface: document.createRange() must inherit property "collapsed" with the proper type (4) -PASS Range interface: document.createRange() must inherit property "commonAncestorContainer" with the proper type (5) -PASS Range interface: document.createRange() must inherit property "setStart" with the proper type (6) -PASS Range interface: calling setStart(Node,unsigned long) on document.createRange() with too few arguments must throw TypeError -PASS Range interface: document.createRange() must inherit property "setEnd" with the proper type (7) -PASS Range interface: calling setEnd(Node,unsigned long) on document.createRange() with too few arguments must throw TypeError -PASS Range interface: document.createRange() must inherit property "setStartBefore" with the proper type (8) +PASS Range interface: document.createRange() must inherit property "startContainer" with the proper type +PASS Range interface: document.createRange() must inherit property "startOffset" with the proper type +PASS Range interface: document.createRange() must inherit property "endContainer" with the proper type +PASS Range interface: document.createRange() must inherit property "endOffset" with the proper type +PASS Range interface: document.createRange() must inherit property "collapsed" with the proper type +PASS Range interface: document.createRange() must inherit property "commonAncestorContainer" with the proper type +PASS Range interface: document.createRange() must inherit property "setStart(Node, unsigned long)" with the proper type +PASS Range interface: calling setStart(Node, unsigned long) on document.createRange() with too few arguments must throw TypeError +PASS Range interface: document.createRange() must inherit property "setEnd(Node, unsigned long)" with the proper type +PASS Range interface: calling setEnd(Node, unsigned long) on document.createRange() with too few arguments must throw TypeError +PASS Range interface: document.createRange() must inherit property "setStartBefore(Node)" with the proper type PASS Range interface: calling setStartBefore(Node) on document.createRange() with too few arguments must throw TypeError -PASS Range interface: document.createRange() must inherit property "setStartAfter" with the proper type (9) +PASS Range interface: document.createRange() must inherit property "setStartAfter(Node)" with the proper type PASS Range interface: calling setStartAfter(Node) on document.createRange() with too few arguments must throw TypeError -PASS Range interface: document.createRange() must inherit property "setEndBefore" with the proper type (10) +PASS Range interface: document.createRange() must inherit property "setEndBefore(Node)" with the proper type PASS Range interface: calling setEndBefore(Node) on document.createRange() with too few arguments must throw TypeError -PASS Range interface: document.createRange() must inherit property "setEndAfter" with the proper type (11) +PASS Range interface: document.createRange() must inherit property "setEndAfter(Node)" with the proper type PASS Range interface: calling setEndAfter(Node) on document.createRange() with too few arguments must throw TypeError -PASS Range interface: document.createRange() must inherit property "collapse" with the proper type (12) +PASS Range interface: document.createRange() must inherit property "collapse(boolean)" with the proper type PASS Range interface: calling collapse(boolean) on document.createRange() with too few arguments must throw TypeError -PASS Range interface: document.createRange() must inherit property "selectNode" with the proper type (13) +PASS Range interface: document.createRange() must inherit property "selectNode(Node)" with the proper type PASS Range interface: calling selectNode(Node) on document.createRange() with too few arguments must throw TypeError -PASS Range interface: document.createRange() must inherit property "selectNodeContents" with the proper type (14) +PASS Range interface: document.createRange() must inherit property "selectNodeContents(Node)" with the proper type PASS Range interface: calling selectNodeContents(Node) on document.createRange() with too few arguments must throw TypeError -PASS Range interface: document.createRange() must inherit property "START_TO_START" with the proper type (15) -PASS Range interface: document.createRange() must inherit property "START_TO_END" with the proper type (16) -PASS Range interface: document.createRange() must inherit property "END_TO_END" with the proper type (17) -PASS Range interface: document.createRange() must inherit property "END_TO_START" with the proper type (18) -PASS Range interface: document.createRange() must inherit property "compareBoundaryPoints" with the proper type (19) -PASS Range interface: calling compareBoundaryPoints(unsigned short,Range) on document.createRange() with too few arguments must throw TypeError -PASS Range interface: document.createRange() must inherit property "deleteContents" with the proper type (20) -PASS Range interface: document.createRange() must inherit property "extractContents" with the proper type (21) -PASS Range interface: document.createRange() must inherit property "cloneContents" with the proper type (22) -PASS Range interface: document.createRange() must inherit property "insertNode" with the proper type (23) +PASS Range interface: document.createRange() must inherit property "START_TO_START" with the proper type +PASS Range interface: document.createRange() must inherit property "START_TO_END" with the proper type +PASS Range interface: document.createRange() must inherit property "END_TO_END" with the proper type +PASS Range interface: document.createRange() must inherit property "END_TO_START" with the proper type +PASS Range interface: document.createRange() must inherit property "compareBoundaryPoints(unsigned short, Range)" with the proper type +PASS Range interface: calling compareBoundaryPoints(unsigned short, Range) on document.createRange() with too few arguments must throw TypeError +PASS Range interface: document.createRange() must inherit property "deleteContents()" with the proper type +PASS Range interface: document.createRange() must inherit property "extractContents()" with the proper type +PASS Range interface: document.createRange() must inherit property "cloneContents()" with the proper type +PASS Range interface: document.createRange() must inherit property "insertNode(Node)" with the proper type PASS Range interface: calling insertNode(Node) on document.createRange() with too few arguments must throw TypeError -PASS Range interface: document.createRange() must inherit property "surroundContents" with the proper type (24) +PASS Range interface: document.createRange() must inherit property "surroundContents(Node)" with the proper type PASS Range interface: calling surroundContents(Node) on document.createRange() with too few arguments must throw TypeError -PASS Range interface: document.createRange() must inherit property "cloneRange" with the proper type (25) -PASS Range interface: document.createRange() must inherit property "detach" with the proper type (26) -PASS Range interface: document.createRange() must inherit property "isPointInRange" with the proper type (27) -PASS Range interface: calling isPointInRange(Node,unsigned long) on document.createRange() with too few arguments must throw TypeError -PASS Range interface: document.createRange() must inherit property "comparePoint" with the proper type (28) -PASS Range interface: calling comparePoint(Node,unsigned long) on document.createRange() with too few arguments must throw TypeError -PASS Range interface: document.createRange() must inherit property "intersectsNode" with the proper type (29) +PASS Range interface: document.createRange() must inherit property "cloneRange()" with the proper type +PASS Range interface: document.createRange() must inherit property "detach()" with the proper type +PASS Range interface: document.createRange() must inherit property "isPointInRange(Node, unsigned long)" with the proper type +PASS Range interface: calling isPointInRange(Node, unsigned long) on document.createRange() with too few arguments must throw TypeError +PASS Range interface: document.createRange() must inherit property "comparePoint(Node, unsigned long)" with the proper type +PASS Range interface: calling comparePoint(Node, unsigned long) on document.createRange() with too few arguments must throw TypeError +PASS Range interface: document.createRange() must inherit property "intersectsNode(Node)" with the proper type PASS Range interface: calling intersectsNode(Node) on document.createRange() with too few arguments must throw TypeError PASS Range must be primary interface of detachedRange PASS Stringification of detachedRange -PASS Range interface: detachedRange must inherit property "startContainer" with the proper type (0) -PASS Range interface: detachedRange must inherit property "startOffset" with the proper type (1) -PASS Range interface: detachedRange must inherit property "endContainer" with the proper type (2) -PASS Range interface: detachedRange must inherit property "endOffset" with the proper type (3) -PASS Range interface: detachedRange must inherit property "collapsed" with the proper type (4) -PASS Range interface: detachedRange must inherit property "commonAncestorContainer" with the proper type (5) -PASS Range interface: detachedRange must inherit property "setStart" with the proper type (6) -PASS Range interface: calling setStart(Node,unsigned long) on detachedRange with too few arguments must throw TypeError -PASS Range interface: detachedRange must inherit property "setEnd" with the proper type (7) -PASS Range interface: calling setEnd(Node,unsigned long) on detachedRange with too few arguments must throw TypeError -PASS Range interface: detachedRange must inherit property "setStartBefore" with the proper type (8) +PASS Range interface: detachedRange must inherit property "startContainer" with the proper type +PASS Range interface: detachedRange must inherit property "startOffset" with the proper type +PASS Range interface: detachedRange must inherit property "endContainer" with the proper type +PASS Range interface: detachedRange must inherit property "endOffset" with the proper type +PASS Range interface: detachedRange must inherit property "collapsed" with the proper type +PASS Range interface: detachedRange must inherit property "commonAncestorContainer" with the proper type +PASS Range interface: detachedRange must inherit property "setStart(Node, unsigned long)" with the proper type +PASS Range interface: calling setStart(Node, unsigned long) on detachedRange with too few arguments must throw TypeError +PASS Range interface: detachedRange must inherit property "setEnd(Node, unsigned long)" with the proper type +PASS Range interface: calling setEnd(Node, unsigned long) on detachedRange with too few arguments must throw TypeError +PASS Range interface: detachedRange must inherit property "setStartBefore(Node)" with the proper type PASS Range interface: calling setStartBefore(Node) on detachedRange with too few arguments must throw TypeError -PASS Range interface: detachedRange must inherit property "setStartAfter" with the proper type (9) +PASS Range interface: detachedRange must inherit property "setStartAfter(Node)" with the proper type PASS Range interface: calling setStartAfter(Node) on detachedRange with too few arguments must throw TypeError -PASS Range interface: detachedRange must inherit property "setEndBefore" with the proper type (10) +PASS Range interface: detachedRange must inherit property "setEndBefore(Node)" with the proper type PASS Range interface: calling setEndBefore(Node) on detachedRange with too few arguments must throw TypeError -PASS Range interface: detachedRange must inherit property "setEndAfter" with the proper type (11) +PASS Range interface: detachedRange must inherit property "setEndAfter(Node)" with the proper type PASS Range interface: calling setEndAfter(Node) on detachedRange with too few arguments must throw TypeError -PASS Range interface: detachedRange must inherit property "collapse" with the proper type (12) +PASS Range interface: detachedRange must inherit property "collapse(boolean)" with the proper type PASS Range interface: calling collapse(boolean) on detachedRange with too few arguments must throw TypeError -PASS Range interface: detachedRange must inherit property "selectNode" with the proper type (13) +PASS Range interface: detachedRange must inherit property "selectNode(Node)" with the proper type PASS Range interface: calling selectNode(Node) on detachedRange with too few arguments must throw TypeError -PASS Range interface: detachedRange must inherit property "selectNodeContents" with the proper type (14) +PASS Range interface: detachedRange must inherit property "selectNodeContents(Node)" with the proper type PASS Range interface: calling selectNodeContents(Node) on detachedRange with too few arguments must throw TypeError -PASS Range interface: detachedRange must inherit property "START_TO_START" with the proper type (15) -PASS Range interface: detachedRange must inherit property "START_TO_END" with the proper type (16) -PASS Range interface: detachedRange must inherit property "END_TO_END" with the proper type (17) -PASS Range interface: detachedRange must inherit property "END_TO_START" with the proper type (18) -PASS Range interface: detachedRange must inherit property "compareBoundaryPoints" with the proper type (19) -PASS Range interface: calling compareBoundaryPoints(unsigned short,Range) on detachedRange with too few arguments must throw TypeError -PASS Range interface: detachedRange must inherit property "deleteContents" with the proper type (20) -PASS Range interface: detachedRange must inherit property "extractContents" with the proper type (21) -PASS Range interface: detachedRange must inherit property "cloneContents" with the proper type (22) -PASS Range interface: detachedRange must inherit property "insertNode" with the proper type (23) +PASS Range interface: detachedRange must inherit property "START_TO_START" with the proper type +PASS Range interface: detachedRange must inherit property "START_TO_END" with the proper type +PASS Range interface: detachedRange must inherit property "END_TO_END" with the proper type +PASS Range interface: detachedRange must inherit property "END_TO_START" with the proper type +PASS Range interface: detachedRange must inherit property "compareBoundaryPoints(unsigned short, Range)" with the proper type +PASS Range interface: calling compareBoundaryPoints(unsigned short, Range) on detachedRange with too few arguments must throw TypeError +PASS Range interface: detachedRange must inherit property "deleteContents()" with the proper type +PASS Range interface: detachedRange must inherit property "extractContents()" with the proper type +PASS Range interface: detachedRange must inherit property "cloneContents()" with the proper type +PASS Range interface: detachedRange must inherit property "insertNode(Node)" with the proper type PASS Range interface: calling insertNode(Node) on detachedRange with too few arguments must throw TypeError -PASS Range interface: detachedRange must inherit property "surroundContents" with the proper type (24) +PASS Range interface: detachedRange must inherit property "surroundContents(Node)" with the proper type PASS Range interface: calling surroundContents(Node) on detachedRange with too few arguments must throw TypeError -PASS Range interface: detachedRange must inherit property "cloneRange" with the proper type (25) -PASS Range interface: detachedRange must inherit property "detach" with the proper type (26) -PASS Range interface: detachedRange must inherit property "isPointInRange" with the proper type (27) -PASS Range interface: calling isPointInRange(Node,unsigned long) on detachedRange with too few arguments must throw TypeError -PASS Range interface: detachedRange must inherit property "comparePoint" with the proper type (28) -PASS Range interface: calling comparePoint(Node,unsigned long) on detachedRange with too few arguments must throw TypeError -PASS Range interface: detachedRange must inherit property "intersectsNode" with the proper type (29) +PASS Range interface: detachedRange must inherit property "cloneRange()" with the proper type +PASS Range interface: detachedRange must inherit property "detach()" with the proper type +PASS Range interface: detachedRange must inherit property "isPointInRange(Node, unsigned long)" with the proper type +PASS Range interface: calling isPointInRange(Node, unsigned long) on detachedRange with too few arguments must throw TypeError +PASS Range interface: detachedRange must inherit property "comparePoint(Node, unsigned long)" with the proper type +PASS Range interface: calling comparePoint(Node, unsigned long) on detachedRange with too few arguments must throw TypeError +PASS Range interface: detachedRange must inherit property "intersectsNode(Node)" with the proper type PASS Range interface: calling intersectsNode(Node) on detachedRange with too few arguments must throw TypeError PASS NodeIterator interface: existence and properties of interface object PASS NodeIterator interface object length @@ -1539,14 +1539,14 @@ PASS NodeIterator interface: operation detach() PASS NodeIterator must be primary interface of document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) PASS Stringification of document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) -PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "root" with the proper type (0) -PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "referenceNode" with the proper type (1) -PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "pointerBeforeReferenceNode" with the proper type (2) -PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "whatToShow" with the proper type (3) -PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "filter" with the proper type (4) -PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "nextNode" with the proper type (5) -PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "previousNode" with the proper type (6) -PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "detach" with the proper type (7) +PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "root" with the proper type +PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "referenceNode" with the proper type +PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "pointerBeforeReferenceNode" with the proper type +PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "whatToShow" with the proper type +PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "filter" with the proper type +PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "nextNode()" with the proper type +PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "previousNode()" with the proper type +PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "detach()" with the proper type PASS TreeWalker interface: existence and properties of interface object PASS TreeWalker interface object length PASS TreeWalker interface object name @@ -1565,17 +1565,17 @@ PASS TreeWalker interface: operation nextNode() PASS TreeWalker must be primary interface of document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) PASS Stringification of document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) -PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "root" with the proper type (0) -PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "whatToShow" with the proper type (1) -PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "filter" with the proper type (2) -PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "currentNode" with the proper type (3) -PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "parentNode" with the proper type (4) -PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "firstChild" with the proper type (5) -PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "lastChild" with the proper type (6) -PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "previousSibling" with the proper type (7) -PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "nextSibling" with the proper type (8) -PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "previousNode" with the proper type (9) -PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "nextNode" with the proper type (10) +PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "root" with the proper type +PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "whatToShow" with the proper type +PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "filter" with the proper type +PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "currentNode" with the proper type +PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "parentNode()" with the proper type +PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "firstChild()" with the proper type +PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "lastChild()" with the proper type +PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "previousSibling()" with the proper type +PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "nextSibling()" with the proper type +PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "previousNode()" with the proper type +PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "nextNode()" with the proper type PASS NodeFilter interface: existence and properties of interface object PASS NodeFilter interface object name PASS NodeFilter interface: existence and properties of interface prototype object @@ -1623,28 +1623,28 @@ PASS DOMTokenList interface: operation contains(DOMString) PASS DOMTokenList interface: operation add(DOMString) PASS DOMTokenList interface: operation remove(DOMString) -PASS DOMTokenList interface: operation toggle(DOMString,boolean) -PASS DOMTokenList interface: operation replace(DOMString,DOMString) +PASS DOMTokenList interface: operation toggle(DOMString, boolean) +PASS DOMTokenList interface: operation replace(DOMString, DOMString) PASS DOMTokenList interface: operation supports(DOMString) PASS DOMTokenList interface: attribute value PASS DOMTokenList interface: stringifier PASS DOMTokenList must be primary interface of document.body.classList PASS Stringification of document.body.classList -PASS DOMTokenList interface: document.body.classList must inherit property "length" with the proper type (0) -PASS DOMTokenList interface: document.body.classList must inherit property "item" with the proper type (1) +PASS DOMTokenList interface: document.body.classList must inherit property "length" with the proper type +PASS DOMTokenList interface: document.body.classList must inherit property "item(unsigned long)" with the proper type PASS DOMTokenList interface: calling item(unsigned long) on document.body.classList with too few arguments must throw TypeError -PASS DOMTokenList interface: document.body.classList must inherit property "contains" with the proper type (2) +PASS DOMTokenList interface: document.body.classList must inherit property "contains(DOMString)" with the proper type PASS DOMTokenList interface: calling contains(DOMString) on document.body.classList with too few arguments must throw TypeError -PASS DOMTokenList interface: document.body.classList must inherit property "add" with the proper type (3) +PASS DOMTokenList interface: document.body.classList must inherit property "add(DOMString)" with the proper type PASS DOMTokenList interface: calling add(DOMString) on document.body.classList with too few arguments must throw TypeError -PASS DOMTokenList interface: document.body.classList must inherit property "remove" with the proper type (4) +PASS DOMTokenList interface: document.body.classList must inherit property "remove(DOMString)" with the proper type PASS DOMTokenList interface: calling remove(DOMString) on document.body.classList with too few arguments must throw TypeError -PASS DOMTokenList interface: document.body.classList must inherit property "toggle" with the proper type (5) -PASS DOMTokenList interface: calling toggle(DOMString,boolean) on document.body.classList with too few arguments must throw TypeError -PASS DOMTokenList interface: document.body.classList must inherit property "replace" with the proper type (6) -PASS DOMTokenList interface: calling replace(DOMString,DOMString) on document.body.classList with too few arguments must throw TypeError -PASS DOMTokenList interface: document.body.classList must inherit property "supports" with the proper type (7) +PASS DOMTokenList interface: document.body.classList must inherit property "toggle(DOMString, boolean)" with the proper type +PASS DOMTokenList interface: calling toggle(DOMString, boolean) on document.body.classList with too few arguments must throw TypeError +PASS DOMTokenList interface: document.body.classList must inherit property "replace(DOMString, DOMString)" with the proper type +PASS DOMTokenList interface: calling replace(DOMString, DOMString) on document.body.classList with too few arguments must throw TypeError +PASS DOMTokenList interface: document.body.classList must inherit property "supports(DOMString)" with the proper type PASS DOMTokenList interface: calling supports(DOMString) on document.body.classList with too few arguments must throw TypeError -PASS DOMTokenList interface: document.body.classList must inherit property "value" with the proper type (8) +PASS DOMTokenList interface: document.body.classList must inherit property "value" with the proper type Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt index 792f6117..b18b8d79 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt
@@ -1,33 +1,4 @@ This is a testharness.js-based test. -FAIL ServiceWorkerGlobalScope: Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Request objects have a signal property assert_true: Signal member is present & truthy expected true got false -FAIL ServiceWorkerGlobalScope: Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Readable stream synchronously cancels with AbortError if aborted before reading AbortController is not defined +FAIL General fetch abort tests in a service worker Failed to register a ServiceWorker: The script does not have a MIME type. Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general-serviceworker.https.html b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general-serviceworker.https.html index c1334e03..74de2874 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general-serviceworker.https.html +++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general-serviceworker.https.html
@@ -14,7 +14,7 @@ let reg = await navigator.serviceWorker.getRegistration(scope); if (reg) await reg.unregister(); - reg = await navigator.serviceWorker.register('general.js', {scope}); + reg = await navigator.serviceWorker.register('general.any.worker.js', {scope}); fetch_tests_from_worker(reg.installing); })();
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general-sharedworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general-sharedworker-expected.txt new file mode 100644 index 0000000..d9b7c58 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general-sharedworker-expected.txt
@@ -0,0 +1,52 @@ +This is a testharness.js-based test. +FAIL Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - RequestInit's window is not null +FAIL TypeError from request constructor takes priority - Input URL is not valid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - Input URL has credentials promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is navigate promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's referrer is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's method is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's method is forbidden promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and method is not simple promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and integrity is not empty promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - RequestInit's cache mode is only-if-cached and mode is not same-origin +PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode cors +PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode no-cors +FAIL TypeError from request constructor takes priority - Bad referrerPolicy init parameter value promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - Bad mode init parameter value +PASS TypeError from request constructor takes priority - Bad credentials init parameter value +PASS TypeError from request constructor takes priority - Bad cache init parameter value +PASS TypeError from request constructor takes priority - Bad redirect init parameter value +FAIL Request objects have a signal property assert_true: Signal member is present & truthy expected true got false +FAIL Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Readable stream synchronously cancels with AbortError if aborted before reading promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal state is cloned AbortController is not defined +FAIL Clone aborts with original controller AbortController is not defined +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general-sharedworker.html b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general-sharedworker.html new file mode 100644 index 0000000..9378e166 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general-sharedworker.html
@@ -0,0 +1,14 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <title>General fetch abort tests - shared worker</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> +</head> +<body> +<script> + fetch_tests_from_worker(new SharedWorker("general.any.worker.js")); +</script> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general.any-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general.any-expected.txt new file mode 100644 index 0000000..d9b7c58 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general.any-expected.txt
@@ -0,0 +1,52 @@ +This is a testharness.js-based test. +FAIL Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - RequestInit's window is not null +FAIL TypeError from request constructor takes priority - Input URL is not valid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - Input URL has credentials promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is navigate promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's referrer is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's method is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's method is forbidden promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and method is not simple promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and integrity is not empty promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - RequestInit's cache mode is only-if-cached and mode is not same-origin +PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode cors +PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode no-cors +FAIL TypeError from request constructor takes priority - Bad referrerPolicy init parameter value promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - Bad mode init parameter value +PASS TypeError from request constructor takes priority - Bad credentials init parameter value +PASS TypeError from request constructor takes priority - Bad cache init parameter value +PASS TypeError from request constructor takes priority - Bad redirect init parameter value +FAIL Request objects have a signal property assert_true: Signal member is present & truthy expected true got false +FAIL Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Readable stream synchronously cancels with AbortError if aborted before reading promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal state is cloned AbortController is not defined +FAIL Clone aborts with original controller AbortController is not defined +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general.js b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general.any.js similarity index 76% rename from third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general.js rename to third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general.any.js index 8416e3a..df77d56 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general.js +++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general.any.js
@@ -1,12 +1,7 @@ -const BODY_METHODS = ['arrayBuffer', 'blob', 'formData', 'json', 'text']; +// META: script=/common/utils.js +// META: script=../request/request-error.js -if (self.importScripts) { - // Load scripts if being run from a worker - importScripts( - '/resources/testharness.js', - '/common/utils.js' - ); -} +const BODY_METHODS = ['arrayBuffer', 'blob', 'formData', 'json', 'text']; // This is used to close connections that weren't correctly closed during the tests, // otherwise you can end up running out of HTTP connections. @@ -20,11 +15,6 @@ ); } -// Add the global name to the test name -function contextualTestName(name) { - return `${self.constructor.name}: ${name}`; -} - promise_test(async t => { const controller = new AbortController(); const signal = controller.signal; @@ -33,7 +23,7 @@ const fetchPromise = fetch('../resources/data.json', { signal }); await promise_rejects(t, "AbortError", fetchPromise); -}, contextualTestName("Aborting rejects with AbortError")); +}, "Aborting rejects with AbortError"); promise_test(async t => { const controller = new AbortController(); @@ -49,13 +39,34 @@ }); await promise_rejects(t, "AbortError", fetchPromise); -}, contextualTestName("Aborting rejects with AbortError - no-cors")); +}, "Aborting rejects with AbortError - no-cors"); + +// Test that errors thrown from the request constructor take priority over abort errors. +// badRequestArgTests is from response-error.js +for (const { args, testName } of badRequestArgTests) { + promise_test(async t => { + try { + // If this doesn't throw, we'll effectively skip the test. + // It'll fail properly in ../request/request-error.html + new Request(...args); + } + catch (err) { + const controller = new AbortController(); + controller.abort(); + + // Add signal to 2nd arg + args[1] = args[1] || {}; + args[1].signal = controller.signal; + await promise_rejects(t, err, fetch(...args)); + } + }, `TypeError from request constructor takes priority - ${testName}`); +} test(() => { const request = new Request(''); assert_true(Boolean(request.signal), "Signal member is present & truthy"); assert_equals(request.signal.constructor, AbortSignal); -}, contextualTestName("Request objects have a signal property")); +}, "Request objects have a signal property"); promise_test(async t => { const controller = new AbortController(); @@ -71,7 +82,7 @@ const fetchPromise = fetch(request); await promise_rejects(t, "AbortError", fetchPromise); -}, contextualTestName("Signal on request object")); +}, "Signal on request object"); promise_test(async t => { const controller = new AbortController(); @@ -84,7 +95,7 @@ const fetchPromise = fetch(requestFromRequest); await promise_rejects(t, "AbortError", fetchPromise); -}, contextualTestName("Signal on request object created from request object")); +}, "Signal on request object created from request object"); promise_test(async t => { const controller = new AbortController(); @@ -97,7 +108,7 @@ const fetchPromise = fetch(requestFromRequest); await promise_rejects(t, "AbortError", fetchPromise); -}, contextualTestName("Signal on request object created from request object, with signal on second request")); +}, "Signal on request object created from request object, with signal on second request"); promise_test(async t => { const controller = new AbortController(); @@ -110,7 +121,7 @@ const fetchPromise = fetch(requestFromRequest); await promise_rejects(t, "AbortError", fetchPromise); -}, contextualTestName("Signal on request object created from request object, with signal on second request overriding another")); +}, "Signal on request object created from request object, with signal on second request overriding another"); promise_test(async t => { const controller = new AbortController(); @@ -122,7 +133,7 @@ const fetchPromise = fetch(request, {method: 'POST'}); await promise_rejects(t, "AbortError", fetchPromise); -}, contextualTestName("Signal retained after unrelated properties are overridden by fetch")); +}, "Signal retained after unrelated properties are overridden by fetch"); promise_test(async t => { const controller = new AbortController(); @@ -133,7 +144,7 @@ const data = await fetch(request, { signal: null }).then(r => r.json()); assert_equals(data.key, 'value', 'Fetch fully completes'); -}, contextualTestName("Signal removed by setting to null")); +}, "Signal removed by setting to null"); promise_test(async t => { const controller = new AbortController(); @@ -151,7 +162,7 @@ ]); assert_array_equals(log, ['fetch-reject', 'next-microtask']); -}, contextualTestName("Already aborted signal rejects immediately")); +}, "Already aborted signal rejects immediately"); promise_test(async t => { const controller = new AbortController(); @@ -168,7 +179,7 @@ await fetch(request).catch(() => {}); assert_true(request.bodyUsed, "Body has been used"); -}, contextualTestName("Request is still 'used' if signal is aborted before fetching")); +}, "Request is still 'used' if signal is aborted before fetching"); for (const bodyMethod of BODY_METHODS) { promise_test(async t => { @@ -190,7 +201,7 @@ await promise_rejects(t, "AbortError", bodyPromise); assert_array_equals(log, [`${bodyMethod}-reject`, 'next-microtask']); - }, contextualTestName(`response.${bodyMethod}() rejects if already aborted`)); + }, `response.${bodyMethod}() rejects if already aborted`); } promise_test(async t => { @@ -213,7 +224,7 @@ const data = await response.json(); assert_equals(data, null, "Request hasn't been made to the server"); -}, contextualTestName("Already aborted signal does not make request")); +}, "Already aborted signal does not make request"); promise_test(async t => { await abortRequests(); @@ -236,7 +247,7 @@ for (const fetchPromise of fetches) { await promise_rejects(t, "AbortError", fetchPromise); } -}, contextualTestName("Already aborted signal can be used for many fetches")); +}, "Already aborted signal can be used for many fetches"); promise_test(async t => { await abortRequests(); @@ -262,7 +273,7 @@ for (const fetchPromise of fetches) { await promise_rejects(t, "AbortError", fetchPromise); } -}, contextualTestName("Signal can be used to abort other fetches, even if another fetch succeeded before aborting")); +}, "Signal can be used to abort other fetches, even if another fetch succeeded before aborting"); promise_test(async t => { await abortRequests(); @@ -290,7 +301,7 @@ const afterAbortResult = await fetch(`../resources/stash-take.py?key=${stateKey}`).then(r => r.json()); if (afterAbortResult == 'closed') break; } -}, contextualTestName("Underlying connection is closed when aborting after receiving response")); +}, "Underlying connection is closed when aborting after receiving response"); promise_test(async t => { await abortRequests(); @@ -327,7 +338,7 @@ const afterAbortResult = await fetch(stashTakeURL).then(r => r.json()); if (afterAbortResult == 'closed') break; } -}, contextualTestName("Underlying connection is closed when aborting after receiving response - no-cors")); +}, "Underlying connection is closed when aborting after receiving response - no-cors"); for (const bodyMethod of BODY_METHODS) { promise_test(async t => { @@ -359,7 +370,7 @@ const afterAbortResult = await fetch(`../resources/stash-take.py?key=${stateKey}`).then(r => r.json()); if (afterAbortResult == 'closed') break; } - }, contextualTestName(`Fetch aborted & connection closed when aborted after calling response.${bodyMethod}()`)); + }, `Fetch aborted & connection closed when aborted after calling response.${bodyMethod}()`); } promise_test(async t => { @@ -389,7 +400,7 @@ const afterAbortResult = await fetch(`../resources/stash-take.py?key=${stateKey}`).then(r => r.json()); if (afterAbortResult == 'closed') break; } -}, contextualTestName("Stream errors once aborted. Underlying connection closed.")); +}, "Stream errors once aborted. Underlying connection closed."); promise_test(async t => { await abortRequests(); @@ -420,7 +431,7 @@ const afterAbortResult = await fetch(`../resources/stash-take.py?key=${stateKey}`).then(r => r.json()); if (afterAbortResult == 'closed') break; } -}, contextualTestName("Stream errors once aborted, after reading. Underlying connection closed.")); +}, "Stream errors once aborted, after reading. Underlying connection closed."); promise_test(async t => { await abortRequests(); @@ -436,10 +447,9 @@ const item = await reader.read(); assert_true(item.done, "Stream is done"); -}, contextualTestName("Stream will not error if body is empty. It's closed with an empty queue before it errors.")); +}, "Stream will not error if body is empty. It's closed with an empty queue before it errors."); - -test(t => { +promise_test(async t => { const controller = new AbortController(); const signal = controller.signal; controller.abort(); @@ -455,7 +465,7 @@ } }); - fetch('../resources/empty.txt', { + const fetchPromise = fetch('../resources/empty.txt', { body, signal, method: 'POST', headers: { @@ -466,4 +476,45 @@ assert_true(!!cancelReason, 'Cancel called sync'); assert_equals(cancelReason.constructor, DOMException); assert_equals(cancelReason.name, 'AbortError'); -}, contextualTestName("Readable stream synchronously cancels with AbortError if aborted before reading")); + + await promise_rejects(t, "AbortError", fetchPromise); + + const fetchErr = await fetchPromise.catch(e => e); + + assert_equals(cancelReason, fetchErr, "Fetch rejects with same error instance"); +}, "Readable stream synchronously cancels with AbortError if aborted before reading"); + +test(() => { + const controller = new AbortController(); + const signal = controller.signal; + controller.abort(); + + const request = new Request('.', { signal }); + const requestSignal = request.signal; + + const clonedRequest = request.clone(); + + assert_equals(requestSignal, request.signal, "Original request signal the same after cloning"); + assert_true(request.signal.aborted, "Original request signal aborted"); + assert_not_equals(clonedRequest.signal, request.signal, "Cloned request has different signal"); + assert_true(clonedRequest.signal.aborted, "Cloned request signal aborted"); +}, "Signal state is cloned"); + +test(() => { + const controller = new AbortController(); + const signal = controller.signal; + + const request = new Request('.', { signal }); + const clonedRequest = request.clone(); + + const log = []; + + request.signal.addEventListener('abort', () => log.push('original-aborted')); + clonedRequest.signal.addEventListener('abort', () => log.push('clone-aborted')); + + controller.abort(); + + assert_array_equals(log, ['clone-aborted', 'original-aborted'], "Abort events fired in correct order"); + assert_true(request.signal.aborted, 'Signal aborted'); + assert_true(clonedRequest.signal.aborted, 'Signal aborted'); +}, "Clone aborts with original controller");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general.any.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general.any.worker-expected.txt new file mode 100644 index 0000000..d9b7c58 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general.any.worker-expected.txt
@@ -0,0 +1,52 @@ +This is a testharness.js-based test. +FAIL Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - RequestInit's window is not null +FAIL TypeError from request constructor takes priority - Input URL is not valid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - Input URL has credentials promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is navigate promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's referrer is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's method is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's method is forbidden promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and method is not simple promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and integrity is not empty promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - RequestInit's cache mode is only-if-cached and mode is not same-origin +PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode cors +PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode no-cors +FAIL TypeError from request constructor takes priority - Bad referrerPolicy init parameter value promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - Bad mode init parameter value +PASS TypeError from request constructor takes priority - Bad credentials init parameter value +PASS TypeError from request constructor takes priority - Bad cache init parameter value +PASS TypeError from request constructor takes priority - Bad redirect init parameter value +FAIL Request objects have a signal property assert_true: Signal member is present & truthy expected true got false +FAIL Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Readable stream synchronously cancels with AbortError if aborted before reading promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal state is cloned AbortController is not defined +FAIL Clone aborts with original controller AbortController is not defined +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general.html b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general.html deleted file mode 100644 index 0d5baf2..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general.html +++ /dev/null
@@ -1,19 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <title>General fetch abort tests</title> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> - <script src="/common/utils.js"></script> - <script src="general.js"></script> -</head> -<body> -<script> - fetch_tests_from_worker(new Worker("general.js")); - if (window.SharedWorker) { - fetch_tests_from_worker(new SharedWorker("general.js")); - } -</script> -</body> -</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/request/request-error-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/request/request-error-expected.txt index 9c18579..697b78fd0 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/request/request-error-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/request/request-error-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -FAIL RequestInit's window is not null assert_throws: Expect TypeError exception function "function () { new Request("", {"window" : "http://test.url"}); }" did not throw +FAIL RequestInit's window is not null assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw PASS Input URL is not valid PASS Input URL has credentials PASS RequestInit's mode is navigate @@ -8,18 +8,18 @@ PASS RequestInit's method is forbidden PASS RequestInit's mode is no-cors and method is not simple PASS RequestInit's mode is no-cors and integrity is not empty -FAIL RequestInit's cache mode is only-if-cached and mode is not same-origin assert_throws: Expect TypeError exception function "function () { new Request("", {"mode" : "cors", "cache" : "only-if-cached"}); }" did not throw +FAIL RequestInit's cache mode is only-if-cached and mode is not same-origin assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +FAIL Request with cache mode: only-if-cached and fetch mode cors assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +FAIL Request with cache mode: only-if-cached and fetch mode no-cors assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +PASS Bad referrerPolicy init parameter value +FAIL Bad mode init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +FAIL Bad credentials init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +FAIL Bad cache init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +FAIL Bad redirect init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw PASS Request should get its content-type from the init request PASS Request should not get its content-type from the init request if init headers are provided PASS Request should get its content-type from the body if none is provided PASS Request should get its content-type from init headers if one is provided -PASS Bad referrerPolicy init parameter value -FAIL Bad mode init parameter value assert_throws: function "function () { new Request("", options); }" did not throw -FAIL Bad credentials init parameter value assert_throws: function "function () { new Request("", options); }" did not throw -FAIL Bad cache init parameter value assert_throws: function "function () { new Request("", options); }" did not throw -FAIL Bad redirect init parameter value assert_throws: function "function () { new Request("", options); }" did not throw PASS Request with cache mode: only-if-cached and fetch mode: same-origin -FAIL Request with cache mode: only-if-cached and fetch mode: cors assert_throws: function "function () { new Request("test", options); }" did not throw -FAIL Request with cache mode: only-if-cached and fetch mode: no-cors assert_throws: function "function () { new Request("test", options); }" did not throw Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/request/request-error.html b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/request/request-error.html index a04bfde..70be9fb 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/request/request-error.html +++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/request/request-error.html
@@ -8,60 +8,20 @@ <meta name="author" title="Canon Research France" href="https://www.crf.canon.fr"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> + <script src="request-error.js"></script> </head> <body> <script> - test(function() { - assert_throws(new TypeError() , function() { new Request("", {"window" : "http://test.url"}); }, - "Expect TypeError exception"); - },"RequestInit's window is not null"); - - test(function() { - assert_throws(new TypeError() , function() { new Request("http://:not a valid URL"); }, - "Expect TypeError exception"); - },"Input URL is not valid") - - test(function() { - assert_throws(new TypeError() , function() { new Request("http://user:pass@test.url"); }, - "Expect TypeError exception"); - },"Input URL has credentials"); - - test(function() { - assert_throws(new TypeError() , function() { new Request("", {"mode" : "navigate"}); }, - "Expect TypeError exception"); - },"RequestInit's mode is navigate"); - - test(function() { - assert_throws(new TypeError() , function() { new Request("", {"referrer" : "http://:not a valid URL"}); }, - "Expect TypeError exception"); - },"RequestInit's referrer is invalid"); - - test(function() { - assert_throws(new TypeError() , function() { new Request("", {"method" : "IN VALID"}); }, - "Expect TypeError exception"); - }, "RequestInit's method is invalid"); - - test(function() { - assert_throws(new TypeError() , function() { new Request("", {"method" : "TRACE"}); }, - "Expect TypeError exception"); - }, "RequestInit's method is forbidden"); - - test(function() { - assert_throws(new TypeError() , function() { new Request("", {"mode" : "no-cors", "method" : "PUT"}); }, - "Expect TypeError exception"); - },"RequestInit's mode is no-cors and method is not simple"); - - test(function() { - assert_throws(new TypeError() , - function() { new Request("", {"mode" : "no-cors", "integrity" : "not an empty string"}); }, - "Expect TypeError exception"); - },"RequestInit's mode is no-cors and integrity is not empty"); - - test(function() { - assert_throws(new TypeError() , - function() { new Request("", {"mode" : "cors", "cache" : "only-if-cached"}); }, - "Expect TypeError exception"); - },"RequestInit's cache mode is only-if-cached and mode is not same-origin"); + // badRequestArgTests is from response-error.js + for (const { args, testName } of badRequestArgTests) { + test(() => { + assert_throws( + new TypeError(), + () => new Request(...args), + "Expect TypeError exception" + ); + }, testName); + } test(function() { var initialHeaders = new Headers([["Content-Type", "potato"]]); @@ -92,28 +52,10 @@ assert_equals(request.headers.get("Content-Type"), "potato"); }, "Request should get its content-type from init headers if one is provided"); - var parameters = ["referrerPolicy", "mode", "credentials", "cache", "redirect"]; - parameters.forEach(function(parameter) { - test(function() { - var options = { }; - options[parameter] = "BAD"; - assert_throws(new TypeError(), function() { new Request("", options); }); - },"Bad " + parameter +" init parameter value"); - }); - - function testOnlyIfCachedMode(fetchMode, ok) { - test(function() { - var options = {"cache": "only-if-cached", "mode": fetchMode}; - if (ok) - new Request("test", options); - else - assert_throws(new TypeError(), function() { new Request("test", options); }); - }, "Request with cache mode: only-if-cached and fetch mode: " + fetchMode); - } - testOnlyIfCachedMode("same-origin", true); - testOnlyIfCachedMode("cors", false); - testOnlyIfCachedMode("no-cors", false); - + test(function() { + var options = {"cache": "only-if-cached", "mode": "same-origin"}; + new Request("test", options); + }, "Request with cache mode: only-if-cached and fetch mode: same-origin"); </script> </body> </html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/request/request-error.js b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/request/request-error.js new file mode 100644 index 0000000..d2ffec6 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/request/request-error.js
@@ -0,0 +1,61 @@ +const badRequestArgTests = [ + { + args: ["", { "window": "http://test.url" }], + testName: "RequestInit's window is not null" + }, + { + args: ["http://:not a valid URL"], + testName: "Input URL is not valid" + }, + { + args: ["http://user:pass@test.url"], + testName: "Input URL has credentials" + }, + { + args: ["", { "mode": "navigate" }], + testName: "RequestInit's mode is navigate" + }, + { + args: ["", { "referrer": "http://:not a valid URL" }], + testName: "RequestInit's referrer is invalid" + }, + { + args: ["", { "method": "IN VALID" }], + testName: "RequestInit's method is invalid" + }, + { + args: ["", { "method": "TRACE" }], + testName: "RequestInit's method is forbidden" + }, + { + args: ["", { "mode": "no-cors", "method": "PUT" }], + testName: "RequestInit's mode is no-cors and method is not simple" + }, + { + args: ["", { "mode": "no-cors", "integrity": "not an empty string" }], + testName: "RequestInit's mode is no-cors and integrity is not empty" + }, + { + args: ["", { "mode": "cors", "cache": "only-if-cached" }], + testName: "RequestInit's cache mode is only-if-cached and mode is not same-origin" + }, + { + args: ["test", { "cache": "only-if-cached", "mode": "cors" }], + testName: "Request with cache mode: only-if-cached and fetch mode cors" + }, + { + args: ["test", { "cache": "only-if-cached", "mode": "no-cors" }], + testName: "Request with cache mode: only-if-cached and fetch mode no-cors" + } +]; + +badRequestArgTests.push( + ...["referrerPolicy", "mode", "credentials", "cache", "redirect"].map(optionProp => { + const options = {}; + options[optionProp] = "BAD"; + return { + args: ["", options], + testName: `Bad ${optionProp} init parameter value` + }; + }) +);
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/request/request-idl-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/request/request-idl-expected.txt index 93b1e2a..6835e7d 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/request/request-idl-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/request/request-idl-expected.txt
@@ -26,25 +26,25 @@ PASS Request interface: operation text() PASS Request must be primary interface of new Request("") PASS Stringification of new Request("") -PASS Request interface: new Request("") must inherit property "method" with the proper type (0) -PASS Request interface: new Request("") must inherit property "url" with the proper type (1) -PASS Request interface: new Request("") must inherit property "headers" with the proper type (2) -FAIL Request interface: new Request("") must inherit property "type" with the proper type (3) assert_inherits: property "type" not found in prototype chain -FAIL Request interface: new Request("") must inherit property "destination" with the proper type (4) assert_inherits: property "destination" not found in prototype chain -PASS Request interface: new Request("") must inherit property "referrer" with the proper type (5) -PASS Request interface: new Request("") must inherit property "referrerPolicy" with the proper type (6) -PASS Request interface: new Request("") must inherit property "mode" with the proper type (7) -PASS Request interface: new Request("") must inherit property "credentials" with the proper type (8) -PASS Request interface: new Request("") must inherit property "cache" with the proper type (9) -PASS Request interface: new Request("") must inherit property "redirect" with the proper type (10) -PASS Request interface: new Request("") must inherit property "integrity" with the proper type (11) -PASS Request interface: new Request("") must inherit property "clone" with the proper type (12) -FAIL Request interface: new Request("") must inherit property "body" with the proper type (13) assert_inherits: property "body" not found in prototype chain -PASS Request interface: new Request("") must inherit property "bodyUsed" with the proper type (14) -PASS Request interface: new Request("") must inherit property "arrayBuffer" with the proper type (15) -PASS Request interface: new Request("") must inherit property "blob" with the proper type (16) -PASS Request interface: new Request("") must inherit property "formData" with the proper type (17) -PASS Request interface: new Request("") must inherit property "json" with the proper type (18) -PASS Request interface: new Request("") must inherit property "text" with the proper type (19) +PASS Request interface: new Request("") must inherit property "method" with the proper type +PASS Request interface: new Request("") must inherit property "url" with the proper type +PASS Request interface: new Request("") must inherit property "headers" with the proper type +FAIL Request interface: new Request("") must inherit property "type" with the proper type assert_inherits: property "type" not found in prototype chain +FAIL Request interface: new Request("") must inherit property "destination" with the proper type assert_inherits: property "destination" not found in prototype chain +PASS Request interface: new Request("") must inherit property "referrer" with the proper type +PASS Request interface: new Request("") must inherit property "referrerPolicy" with the proper type +PASS Request interface: new Request("") must inherit property "mode" with the proper type +PASS Request interface: new Request("") must inherit property "credentials" with the proper type +PASS Request interface: new Request("") must inherit property "cache" with the proper type +PASS Request interface: new Request("") must inherit property "redirect" with the proper type +PASS Request interface: new Request("") must inherit property "integrity" with the proper type +PASS Request interface: new Request("") must inherit property "clone()" with the proper type +FAIL Request interface: new Request("") must inherit property "body" with the proper type assert_inherits: property "body" not found in prototype chain +PASS Request interface: new Request("") must inherit property "bodyUsed" with the proper type +PASS Request interface: new Request("") must inherit property "arrayBuffer()" with the proper type +PASS Request interface: new Request("") must inherit property "blob()" with the proper type +PASS Request interface: new Request("") must inherit property "formData()" with the proper type +PASS Request interface: new Request("") must inherit property "json()" with the proper type +PASS Request interface: new Request("") must inherit property "text()" with the proper type Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/response/response-idl-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/response/response-idl-expected.txt index 00afc4f..db7454c6 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/response/response-idl-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/response/response-idl-expected.txt
@@ -5,7 +5,7 @@ PASS Response interface: existence and properties of interface prototype object PASS Response interface: existence and properties of interface prototype object's "constructor" property PASS Response interface: operation error() -PASS Response interface: operation redirect(USVString,unsigned short) +PASS Response interface: operation redirect(USVString, unsigned short) PASS Response interface: attribute type PASS Response interface: attribute url PASS Response interface: attribute status @@ -23,23 +23,23 @@ PASS Response interface: operation text() PASS Response must be primary interface of new Response() PASS Stringification of new Response() -PASS Response interface: new Response() must inherit property "error" with the proper type (0) -PASS Response interface: new Response() must inherit property "redirect" with the proper type (1) -PASS Response interface: calling redirect(USVString,unsigned short) on new Response() with too few arguments must throw TypeError -PASS Response interface: new Response() must inherit property "type" with the proper type (2) -PASS Response interface: new Response() must inherit property "url" with the proper type (3) -PASS Response interface: new Response() must inherit property "status" with the proper type (4) -PASS Response interface: new Response() must inherit property "ok" with the proper type (5) -PASS Response interface: new Response() must inherit property "statusText" with the proper type (6) -PASS Response interface: new Response() must inherit property "headers" with the proper type (7) -FAIL Response interface: new Response() must inherit property "trailer" with the proper type (8) assert_inherits: property "trailer" not found in prototype chain -PASS Response interface: new Response() must inherit property "clone" with the proper type (9) -PASS Response interface: new Response() must inherit property "body" with the proper type (10) -PASS Response interface: new Response() must inherit property "bodyUsed" with the proper type (11) -PASS Response interface: new Response() must inherit property "arrayBuffer" with the proper type (12) -PASS Response interface: new Response() must inherit property "blob" with the proper type (13) -PASS Response interface: new Response() must inherit property "formData" with the proper type (14) -PASS Response interface: new Response() must inherit property "json" with the proper type (15) -PASS Response interface: new Response() must inherit property "text" with the proper type (16) +PASS Response interface: new Response() must inherit property "error()" with the proper type +PASS Response interface: new Response() must inherit property "redirect(USVString, unsigned short)" with the proper type +PASS Response interface: calling redirect(USVString, unsigned short) on new Response() with too few arguments must throw TypeError +PASS Response interface: new Response() must inherit property "type" with the proper type +PASS Response interface: new Response() must inherit property "url" with the proper type +PASS Response interface: new Response() must inherit property "status" with the proper type +PASS Response interface: new Response() must inherit property "ok" with the proper type +PASS Response interface: new Response() must inherit property "statusText" with the proper type +PASS Response interface: new Response() must inherit property "headers" with the proper type +FAIL Response interface: new Response() must inherit property "trailer" with the proper type assert_inherits: property "trailer" not found in prototype chain +PASS Response interface: new Response() must inherit property "clone()" with the proper type +PASS Response interface: new Response() must inherit property "body" with the proper type +PASS Response interface: new Response() must inherit property "bodyUsed" with the proper type +PASS Response interface: new Response() must inherit property "arrayBuffer()" with the proper type +PASS Response interface: new Response() must inherit property "blob()" with the proper type +PASS Response interface: new Response() must inherit property "formData()" with the proper type +PASS Response interface: new Response() must inherit property "json()" with the proper type +PASS Response interface: new Response() must inherit property "text()" with the proper type Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fullscreen/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/fullscreen/interfaces-expected.txt index 7336b1d7..9d5e1e7 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/fullscreen/interfaces-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/fullscreen/interfaces-expected.txt
@@ -6,18 +6,18 @@ PASS Document interface: attribute onfullscreenchange PASS Document interface: attribute onfullscreenerror FAIL Document interface: attribute fullscreenElement assert_equals: setter must be function for PutForwards, Replaceable, or non-readonly attributes expected "function" but got "undefined" -PASS Document interface: new Document must inherit property "fullscreenEnabled" with the proper type (29) -FAIL Document interface: new Document must inherit property "fullscreen" with the proper type (30) assert_inherits: property "fullscreen" not found in prototype chain -PASS Document interface: new Document must inherit property "exitFullscreen" with the proper type (31) -PASS Document interface: new Document must inherit property "onfullscreenchange" with the proper type (32) -PASS Document interface: new Document must inherit property "onfullscreenerror" with the proper type (33) -PASS Document interface: new Document must inherit property "fullscreenElement" with the proper type (35) +PASS Document interface: new Document must inherit property "fullscreenEnabled" with the proper type +FAIL Document interface: new Document must inherit property "fullscreen" with the proper type assert_inherits: property "fullscreen" not found in prototype chain +PASS Document interface: new Document must inherit property "exitFullscreen()" with the proper type +PASS Document interface: new Document must inherit property "onfullscreenchange" with the proper type +PASS Document interface: new Document must inherit property "onfullscreenerror" with the proper type +PASS Document interface: new Document must inherit property "fullscreenElement" with the proper type FAIL ShadowRoot interface: attribute fullscreenElement assert_equals: setter must be function for PutForwards, Replaceable, or non-readonly attributes expected "function" but got "undefined" FAIL Element interface: operation requestFullscreen() assert_unreached: Throws "TypeError: Illegal invocation" instead of rejecting promise Reached unreachable code PASS Element interface: attribute onfullscreenchange PASS Element interface: attribute onfullscreenerror -PASS Element interface: document.createElementNS(null, "test") must inherit property "requestFullscreen" with the proper type (34) -PASS Element interface: document.createElementNS(null, "test") must inherit property "onfullscreenchange" with the proper type (35) -PASS Element interface: document.createElementNS(null, "test") must inherit property "onfullscreenerror" with the proper type (36) +PASS Element interface: document.createElementNS(null, "test") must inherit property "requestFullscreen()" with the proper type +PASS Element interface: document.createElementNS(null, "test") must inherit property "onfullscreenchange" with the proper type +PASS Element interface: document.createElementNS(null, "test") must inherit property "onfullscreenerror" with the proper type Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/hr-time/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/hr-time/idlharness-expected.txt index cbdd61f6..f1e40d5 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/hr-time/idlharness-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/hr-time/idlharness-expected.txt
@@ -11,7 +11,7 @@ FAIL Test default toJSON operation of Performance Illegal invocation PASS Performance must be primary interface of window.performance PASS Stringification of window.performance -PASS Performance interface: window.performance must inherit property "now" with the proper type (0) -PASS Performance interface: window.performance must inherit property "toJSON" with the proper type (1) +PASS Performance interface: window.performance must inherit property "now()" with the proper type +PASS Performance interface: window.performance must inherit property "toJSON()" with the proper type Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html-media-capture/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html-media-capture/idlharness-expected.txt index 6aa54fd..9239268 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/html-media-capture/idlharness-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/html-media-capture/idlharness-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. FAIL HTMLInputElement interface: attribute capture assert_true: The prototype object must have a property "capture" expected true got false -FAIL HTMLInputElement interface: [object HTMLInputElement] must inherit property "capture" with the proper type (0) assert_inherits: property "capture" not found in prototype chain +FAIL HTMLInputElement interface: [object HTMLInputElement] must inherit property "capture" with the proper type assert_inherits: property "capture" not found in prototype chain Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/browsers/browsing-the-web/history-traversal/PopStateEvent.html b/third_party/WebKit/LayoutTests/external/wpt/html/browsers/browsing-the-web/history-traversal/PopStateEvent.html index ace09e5..85205c1 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/html/browsers/browsing-the-web/history-traversal/PopStateEvent.html +++ b/third_party/WebKit/LayoutTests/external/wpt/html/browsers/browsing-the-web/history-traversal/PopStateEvent.html
@@ -6,12 +6,6 @@ <div id="log"></div> <script> test(function () { - var e = document.createEvent('PopStateEvent'); - var eProto = Object.getPrototypeOf(e); - assert_equals(eProto, PopStateEvent.prototype); -}, 'document.createEvent'); - -test(function () { assert_false('initPopStateEvent' in PopStateEvent.prototype, 'There should be no PopStateEvent#initPopStateEvent'); }, 'initPopStateEvent');
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces-expected.txt index 25a4c2c..cdf2e4df 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces-expected.txt
@@ -18,8 +18,8 @@ PASS Document interface: attribute scripts PASS Document interface: operation getElementsByName(DOMString) PASS Document interface: attribute currentScript -PASS Document interface: operation open(DOMString,DOMString) -PASS Document interface: operation open(USVString,DOMString,DOMString) +PASS Document interface: operation open(DOMString, DOMString) +PASS Document interface: operation open(USVString, DOMString, DOMString) PASS Document interface: operation close() PASS Document interface: operation write(DOMString) PASS Document interface: operation writeln(DOMString) @@ -27,7 +27,7 @@ PASS Document interface: attribute activeElement PASS Document interface: operation hasFocus() PASS Document interface: attribute designMode -PASS Document interface: operation execCommand(DOMString,boolean,DOMString) +PASS Document interface: operation execCommand(DOMString, boolean, DOMString) PASS Document interface: operation queryCommandEnabled(DOMString) PASS Document interface: operation queryCommandIndeterm(DOMString) PASS Document interface: operation queryCommandState(DOMString) @@ -110,365 +110,365 @@ PASS Document interface: attribute oncut PASS Document interface: attribute onpaste PASS Document interface: iframe.contentDocument must have own property "location" -PASS Document interface: iframe.contentDocument must inherit property "domain" with the proper type (31) -PASS Document interface: iframe.contentDocument must inherit property "referrer" with the proper type (32) -PASS Document interface: iframe.contentDocument must inherit property "cookie" with the proper type (33) -PASS Document interface: iframe.contentDocument must inherit property "lastModified" with the proper type (34) -PASS Document interface: iframe.contentDocument must inherit property "readyState" with the proper type (35) -PASS Document interface: iframe.contentDocument must inherit property "title" with the proper type (37) -PASS Document interface: iframe.contentDocument must inherit property "dir" with the proper type (38) -PASS Document interface: iframe.contentDocument must inherit property "body" with the proper type (39) -PASS Document interface: iframe.contentDocument must inherit property "head" with the proper type (40) -PASS Document interface: iframe.contentDocument must inherit property "images" with the proper type (41) -PASS Document interface: iframe.contentDocument must inherit property "embeds" with the proper type (42) -PASS Document interface: iframe.contentDocument must inherit property "plugins" with the proper type (43) -PASS Document interface: iframe.contentDocument must inherit property "links" with the proper type (44) -PASS Document interface: iframe.contentDocument must inherit property "forms" with the proper type (45) -PASS Document interface: iframe.contentDocument must inherit property "scripts" with the proper type (46) -PASS Document interface: iframe.contentDocument must inherit property "getElementsByName" with the proper type (47) +PASS Document interface: iframe.contentDocument must inherit property "domain" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "referrer" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "cookie" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "lastModified" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "readyState" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "title" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "dir" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "body" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "head" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "images" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "embeds" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "plugins" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "links" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "forms" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "scripts" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "getElementsByName(DOMString)" with the proper type PASS Document interface: calling getElementsByName(DOMString) on iframe.contentDocument with too few arguments must throw TypeError -PASS Document interface: iframe.contentDocument must inherit property "currentScript" with the proper type (48) -PASS Document interface: iframe.contentDocument must inherit property "open" with the proper type (49) -PASS Document interface: calling open(DOMString,DOMString) on iframe.contentDocument with too few arguments must throw TypeError -PASS Document interface: iframe.contentDocument must inherit property "open" with the proper type (50) -PASS Document interface: calling open(USVString,DOMString,DOMString) on iframe.contentDocument with too few arguments must throw TypeError -PASS Document interface: iframe.contentDocument must inherit property "close" with the proper type (51) -PASS Document interface: iframe.contentDocument must inherit property "write" with the proper type (52) +PASS Document interface: iframe.contentDocument must inherit property "currentScript" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "open(DOMString, DOMString)" with the proper type +PASS Document interface: calling open(DOMString, DOMString) on iframe.contentDocument with too few arguments must throw TypeError +PASS Document interface: iframe.contentDocument must inherit property "open(USVString, DOMString, DOMString)" with the proper type +PASS Document interface: calling open(USVString, DOMString, DOMString) on iframe.contentDocument with too few arguments must throw TypeError +PASS Document interface: iframe.contentDocument must inherit property "close()" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "write(DOMString)" with the proper type PASS Document interface: calling write(DOMString) on iframe.contentDocument with too few arguments must throw TypeError -PASS Document interface: iframe.contentDocument must inherit property "writeln" with the proper type (53) +PASS Document interface: iframe.contentDocument must inherit property "writeln(DOMString)" with the proper type PASS Document interface: calling writeln(DOMString) on iframe.contentDocument with too few arguments must throw TypeError -PASS Document interface: iframe.contentDocument must inherit property "defaultView" with the proper type (54) -PASS Document interface: iframe.contentDocument must inherit property "activeElement" with the proper type (55) -PASS Document interface: iframe.contentDocument must inherit property "hasFocus" with the proper type (56) -PASS Document interface: iframe.contentDocument must inherit property "designMode" with the proper type (57) -PASS Document interface: iframe.contentDocument must inherit property "execCommand" with the proper type (58) -PASS Document interface: calling execCommand(DOMString,boolean,DOMString) on iframe.contentDocument with too few arguments must throw TypeError -PASS Document interface: iframe.contentDocument must inherit property "queryCommandEnabled" with the proper type (59) +PASS Document interface: iframe.contentDocument must inherit property "defaultView" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "activeElement" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "hasFocus()" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "designMode" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "execCommand(DOMString, boolean, DOMString)" with the proper type +PASS Document interface: calling execCommand(DOMString, boolean, DOMString) on iframe.contentDocument with too few arguments must throw TypeError +PASS Document interface: iframe.contentDocument must inherit property "queryCommandEnabled(DOMString)" with the proper type PASS Document interface: calling queryCommandEnabled(DOMString) on iframe.contentDocument with too few arguments must throw TypeError -PASS Document interface: iframe.contentDocument must inherit property "queryCommandIndeterm" with the proper type (60) +PASS Document interface: iframe.contentDocument must inherit property "queryCommandIndeterm(DOMString)" with the proper type PASS Document interface: calling queryCommandIndeterm(DOMString) on iframe.contentDocument with too few arguments must throw TypeError -PASS Document interface: iframe.contentDocument must inherit property "queryCommandState" with the proper type (61) +PASS Document interface: iframe.contentDocument must inherit property "queryCommandState(DOMString)" with the proper type PASS Document interface: calling queryCommandState(DOMString) on iframe.contentDocument with too few arguments must throw TypeError -PASS Document interface: iframe.contentDocument must inherit property "queryCommandSupported" with the proper type (62) +PASS Document interface: iframe.contentDocument must inherit property "queryCommandSupported(DOMString)" with the proper type PASS Document interface: calling queryCommandSupported(DOMString) on iframe.contentDocument with too few arguments must throw TypeError -PASS Document interface: iframe.contentDocument must inherit property "queryCommandValue" with the proper type (63) +PASS Document interface: iframe.contentDocument must inherit property "queryCommandValue(DOMString)" with the proper type PASS Document interface: calling queryCommandValue(DOMString) on iframe.contentDocument with too few arguments must throw TypeError -PASS Document interface: iframe.contentDocument must inherit property "onreadystatechange" with the proper type (64) -PASS Document interface: iframe.contentDocument must inherit property "fgColor" with the proper type (65) -PASS Document interface: iframe.contentDocument must inherit property "linkColor" with the proper type (66) -PASS Document interface: iframe.contentDocument must inherit property "vlinkColor" with the proper type (67) -PASS Document interface: iframe.contentDocument must inherit property "alinkColor" with the proper type (68) -PASS Document interface: iframe.contentDocument must inherit property "bgColor" with the proper type (69) -PASS Document interface: iframe.contentDocument must inherit property "anchors" with the proper type (70) -PASS Document interface: iframe.contentDocument must inherit property "applets" with the proper type (71) -PASS Document interface: iframe.contentDocument must inherit property "clear" with the proper type (72) -PASS Document interface: iframe.contentDocument must inherit property "captureEvents" with the proper type (73) -PASS Document interface: iframe.contentDocument must inherit property "releaseEvents" with the proper type (74) -FAIL Document interface: iframe.contentDocument must inherit property "all" with the proper type (75) assert_in_array: wrong type: not object or function value "undefined" not in array ["object", "function"] -PASS Document interface: iframe.contentDocument must inherit property "onabort" with the proper type (85) -PASS Document interface: iframe.contentDocument must inherit property "onauxclick" with the proper type (86) -PASS Document interface: iframe.contentDocument must inherit property "onblur" with the proper type (87) -PASS Document interface: iframe.contentDocument must inherit property "oncancel" with the proper type (88) -PASS Document interface: iframe.contentDocument must inherit property "oncanplay" with the proper type (89) -PASS Document interface: iframe.contentDocument must inherit property "oncanplaythrough" with the proper type (90) -PASS Document interface: iframe.contentDocument must inherit property "onchange" with the proper type (91) -PASS Document interface: iframe.contentDocument must inherit property "onclick" with the proper type (92) -PASS Document interface: iframe.contentDocument must inherit property "onclose" with the proper type (93) -PASS Document interface: iframe.contentDocument must inherit property "oncontextmenu" with the proper type (94) -PASS Document interface: iframe.contentDocument must inherit property "oncuechange" with the proper type (95) -PASS Document interface: iframe.contentDocument must inherit property "ondblclick" with the proper type (96) -PASS Document interface: iframe.contentDocument must inherit property "ondrag" with the proper type (97) -PASS Document interface: iframe.contentDocument must inherit property "ondragend" with the proper type (98) -PASS Document interface: iframe.contentDocument must inherit property "ondragenter" with the proper type (99) -FAIL Document interface: iframe.contentDocument must inherit property "ondragexit" with the proper type (100) assert_inherits: property "ondragexit" not found in prototype chain -PASS Document interface: iframe.contentDocument must inherit property "ondragleave" with the proper type (101) -PASS Document interface: iframe.contentDocument must inherit property "ondragover" with the proper type (102) -PASS Document interface: iframe.contentDocument must inherit property "ondragstart" with the proper type (103) -PASS Document interface: iframe.contentDocument must inherit property "ondrop" with the proper type (104) -PASS Document interface: iframe.contentDocument must inherit property "ondurationchange" with the proper type (105) -PASS Document interface: iframe.contentDocument must inherit property "onemptied" with the proper type (106) -PASS Document interface: iframe.contentDocument must inherit property "onended" with the proper type (107) -PASS Document interface: iframe.contentDocument must inherit property "onerror" with the proper type (108) -PASS Document interface: iframe.contentDocument must inherit property "onfocus" with the proper type (109) -PASS Document interface: iframe.contentDocument must inherit property "oninput" with the proper type (110) -PASS Document interface: iframe.contentDocument must inherit property "oninvalid" with the proper type (111) -PASS Document interface: iframe.contentDocument must inherit property "onkeydown" with the proper type (112) -PASS Document interface: iframe.contentDocument must inherit property "onkeypress" with the proper type (113) -PASS Document interface: iframe.contentDocument must inherit property "onkeyup" with the proper type (114) -PASS Document interface: iframe.contentDocument must inherit property "onload" with the proper type (115) -PASS Document interface: iframe.contentDocument must inherit property "onloadeddata" with the proper type (116) -PASS Document interface: iframe.contentDocument must inherit property "onloadedmetadata" with the proper type (117) -FAIL Document interface: iframe.contentDocument must inherit property "onloadend" with the proper type (118) assert_inherits: property "onloadend" not found in prototype chain -PASS Document interface: iframe.contentDocument must inherit property "onloadstart" with the proper type (119) -PASS Document interface: iframe.contentDocument must inherit property "onmousedown" with the proper type (120) -PASS Document interface: iframe.contentDocument must inherit property "onmouseenter" with the proper type (121) -PASS Document interface: iframe.contentDocument must inherit property "onmouseleave" with the proper type (122) -PASS Document interface: iframe.contentDocument must inherit property "onmousemove" with the proper type (123) -PASS Document interface: iframe.contentDocument must inherit property "onmouseout" with the proper type (124) -PASS Document interface: iframe.contentDocument must inherit property "onmouseover" with the proper type (125) -PASS Document interface: iframe.contentDocument must inherit property "onmouseup" with the proper type (126) -PASS Document interface: iframe.contentDocument must inherit property "onwheel" with the proper type (127) -PASS Document interface: iframe.contentDocument must inherit property "onpause" with the proper type (128) -PASS Document interface: iframe.contentDocument must inherit property "onplay" with the proper type (129) -PASS Document interface: iframe.contentDocument must inherit property "onplaying" with the proper type (130) -PASS Document interface: iframe.contentDocument must inherit property "onprogress" with the proper type (131) -PASS Document interface: iframe.contentDocument must inherit property "onratechange" with the proper type (132) -PASS Document interface: iframe.contentDocument must inherit property "onreset" with the proper type (133) -PASS Document interface: iframe.contentDocument must inherit property "onresize" with the proper type (134) -PASS Document interface: iframe.contentDocument must inherit property "onscroll" with the proper type (135) -PASS Document interface: iframe.contentDocument must inherit property "onseeked" with the proper type (136) -PASS Document interface: iframe.contentDocument must inherit property "onseeking" with the proper type (137) -PASS Document interface: iframe.contentDocument must inherit property "onselect" with the proper type (138) -PASS Document interface: iframe.contentDocument must inherit property "onstalled" with the proper type (139) -PASS Document interface: iframe.contentDocument must inherit property "onsubmit" with the proper type (140) -PASS Document interface: iframe.contentDocument must inherit property "onsuspend" with the proper type (141) -PASS Document interface: iframe.contentDocument must inherit property "ontimeupdate" with the proper type (142) -PASS Document interface: iframe.contentDocument must inherit property "ontoggle" with the proper type (143) -PASS Document interface: iframe.contentDocument must inherit property "onvolumechange" with the proper type (144) -PASS Document interface: iframe.contentDocument must inherit property "onwaiting" with the proper type (145) -PASS Document interface: iframe.contentDocument must inherit property "oncopy" with the proper type (146) -PASS Document interface: iframe.contentDocument must inherit property "oncut" with the proper type (147) -PASS Document interface: iframe.contentDocument must inherit property "onpaste" with the proper type (148) +PASS Document interface: iframe.contentDocument must inherit property "onreadystatechange" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "fgColor" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "linkColor" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "vlinkColor" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "alinkColor" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "bgColor" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "anchors" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "applets" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "clear()" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "captureEvents()" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "releaseEvents()" with the proper type +FAIL Document interface: iframe.contentDocument must inherit property "all" with the proper type assert_in_array: wrong type: not object or function value "undefined" not in array ["object", "function"] +PASS Document interface: iframe.contentDocument must inherit property "onabort" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onauxclick" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onblur" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "oncancel" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "oncanplay" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "oncanplaythrough" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onchange" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onclick" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onclose" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "oncontextmenu" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "oncuechange" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "ondblclick" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "ondrag" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "ondragend" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "ondragenter" with the proper type +FAIL Document interface: iframe.contentDocument must inherit property "ondragexit" with the proper type assert_inherits: property "ondragexit" not found in prototype chain +PASS Document interface: iframe.contentDocument must inherit property "ondragleave" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "ondragover" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "ondragstart" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "ondrop" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "ondurationchange" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onemptied" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onended" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onerror" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onfocus" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "oninput" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "oninvalid" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onkeydown" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onkeypress" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onkeyup" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onload" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onloadeddata" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onloadedmetadata" with the proper type +FAIL Document interface: iframe.contentDocument must inherit property "onloadend" with the proper type assert_inherits: property "onloadend" not found in prototype chain +PASS Document interface: iframe.contentDocument must inherit property "onloadstart" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onmousedown" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onmouseenter" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onmouseleave" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onmousemove" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onmouseout" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onmouseover" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onmouseup" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onwheel" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onpause" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onplay" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onplaying" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onprogress" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onratechange" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onreset" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onresize" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onscroll" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onseeked" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onseeking" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onselect" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onstalled" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onsubmit" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onsuspend" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "ontimeupdate" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "ontoggle" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onvolumechange" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onwaiting" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "oncopy" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "oncut" with the proper type +PASS Document interface: iframe.contentDocument must inherit property "onpaste" with the proper type PASS Document interface: new Document() must have own property "location" -PASS Document interface: new Document() must inherit property "domain" with the proper type (31) -PASS Document interface: new Document() must inherit property "referrer" with the proper type (32) -PASS Document interface: new Document() must inherit property "cookie" with the proper type (33) -PASS Document interface: new Document() must inherit property "lastModified" with the proper type (34) -PASS Document interface: new Document() must inherit property "readyState" with the proper type (35) -PASS Document interface: new Document() must inherit property "title" with the proper type (37) -PASS Document interface: new Document() must inherit property "dir" with the proper type (38) -PASS Document interface: new Document() must inherit property "body" with the proper type (39) -PASS Document interface: new Document() must inherit property "head" with the proper type (40) -PASS Document interface: new Document() must inherit property "images" with the proper type (41) -PASS Document interface: new Document() must inherit property "embeds" with the proper type (42) -PASS Document interface: new Document() must inherit property "plugins" with the proper type (43) -PASS Document interface: new Document() must inherit property "links" with the proper type (44) -PASS Document interface: new Document() must inherit property "forms" with the proper type (45) -PASS Document interface: new Document() must inherit property "scripts" with the proper type (46) -PASS Document interface: new Document() must inherit property "getElementsByName" with the proper type (47) +PASS Document interface: new Document() must inherit property "domain" with the proper type +PASS Document interface: new Document() must inherit property "referrer" with the proper type +PASS Document interface: new Document() must inherit property "cookie" with the proper type +PASS Document interface: new Document() must inherit property "lastModified" with the proper type +PASS Document interface: new Document() must inherit property "readyState" with the proper type +PASS Document interface: new Document() must inherit property "title" with the proper type +PASS Document interface: new Document() must inherit property "dir" with the proper type +PASS Document interface: new Document() must inherit property "body" with the proper type +PASS Document interface: new Document() must inherit property "head" with the proper type +PASS Document interface: new Document() must inherit property "images" with the proper type +PASS Document interface: new Document() must inherit property "embeds" with the proper type +PASS Document interface: new Document() must inherit property "plugins" with the proper type +PASS Document interface: new Document() must inherit property "links" with the proper type +PASS Document interface: new Document() must inherit property "forms" with the proper type +PASS Document interface: new Document() must inherit property "scripts" with the proper type +PASS Document interface: new Document() must inherit property "getElementsByName(DOMString)" with the proper type PASS Document interface: calling getElementsByName(DOMString) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "currentScript" with the proper type (48) -PASS Document interface: new Document() must inherit property "open" with the proper type (49) -PASS Document interface: calling open(DOMString,DOMString) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "open" with the proper type (50) -PASS Document interface: calling open(USVString,DOMString,DOMString) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "close" with the proper type (51) -PASS Document interface: new Document() must inherit property "write" with the proper type (52) +PASS Document interface: new Document() must inherit property "currentScript" with the proper type +PASS Document interface: new Document() must inherit property "open(DOMString, DOMString)" with the proper type +PASS Document interface: calling open(DOMString, DOMString) on new Document() with too few arguments must throw TypeError +PASS Document interface: new Document() must inherit property "open(USVString, DOMString, DOMString)" with the proper type +PASS Document interface: calling open(USVString, DOMString, DOMString) on new Document() with too few arguments must throw TypeError +PASS Document interface: new Document() must inherit property "close()" with the proper type +PASS Document interface: new Document() must inherit property "write(DOMString)" with the proper type PASS Document interface: calling write(DOMString) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "writeln" with the proper type (53) +PASS Document interface: new Document() must inherit property "writeln(DOMString)" with the proper type PASS Document interface: calling writeln(DOMString) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "defaultView" with the proper type (54) -PASS Document interface: new Document() must inherit property "activeElement" with the proper type (55) -PASS Document interface: new Document() must inherit property "hasFocus" with the proper type (56) -PASS Document interface: new Document() must inherit property "designMode" with the proper type (57) -PASS Document interface: new Document() must inherit property "execCommand" with the proper type (58) -PASS Document interface: calling execCommand(DOMString,boolean,DOMString) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "queryCommandEnabled" with the proper type (59) +PASS Document interface: new Document() must inherit property "defaultView" with the proper type +PASS Document interface: new Document() must inherit property "activeElement" with the proper type +PASS Document interface: new Document() must inherit property "hasFocus()" with the proper type +PASS Document interface: new Document() must inherit property "designMode" with the proper type +PASS Document interface: new Document() must inherit property "execCommand(DOMString, boolean, DOMString)" with the proper type +PASS Document interface: calling execCommand(DOMString, boolean, DOMString) on new Document() with too few arguments must throw TypeError +PASS Document interface: new Document() must inherit property "queryCommandEnabled(DOMString)" with the proper type PASS Document interface: calling queryCommandEnabled(DOMString) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "queryCommandIndeterm" with the proper type (60) +PASS Document interface: new Document() must inherit property "queryCommandIndeterm(DOMString)" with the proper type PASS Document interface: calling queryCommandIndeterm(DOMString) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "queryCommandState" with the proper type (61) +PASS Document interface: new Document() must inherit property "queryCommandState(DOMString)" with the proper type PASS Document interface: calling queryCommandState(DOMString) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "queryCommandSupported" with the proper type (62) +PASS Document interface: new Document() must inherit property "queryCommandSupported(DOMString)" with the proper type PASS Document interface: calling queryCommandSupported(DOMString) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "queryCommandValue" with the proper type (63) +PASS Document interface: new Document() must inherit property "queryCommandValue(DOMString)" with the proper type PASS Document interface: calling queryCommandValue(DOMString) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "onreadystatechange" with the proper type (64) -FAIL Document interface: new Document() must inherit property "fgColor" with the proper type (65) assert_inherits: property "fgColor" not found in prototype chain -FAIL Document interface: new Document() must inherit property "linkColor" with the proper type (66) assert_inherits: property "linkColor" not found in prototype chain -FAIL Document interface: new Document() must inherit property "vlinkColor" with the proper type (67) assert_inherits: property "vlinkColor" not found in prototype chain -FAIL Document interface: new Document() must inherit property "alinkColor" with the proper type (68) assert_inherits: property "alinkColor" not found in prototype chain -FAIL Document interface: new Document() must inherit property "bgColor" with the proper type (69) assert_inherits: property "bgColor" not found in prototype chain -PASS Document interface: new Document() must inherit property "anchors" with the proper type (70) -PASS Document interface: new Document() must inherit property "applets" with the proper type (71) -FAIL Document interface: new Document() must inherit property "clear" with the proper type (72) assert_inherits: property "clear" not found in prototype chain -FAIL Document interface: new Document() must inherit property "captureEvents" with the proper type (73) assert_inherits: property "captureEvents" not found in prototype chain -FAIL Document interface: new Document() must inherit property "releaseEvents" with the proper type (74) assert_inherits: property "releaseEvents" not found in prototype chain -FAIL Document interface: new Document() must inherit property "all" with the proper type (75) assert_inherits: property "all" not found in prototype chain -PASS Document interface: new Document() must inherit property "onabort" with the proper type (85) -PASS Document interface: new Document() must inherit property "onauxclick" with the proper type (86) -PASS Document interface: new Document() must inherit property "onblur" with the proper type (87) -PASS Document interface: new Document() must inherit property "oncancel" with the proper type (88) -PASS Document interface: new Document() must inherit property "oncanplay" with the proper type (89) -PASS Document interface: new Document() must inherit property "oncanplaythrough" with the proper type (90) -PASS Document interface: new Document() must inherit property "onchange" with the proper type (91) -PASS Document interface: new Document() must inherit property "onclick" with the proper type (92) -PASS Document interface: new Document() must inherit property "onclose" with the proper type (93) -PASS Document interface: new Document() must inherit property "oncontextmenu" with the proper type (94) -PASS Document interface: new Document() must inherit property "oncuechange" with the proper type (95) -PASS Document interface: new Document() must inherit property "ondblclick" with the proper type (96) -PASS Document interface: new Document() must inherit property "ondrag" with the proper type (97) -PASS Document interface: new Document() must inherit property "ondragend" with the proper type (98) -PASS Document interface: new Document() must inherit property "ondragenter" with the proper type (99) -FAIL Document interface: new Document() must inherit property "ondragexit" with the proper type (100) assert_inherits: property "ondragexit" not found in prototype chain -PASS Document interface: new Document() must inherit property "ondragleave" with the proper type (101) -PASS Document interface: new Document() must inherit property "ondragover" with the proper type (102) -PASS Document interface: new Document() must inherit property "ondragstart" with the proper type (103) -PASS Document interface: new Document() must inherit property "ondrop" with the proper type (104) -PASS Document interface: new Document() must inherit property "ondurationchange" with the proper type (105) -PASS Document interface: new Document() must inherit property "onemptied" with the proper type (106) -PASS Document interface: new Document() must inherit property "onended" with the proper type (107) -PASS Document interface: new Document() must inherit property "onerror" with the proper type (108) -PASS Document interface: new Document() must inherit property "onfocus" with the proper type (109) -PASS Document interface: new Document() must inherit property "oninput" with the proper type (110) -PASS Document interface: new Document() must inherit property "oninvalid" with the proper type (111) -PASS Document interface: new Document() must inherit property "onkeydown" with the proper type (112) -PASS Document interface: new Document() must inherit property "onkeypress" with the proper type (113) -PASS Document interface: new Document() must inherit property "onkeyup" with the proper type (114) -PASS Document interface: new Document() must inherit property "onload" with the proper type (115) -PASS Document interface: new Document() must inherit property "onloadeddata" with the proper type (116) -PASS Document interface: new Document() must inherit property "onloadedmetadata" with the proper type (117) -FAIL Document interface: new Document() must inherit property "onloadend" with the proper type (118) assert_inherits: property "onloadend" not found in prototype chain -PASS Document interface: new Document() must inherit property "onloadstart" with the proper type (119) -PASS Document interface: new Document() must inherit property "onmousedown" with the proper type (120) -PASS Document interface: new Document() must inherit property "onmouseenter" with the proper type (121) -PASS Document interface: new Document() must inherit property "onmouseleave" with the proper type (122) -PASS Document interface: new Document() must inherit property "onmousemove" with the proper type (123) -PASS Document interface: new Document() must inherit property "onmouseout" with the proper type (124) -PASS Document interface: new Document() must inherit property "onmouseover" with the proper type (125) -PASS Document interface: new Document() must inherit property "onmouseup" with the proper type (126) -PASS Document interface: new Document() must inherit property "onwheel" with the proper type (127) -PASS Document interface: new Document() must inherit property "onpause" with the proper type (128) -PASS Document interface: new Document() must inherit property "onplay" with the proper type (129) -PASS Document interface: new Document() must inherit property "onplaying" with the proper type (130) -PASS Document interface: new Document() must inherit property "onprogress" with the proper type (131) -PASS Document interface: new Document() must inherit property "onratechange" with the proper type (132) -PASS Document interface: new Document() must inherit property "onreset" with the proper type (133) -PASS Document interface: new Document() must inherit property "onresize" with the proper type (134) -PASS Document interface: new Document() must inherit property "onscroll" with the proper type (135) -PASS Document interface: new Document() must inherit property "onseeked" with the proper type (136) -PASS Document interface: new Document() must inherit property "onseeking" with the proper type (137) -PASS Document interface: new Document() must inherit property "onselect" with the proper type (138) -PASS Document interface: new Document() must inherit property "onstalled" with the proper type (139) -PASS Document interface: new Document() must inherit property "onsubmit" with the proper type (140) -PASS Document interface: new Document() must inherit property "onsuspend" with the proper type (141) -PASS Document interface: new Document() must inherit property "ontimeupdate" with the proper type (142) -PASS Document interface: new Document() must inherit property "ontoggle" with the proper type (143) -PASS Document interface: new Document() must inherit property "onvolumechange" with the proper type (144) -PASS Document interface: new Document() must inherit property "onwaiting" with the proper type (145) -PASS Document interface: new Document() must inherit property "oncopy" with the proper type (146) -PASS Document interface: new Document() must inherit property "oncut" with the proper type (147) -PASS Document interface: new Document() must inherit property "onpaste" with the proper type (148) +PASS Document interface: new Document() must inherit property "onreadystatechange" with the proper type +FAIL Document interface: new Document() must inherit property "fgColor" with the proper type assert_inherits: property "fgColor" not found in prototype chain +FAIL Document interface: new Document() must inherit property "linkColor" with the proper type assert_inherits: property "linkColor" not found in prototype chain +FAIL Document interface: new Document() must inherit property "vlinkColor" with the proper type assert_inherits: property "vlinkColor" not found in prototype chain +FAIL Document interface: new Document() must inherit property "alinkColor" with the proper type assert_inherits: property "alinkColor" not found in prototype chain +FAIL Document interface: new Document() must inherit property "bgColor" with the proper type assert_inherits: property "bgColor" not found in prototype chain +PASS Document interface: new Document() must inherit property "anchors" with the proper type +PASS Document interface: new Document() must inherit property "applets" with the proper type +FAIL Document interface: new Document() must inherit property "clear()" with the proper type assert_inherits: property "clear" not found in prototype chain +FAIL Document interface: new Document() must inherit property "captureEvents()" with the proper type assert_inherits: property "captureEvents" not found in prototype chain +FAIL Document interface: new Document() must inherit property "releaseEvents()" with the proper type assert_inherits: property "releaseEvents" not found in prototype chain +FAIL Document interface: new Document() must inherit property "all" with the proper type assert_inherits: property "all" not found in prototype chain +PASS Document interface: new Document() must inherit property "onabort" with the proper type +PASS Document interface: new Document() must inherit property "onauxclick" with the proper type +PASS Document interface: new Document() must inherit property "onblur" with the proper type +PASS Document interface: new Document() must inherit property "oncancel" with the proper type +PASS Document interface: new Document() must inherit property "oncanplay" with the proper type +PASS Document interface: new Document() must inherit property "oncanplaythrough" with the proper type +PASS Document interface: new Document() must inherit property "onchange" with the proper type +PASS Document interface: new Document() must inherit property "onclick" with the proper type +PASS Document interface: new Document() must inherit property "onclose" with the proper type +PASS Document interface: new Document() must inherit property "oncontextmenu" with the proper type +PASS Document interface: new Document() must inherit property "oncuechange" with the proper type +PASS Document interface: new Document() must inherit property "ondblclick" with the proper type +PASS Document interface: new Document() must inherit property "ondrag" with the proper type +PASS Document interface: new Document() must inherit property "ondragend" with the proper type +PASS Document interface: new Document() must inherit property "ondragenter" with the proper type +FAIL Document interface: new Document() must inherit property "ondragexit" with the proper type assert_inherits: property "ondragexit" not found in prototype chain +PASS Document interface: new Document() must inherit property "ondragleave" with the proper type +PASS Document interface: new Document() must inherit property "ondragover" with the proper type +PASS Document interface: new Document() must inherit property "ondragstart" with the proper type +PASS Document interface: new Document() must inherit property "ondrop" with the proper type +PASS Document interface: new Document() must inherit property "ondurationchange" with the proper type +PASS Document interface: new Document() must inherit property "onemptied" with the proper type +PASS Document interface: new Document() must inherit property "onended" with the proper type +PASS Document interface: new Document() must inherit property "onerror" with the proper type +PASS Document interface: new Document() must inherit property "onfocus" with the proper type +PASS Document interface: new Document() must inherit property "oninput" with the proper type +PASS Document interface: new Document() must inherit property "oninvalid" with the proper type +PASS Document interface: new Document() must inherit property "onkeydown" with the proper type +PASS Document interface: new Document() must inherit property "onkeypress" with the proper type +PASS Document interface: new Document() must inherit property "onkeyup" with the proper type +PASS Document interface: new Document() must inherit property "onload" with the proper type +PASS Document interface: new Document() must inherit property "onloadeddata" with the proper type +PASS Document interface: new Document() must inherit property "onloadedmetadata" with the proper type +FAIL Document interface: new Document() must inherit property "onloadend" with the proper type assert_inherits: property "onloadend" not found in prototype chain +PASS Document interface: new Document() must inherit property "onloadstart" with the proper type +PASS Document interface: new Document() must inherit property "onmousedown" with the proper type +PASS Document interface: new Document() must inherit property "onmouseenter" with the proper type +PASS Document interface: new Document() must inherit property "onmouseleave" with the proper type +PASS Document interface: new Document() must inherit property "onmousemove" with the proper type +PASS Document interface: new Document() must inherit property "onmouseout" with the proper type +PASS Document interface: new Document() must inherit property "onmouseover" with the proper type +PASS Document interface: new Document() must inherit property "onmouseup" with the proper type +PASS Document interface: new Document() must inherit property "onwheel" with the proper type +PASS Document interface: new Document() must inherit property "onpause" with the proper type +PASS Document interface: new Document() must inherit property "onplay" with the proper type +PASS Document interface: new Document() must inherit property "onplaying" with the proper type +PASS Document interface: new Document() must inherit property "onprogress" with the proper type +PASS Document interface: new Document() must inherit property "onratechange" with the proper type +PASS Document interface: new Document() must inherit property "onreset" with the proper type +PASS Document interface: new Document() must inherit property "onresize" with the proper type +PASS Document interface: new Document() must inherit property "onscroll" with the proper type +PASS Document interface: new Document() must inherit property "onseeked" with the proper type +PASS Document interface: new Document() must inherit property "onseeking" with the proper type +PASS Document interface: new Document() must inherit property "onselect" with the proper type +PASS Document interface: new Document() must inherit property "onstalled" with the proper type +PASS Document interface: new Document() must inherit property "onsubmit" with the proper type +PASS Document interface: new Document() must inherit property "onsuspend" with the proper type +PASS Document interface: new Document() must inherit property "ontimeupdate" with the proper type +PASS Document interface: new Document() must inherit property "ontoggle" with the proper type +PASS Document interface: new Document() must inherit property "onvolumechange" with the proper type +PASS Document interface: new Document() must inherit property "onwaiting" with the proper type +PASS Document interface: new Document() must inherit property "oncopy" with the proper type +PASS Document interface: new Document() must inherit property "oncut" with the proper type +PASS Document interface: new Document() must inherit property "onpaste" with the proper type PASS Document interface: document.implementation.createDocument(null, "", null) must have own property "location" -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "domain" with the proper type (31) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "referrer" with the proper type (32) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "cookie" with the proper type (33) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "lastModified" with the proper type (34) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "readyState" with the proper type (35) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "title" with the proper type (37) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "dir" with the proper type (38) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "body" with the proper type (39) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "head" with the proper type (40) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "images" with the proper type (41) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "embeds" with the proper type (42) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "plugins" with the proper type (43) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "links" with the proper type (44) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "forms" with the proper type (45) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "scripts" with the proper type (46) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "getElementsByName" with the proper type (47) +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "domain" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "referrer" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "cookie" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "lastModified" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "readyState" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "title" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "dir" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "body" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "head" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "images" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "embeds" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "plugins" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "links" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "forms" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "scripts" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "getElementsByName(DOMString)" with the proper type PASS Document interface: calling getElementsByName(DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "currentScript" with the proper type (48) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "open" with the proper type (49) -PASS Document interface: calling open(DOMString,DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "open" with the proper type (50) -PASS Document interface: calling open(USVString,DOMString,DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "close" with the proper type (51) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "write" with the proper type (52) +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "currentScript" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "open(DOMString, DOMString)" with the proper type +PASS Document interface: calling open(DOMString, DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "open(USVString, DOMString, DOMString)" with the proper type +PASS Document interface: calling open(USVString, DOMString, DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "close()" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "write(DOMString)" with the proper type PASS Document interface: calling write(DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "writeln" with the proper type (53) +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "writeln(DOMString)" with the proper type PASS Document interface: calling writeln(DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "defaultView" with the proper type (54) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "activeElement" with the proper type (55) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "hasFocus" with the proper type (56) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "designMode" with the proper type (57) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "execCommand" with the proper type (58) -PASS Document interface: calling execCommand(DOMString,boolean,DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "queryCommandEnabled" with the proper type (59) +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "defaultView" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "activeElement" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "hasFocus()" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "designMode" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "execCommand(DOMString, boolean, DOMString)" with the proper type +PASS Document interface: calling execCommand(DOMString, boolean, DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "queryCommandEnabled(DOMString)" with the proper type PASS Document interface: calling queryCommandEnabled(DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "queryCommandIndeterm" with the proper type (60) +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "queryCommandIndeterm(DOMString)" with the proper type PASS Document interface: calling queryCommandIndeterm(DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "queryCommandState" with the proper type (61) +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "queryCommandState(DOMString)" with the proper type PASS Document interface: calling queryCommandState(DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "queryCommandSupported" with the proper type (62) +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "queryCommandSupported(DOMString)" with the proper type PASS Document interface: calling queryCommandSupported(DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "queryCommandValue" with the proper type (63) +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "queryCommandValue(DOMString)" with the proper type PASS Document interface: calling queryCommandValue(DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onreadystatechange" with the proper type (64) -FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "fgColor" with the proper type (65) assert_inherits: property "fgColor" not found in prototype chain -FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "linkColor" with the proper type (66) assert_inherits: property "linkColor" not found in prototype chain -FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "vlinkColor" with the proper type (67) assert_inherits: property "vlinkColor" not found in prototype chain -FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "alinkColor" with the proper type (68) assert_inherits: property "alinkColor" not found in prototype chain -FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "bgColor" with the proper type (69) assert_inherits: property "bgColor" not found in prototype chain -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "anchors" with the proper type (70) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "applets" with the proper type (71) -FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "clear" with the proper type (72) assert_inherits: property "clear" not found in prototype chain -FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "captureEvents" with the proper type (73) assert_inherits: property "captureEvents" not found in prototype chain -FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "releaseEvents" with the proper type (74) assert_inherits: property "releaseEvents" not found in prototype chain -FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "all" with the proper type (75) assert_inherits: property "all" not found in prototype chain -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onabort" with the proper type (85) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onauxclick" with the proper type (86) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onblur" with the proper type (87) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncancel" with the proper type (88) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncanplay" with the proper type (89) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncanplaythrough" with the proper type (90) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onchange" with the proper type (91) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onclick" with the proper type (92) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onclose" with the proper type (93) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncontextmenu" with the proper type (94) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncuechange" with the proper type (95) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondblclick" with the proper type (96) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondrag" with the proper type (97) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondragend" with the proper type (98) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondragenter" with the proper type (99) -FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondragexit" with the proper type (100) assert_inherits: property "ondragexit" not found in prototype chain -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondragleave" with the proper type (101) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondragover" with the proper type (102) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondragstart" with the proper type (103) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondrop" with the proper type (104) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondurationchange" with the proper type (105) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onemptied" with the proper type (106) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onended" with the proper type (107) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onerror" with the proper type (108) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onfocus" with the proper type (109) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oninput" with the proper type (110) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oninvalid" with the proper type (111) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onkeydown" with the proper type (112) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onkeypress" with the proper type (113) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onkeyup" with the proper type (114) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onload" with the proper type (115) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onloadeddata" with the proper type (116) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onloadedmetadata" with the proper type (117) -FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "onloadend" with the proper type (118) assert_inherits: property "onloadend" not found in prototype chain -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onloadstart" with the proper type (119) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmousedown" with the proper type (120) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmouseenter" with the proper type (121) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmouseleave" with the proper type (122) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmousemove" with the proper type (123) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmouseout" with the proper type (124) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmouseover" with the proper type (125) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmouseup" with the proper type (126) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onwheel" with the proper type (127) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onpause" with the proper type (128) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onplay" with the proper type (129) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onplaying" with the proper type (130) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onprogress" with the proper type (131) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onratechange" with the proper type (132) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onreset" with the proper type (133) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onresize" with the proper type (134) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onscroll" with the proper type (135) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onseeked" with the proper type (136) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onseeking" with the proper type (137) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onselect" with the proper type (138) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onstalled" with the proper type (139) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onsubmit" with the proper type (140) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onsuspend" with the proper type (141) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ontimeupdate" with the proper type (142) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ontoggle" with the proper type (143) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onvolumechange" with the proper type (144) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onwaiting" with the proper type (145) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncopy" with the proper type (146) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncut" with the proper type (147) -PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onpaste" with the proper type (148) +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onreadystatechange" with the proper type +FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "fgColor" with the proper type assert_inherits: property "fgColor" not found in prototype chain +FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "linkColor" with the proper type assert_inherits: property "linkColor" not found in prototype chain +FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "vlinkColor" with the proper type assert_inherits: property "vlinkColor" not found in prototype chain +FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "alinkColor" with the proper type assert_inherits: property "alinkColor" not found in prototype chain +FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "bgColor" with the proper type assert_inherits: property "bgColor" not found in prototype chain +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "anchors" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "applets" with the proper type +FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "clear()" with the proper type assert_inherits: property "clear" not found in prototype chain +FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "captureEvents()" with the proper type assert_inherits: property "captureEvents" not found in prototype chain +FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "releaseEvents()" with the proper type assert_inherits: property "releaseEvents" not found in prototype chain +FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "all" with the proper type assert_inherits: property "all" not found in prototype chain +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onabort" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onauxclick" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onblur" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncancel" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncanplay" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncanplaythrough" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onchange" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onclick" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onclose" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncontextmenu" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncuechange" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondblclick" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondrag" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondragend" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondragenter" with the proper type +FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondragexit" with the proper type assert_inherits: property "ondragexit" not found in prototype chain +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondragleave" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondragover" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondragstart" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondrop" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondurationchange" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onemptied" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onended" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onerror" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onfocus" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oninput" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oninvalid" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onkeydown" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onkeypress" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onkeyup" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onload" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onloadeddata" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onloadedmetadata" with the proper type +FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "onloadend" with the proper type assert_inherits: property "onloadend" not found in prototype chain +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onloadstart" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmousedown" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmouseenter" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmouseleave" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmousemove" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmouseout" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmouseover" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmouseup" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onwheel" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onpause" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onplay" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onplaying" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onprogress" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onratechange" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onreset" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onresize" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onscroll" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onseeked" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onseeking" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onselect" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onstalled" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onsubmit" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onsuspend" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ontimeupdate" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ontoggle" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onvolumechange" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onwaiting" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncopy" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncut" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onpaste" with the proper type PASS Touch interface: attribute region PASS MouseEvent interface: attribute region PASS HTMLAllCollection interface: existence and properties of interface object @@ -482,12 +482,12 @@ PASS HTMLAllCollection interface: operation namedItem(DOMString) FAIL HTMLAllCollection must be primary interface of document.all assert_equals: wrong typeof object expected "function" but got "undefined" FAIL Stringification of document.all assert_equals: wrong typeof object expected "function" but got "undefined" -FAIL HTMLAllCollection interface: document.all must inherit property "length" with the proper type (0) assert_equals: wrong typeof object expected "function" but got "undefined" -FAIL HTMLAllCollection interface: document.all must inherit property "item" with the proper type (1) assert_equals: wrong typeof object expected "function" but got "undefined" +FAIL HTMLAllCollection interface: document.all must inherit property "length" with the proper type assert_equals: wrong typeof object expected "function" but got "undefined" +FAIL HTMLAllCollection interface: document.all must inherit property "item(unsigned long)" with the proper type assert_equals: wrong typeof object expected "function" but got "undefined" FAIL HTMLAllCollection interface: calling item(unsigned long) on document.all with too few arguments must throw TypeError assert_equals: wrong typeof object expected "function" but got "undefined" -FAIL HTMLAllCollection interface: document.all must inherit property "item" with the proper type (2) assert_equals: wrong typeof object expected "function" but got "undefined" +FAIL HTMLAllCollection interface: document.all must inherit property "item(DOMString)" with the proper type assert_equals: wrong typeof object expected "function" but got "undefined" FAIL HTMLAllCollection interface: calling item(DOMString) on document.all with too few arguments must throw TypeError assert_equals: wrong typeof object expected "function" but got "undefined" -FAIL HTMLAllCollection interface: document.all must inherit property "namedItem" with the proper type (3) assert_equals: wrong typeof object expected "function" but got "undefined" +FAIL HTMLAllCollection interface: document.all must inherit property "namedItem(DOMString)" with the proper type assert_equals: wrong typeof object expected "function" but got "undefined" FAIL HTMLAllCollection interface: calling namedItem(DOMString) on document.all with too few arguments must throw TypeError assert_equals: wrong typeof object expected "function" but got "undefined" PASS HTMLFormControlsCollection interface: existence and properties of interface object PASS HTMLFormControlsCollection interface object length @@ -497,7 +497,7 @@ PASS HTMLFormControlsCollection interface: operation namedItem(DOMString) PASS HTMLFormControlsCollection must be primary interface of document.createElement("form").elements PASS Stringification of document.createElement("form").elements -PASS HTMLFormControlsCollection interface: document.createElement("form").elements must inherit property "namedItem" with the proper type (0) +PASS HTMLFormControlsCollection interface: document.createElement("form").elements must inherit property "namedItem(DOMString)" with the proper type PASS HTMLFormControlsCollection interface: calling namedItem(DOMString) on document.createElement("form").elements with too few arguments must throw TypeError PASS RadioNodeList interface: existence and properties of interface object PASS RadioNodeList interface object length @@ -511,17 +511,17 @@ PASS HTMLOptionsCollection interface: existence and properties of interface prototype object PASS HTMLOptionsCollection interface: existence and properties of interface prototype object's "constructor" property PASS HTMLOptionsCollection interface: attribute length -PASS HTMLOptionsCollection interface: operation add([object Object],[object Object],[object Object],[object Object]) +PASS HTMLOptionsCollection interface: operation add([object Object],[object Object], [object Object],[object Object]) PASS HTMLOptionsCollection interface: operation remove(long) PASS HTMLOptionsCollection interface: attribute selectedIndex PASS HTMLOptionsCollection must be primary interface of document.createElement("select").options PASS Stringification of document.createElement("select").options -PASS HTMLOptionsCollection interface: document.createElement("select").options must inherit property "length" with the proper type (0) -PASS HTMLOptionsCollection interface: document.createElement("select").options must inherit property "add" with the proper type (2) -PASS HTMLOptionsCollection interface: calling add([object Object],[object Object],[object Object],[object Object]) on document.createElement("select").options with too few arguments must throw TypeError -PASS HTMLOptionsCollection interface: document.createElement("select").options must inherit property "remove" with the proper type (3) +PASS HTMLOptionsCollection interface: document.createElement("select").options must inherit property "length" with the proper type +PASS HTMLOptionsCollection interface: document.createElement("select").options must inherit property "add([object Object],[object Object], [object Object],[object Object])" with the proper type +PASS HTMLOptionsCollection interface: calling add([object Object],[object Object], [object Object],[object Object]) on document.createElement("select").options with too few arguments must throw TypeError +PASS HTMLOptionsCollection interface: document.createElement("select").options must inherit property "remove(long)" with the proper type PASS HTMLOptionsCollection interface: calling remove(long) on document.createElement("select").options with too few arguments must throw TypeError -PASS HTMLOptionsCollection interface: document.createElement("select").options must inherit property "selectedIndex" with the proper type (4) +PASS HTMLOptionsCollection interface: document.createElement("select").options must inherit property "selectedIndex" with the proper type PASS DOMStringMap interface: existence and properties of interface object PASS DOMStringMap interface object length PASS DOMStringMap interface object name @@ -618,88 +618,88 @@ PASS HTMLElement interface: attribute isContentEditable PASS HTMLElement must be primary interface of document.createElement("noscript") PASS Stringification of document.createElement("noscript") -PASS HTMLElement interface: document.createElement("noscript") must inherit property "title" with the proper type (0) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "lang" with the proper type (1) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "translate" with the proper type (2) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "dir" with the proper type (3) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "dataset" with the proper type (4) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "hidden" with the proper type (5) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "click" with the proper type (6) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "tabIndex" with the proper type (7) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "focus" with the proper type (8) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "blur" with the proper type (9) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "accessKey" with the proper type (10) -FAIL HTMLElement interface: document.createElement("noscript") must inherit property "accessKeyLabel" with the proper type (11) assert_inherits: property "accessKeyLabel" not found in prototype chain -PASS HTMLElement interface: document.createElement("noscript") must inherit property "draggable" with the proper type (12) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "spellcheck" with the proper type (13) -FAIL HTMLElement interface: document.createElement("noscript") must inherit property "forceSpellCheck" with the proper type (14) assert_inherits: property "forceSpellCheck" not found in prototype chain -PASS HTMLElement interface: document.createElement("noscript") must inherit property "innerText" with the proper type (15) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onabort" with the proper type (16) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onauxclick" with the proper type (17) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onblur" with the proper type (18) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncancel" with the proper type (19) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncanplay" with the proper type (20) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncanplaythrough" with the proper type (21) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onchange" with the proper type (22) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onclick" with the proper type (23) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onclose" with the proper type (24) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncontextmenu" with the proper type (25) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncuechange" with the proper type (26) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondblclick" with the proper type (27) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondrag" with the proper type (28) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondragend" with the proper type (29) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondragenter" with the proper type (30) -FAIL HTMLElement interface: document.createElement("noscript") must inherit property "ondragexit" with the proper type (31) assert_inherits: property "ondragexit" not found in prototype chain -PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondragleave" with the proper type (32) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondragover" with the proper type (33) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondragstart" with the proper type (34) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondrop" with the proper type (35) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondurationchange" with the proper type (36) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onemptied" with the proper type (37) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onended" with the proper type (38) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onerror" with the proper type (39) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onfocus" with the proper type (40) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "oninput" with the proper type (41) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "oninvalid" with the proper type (42) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onkeydown" with the proper type (43) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onkeypress" with the proper type (44) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onkeyup" with the proper type (45) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onload" with the proper type (46) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onloadeddata" with the proper type (47) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onloadedmetadata" with the proper type (48) -FAIL HTMLElement interface: document.createElement("noscript") must inherit property "onloadend" with the proper type (49) assert_inherits: property "onloadend" not found in prototype chain -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onloadstart" with the proper type (50) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmousedown" with the proper type (51) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmouseenter" with the proper type (52) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmouseleave" with the proper type (53) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmousemove" with the proper type (54) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmouseout" with the proper type (55) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmouseover" with the proper type (56) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmouseup" with the proper type (57) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onwheel" with the proper type (58) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onpause" with the proper type (59) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onplay" with the proper type (60) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onplaying" with the proper type (61) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onprogress" with the proper type (62) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onratechange" with the proper type (63) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onreset" with the proper type (64) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onresize" with the proper type (65) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onscroll" with the proper type (66) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onseeked" with the proper type (67) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onseeking" with the proper type (68) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onselect" with the proper type (69) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onstalled" with the proper type (70) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onsubmit" with the proper type (71) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onsuspend" with the proper type (72) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "ontimeupdate" with the proper type (73) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "ontoggle" with the proper type (74) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onvolumechange" with the proper type (75) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onwaiting" with the proper type (76) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncopy" with the proper type (77) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncut" with the proper type (78) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "onpaste" with the proper type (79) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "contentEditable" with the proper type (80) -PASS HTMLElement interface: document.createElement("noscript") must inherit property "isContentEditable" with the proper type (81) +PASS HTMLElement interface: document.createElement("noscript") must inherit property "title" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "lang" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "translate" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "dir" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "dataset" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "hidden" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "click()" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "tabIndex" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "focus()" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "blur()" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "accessKey" with the proper type +FAIL HTMLElement interface: document.createElement("noscript") must inherit property "accessKeyLabel" with the proper type assert_inherits: property "accessKeyLabel" not found in prototype chain +PASS HTMLElement interface: document.createElement("noscript") must inherit property "draggable" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "spellcheck" with the proper type +FAIL HTMLElement interface: document.createElement("noscript") must inherit property "forceSpellCheck()" with the proper type assert_inherits: property "forceSpellCheck" not found in prototype chain +PASS HTMLElement interface: document.createElement("noscript") must inherit property "innerText" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onabort" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onauxclick" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onblur" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncancel" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncanplay" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncanplaythrough" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onchange" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onclick" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onclose" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncontextmenu" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncuechange" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondblclick" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondrag" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondragend" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondragenter" with the proper type +FAIL HTMLElement interface: document.createElement("noscript") must inherit property "ondragexit" with the proper type assert_inherits: property "ondragexit" not found in prototype chain +PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondragleave" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondragover" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondragstart" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondrop" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondurationchange" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onemptied" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onended" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onerror" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onfocus" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "oninput" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "oninvalid" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onkeydown" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onkeypress" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onkeyup" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onload" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onloadeddata" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onloadedmetadata" with the proper type +FAIL HTMLElement interface: document.createElement("noscript") must inherit property "onloadend" with the proper type assert_inherits: property "onloadend" not found in prototype chain +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onloadstart" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmousedown" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmouseenter" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmouseleave" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmousemove" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmouseout" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmouseover" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmouseup" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onwheel" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onpause" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onplay" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onplaying" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onprogress" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onratechange" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onreset" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onresize" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onscroll" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onseeked" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onseeking" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onselect" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onstalled" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onsubmit" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onsuspend" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "ontimeupdate" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "ontoggle" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onvolumechange" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onwaiting" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncopy" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncut" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onpaste" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "contentEditable" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "isContentEditable" with the proper type PASS HTMLUnknownElement interface: existence and properties of interface object PASS HTMLUnknownElement interface object length PASS HTMLUnknownElement interface object name @@ -715,7 +715,7 @@ PASS HTMLHtmlElement interface: attribute version PASS HTMLHtmlElement must be primary interface of document.createElement("html") PASS Stringification of document.createElement("html") -PASS HTMLHtmlElement interface: document.createElement("html") must inherit property "version" with the proper type (0) +PASS HTMLHtmlElement interface: document.createElement("html") must inherit property "version" with the proper type PASS HTMLHeadElement interface: existence and properties of interface object PASS HTMLHeadElement interface object length PASS HTMLHeadElement interface object name @@ -731,7 +731,7 @@ PASS HTMLTitleElement interface: attribute text PASS HTMLTitleElement must be primary interface of document.createElement("title") PASS Stringification of document.createElement("title") -PASS HTMLTitleElement interface: document.createElement("title") must inherit property "text" with the proper type (0) +PASS HTMLTitleElement interface: document.createElement("title") must inherit property "text" with the proper type PASS HTMLBaseElement interface: existence and properties of interface object PASS HTMLBaseElement interface object length PASS HTMLBaseElement interface object name @@ -741,8 +741,8 @@ PASS HTMLBaseElement interface: attribute target PASS HTMLBaseElement must be primary interface of document.createElement("base") PASS Stringification of document.createElement("base") -PASS HTMLBaseElement interface: document.createElement("base") must inherit property "href" with the proper type (0) -PASS HTMLBaseElement interface: document.createElement("base") must inherit property "target" with the proper type (1) +PASS HTMLBaseElement interface: document.createElement("base") must inherit property "href" with the proper type +PASS HTMLBaseElement interface: document.createElement("base") must inherit property "target" with the proper type PASS HTMLLinkElement interface: existence and properties of interface object PASS HTMLLinkElement interface object length PASS HTMLLinkElement interface object name @@ -765,21 +765,21 @@ PASS HTMLLinkElement interface: attribute target PASS HTMLLinkElement must be primary interface of document.createElement("link") PASS Stringification of document.createElement("link") -PASS HTMLLinkElement interface: document.createElement("link") must inherit property "href" with the proper type (0) -PASS HTMLLinkElement interface: document.createElement("link") must inherit property "crossOrigin" with the proper type (1) -PASS HTMLLinkElement interface: document.createElement("link") must inherit property "rel" with the proper type (2) -PASS HTMLLinkElement interface: document.createElement("link") must inherit property "as" with the proper type (3) -PASS HTMLLinkElement interface: document.createElement("link") must inherit property "relList" with the proper type (4) -PASS HTMLLinkElement interface: document.createElement("link") must inherit property "media" with the proper type (5) -PASS HTMLLinkElement interface: document.createElement("link") must inherit property "nonce" with the proper type (6) -PASS HTMLLinkElement interface: document.createElement("link") must inherit property "integrity" with the proper type (7) -PASS HTMLLinkElement interface: document.createElement("link") must inherit property "hreflang" with the proper type (8) -PASS HTMLLinkElement interface: document.createElement("link") must inherit property "type" with the proper type (9) -PASS HTMLLinkElement interface: document.createElement("link") must inherit property "sizes" with the proper type (10) -PASS HTMLLinkElement interface: document.createElement("link") must inherit property "referrerPolicy" with the proper type (11) -PASS HTMLLinkElement interface: document.createElement("link") must inherit property "charset" with the proper type (12) -PASS HTMLLinkElement interface: document.createElement("link") must inherit property "rev" with the proper type (13) -PASS HTMLLinkElement interface: document.createElement("link") must inherit property "target" with the proper type (14) +PASS HTMLLinkElement interface: document.createElement("link") must inherit property "href" with the proper type +PASS HTMLLinkElement interface: document.createElement("link") must inherit property "crossOrigin" with the proper type +PASS HTMLLinkElement interface: document.createElement("link") must inherit property "rel" with the proper type +PASS HTMLLinkElement interface: document.createElement("link") must inherit property "as" with the proper type +PASS HTMLLinkElement interface: document.createElement("link") must inherit property "relList" with the proper type +PASS HTMLLinkElement interface: document.createElement("link") must inherit property "media" with the proper type +PASS HTMLLinkElement interface: document.createElement("link") must inherit property "nonce" with the proper type +PASS HTMLLinkElement interface: document.createElement("link") must inherit property "integrity" with the proper type +PASS HTMLLinkElement interface: document.createElement("link") must inherit property "hreflang" with the proper type +PASS HTMLLinkElement interface: document.createElement("link") must inherit property "type" with the proper type +PASS HTMLLinkElement interface: document.createElement("link") must inherit property "sizes" with the proper type +PASS HTMLLinkElement interface: document.createElement("link") must inherit property "referrerPolicy" with the proper type +PASS HTMLLinkElement interface: document.createElement("link") must inherit property "charset" with the proper type +PASS HTMLLinkElement interface: document.createElement("link") must inherit property "rev" with the proper type +PASS HTMLLinkElement interface: document.createElement("link") must inherit property "target" with the proper type PASS HTMLMetaElement interface: existence and properties of interface object PASS HTMLMetaElement interface object length PASS HTMLMetaElement interface object name @@ -791,10 +791,10 @@ PASS HTMLMetaElement interface: attribute scheme PASS HTMLMetaElement must be primary interface of document.createElement("meta") PASS Stringification of document.createElement("meta") -PASS HTMLMetaElement interface: document.createElement("meta") must inherit property "name" with the proper type (0) -PASS HTMLMetaElement interface: document.createElement("meta") must inherit property "httpEquiv" with the proper type (1) -PASS HTMLMetaElement interface: document.createElement("meta") must inherit property "content" with the proper type (2) -PASS HTMLMetaElement interface: document.createElement("meta") must inherit property "scheme" with the proper type (3) +PASS HTMLMetaElement interface: document.createElement("meta") must inherit property "name" with the proper type +PASS HTMLMetaElement interface: document.createElement("meta") must inherit property "httpEquiv" with the proper type +PASS HTMLMetaElement interface: document.createElement("meta") must inherit property "content" with the proper type +PASS HTMLMetaElement interface: document.createElement("meta") must inherit property "scheme" with the proper type PASS HTMLStyleElement interface: existence and properties of interface object PASS HTMLStyleElement interface object length PASS HTMLStyleElement interface object name @@ -805,9 +805,9 @@ PASS HTMLStyleElement interface: attribute type PASS HTMLStyleElement must be primary interface of document.createElement("style") PASS Stringification of document.createElement("style") -PASS HTMLStyleElement interface: document.createElement("style") must inherit property "media" with the proper type (0) -PASS HTMLStyleElement interface: document.createElement("style") must inherit property "nonce" with the proper type (1) -PASS HTMLStyleElement interface: document.createElement("style") must inherit property "type" with the proper type (2) +PASS HTMLStyleElement interface: document.createElement("style") must inherit property "media" with the proper type +PASS HTMLStyleElement interface: document.createElement("style") must inherit property "nonce" with the proper type +PASS HTMLStyleElement interface: document.createElement("style") must inherit property "type" with the proper type PASS HTMLBodyElement interface: existence and properties of interface object PASS HTMLBodyElement interface object length PASS HTMLBodyElement interface object name @@ -837,28 +837,28 @@ PASS HTMLBodyElement interface: attribute onunload PASS HTMLBodyElement must be primary interface of document.createElement("body") PASS Stringification of document.createElement("body") -PASS HTMLBodyElement interface: document.createElement("body") must inherit property "text" with the proper type (0) -PASS HTMLBodyElement interface: document.createElement("body") must inherit property "link" with the proper type (1) -PASS HTMLBodyElement interface: document.createElement("body") must inherit property "vLink" with the proper type (2) -PASS HTMLBodyElement interface: document.createElement("body") must inherit property "aLink" with the proper type (3) -PASS HTMLBodyElement interface: document.createElement("body") must inherit property "bgColor" with the proper type (4) -PASS HTMLBodyElement interface: document.createElement("body") must inherit property "background" with the proper type (5) -FAIL HTMLBodyElement interface: document.createElement("body") must inherit property "onafterprint" with the proper type (6) assert_inherits: property "onafterprint" not found in prototype chain -FAIL HTMLBodyElement interface: document.createElement("body") must inherit property "onbeforeprint" with the proper type (7) assert_inherits: property "onbeforeprint" not found in prototype chain -PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onbeforeunload" with the proper type (8) -PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onhashchange" with the proper type (9) -PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onlanguagechange" with the proper type (10) -PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onmessage" with the proper type (11) -PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onmessageerror" with the proper type (12) -PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onoffline" with the proper type (13) -PASS HTMLBodyElement interface: document.createElement("body") must inherit property "ononline" with the proper type (14) -PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onpagehide" with the proper type (15) -PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onpageshow" with the proper type (16) -PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onpopstate" with the proper type (17) -PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onrejectionhandled" with the proper type (18) -PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onstorage" with the proper type (19) -PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onunhandledrejection" with the proper type (20) -PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onunload" with the proper type (21) +PASS HTMLBodyElement interface: document.createElement("body") must inherit property "text" with the proper type +PASS HTMLBodyElement interface: document.createElement("body") must inherit property "link" with the proper type +PASS HTMLBodyElement interface: document.createElement("body") must inherit property "vLink" with the proper type +PASS HTMLBodyElement interface: document.createElement("body") must inherit property "aLink" with the proper type +PASS HTMLBodyElement interface: document.createElement("body") must inherit property "bgColor" with the proper type +PASS HTMLBodyElement interface: document.createElement("body") must inherit property "background" with the proper type +FAIL HTMLBodyElement interface: document.createElement("body") must inherit property "onafterprint" with the proper type assert_inherits: property "onafterprint" not found in prototype chain +FAIL HTMLBodyElement interface: document.createElement("body") must inherit property "onbeforeprint" with the proper type assert_inherits: property "onbeforeprint" not found in prototype chain +PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onbeforeunload" with the proper type +PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onhashchange" with the proper type +PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onlanguagechange" with the proper type +PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onmessage" with the proper type +PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onmessageerror" with the proper type +PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onoffline" with the proper type +PASS HTMLBodyElement interface: document.createElement("body") must inherit property "ononline" with the proper type +PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onpagehide" with the proper type +PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onpageshow" with the proper type +PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onpopstate" with the proper type +PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onrejectionhandled" with the proper type +PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onstorage" with the proper type +PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onunhandledrejection" with the proper type +PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onunload" with the proper type PASS HTMLHeadingElement interface: existence and properties of interface object PASS HTMLHeadingElement interface object length PASS HTMLHeadingElement interface object name @@ -867,7 +867,7 @@ PASS HTMLHeadingElement interface: attribute align PASS HTMLHeadingElement must be primary interface of document.createElement("h1") PASS Stringification of document.createElement("h1") -PASS HTMLHeadingElement interface: document.createElement("h1") must inherit property "align" with the proper type (0) +PASS HTMLHeadingElement interface: document.createElement("h1") must inherit property "align" with the proper type PASS HTMLParagraphElement interface: existence and properties of interface object PASS HTMLParagraphElement interface object length PASS HTMLParagraphElement interface object name @@ -876,7 +876,7 @@ PASS HTMLParagraphElement interface: attribute align PASS HTMLParagraphElement must be primary interface of document.createElement("p") PASS Stringification of document.createElement("p") -PASS HTMLParagraphElement interface: document.createElement("p") must inherit property "align" with the proper type (0) +PASS HTMLParagraphElement interface: document.createElement("p") must inherit property "align" with the proper type PASS HTMLHRElement interface: existence and properties of interface object PASS HTMLHRElement interface object length PASS HTMLHRElement interface object name @@ -889,11 +889,11 @@ PASS HTMLHRElement interface: attribute width PASS HTMLHRElement must be primary interface of document.createElement("hr") PASS Stringification of document.createElement("hr") -PASS HTMLHRElement interface: document.createElement("hr") must inherit property "align" with the proper type (0) -PASS HTMLHRElement interface: document.createElement("hr") must inherit property "color" with the proper type (1) -PASS HTMLHRElement interface: document.createElement("hr") must inherit property "noShade" with the proper type (2) -PASS HTMLHRElement interface: document.createElement("hr") must inherit property "size" with the proper type (3) -PASS HTMLHRElement interface: document.createElement("hr") must inherit property "width" with the proper type (4) +PASS HTMLHRElement interface: document.createElement("hr") must inherit property "align" with the proper type +PASS HTMLHRElement interface: document.createElement("hr") must inherit property "color" with the proper type +PASS HTMLHRElement interface: document.createElement("hr") must inherit property "noShade" with the proper type +PASS HTMLHRElement interface: document.createElement("hr") must inherit property "size" with the proper type +PASS HTMLHRElement interface: document.createElement("hr") must inherit property "width" with the proper type PASS HTMLPreElement interface: existence and properties of interface object PASS HTMLPreElement interface object length PASS HTMLPreElement interface object name @@ -902,13 +902,13 @@ PASS HTMLPreElement interface: attribute width PASS HTMLPreElement must be primary interface of document.createElement("pre") PASS Stringification of document.createElement("pre") -PASS HTMLPreElement interface: document.createElement("pre") must inherit property "width" with the proper type (0) +PASS HTMLPreElement interface: document.createElement("pre") must inherit property "width" with the proper type PASS HTMLPreElement must be primary interface of document.createElement("listing") PASS Stringification of document.createElement("listing") -PASS HTMLPreElement interface: document.createElement("listing") must inherit property "width" with the proper type (0) +PASS HTMLPreElement interface: document.createElement("listing") must inherit property "width" with the proper type PASS HTMLPreElement must be primary interface of document.createElement("xmp") PASS Stringification of document.createElement("xmp") -PASS HTMLPreElement interface: document.createElement("xmp") must inherit property "width" with the proper type (0) +PASS HTMLPreElement interface: document.createElement("xmp") must inherit property "width" with the proper type PASS HTMLQuoteElement interface: existence and properties of interface object PASS HTMLQuoteElement interface object length PASS HTMLQuoteElement interface object name @@ -917,10 +917,10 @@ PASS HTMLQuoteElement interface: attribute cite PASS HTMLQuoteElement must be primary interface of document.createElement("blockquote") PASS Stringification of document.createElement("blockquote") -PASS HTMLQuoteElement interface: document.createElement("blockquote") must inherit property "cite" with the proper type (0) +PASS HTMLQuoteElement interface: document.createElement("blockquote") must inherit property "cite" with the proper type PASS HTMLQuoteElement must be primary interface of document.createElement("q") PASS Stringification of document.createElement("q") -PASS HTMLQuoteElement interface: document.createElement("q") must inherit property "cite" with the proper type (0) +PASS HTMLQuoteElement interface: document.createElement("q") must inherit property "cite" with the proper type PASS HTMLOListElement interface: existence and properties of interface object PASS HTMLOListElement interface object length PASS HTMLOListElement interface object name @@ -946,8 +946,8 @@ PASS HTMLLIElement interface: attribute type PASS HTMLLIElement must be primary interface of document.createElement("li") PASS Stringification of document.createElement("li") -PASS HTMLLIElement interface: document.createElement("li") must inherit property "value" with the proper type (0) -PASS HTMLLIElement interface: document.createElement("li") must inherit property "type" with the proper type (1) +PASS HTMLLIElement interface: document.createElement("li") must inherit property "value" with the proper type +PASS HTMLLIElement interface: document.createElement("li") must inherit property "type" with the proper type PASS HTMLDListElement interface: existence and properties of interface object PASS HTMLDListElement interface object length PASS HTMLDListElement interface object name @@ -962,7 +962,7 @@ PASS HTMLDivElement interface: attribute align PASS HTMLDivElement must be primary interface of document.createElement("div") PASS Stringification of document.createElement("div") -PASS HTMLDivElement interface: document.createElement("div") must inherit property "align" with the proper type (0) +PASS HTMLDivElement interface: document.createElement("div") must inherit property "align" with the proper type PASS HTMLAnchorElement interface: existence and properties of interface object PASS HTMLAnchorElement interface object length PASS HTMLAnchorElement interface object name @@ -996,31 +996,31 @@ PASS HTMLAnchorElement interface: attribute hash PASS HTMLAnchorElement must be primary interface of document.createElement("a") PASS Stringification of document.createElement("a") -PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "target" with the proper type (0) -PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "download" with the proper type (1) -PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "ping" with the proper type (2) -PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "rel" with the proper type (3) -FAIL HTMLAnchorElement interface: document.createElement("a") must inherit property "relList" with the proper type (4) assert_inherits: property "relList" not found in prototype chain -PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "hreflang" with the proper type (5) -PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "type" with the proper type (6) -PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "text" with the proper type (7) -PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "referrerPolicy" with the proper type (8) -PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "coords" with the proper type (9) -PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "charset" with the proper type (10) -PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "name" with the proper type (11) -PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "rev" with the proper type (12) -PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "shape" with the proper type (13) -PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "href" with the proper type (14) -PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "origin" with the proper type (15) -PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "protocol" with the proper type (16) -PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "username" with the proper type (17) -PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "password" with the proper type (18) -PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "host" with the proper type (19) -PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "hostname" with the proper type (20) -PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "port" with the proper type (21) -PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "pathname" with the proper type (22) -PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "search" with the proper type (23) -PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "hash" with the proper type (24) +PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "target" with the proper type +PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "download" with the proper type +PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "ping" with the proper type +PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "rel" with the proper type +FAIL HTMLAnchorElement interface: document.createElement("a") must inherit property "relList" with the proper type assert_inherits: property "relList" not found in prototype chain +PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "hreflang" with the proper type +PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "type" with the proper type +PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "text" with the proper type +PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "referrerPolicy" with the proper type +PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "coords" with the proper type +PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "charset" with the proper type +PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "name" with the proper type +PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "rev" with the proper type +PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "shape" with the proper type +PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "href" with the proper type +PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "origin" with the proper type +PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "protocol" with the proper type +PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "username" with the proper type +PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "password" with the proper type +PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "host" with the proper type +PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "hostname" with the proper type +PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "port" with the proper type +PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "pathname" with the proper type +PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "search" with the proper type +PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "hash" with the proper type PASS HTMLDataElement interface: existence and properties of interface object PASS HTMLDataElement interface object length PASS HTMLDataElement interface object name @@ -1029,7 +1029,7 @@ PASS HTMLDataElement interface: attribute value PASS HTMLDataElement must be primary interface of document.createElement("data") PASS Stringification of document.createElement("data") -PASS HTMLDataElement interface: document.createElement("data") must inherit property "value" with the proper type (0) +PASS HTMLDataElement interface: document.createElement("data") must inherit property "value" with the proper type PASS HTMLTimeElement interface: existence and properties of interface object PASS HTMLTimeElement interface object length PASS HTMLTimeElement interface object name @@ -1038,7 +1038,7 @@ PASS HTMLTimeElement interface: attribute dateTime PASS HTMLTimeElement must be primary interface of document.createElement("time") PASS Stringification of document.createElement("time") -PASS HTMLTimeElement interface: document.createElement("time") must inherit property "dateTime" with the proper type (0) +PASS HTMLTimeElement interface: document.createElement("time") must inherit property "dateTime" with the proper type PASS HTMLSpanElement interface: existence and properties of interface object PASS HTMLSpanElement interface object length PASS HTMLSpanElement interface object name @@ -1054,7 +1054,7 @@ PASS HTMLBRElement interface: attribute clear PASS HTMLBRElement must be primary interface of document.createElement("br") PASS Stringification of document.createElement("br") -PASS HTMLBRElement interface: document.createElement("br") must inherit property "clear" with the proper type (0) +PASS HTMLBRElement interface: document.createElement("br") must inherit property "clear" with the proper type PASS HTMLModElement interface: existence and properties of interface object PASS HTMLModElement interface object length PASS HTMLModElement interface object name @@ -1064,12 +1064,12 @@ PASS HTMLModElement interface: attribute dateTime PASS HTMLModElement must be primary interface of document.createElement("ins") PASS Stringification of document.createElement("ins") -PASS HTMLModElement interface: document.createElement("ins") must inherit property "cite" with the proper type (0) -PASS HTMLModElement interface: document.createElement("ins") must inherit property "dateTime" with the proper type (1) +PASS HTMLModElement interface: document.createElement("ins") must inherit property "cite" with the proper type +PASS HTMLModElement interface: document.createElement("ins") must inherit property "dateTime" with the proper type PASS HTMLModElement must be primary interface of document.createElement("del") PASS Stringification of document.createElement("del") -PASS HTMLModElement interface: document.createElement("del") must inherit property "cite" with the proper type (0) -PASS HTMLModElement interface: document.createElement("del") must inherit property "dateTime" with the proper type (1) +PASS HTMLModElement interface: document.createElement("del") must inherit property "cite" with the proper type +PASS HTMLModElement interface: document.createElement("del") must inherit property "dateTime" with the proper type PASS HTMLPictureElement interface: existence and properties of interface object PASS HTMLPictureElement interface object length PASS HTMLPictureElement interface object name @@ -1105,50 +1105,50 @@ PASS HTMLImageElement interface: attribute border PASS HTMLImageElement must be primary interface of document.createElement("img") PASS Stringification of document.createElement("img") -PASS HTMLImageElement interface: document.createElement("img") must inherit property "alt" with the proper type (0) -PASS HTMLImageElement interface: document.createElement("img") must inherit property "src" with the proper type (1) -PASS HTMLImageElement interface: document.createElement("img") must inherit property "srcset" with the proper type (2) -PASS HTMLImageElement interface: document.createElement("img") must inherit property "sizes" with the proper type (3) -PASS HTMLImageElement interface: document.createElement("img") must inherit property "crossOrigin" with the proper type (4) -PASS HTMLImageElement interface: document.createElement("img") must inherit property "useMap" with the proper type (5) -PASS HTMLImageElement interface: document.createElement("img") must inherit property "isMap" with the proper type (6) -PASS HTMLImageElement interface: document.createElement("img") must inherit property "width" with the proper type (7) -PASS HTMLImageElement interface: document.createElement("img") must inherit property "height" with the proper type (8) -PASS HTMLImageElement interface: document.createElement("img") must inherit property "naturalWidth" with the proper type (9) -PASS HTMLImageElement interface: document.createElement("img") must inherit property "naturalHeight" with the proper type (10) -PASS HTMLImageElement interface: document.createElement("img") must inherit property "complete" with the proper type (11) -PASS HTMLImageElement interface: document.createElement("img") must inherit property "currentSrc" with the proper type (12) -PASS HTMLImageElement interface: document.createElement("img") must inherit property "referrerPolicy" with the proper type (13) -PASS HTMLImageElement interface: document.createElement("img") must inherit property "name" with the proper type (14) -PASS HTMLImageElement interface: document.createElement("img") must inherit property "lowsrc" with the proper type (15) -PASS HTMLImageElement interface: document.createElement("img") must inherit property "align" with the proper type (16) -PASS HTMLImageElement interface: document.createElement("img") must inherit property "hspace" with the proper type (17) -PASS HTMLImageElement interface: document.createElement("img") must inherit property "vspace" with the proper type (18) -PASS HTMLImageElement interface: document.createElement("img") must inherit property "longDesc" with the proper type (19) -PASS HTMLImageElement interface: document.createElement("img") must inherit property "border" with the proper type (20) +PASS HTMLImageElement interface: document.createElement("img") must inherit property "alt" with the proper type +PASS HTMLImageElement interface: document.createElement("img") must inherit property "src" with the proper type +PASS HTMLImageElement interface: document.createElement("img") must inherit property "srcset" with the proper type +PASS HTMLImageElement interface: document.createElement("img") must inherit property "sizes" with the proper type +PASS HTMLImageElement interface: document.createElement("img") must inherit property "crossOrigin" with the proper type +PASS HTMLImageElement interface: document.createElement("img") must inherit property "useMap" with the proper type +PASS HTMLImageElement interface: document.createElement("img") must inherit property "isMap" with the proper type +PASS HTMLImageElement interface: document.createElement("img") must inherit property "width" with the proper type +PASS HTMLImageElement interface: document.createElement("img") must inherit property "height" with the proper type +PASS HTMLImageElement interface: document.createElement("img") must inherit property "naturalWidth" with the proper type +PASS HTMLImageElement interface: document.createElement("img") must inherit property "naturalHeight" with the proper type +PASS HTMLImageElement interface: document.createElement("img") must inherit property "complete" with the proper type +PASS HTMLImageElement interface: document.createElement("img") must inherit property "currentSrc" with the proper type +PASS HTMLImageElement interface: document.createElement("img") must inherit property "referrerPolicy" with the proper type +PASS HTMLImageElement interface: document.createElement("img") must inherit property "name" with the proper type +PASS HTMLImageElement interface: document.createElement("img") must inherit property "lowsrc" with the proper type +PASS HTMLImageElement interface: document.createElement("img") must inherit property "align" with the proper type +PASS HTMLImageElement interface: document.createElement("img") must inherit property "hspace" with the proper type +PASS HTMLImageElement interface: document.createElement("img") must inherit property "vspace" with the proper type +PASS HTMLImageElement interface: document.createElement("img") must inherit property "longDesc" with the proper type +PASS HTMLImageElement interface: document.createElement("img") must inherit property "border" with the proper type PASS HTMLImageElement must be primary interface of new Image() PASS Stringification of new Image() -PASS HTMLImageElement interface: new Image() must inherit property "alt" with the proper type (0) -PASS HTMLImageElement interface: new Image() must inherit property "src" with the proper type (1) -PASS HTMLImageElement interface: new Image() must inherit property "srcset" with the proper type (2) -PASS HTMLImageElement interface: new Image() must inherit property "sizes" with the proper type (3) -PASS HTMLImageElement interface: new Image() must inherit property "crossOrigin" with the proper type (4) -PASS HTMLImageElement interface: new Image() must inherit property "useMap" with the proper type (5) -PASS HTMLImageElement interface: new Image() must inherit property "isMap" with the proper type (6) -PASS HTMLImageElement interface: new Image() must inherit property "width" with the proper type (7) -PASS HTMLImageElement interface: new Image() must inherit property "height" with the proper type (8) -PASS HTMLImageElement interface: new Image() must inherit property "naturalWidth" with the proper type (9) -PASS HTMLImageElement interface: new Image() must inherit property "naturalHeight" with the proper type (10) -PASS HTMLImageElement interface: new Image() must inherit property "complete" with the proper type (11) -PASS HTMLImageElement interface: new Image() must inherit property "currentSrc" with the proper type (12) -PASS HTMLImageElement interface: new Image() must inherit property "referrerPolicy" with the proper type (13) -PASS HTMLImageElement interface: new Image() must inherit property "name" with the proper type (14) -PASS HTMLImageElement interface: new Image() must inherit property "lowsrc" with the proper type (15) -PASS HTMLImageElement interface: new Image() must inherit property "align" with the proper type (16) -PASS HTMLImageElement interface: new Image() must inherit property "hspace" with the proper type (17) -PASS HTMLImageElement interface: new Image() must inherit property "vspace" with the proper type (18) -PASS HTMLImageElement interface: new Image() must inherit property "longDesc" with the proper type (19) -PASS HTMLImageElement interface: new Image() must inherit property "border" with the proper type (20) +PASS HTMLImageElement interface: new Image() must inherit property "alt" with the proper type +PASS HTMLImageElement interface: new Image() must inherit property "src" with the proper type +PASS HTMLImageElement interface: new Image() must inherit property "srcset" with the proper type +PASS HTMLImageElement interface: new Image() must inherit property "sizes" with the proper type +PASS HTMLImageElement interface: new Image() must inherit property "crossOrigin" with the proper type +PASS HTMLImageElement interface: new Image() must inherit property "useMap" with the proper type +PASS HTMLImageElement interface: new Image() must inherit property "isMap" with the proper type +PASS HTMLImageElement interface: new Image() must inherit property "width" with the proper type +PASS HTMLImageElement interface: new Image() must inherit property "height" with the proper type +PASS HTMLImageElement interface: new Image() must inherit property "naturalWidth" with the proper type +PASS HTMLImageElement interface: new Image() must inherit property "naturalHeight" with the proper type +PASS HTMLImageElement interface: new Image() must inherit property "complete" with the proper type +PASS HTMLImageElement interface: new Image() must inherit property "currentSrc" with the proper type +PASS HTMLImageElement interface: new Image() must inherit property "referrerPolicy" with the proper type +PASS HTMLImageElement interface: new Image() must inherit property "name" with the proper type +PASS HTMLImageElement interface: new Image() must inherit property "lowsrc" with the proper type +PASS HTMLImageElement interface: new Image() must inherit property "align" with the proper type +PASS HTMLImageElement interface: new Image() must inherit property "hspace" with the proper type +PASS HTMLImageElement interface: new Image() must inherit property "vspace" with the proper type +PASS HTMLImageElement interface: new Image() must inherit property "longDesc" with the proper type +PASS HTMLImageElement interface: new Image() must inherit property "border" with the proper type PASS HTMLIFrameElement interface: existence and properties of interface object PASS HTMLIFrameElement interface object length PASS HTMLIFrameElement interface object name @@ -1187,13 +1187,13 @@ PASS HTMLEmbedElement interface: attribute name PASS HTMLEmbedElement must be primary interface of document.createElement("embed") PASS Stringification of document.createElement("embed") -PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "src" with the proper type (0) -PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "type" with the proper type (1) -PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "width" with the proper type (2) -PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "height" with the proper type (3) -PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "getSVGDocument" with the proper type (4) -PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "align" with the proper type (5) -PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "name" with the proper type (6) +PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "src" with the proper type +PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "type" with the proper type +PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "width" with the proper type +PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "height" with the proper type +PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "getSVGDocument()" with the proper type +PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "align" with the proper type +PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "name" with the proper type PASS HTMLObjectElement interface: existence and properties of interface object PASS HTMLObjectElement interface object length PASS HTMLObjectElement interface object name @@ -1227,33 +1227,33 @@ PASS HTMLObjectElement interface: attribute border PASS HTMLObjectElement must be primary interface of document.createElement("object") PASS Stringification of document.createElement("object") -PASS HTMLObjectElement interface: document.createElement("object") must inherit property "data" with the proper type (0) -PASS HTMLObjectElement interface: document.createElement("object") must inherit property "type" with the proper type (1) -FAIL HTMLObjectElement interface: document.createElement("object") must inherit property "typeMustMatch" with the proper type (2) assert_inherits: property "typeMustMatch" not found in prototype chain -PASS HTMLObjectElement interface: document.createElement("object") must inherit property "name" with the proper type (3) -PASS HTMLObjectElement interface: document.createElement("object") must inherit property "useMap" with the proper type (4) -PASS HTMLObjectElement interface: document.createElement("object") must inherit property "form" with the proper type (5) -PASS HTMLObjectElement interface: document.createElement("object") must inherit property "width" with the proper type (6) -PASS HTMLObjectElement interface: document.createElement("object") must inherit property "height" with the proper type (7) -PASS HTMLObjectElement interface: document.createElement("object") must inherit property "contentDocument" with the proper type (8) -PASS HTMLObjectElement interface: document.createElement("object") must inherit property "contentWindow" with the proper type (9) -PASS HTMLObjectElement interface: document.createElement("object") must inherit property "willValidate" with the proper type (10) -PASS HTMLObjectElement interface: document.createElement("object") must inherit property "validity" with the proper type (11) -PASS HTMLObjectElement interface: document.createElement("object") must inherit property "validationMessage" with the proper type (12) -PASS HTMLObjectElement interface: document.createElement("object") must inherit property "checkValidity" with the proper type (13) -PASS HTMLObjectElement interface: document.createElement("object") must inherit property "reportValidity" with the proper type (14) -PASS HTMLObjectElement interface: document.createElement("object") must inherit property "setCustomValidity" with the proper type (15) +PASS HTMLObjectElement interface: document.createElement("object") must inherit property "data" with the proper type +PASS HTMLObjectElement interface: document.createElement("object") must inherit property "type" with the proper type +FAIL HTMLObjectElement interface: document.createElement("object") must inherit property "typeMustMatch" with the proper type assert_inherits: property "typeMustMatch" not found in prototype chain +PASS HTMLObjectElement interface: document.createElement("object") must inherit property "name" with the proper type +PASS HTMLObjectElement interface: document.createElement("object") must inherit property "useMap" with the proper type +PASS HTMLObjectElement interface: document.createElement("object") must inherit property "form" with the proper type +PASS HTMLObjectElement interface: document.createElement("object") must inherit property "width" with the proper type +PASS HTMLObjectElement interface: document.createElement("object") must inherit property "height" with the proper type +PASS HTMLObjectElement interface: document.createElement("object") must inherit property "contentDocument" with the proper type +PASS HTMLObjectElement interface: document.createElement("object") must inherit property "contentWindow" with the proper type +PASS HTMLObjectElement interface: document.createElement("object") must inherit property "willValidate" with the proper type +PASS HTMLObjectElement interface: document.createElement("object") must inherit property "validity" with the proper type +PASS HTMLObjectElement interface: document.createElement("object") must inherit property "validationMessage" with the proper type +PASS HTMLObjectElement interface: document.createElement("object") must inherit property "checkValidity()" with the proper type +PASS HTMLObjectElement interface: document.createElement("object") must inherit property "reportValidity()" with the proper type +PASS HTMLObjectElement interface: document.createElement("object") must inherit property "setCustomValidity(DOMString)" with the proper type PASS HTMLObjectElement interface: calling setCustomValidity(DOMString) on document.createElement("object") with too few arguments must throw TypeError -PASS HTMLObjectElement interface: document.createElement("object") must inherit property "align" with the proper type (16) -PASS HTMLObjectElement interface: document.createElement("object") must inherit property "archive" with the proper type (17) -PASS HTMLObjectElement interface: document.createElement("object") must inherit property "code" with the proper type (18) -PASS HTMLObjectElement interface: document.createElement("object") must inherit property "declare" with the proper type (19) -PASS HTMLObjectElement interface: document.createElement("object") must inherit property "hspace" with the proper type (20) -PASS HTMLObjectElement interface: document.createElement("object") must inherit property "standby" with the proper type (21) -PASS HTMLObjectElement interface: document.createElement("object") must inherit property "vspace" with the proper type (22) -PASS HTMLObjectElement interface: document.createElement("object") must inherit property "codeBase" with the proper type (23) -PASS HTMLObjectElement interface: document.createElement("object") must inherit property "codeType" with the proper type (24) -PASS HTMLObjectElement interface: document.createElement("object") must inherit property "border" with the proper type (25) +PASS HTMLObjectElement interface: document.createElement("object") must inherit property "align" with the proper type +PASS HTMLObjectElement interface: document.createElement("object") must inherit property "archive" with the proper type +PASS HTMLObjectElement interface: document.createElement("object") must inherit property "code" with the proper type +PASS HTMLObjectElement interface: document.createElement("object") must inherit property "declare" with the proper type +PASS HTMLObjectElement interface: document.createElement("object") must inherit property "hspace" with the proper type +PASS HTMLObjectElement interface: document.createElement("object") must inherit property "standby" with the proper type +PASS HTMLObjectElement interface: document.createElement("object") must inherit property "vspace" with the proper type +PASS HTMLObjectElement interface: document.createElement("object") must inherit property "codeBase" with the proper type +PASS HTMLObjectElement interface: document.createElement("object") must inherit property "codeType" with the proper type +PASS HTMLObjectElement interface: document.createElement("object") must inherit property "border" with the proper type PASS HTMLParamElement interface: existence and properties of interface object PASS HTMLParamElement interface object length PASS HTMLParamElement interface object name @@ -1265,10 +1265,10 @@ PASS HTMLParamElement interface: attribute valueType PASS HTMLParamElement must be primary interface of document.createElement("param") PASS Stringification of document.createElement("param") -PASS HTMLParamElement interface: document.createElement("param") must inherit property "name" with the proper type (0) -PASS HTMLParamElement interface: document.createElement("param") must inherit property "value" with the proper type (1) -PASS HTMLParamElement interface: document.createElement("param") must inherit property "type" with the proper type (2) -PASS HTMLParamElement interface: document.createElement("param") must inherit property "valueType" with the proper type (3) +PASS HTMLParamElement interface: document.createElement("param") must inherit property "name" with the proper type +PASS HTMLParamElement interface: document.createElement("param") must inherit property "value" with the proper type +PASS HTMLParamElement interface: document.createElement("param") must inherit property "type" with the proper type +PASS HTMLParamElement interface: document.createElement("param") must inherit property "valueType" with the proper type PASS HTMLVideoElement interface: existence and properties of interface object PASS HTMLVideoElement interface object length PASS HTMLVideoElement interface object name @@ -1281,56 +1281,56 @@ PASS HTMLVideoElement interface: attribute poster PASS HTMLVideoElement must be primary interface of document.createElement("video") PASS Stringification of document.createElement("video") -PASS HTMLVideoElement interface: document.createElement("video") must inherit property "width" with the proper type (0) -PASS HTMLVideoElement interface: document.createElement("video") must inherit property "height" with the proper type (1) -PASS HTMLVideoElement interface: document.createElement("video") must inherit property "videoWidth" with the proper type (2) -PASS HTMLVideoElement interface: document.createElement("video") must inherit property "videoHeight" with the proper type (3) -PASS HTMLVideoElement interface: document.createElement("video") must inherit property "poster" with the proper type (4) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "error" with the proper type (0) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "src" with the proper type (1) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "currentSrc" with the proper type (2) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "crossOrigin" with the proper type (3) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_EMPTY" with the proper type (4) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_IDLE" with the proper type (5) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_LOADING" with the proper type (6) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_NO_SOURCE" with the proper type (7) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "networkState" with the proper type (8) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "preload" with the proper type (9) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "buffered" with the proper type (10) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "load" with the proper type (11) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "canPlayType" with the proper type (12) +PASS HTMLVideoElement interface: document.createElement("video") must inherit property "width" with the proper type +PASS HTMLVideoElement interface: document.createElement("video") must inherit property "height" with the proper type +PASS HTMLVideoElement interface: document.createElement("video") must inherit property "videoWidth" with the proper type +PASS HTMLVideoElement interface: document.createElement("video") must inherit property "videoHeight" with the proper type +PASS HTMLVideoElement interface: document.createElement("video") must inherit property "poster" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "error" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "src" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "currentSrc" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "crossOrigin" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_EMPTY" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_IDLE" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_LOADING" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_NO_SOURCE" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "networkState" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "preload" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "buffered" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "load()" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "canPlayType(DOMString)" with the proper type PASS HTMLMediaElement interface: calling canPlayType(DOMString) on document.createElement("video") with too few arguments must throw TypeError -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "HAVE_NOTHING" with the proper type (13) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "HAVE_METADATA" with the proper type (14) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "HAVE_CURRENT_DATA" with the proper type (15) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "HAVE_FUTURE_DATA" with the proper type (16) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "HAVE_ENOUGH_DATA" with the proper type (17) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "readyState" with the proper type (18) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "seeking" with the proper type (19) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "currentTime" with the proper type (20) -FAIL HTMLMediaElement interface: document.createElement("video") must inherit property "fastSeek" with the proper type (21) assert_inherits: property "fastSeek" not found in prototype chain +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "HAVE_NOTHING" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "HAVE_METADATA" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "HAVE_CURRENT_DATA" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "HAVE_FUTURE_DATA" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "HAVE_ENOUGH_DATA" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "readyState" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "seeking" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "currentTime" with the proper type +FAIL HTMLMediaElement interface: document.createElement("video") must inherit property "fastSeek(double)" with the proper type assert_inherits: property "fastSeek" not found in prototype chain FAIL HTMLMediaElement interface: calling fastSeek(double) on document.createElement("video") with too few arguments must throw TypeError assert_inherits: property "fastSeek" not found in prototype chain -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "duration" with the proper type (22) -FAIL HTMLMediaElement interface: document.createElement("video") must inherit property "getStartDate" with the proper type (23) assert_inherits: property "getStartDate" not found in prototype chain -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "paused" with the proper type (24) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "defaultPlaybackRate" with the proper type (25) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "playbackRate" with the proper type (26) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "played" with the proper type (27) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "seekable" with the proper type (28) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "ended" with the proper type (29) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "autoplay" with the proper type (30) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "loop" with the proper type (31) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "play" with the proper type (32) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "pause" with the proper type (33) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "controls" with the proper type (34) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "volume" with the proper type (35) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "muted" with the proper type (36) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "defaultMuted" with the proper type (37) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "audioTracks" with the proper type (38) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "videoTracks" with the proper type (39) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "textTracks" with the proper type (40) -PASS HTMLMediaElement interface: document.createElement("video") must inherit property "addTextTrack" with the proper type (41) -PASS HTMLMediaElement interface: calling addTextTrack(TextTrackKind,DOMString,DOMString) on document.createElement("video") with too few arguments must throw TypeError +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "duration" with the proper type +FAIL HTMLMediaElement interface: document.createElement("video") must inherit property "getStartDate()" with the proper type assert_inherits: property "getStartDate" not found in prototype chain +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "paused" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "defaultPlaybackRate" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "playbackRate" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "played" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "seekable" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "ended" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "autoplay" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "loop" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "play()" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "pause()" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "controls" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "volume" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "muted" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "defaultMuted" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "audioTracks" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "videoTracks" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "textTracks" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "addTextTrack(TextTrackKind, DOMString, DOMString)" with the proper type +PASS HTMLMediaElement interface: calling addTextTrack(TextTrackKind, DOMString, DOMString) on document.createElement("video") with too few arguments must throw TypeError PASS HTMLAudioElement interface: existence and properties of interface object PASS HTMLAudioElement interface object length PASS HTMLAudioElement interface object name @@ -1338,98 +1338,98 @@ PASS HTMLAudioElement interface: existence and properties of interface prototype object's "constructor" property PASS HTMLAudioElement must be primary interface of document.createElement("audio") PASS Stringification of document.createElement("audio") -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "error" with the proper type (0) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "src" with the proper type (1) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "currentSrc" with the proper type (2) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "crossOrigin" with the proper type (3) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_EMPTY" with the proper type (4) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_IDLE" with the proper type (5) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_LOADING" with the proper type (6) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_NO_SOURCE" with the proper type (7) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "networkState" with the proper type (8) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "preload" with the proper type (9) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "buffered" with the proper type (10) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "load" with the proper type (11) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "canPlayType" with the proper type (12) +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "error" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "src" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "currentSrc" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "crossOrigin" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_EMPTY" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_IDLE" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_LOADING" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_NO_SOURCE" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "networkState" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "preload" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "buffered" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "load()" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "canPlayType(DOMString)" with the proper type PASS HTMLMediaElement interface: calling canPlayType(DOMString) on document.createElement("audio") with too few arguments must throw TypeError -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "HAVE_NOTHING" with the proper type (13) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "HAVE_METADATA" with the proper type (14) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "HAVE_CURRENT_DATA" with the proper type (15) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "HAVE_FUTURE_DATA" with the proper type (16) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "HAVE_ENOUGH_DATA" with the proper type (17) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "readyState" with the proper type (18) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "seeking" with the proper type (19) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "currentTime" with the proper type (20) -FAIL HTMLMediaElement interface: document.createElement("audio") must inherit property "fastSeek" with the proper type (21) assert_inherits: property "fastSeek" not found in prototype chain +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "HAVE_NOTHING" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "HAVE_METADATA" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "HAVE_CURRENT_DATA" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "HAVE_FUTURE_DATA" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "HAVE_ENOUGH_DATA" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "readyState" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "seeking" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "currentTime" with the proper type +FAIL HTMLMediaElement interface: document.createElement("audio") must inherit property "fastSeek(double)" with the proper type assert_inherits: property "fastSeek" not found in prototype chain FAIL HTMLMediaElement interface: calling fastSeek(double) on document.createElement("audio") with too few arguments must throw TypeError assert_inherits: property "fastSeek" not found in prototype chain -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "duration" with the proper type (22) -FAIL HTMLMediaElement interface: document.createElement("audio") must inherit property "getStartDate" with the proper type (23) assert_inherits: property "getStartDate" not found in prototype chain -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "paused" with the proper type (24) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "defaultPlaybackRate" with the proper type (25) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "playbackRate" with the proper type (26) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "played" with the proper type (27) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "seekable" with the proper type (28) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "ended" with the proper type (29) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "autoplay" with the proper type (30) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "loop" with the proper type (31) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "play" with the proper type (32) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "pause" with the proper type (33) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "controls" with the proper type (34) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "volume" with the proper type (35) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "muted" with the proper type (36) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "defaultMuted" with the proper type (37) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "audioTracks" with the proper type (38) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "videoTracks" with the proper type (39) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "textTracks" with the proper type (40) -PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "addTextTrack" with the proper type (41) -PASS HTMLMediaElement interface: calling addTextTrack(TextTrackKind,DOMString,DOMString) on document.createElement("audio") with too few arguments must throw TypeError +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "duration" with the proper type +FAIL HTMLMediaElement interface: document.createElement("audio") must inherit property "getStartDate()" with the proper type assert_inherits: property "getStartDate" not found in prototype chain +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "paused" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "defaultPlaybackRate" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "playbackRate" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "played" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "seekable" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "ended" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "autoplay" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "loop" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "play()" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "pause()" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "controls" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "volume" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "muted" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "defaultMuted" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "audioTracks" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "videoTracks" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "textTracks" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "addTextTrack(TextTrackKind, DOMString, DOMString)" with the proper type +PASS HTMLMediaElement interface: calling addTextTrack(TextTrackKind, DOMString, DOMString) on document.createElement("audio") with too few arguments must throw TypeError PASS HTMLAudioElement must be primary interface of new Audio() PASS Stringification of new Audio() -PASS HTMLMediaElement interface: new Audio() must inherit property "error" with the proper type (0) -PASS HTMLMediaElement interface: new Audio() must inherit property "src" with the proper type (1) -PASS HTMLMediaElement interface: new Audio() must inherit property "currentSrc" with the proper type (2) -PASS HTMLMediaElement interface: new Audio() must inherit property "crossOrigin" with the proper type (3) -PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_EMPTY" with the proper type (4) -PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_IDLE" with the proper type (5) -PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_LOADING" with the proper type (6) -PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_NO_SOURCE" with the proper type (7) -PASS HTMLMediaElement interface: new Audio() must inherit property "networkState" with the proper type (8) -PASS HTMLMediaElement interface: new Audio() must inherit property "preload" with the proper type (9) -PASS HTMLMediaElement interface: new Audio() must inherit property "buffered" with the proper type (10) -PASS HTMLMediaElement interface: new Audio() must inherit property "load" with the proper type (11) -PASS HTMLMediaElement interface: new Audio() must inherit property "canPlayType" with the proper type (12) +PASS HTMLMediaElement interface: new Audio() must inherit property "error" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "src" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "currentSrc" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "crossOrigin" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_EMPTY" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_IDLE" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_LOADING" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_NO_SOURCE" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "networkState" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "preload" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "buffered" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "load()" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "canPlayType(DOMString)" with the proper type PASS HTMLMediaElement interface: calling canPlayType(DOMString) on new Audio() with too few arguments must throw TypeError -PASS HTMLMediaElement interface: new Audio() must inherit property "HAVE_NOTHING" with the proper type (13) -PASS HTMLMediaElement interface: new Audio() must inherit property "HAVE_METADATA" with the proper type (14) -PASS HTMLMediaElement interface: new Audio() must inherit property "HAVE_CURRENT_DATA" with the proper type (15) -PASS HTMLMediaElement interface: new Audio() must inherit property "HAVE_FUTURE_DATA" with the proper type (16) -PASS HTMLMediaElement interface: new Audio() must inherit property "HAVE_ENOUGH_DATA" with the proper type (17) -PASS HTMLMediaElement interface: new Audio() must inherit property "readyState" with the proper type (18) -PASS HTMLMediaElement interface: new Audio() must inherit property "seeking" with the proper type (19) -PASS HTMLMediaElement interface: new Audio() must inherit property "currentTime" with the proper type (20) -FAIL HTMLMediaElement interface: new Audio() must inherit property "fastSeek" with the proper type (21) assert_inherits: property "fastSeek" not found in prototype chain +PASS HTMLMediaElement interface: new Audio() must inherit property "HAVE_NOTHING" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "HAVE_METADATA" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "HAVE_CURRENT_DATA" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "HAVE_FUTURE_DATA" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "HAVE_ENOUGH_DATA" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "readyState" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "seeking" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "currentTime" with the proper type +FAIL HTMLMediaElement interface: new Audio() must inherit property "fastSeek(double)" with the proper type assert_inherits: property "fastSeek" not found in prototype chain FAIL HTMLMediaElement interface: calling fastSeek(double) on new Audio() with too few arguments must throw TypeError assert_inherits: property "fastSeek" not found in prototype chain -PASS HTMLMediaElement interface: new Audio() must inherit property "duration" with the proper type (22) -FAIL HTMLMediaElement interface: new Audio() must inherit property "getStartDate" with the proper type (23) assert_inherits: property "getStartDate" not found in prototype chain -PASS HTMLMediaElement interface: new Audio() must inherit property "paused" with the proper type (24) -PASS HTMLMediaElement interface: new Audio() must inherit property "defaultPlaybackRate" with the proper type (25) -PASS HTMLMediaElement interface: new Audio() must inherit property "playbackRate" with the proper type (26) -PASS HTMLMediaElement interface: new Audio() must inherit property "played" with the proper type (27) -PASS HTMLMediaElement interface: new Audio() must inherit property "seekable" with the proper type (28) -PASS HTMLMediaElement interface: new Audio() must inherit property "ended" with the proper type (29) -PASS HTMLMediaElement interface: new Audio() must inherit property "autoplay" with the proper type (30) -PASS HTMLMediaElement interface: new Audio() must inherit property "loop" with the proper type (31) -PASS HTMLMediaElement interface: new Audio() must inherit property "play" with the proper type (32) -PASS HTMLMediaElement interface: new Audio() must inherit property "pause" with the proper type (33) -PASS HTMLMediaElement interface: new Audio() must inherit property "controls" with the proper type (34) -PASS HTMLMediaElement interface: new Audio() must inherit property "volume" with the proper type (35) -PASS HTMLMediaElement interface: new Audio() must inherit property "muted" with the proper type (36) -PASS HTMLMediaElement interface: new Audio() must inherit property "defaultMuted" with the proper type (37) -PASS HTMLMediaElement interface: new Audio() must inherit property "audioTracks" with the proper type (38) -PASS HTMLMediaElement interface: new Audio() must inherit property "videoTracks" with the proper type (39) -PASS HTMLMediaElement interface: new Audio() must inherit property "textTracks" with the proper type (40) -PASS HTMLMediaElement interface: new Audio() must inherit property "addTextTrack" with the proper type (41) -PASS HTMLMediaElement interface: calling addTextTrack(TextTrackKind,DOMString,DOMString) on new Audio() with too few arguments must throw TypeError +PASS HTMLMediaElement interface: new Audio() must inherit property "duration" with the proper type +FAIL HTMLMediaElement interface: new Audio() must inherit property "getStartDate()" with the proper type assert_inherits: property "getStartDate" not found in prototype chain +PASS HTMLMediaElement interface: new Audio() must inherit property "paused" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "defaultPlaybackRate" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "playbackRate" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "played" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "seekable" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "ended" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "autoplay" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "loop" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "play()" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "pause()" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "controls" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "volume" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "muted" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "defaultMuted" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "audioTracks" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "videoTracks" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "textTracks" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "addTextTrack(TextTrackKind, DOMString, DOMString)" with the proper type +PASS HTMLMediaElement interface: calling addTextTrack(TextTrackKind, DOMString, DOMString) on new Audio() with too few arguments must throw TypeError PASS HTMLSourceElement interface: existence and properties of interface object PASS HTMLSourceElement interface object length PASS HTMLSourceElement interface object name @@ -1442,11 +1442,11 @@ PASS HTMLSourceElement interface: attribute media PASS HTMLSourceElement must be primary interface of document.createElement("source") PASS Stringification of document.createElement("source") -PASS HTMLSourceElement interface: document.createElement("source") must inherit property "src" with the proper type (0) -PASS HTMLSourceElement interface: document.createElement("source") must inherit property "type" with the proper type (1) -PASS HTMLSourceElement interface: document.createElement("source") must inherit property "srcset" with the proper type (2) -PASS HTMLSourceElement interface: document.createElement("source") must inherit property "sizes" with the proper type (3) -PASS HTMLSourceElement interface: document.createElement("source") must inherit property "media" with the proper type (4) +PASS HTMLSourceElement interface: document.createElement("source") must inherit property "src" with the proper type +PASS HTMLSourceElement interface: document.createElement("source") must inherit property "type" with the proper type +PASS HTMLSourceElement interface: document.createElement("source") must inherit property "srcset" with the proper type +PASS HTMLSourceElement interface: document.createElement("source") must inherit property "sizes" with the proper type +PASS HTMLSourceElement interface: document.createElement("source") must inherit property "media" with the proper type PASS HTMLTrackElement interface: existence and properties of interface object PASS HTMLTrackElement interface object length PASS HTMLTrackElement interface object name @@ -1469,17 +1469,17 @@ PASS HTMLTrackElement interface: attribute track PASS HTMLTrackElement must be primary interface of document.createElement("track") PASS Stringification of document.createElement("track") -PASS HTMLTrackElement interface: document.createElement("track") must inherit property "kind" with the proper type (0) -PASS HTMLTrackElement interface: document.createElement("track") must inherit property "src" with the proper type (1) -PASS HTMLTrackElement interface: document.createElement("track") must inherit property "srclang" with the proper type (2) -PASS HTMLTrackElement interface: document.createElement("track") must inherit property "label" with the proper type (3) -PASS HTMLTrackElement interface: document.createElement("track") must inherit property "default" with the proper type (4) -PASS HTMLTrackElement interface: document.createElement("track") must inherit property "NONE" with the proper type (5) -PASS HTMLTrackElement interface: document.createElement("track") must inherit property "LOADING" with the proper type (6) -PASS HTMLTrackElement interface: document.createElement("track") must inherit property "LOADED" with the proper type (7) -PASS HTMLTrackElement interface: document.createElement("track") must inherit property "ERROR" with the proper type (8) -PASS HTMLTrackElement interface: document.createElement("track") must inherit property "readyState" with the proper type (9) -PASS HTMLTrackElement interface: document.createElement("track") must inherit property "track" with the proper type (10) +PASS HTMLTrackElement interface: document.createElement("track") must inherit property "kind" with the proper type +PASS HTMLTrackElement interface: document.createElement("track") must inherit property "src" with the proper type +PASS HTMLTrackElement interface: document.createElement("track") must inherit property "srclang" with the proper type +PASS HTMLTrackElement interface: document.createElement("track") must inherit property "label" with the proper type +PASS HTMLTrackElement interface: document.createElement("track") must inherit property "default" with the proper type +PASS HTMLTrackElement interface: document.createElement("track") must inherit property "NONE" with the proper type +PASS HTMLTrackElement interface: document.createElement("track") must inherit property "LOADING" with the proper type +PASS HTMLTrackElement interface: document.createElement("track") must inherit property "LOADED" with the proper type +PASS HTMLTrackElement interface: document.createElement("track") must inherit property "ERROR" with the proper type +PASS HTMLTrackElement interface: document.createElement("track") must inherit property "readyState" with the proper type +PASS HTMLTrackElement interface: document.createElement("track") must inherit property "track" with the proper type PASS HTMLMediaElement interface: existence and properties of interface object PASS HTMLMediaElement interface object length PASS HTMLMediaElement interface object name @@ -1535,7 +1535,7 @@ PASS HTMLMediaElement interface: attribute audioTracks PASS HTMLMediaElement interface: attribute videoTracks PASS HTMLMediaElement interface: attribute textTracks -PASS HTMLMediaElement interface: operation addTextTrack(TextTrackKind,DOMString,DOMString) +PASS HTMLMediaElement interface: operation addTextTrack(TextTrackKind, DOMString, DOMString) PASS MediaError interface: existence and properties of interface object PASS MediaError interface object length PASS MediaError interface object name @@ -1553,12 +1553,12 @@ PASS MediaError interface: attribute message PASS MediaError must be primary interface of errorVideo.error PASS Stringification of errorVideo.error -PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_ABORTED" with the proper type (0) -PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_NETWORK" with the proper type (1) -PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_DECODE" with the proper type (2) -PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_SRC_NOT_SUPPORTED" with the proper type (3) -PASS MediaError interface: errorVideo.error must inherit property "code" with the proper type (4) -PASS MediaError interface: errorVideo.error must inherit property "message" with the proper type (5) +PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_ABORTED" with the proper type +PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_NETWORK" with the proper type +PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_DECODE" with the proper type +PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_SRC_NOT_SUPPORTED" with the proper type +PASS MediaError interface: errorVideo.error must inherit property "code" with the proper type +PASS MediaError interface: errorVideo.error must inherit property "message" with the proper type PASS AudioTrackList interface: existence and properties of interface object PASS AudioTrackList interface object length PASS AudioTrackList interface object name @@ -1612,12 +1612,12 @@ PASS TextTrackList interface: attribute onremovetrack PASS TextTrackList must be primary interface of document.createElement("video").textTracks PASS Stringification of document.createElement("video").textTracks -PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "length" with the proper type (0) -PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "getTrackById" with the proper type (2) +PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "length" with the proper type +PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "getTrackById(DOMString)" with the proper type PASS TextTrackList interface: calling getTrackById(DOMString) on document.createElement("video").textTracks with too few arguments must throw TypeError -PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onchange" with the proper type (3) -PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onaddtrack" with the proper type (4) -PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onremovetrack" with the proper type (5) +PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onchange" with the proper type +PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onaddtrack" with the proper type +PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onremovetrack" with the proper type PASS TextTrack interface: existence and properties of interface object PASS TextTrack interface object length PASS TextTrack interface object name @@ -1636,19 +1636,19 @@ PASS TextTrack interface: attribute oncuechange PASS TextTrack must be primary interface of document.createElement("track").track PASS Stringification of document.createElement("track").track -PASS TextTrack interface: document.createElement("track").track must inherit property "kind" with the proper type (0) -PASS TextTrack interface: document.createElement("track").track must inherit property "label" with the proper type (1) -PASS TextTrack interface: document.createElement("track").track must inherit property "language" with the proper type (2) -PASS TextTrack interface: document.createElement("track").track must inherit property "id" with the proper type (3) -FAIL TextTrack interface: document.createElement("track").track must inherit property "inBandMetadataTrackDispatchType" with the proper type (4) assert_inherits: property "inBandMetadataTrackDispatchType" not found in prototype chain -PASS TextTrack interface: document.createElement("track").track must inherit property "mode" with the proper type (5) -PASS TextTrack interface: document.createElement("track").track must inherit property "cues" with the proper type (6) -PASS TextTrack interface: document.createElement("track").track must inherit property "activeCues" with the proper type (7) -PASS TextTrack interface: document.createElement("track").track must inherit property "addCue" with the proper type (8) +PASS TextTrack interface: document.createElement("track").track must inherit property "kind" with the proper type +PASS TextTrack interface: document.createElement("track").track must inherit property "label" with the proper type +PASS TextTrack interface: document.createElement("track").track must inherit property "language" with the proper type +PASS TextTrack interface: document.createElement("track").track must inherit property "id" with the proper type +FAIL TextTrack interface: document.createElement("track").track must inherit property "inBandMetadataTrackDispatchType" with the proper type assert_inherits: property "inBandMetadataTrackDispatchType" not found in prototype chain +PASS TextTrack interface: document.createElement("track").track must inherit property "mode" with the proper type +PASS TextTrack interface: document.createElement("track").track must inherit property "cues" with the proper type +PASS TextTrack interface: document.createElement("track").track must inherit property "activeCues" with the proper type +PASS TextTrack interface: document.createElement("track").track must inherit property "addCue(TextTrackCue)" with the proper type PASS TextTrack interface: calling addCue(TextTrackCue) on document.createElement("track").track with too few arguments must throw TypeError -PASS TextTrack interface: document.createElement("track").track must inherit property "removeCue" with the proper type (9) +PASS TextTrack interface: document.createElement("track").track must inherit property "removeCue(TextTrackCue)" with the proper type PASS TextTrack interface: calling removeCue(TextTrackCue) on document.createElement("track").track with too few arguments must throw TypeError -PASS TextTrack interface: document.createElement("track").track must inherit property "oncuechange" with the proper type (10) +PASS TextTrack interface: document.createElement("track").track must inherit property "oncuechange" with the proper type PASS TextTrackCueList interface: existence and properties of interface object PASS TextTrackCueList interface object length PASS TextTrackCueList interface object name @@ -1658,8 +1658,8 @@ PASS TextTrackCueList interface: operation getCueById(DOMString) PASS TextTrackCueList must be primary interface of document.createElement("video").addTextTrack("subtitles").cues PASS Stringification of document.createElement("video").addTextTrack("subtitles").cues -PASS TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "length" with the proper type (0) -PASS TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "getCueById" with the proper type (2) +PASS TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "length" with the proper type +PASS TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "getCueById(DOMString)" with the proper type PASS TextTrackCueList interface: calling getCueById(DOMString) on document.createElement("video").addTextTrack("subtitles").cues with too few arguments must throw TypeError PASS TextTrackCue interface: existence and properties of interface object PASS TextTrackCue interface object length @@ -1683,10 +1683,10 @@ PASS TimeRanges interface: operation end(unsigned long) PASS TimeRanges must be primary interface of document.createElement("video").buffered PASS Stringification of document.createElement("video").buffered -PASS TimeRanges interface: document.createElement("video").buffered must inherit property "length" with the proper type (0) -PASS TimeRanges interface: document.createElement("video").buffered must inherit property "start" with the proper type (1) +PASS TimeRanges interface: document.createElement("video").buffered must inherit property "length" with the proper type +PASS TimeRanges interface: document.createElement("video").buffered must inherit property "start(unsigned long)" with the proper type PASS TimeRanges interface: calling start(unsigned long) on document.createElement("video").buffered with too few arguments must throw TypeError -PASS TimeRanges interface: document.createElement("video").buffered must inherit property "end" with the proper type (2) +PASS TimeRanges interface: document.createElement("video").buffered must inherit property "end(unsigned long)" with the proper type PASS TimeRanges interface: calling end(unsigned long) on document.createElement("video").buffered with too few arguments must throw TypeError PASS TrackEvent interface: existence and properties of interface object PASS TrackEvent interface object length @@ -1696,7 +1696,7 @@ PASS TrackEvent interface: attribute track PASS TrackEvent must be primary interface of new TrackEvent("addtrack", {track:document.createElement("track").track}) PASS Stringification of new TrackEvent("addtrack", {track:document.createElement("track").track}) -PASS TrackEvent interface: new TrackEvent("addtrack", {track:document.createElement("track").track}) must inherit property "track" with the proper type (0) +PASS TrackEvent interface: new TrackEvent("addtrack", {track:document.createElement("track").track}) must inherit property "track" with the proper type PASS HTMLMapElement interface: existence and properties of interface object PASS HTMLMapElement interface object length PASS HTMLMapElement interface object name @@ -1706,8 +1706,8 @@ PASS HTMLMapElement interface: attribute areas PASS HTMLMapElement must be primary interface of document.createElement("map") PASS Stringification of document.createElement("map") -PASS HTMLMapElement interface: document.createElement("map") must inherit property "name" with the proper type (0) -PASS HTMLMapElement interface: document.createElement("map") must inherit property "areas" with the proper type (1) +PASS HTMLMapElement interface: document.createElement("map") must inherit property "name" with the proper type +PASS HTMLMapElement interface: document.createElement("map") must inherit property "areas" with the proper type PASS HTMLAreaElement interface: existence and properties of interface object PASS HTMLAreaElement interface object length PASS HTMLAreaElement interface object name @@ -1737,27 +1737,27 @@ PASS HTMLAreaElement interface: attribute hash PASS HTMLAreaElement must be primary interface of document.createElement("area") PASS Stringification of document.createElement("area") -PASS HTMLAreaElement interface: document.createElement("area") must inherit property "alt" with the proper type (0) -PASS HTMLAreaElement interface: document.createElement("area") must inherit property "coords" with the proper type (1) -PASS HTMLAreaElement interface: document.createElement("area") must inherit property "shape" with the proper type (2) -PASS HTMLAreaElement interface: document.createElement("area") must inherit property "target" with the proper type (3) -PASS HTMLAreaElement interface: document.createElement("area") must inherit property "download" with the proper type (4) -PASS HTMLAreaElement interface: document.createElement("area") must inherit property "ping" with the proper type (5) -PASS HTMLAreaElement interface: document.createElement("area") must inherit property "rel" with the proper type (6) -FAIL HTMLAreaElement interface: document.createElement("area") must inherit property "relList" with the proper type (7) assert_inherits: property "relList" not found in prototype chain -PASS HTMLAreaElement interface: document.createElement("area") must inherit property "referrerPolicy" with the proper type (8) -PASS HTMLAreaElement interface: document.createElement("area") must inherit property "noHref" with the proper type (9) -PASS HTMLAreaElement interface: document.createElement("area") must inherit property "href" with the proper type (10) -PASS HTMLAreaElement interface: document.createElement("area") must inherit property "origin" with the proper type (11) -PASS HTMLAreaElement interface: document.createElement("area") must inherit property "protocol" with the proper type (12) -PASS HTMLAreaElement interface: document.createElement("area") must inherit property "username" with the proper type (13) -PASS HTMLAreaElement interface: document.createElement("area") must inherit property "password" with the proper type (14) -PASS HTMLAreaElement interface: document.createElement("area") must inherit property "host" with the proper type (15) -PASS HTMLAreaElement interface: document.createElement("area") must inherit property "hostname" with the proper type (16) -PASS HTMLAreaElement interface: document.createElement("area") must inherit property "port" with the proper type (17) -PASS HTMLAreaElement interface: document.createElement("area") must inherit property "pathname" with the proper type (18) -PASS HTMLAreaElement interface: document.createElement("area") must inherit property "search" with the proper type (19) -PASS HTMLAreaElement interface: document.createElement("area") must inherit property "hash" with the proper type (20) +PASS HTMLAreaElement interface: document.createElement("area") must inherit property "alt" with the proper type +PASS HTMLAreaElement interface: document.createElement("area") must inherit property "coords" with the proper type +PASS HTMLAreaElement interface: document.createElement("area") must inherit property "shape" with the proper type +PASS HTMLAreaElement interface: document.createElement("area") must inherit property "target" with the proper type +PASS HTMLAreaElement interface: document.createElement("area") must inherit property "download" with the proper type +PASS HTMLAreaElement interface: document.createElement("area") must inherit property "ping" with the proper type +PASS HTMLAreaElement interface: document.createElement("area") must inherit property "rel" with the proper type +FAIL HTMLAreaElement interface: document.createElement("area") must inherit property "relList" with the proper type assert_inherits: property "relList" not found in prototype chain +PASS HTMLAreaElement interface: document.createElement("area") must inherit property "referrerPolicy" with the proper type +PASS HTMLAreaElement interface: document.createElement("area") must inherit property "noHref" with the proper type +PASS HTMLAreaElement interface: document.createElement("area") must inherit property "href" with the proper type +PASS HTMLAreaElement interface: document.createElement("area") must inherit property "origin" with the proper type +PASS HTMLAreaElement interface: document.createElement("area") must inherit property "protocol" with the proper type +PASS HTMLAreaElement interface: document.createElement("area") must inherit property "username" with the proper type +PASS HTMLAreaElement interface: document.createElement("area") must inherit property "password" with the proper type +PASS HTMLAreaElement interface: document.createElement("area") must inherit property "host" with the proper type +PASS HTMLAreaElement interface: document.createElement("area") must inherit property "hostname" with the proper type +PASS HTMLAreaElement interface: document.createElement("area") must inherit property "port" with the proper type +PASS HTMLAreaElement interface: document.createElement("area") must inherit property "pathname" with the proper type +PASS HTMLAreaElement interface: document.createElement("area") must inherit property "search" with the proper type +PASS HTMLAreaElement interface: document.createElement("area") must inherit property "hash" with the proper type PASS HTMLTableElement interface: existence and properties of interface object PASS HTMLTableElement interface object length PASS HTMLTableElement interface object name @@ -1788,31 +1788,31 @@ PASS HTMLTableElement interface: attribute cellSpacing PASS HTMLTableElement must be primary interface of document.createElement("table") PASS Stringification of document.createElement("table") -PASS HTMLTableElement interface: document.createElement("table") must inherit property "caption" with the proper type (0) -PASS HTMLTableElement interface: document.createElement("table") must inherit property "createCaption" with the proper type (1) -PASS HTMLTableElement interface: document.createElement("table") must inherit property "deleteCaption" with the proper type (2) -PASS HTMLTableElement interface: document.createElement("table") must inherit property "tHead" with the proper type (3) -PASS HTMLTableElement interface: document.createElement("table") must inherit property "createTHead" with the proper type (4) -PASS HTMLTableElement interface: document.createElement("table") must inherit property "deleteTHead" with the proper type (5) -PASS HTMLTableElement interface: document.createElement("table") must inherit property "tFoot" with the proper type (6) -PASS HTMLTableElement interface: document.createElement("table") must inherit property "createTFoot" with the proper type (7) -PASS HTMLTableElement interface: document.createElement("table") must inherit property "deleteTFoot" with the proper type (8) -PASS HTMLTableElement interface: document.createElement("table") must inherit property "tBodies" with the proper type (9) -PASS HTMLTableElement interface: document.createElement("table") must inherit property "createTBody" with the proper type (10) -PASS HTMLTableElement interface: document.createElement("table") must inherit property "rows" with the proper type (11) -PASS HTMLTableElement interface: document.createElement("table") must inherit property "insertRow" with the proper type (12) +PASS HTMLTableElement interface: document.createElement("table") must inherit property "caption" with the proper type +PASS HTMLTableElement interface: document.createElement("table") must inherit property "createCaption()" with the proper type +PASS HTMLTableElement interface: document.createElement("table") must inherit property "deleteCaption()" with the proper type +PASS HTMLTableElement interface: document.createElement("table") must inherit property "tHead" with the proper type +PASS HTMLTableElement interface: document.createElement("table") must inherit property "createTHead()" with the proper type +PASS HTMLTableElement interface: document.createElement("table") must inherit property "deleteTHead()" with the proper type +PASS HTMLTableElement interface: document.createElement("table") must inherit property "tFoot" with the proper type +PASS HTMLTableElement interface: document.createElement("table") must inherit property "createTFoot()" with the proper type +PASS HTMLTableElement interface: document.createElement("table") must inherit property "deleteTFoot()" with the proper type +PASS HTMLTableElement interface: document.createElement("table") must inherit property "tBodies" with the proper type +PASS HTMLTableElement interface: document.createElement("table") must inherit property "createTBody()" with the proper type +PASS HTMLTableElement interface: document.createElement("table") must inherit property "rows" with the proper type +PASS HTMLTableElement interface: document.createElement("table") must inherit property "insertRow(long)" with the proper type PASS HTMLTableElement interface: calling insertRow(long) on document.createElement("table") with too few arguments must throw TypeError -PASS HTMLTableElement interface: document.createElement("table") must inherit property "deleteRow" with the proper type (13) +PASS HTMLTableElement interface: document.createElement("table") must inherit property "deleteRow(long)" with the proper type PASS HTMLTableElement interface: calling deleteRow(long) on document.createElement("table") with too few arguments must throw TypeError -PASS HTMLTableElement interface: document.createElement("table") must inherit property "align" with the proper type (14) -PASS HTMLTableElement interface: document.createElement("table") must inherit property "border" with the proper type (15) -PASS HTMLTableElement interface: document.createElement("table") must inherit property "frame" with the proper type (16) -PASS HTMLTableElement interface: document.createElement("table") must inherit property "rules" with the proper type (17) -PASS HTMLTableElement interface: document.createElement("table") must inherit property "summary" with the proper type (18) -PASS HTMLTableElement interface: document.createElement("table") must inherit property "width" with the proper type (19) -PASS HTMLTableElement interface: document.createElement("table") must inherit property "bgColor" with the proper type (20) -PASS HTMLTableElement interface: document.createElement("table") must inherit property "cellPadding" with the proper type (21) -PASS HTMLTableElement interface: document.createElement("table") must inherit property "cellSpacing" with the proper type (22) +PASS HTMLTableElement interface: document.createElement("table") must inherit property "align" with the proper type +PASS HTMLTableElement interface: document.createElement("table") must inherit property "border" with the proper type +PASS HTMLTableElement interface: document.createElement("table") must inherit property "frame" with the proper type +PASS HTMLTableElement interface: document.createElement("table") must inherit property "rules" with the proper type +PASS HTMLTableElement interface: document.createElement("table") must inherit property "summary" with the proper type +PASS HTMLTableElement interface: document.createElement("table") must inherit property "width" with the proper type +PASS HTMLTableElement interface: document.createElement("table") must inherit property "bgColor" with the proper type +PASS HTMLTableElement interface: document.createElement("table") must inherit property "cellPadding" with the proper type +PASS HTMLTableElement interface: document.createElement("table") must inherit property "cellSpacing" with the proper type PASS HTMLTableCaptionElement interface: existence and properties of interface object PASS HTMLTableCaptionElement interface object length PASS HTMLTableCaptionElement interface object name @@ -1821,7 +1821,7 @@ PASS HTMLTableCaptionElement interface: attribute align PASS HTMLTableCaptionElement must be primary interface of document.createElement("caption") PASS Stringification of document.createElement("caption") -PASS HTMLTableCaptionElement interface: document.createElement("caption") must inherit property "align" with the proper type (0) +PASS HTMLTableCaptionElement interface: document.createElement("caption") must inherit property "align" with the proper type PASS HTMLTableColElement interface: existence and properties of interface object PASS HTMLTableColElement interface object length PASS HTMLTableColElement interface object name @@ -1835,20 +1835,20 @@ PASS HTMLTableColElement interface: attribute width PASS HTMLTableColElement must be primary interface of document.createElement("colgroup") PASS Stringification of document.createElement("colgroup") -PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "span" with the proper type (0) -PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "align" with the proper type (1) -PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "ch" with the proper type (2) -PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "chOff" with the proper type (3) -PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "vAlign" with the proper type (4) -PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "width" with the proper type (5) +PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "span" with the proper type +PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "align" with the proper type +PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "ch" with the proper type +PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "chOff" with the proper type +PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "vAlign" with the proper type +PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "width" with the proper type PASS HTMLTableColElement must be primary interface of document.createElement("col") PASS Stringification of document.createElement("col") -PASS HTMLTableColElement interface: document.createElement("col") must inherit property "span" with the proper type (0) -PASS HTMLTableColElement interface: document.createElement("col") must inherit property "align" with the proper type (1) -PASS HTMLTableColElement interface: document.createElement("col") must inherit property "ch" with the proper type (2) -PASS HTMLTableColElement interface: document.createElement("col") must inherit property "chOff" with the proper type (3) -PASS HTMLTableColElement interface: document.createElement("col") must inherit property "vAlign" with the proper type (4) -PASS HTMLTableColElement interface: document.createElement("col") must inherit property "width" with the proper type (5) +PASS HTMLTableColElement interface: document.createElement("col") must inherit property "span" with the proper type +PASS HTMLTableColElement interface: document.createElement("col") must inherit property "align" with the proper type +PASS HTMLTableColElement interface: document.createElement("col") must inherit property "ch" with the proper type +PASS HTMLTableColElement interface: document.createElement("col") must inherit property "chOff" with the proper type +PASS HTMLTableColElement interface: document.createElement("col") must inherit property "vAlign" with the proper type +PASS HTMLTableColElement interface: document.createElement("col") must inherit property "width" with the proper type PASS HTMLTableSectionElement interface: existence and properties of interface object PASS HTMLTableSectionElement interface object length PASS HTMLTableSectionElement interface object name @@ -1863,37 +1863,37 @@ PASS HTMLTableSectionElement interface: attribute vAlign PASS HTMLTableSectionElement must be primary interface of document.createElement("tbody") PASS Stringification of document.createElement("tbody") -PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "rows" with the proper type (0) -PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "insertRow" with the proper type (1) +PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "rows" with the proper type +PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "insertRow(long)" with the proper type PASS HTMLTableSectionElement interface: calling insertRow(long) on document.createElement("tbody") with too few arguments must throw TypeError -PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "deleteRow" with the proper type (2) +PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "deleteRow(long)" with the proper type PASS HTMLTableSectionElement interface: calling deleteRow(long) on document.createElement("tbody") with too few arguments must throw TypeError -PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "align" with the proper type (3) -PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "ch" with the proper type (4) -PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "chOff" with the proper type (5) -PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "vAlign" with the proper type (6) +PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "align" with the proper type +PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "ch" with the proper type +PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "chOff" with the proper type +PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "vAlign" with the proper type PASS HTMLTableSectionElement must be primary interface of document.createElement("thead") PASS Stringification of document.createElement("thead") -PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "rows" with the proper type (0) -PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "insertRow" with the proper type (1) +PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "rows" with the proper type +PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "insertRow(long)" with the proper type PASS HTMLTableSectionElement interface: calling insertRow(long) on document.createElement("thead") with too few arguments must throw TypeError -PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "deleteRow" with the proper type (2) +PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "deleteRow(long)" with the proper type PASS HTMLTableSectionElement interface: calling deleteRow(long) on document.createElement("thead") with too few arguments must throw TypeError -PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "align" with the proper type (3) -PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "ch" with the proper type (4) -PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "chOff" with the proper type (5) -PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "vAlign" with the proper type (6) +PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "align" with the proper type +PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "ch" with the proper type +PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "chOff" with the proper type +PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "vAlign" with the proper type PASS HTMLTableSectionElement must be primary interface of document.createElement("tfoot") PASS Stringification of document.createElement("tfoot") -PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "rows" with the proper type (0) -PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "insertRow" with the proper type (1) +PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "rows" with the proper type +PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "insertRow(long)" with the proper type PASS HTMLTableSectionElement interface: calling insertRow(long) on document.createElement("tfoot") with too few arguments must throw TypeError -PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "deleteRow" with the proper type (2) +PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "deleteRow(long)" with the proper type PASS HTMLTableSectionElement interface: calling deleteRow(long) on document.createElement("tfoot") with too few arguments must throw TypeError -PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "align" with the proper type (3) -PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "ch" with the proper type (4) -PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "chOff" with the proper type (5) -PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "vAlign" with the proper type (6) +PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "align" with the proper type +PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "ch" with the proper type +PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "chOff" with the proper type +PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "vAlign" with the proper type PASS HTMLTableRowElement interface: existence and properties of interface object PASS HTMLTableRowElement interface object length PASS HTMLTableRowElement interface object name @@ -1911,18 +1911,18 @@ PASS HTMLTableRowElement interface: attribute bgColor PASS HTMLTableRowElement must be primary interface of document.createElement("tr") PASS Stringification of document.createElement("tr") -PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "rowIndex" with the proper type (0) -PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "sectionRowIndex" with the proper type (1) -PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "cells" with the proper type (2) -PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "insertCell" with the proper type (3) +PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "rowIndex" with the proper type +PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "sectionRowIndex" with the proper type +PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "cells" with the proper type +PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "insertCell(long)" with the proper type PASS HTMLTableRowElement interface: calling insertCell(long) on document.createElement("tr") with too few arguments must throw TypeError -PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "deleteCell" with the proper type (4) +PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "deleteCell(long)" with the proper type PASS HTMLTableRowElement interface: calling deleteCell(long) on document.createElement("tr") with too few arguments must throw TypeError -PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "align" with the proper type (5) -PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "ch" with the proper type (6) -PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "chOff" with the proper type (7) -PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "vAlign" with the proper type (8) -PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "bgColor" with the proper type (9) +PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "align" with the proper type +PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "ch" with the proper type +PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "chOff" with the proper type +PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "vAlign" with the proper type +PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "bgColor" with the proper type PASS HTMLTableCellElement interface: existence and properties of interface object PASS HTMLTableCellElement interface object length PASS HTMLTableCellElement interface object name @@ -1945,38 +1945,38 @@ PASS HTMLTableCellElement interface: attribute bgColor PASS HTMLTableCellElement must be primary interface of document.createElement("td") PASS Stringification of document.createElement("td") -PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "colSpan" with the proper type (0) -PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "rowSpan" with the proper type (1) -PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "headers" with the proper type (2) -PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "cellIndex" with the proper type (3) -PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "scope" with the proper type (4) -PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "abbr" with the proper type (5) -PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "align" with the proper type (6) -PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "axis" with the proper type (7) -PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "height" with the proper type (8) -PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "width" with the proper type (9) -PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "ch" with the proper type (10) -PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "chOff" with the proper type (11) -PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "noWrap" with the proper type (12) -PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "vAlign" with the proper type (13) -PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "bgColor" with the proper type (14) +PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "colSpan" with the proper type +PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "rowSpan" with the proper type +PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "headers" with the proper type +PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "cellIndex" with the proper type +PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "scope" with the proper type +PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "abbr" with the proper type +PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "align" with the proper type +PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "axis" with the proper type +PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "height" with the proper type +PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "width" with the proper type +PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "ch" with the proper type +PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "chOff" with the proper type +PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "noWrap" with the proper type +PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "vAlign" with the proper type +PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "bgColor" with the proper type PASS HTMLTableCellElement must be primary interface of document.createElement("th") PASS Stringification of document.createElement("th") -PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "colSpan" with the proper type (0) -PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "rowSpan" with the proper type (1) -PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "headers" with the proper type (2) -PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "cellIndex" with the proper type (3) -PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "scope" with the proper type (4) -PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "abbr" with the proper type (5) -PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "align" with the proper type (6) -PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "axis" with the proper type (7) -PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "height" with the proper type (8) -PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "width" with the proper type (9) -PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "ch" with the proper type (10) -PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "chOff" with the proper type (11) -PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "noWrap" with the proper type (12) -PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "vAlign" with the proper type (13) -PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "bgColor" with the proper type (14) +PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "colSpan" with the proper type +PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "rowSpan" with the proper type +PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "headers" with the proper type +PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "cellIndex" with the proper type +PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "scope" with the proper type +PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "abbr" with the proper type +PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "align" with the proper type +PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "axis" with the proper type +PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "height" with the proper type +PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "width" with the proper type +PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "ch" with the proper type +PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "chOff" with the proper type +PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "noWrap" with the proper type +PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "vAlign" with the proper type +PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "bgColor" with the proper type PASS HTMLFormElement interface: existence and properties of interface object PASS HTMLFormElement interface object length PASS HTMLFormElement interface object name @@ -1999,21 +1999,21 @@ PASS HTMLFormElement interface: operation reportValidity() PASS HTMLFormElement must be primary interface of document.createElement("form") PASS Stringification of document.createElement("form") -PASS HTMLFormElement interface: document.createElement("form") must inherit property "acceptCharset" with the proper type (0) -PASS HTMLFormElement interface: document.createElement("form") must inherit property "action" with the proper type (1) -PASS HTMLFormElement interface: document.createElement("form") must inherit property "autocomplete" with the proper type (2) -PASS HTMLFormElement interface: document.createElement("form") must inherit property "enctype" with the proper type (3) -PASS HTMLFormElement interface: document.createElement("form") must inherit property "encoding" with the proper type (4) -PASS HTMLFormElement interface: document.createElement("form") must inherit property "method" with the proper type (5) -PASS HTMLFormElement interface: document.createElement("form") must inherit property "name" with the proper type (6) -PASS HTMLFormElement interface: document.createElement("form") must inherit property "noValidate" with the proper type (7) -PASS HTMLFormElement interface: document.createElement("form") must inherit property "target" with the proper type (8) -PASS HTMLFormElement interface: document.createElement("form") must inherit property "elements" with the proper type (9) -PASS HTMLFormElement interface: document.createElement("form") must inherit property "length" with the proper type (10) -PASS HTMLFormElement interface: document.createElement("form") must inherit property "submit" with the proper type (13) -PASS HTMLFormElement interface: document.createElement("form") must inherit property "reset" with the proper type (14) -PASS HTMLFormElement interface: document.createElement("form") must inherit property "checkValidity" with the proper type (15) -PASS HTMLFormElement interface: document.createElement("form") must inherit property "reportValidity" with the proper type (16) +PASS HTMLFormElement interface: document.createElement("form") must inherit property "acceptCharset" with the proper type +PASS HTMLFormElement interface: document.createElement("form") must inherit property "action" with the proper type +PASS HTMLFormElement interface: document.createElement("form") must inherit property "autocomplete" with the proper type +PASS HTMLFormElement interface: document.createElement("form") must inherit property "enctype" with the proper type +PASS HTMLFormElement interface: document.createElement("form") must inherit property "encoding" with the proper type +PASS HTMLFormElement interface: document.createElement("form") must inherit property "method" with the proper type +PASS HTMLFormElement interface: document.createElement("form") must inherit property "name" with the proper type +PASS HTMLFormElement interface: document.createElement("form") must inherit property "noValidate" with the proper type +PASS HTMLFormElement interface: document.createElement("form") must inherit property "target" with the proper type +PASS HTMLFormElement interface: document.createElement("form") must inherit property "elements" with the proper type +PASS HTMLFormElement interface: document.createElement("form") must inherit property "length" with the proper type +PASS HTMLFormElement interface: document.createElement("form") must inherit property "submit()" with the proper type +PASS HTMLFormElement interface: document.createElement("form") must inherit property "reset()" with the proper type +PASS HTMLFormElement interface: document.createElement("form") must inherit property "checkValidity()" with the proper type +PASS HTMLFormElement interface: document.createElement("form") must inherit property "reportValidity()" with the proper type PASS HTMLLabelElement interface: existence and properties of interface object PASS HTMLLabelElement interface object length PASS HTMLLabelElement interface object name @@ -2024,9 +2024,9 @@ PASS HTMLLabelElement interface: attribute control PASS HTMLLabelElement must be primary interface of document.createElement("label") PASS Stringification of document.createElement("label") -PASS HTMLLabelElement interface: document.createElement("label") must inherit property "form" with the proper type (0) -PASS HTMLLabelElement interface: document.createElement("label") must inherit property "htmlFor" with the proper type (1) -PASS HTMLLabelElement interface: document.createElement("label") must inherit property "control" with the proper type (2) +PASS HTMLLabelElement interface: document.createElement("label") must inherit property "form" with the proper type +PASS HTMLLabelElement interface: document.createElement("label") must inherit property "htmlFor" with the proper type +PASS HTMLLabelElement interface: document.createElement("label") must inherit property "control" with the proper type PASS HTMLInputElement interface: existence and properties of interface object PASS HTMLInputElement interface object length PASS HTMLInputElement interface object name @@ -2084,1482 +2084,1482 @@ PASS HTMLInputElement interface: attribute selectionEnd PASS HTMLInputElement interface: attribute selectionDirection PASS HTMLInputElement interface: operation setRangeText(DOMString) -PASS HTMLInputElement interface: operation setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) -PASS HTMLInputElement interface: operation setSelectionRange(unsigned long,unsigned long,DOMString) +PASS HTMLInputElement interface: operation setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) +PASS HTMLInputElement interface: operation setSelectionRange(unsigned long, unsigned long, DOMString) PASS HTMLInputElement interface: attribute align PASS HTMLInputElement interface: attribute useMap PASS HTMLInputElement must be primary interface of document.createElement("input") PASS Stringification of document.createElement("input") -PASS HTMLInputElement interface: document.createElement("input") must inherit property "accept" with the proper type (0) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "alt" with the proper type (1) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "autocomplete" with the proper type (2) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "autofocus" with the proper type (3) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "defaultChecked" with the proper type (4) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "checked" with the proper type (5) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "dirName" with the proper type (6) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "disabled" with the proper type (7) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "form" with the proper type (8) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "files" with the proper type (9) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "formAction" with the proper type (10) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "formEnctype" with the proper type (11) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "formMethod" with the proper type (12) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "formNoValidate" with the proper type (13) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "formTarget" with the proper type (14) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "height" with the proper type (15) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "indeterminate" with the proper type (16) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "inputMode" with the proper type (17) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "list" with the proper type (18) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "max" with the proper type (19) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "maxLength" with the proper type (20) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "min" with the proper type (21) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "minLength" with the proper type (22) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "multiple" with the proper type (23) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "name" with the proper type (24) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "pattern" with the proper type (25) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "placeholder" with the proper type (26) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "readOnly" with the proper type (27) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "required" with the proper type (28) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "size" with the proper type (29) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "src" with the proper type (30) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "step" with the proper type (31) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "type" with the proper type (32) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "defaultValue" with the proper type (33) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "value" with the proper type (34) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "valueAsDate" with the proper type (35) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "valueAsNumber" with the proper type (36) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "width" with the proper type (37) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "stepUp" with the proper type (38) +PASS HTMLInputElement interface: document.createElement("input") must inherit property "accept" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "alt" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "autocomplete" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "autofocus" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "defaultChecked" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "checked" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "dirName" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "disabled" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "form" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "files" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "formAction" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "formEnctype" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "formMethod" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "formNoValidate" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "formTarget" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "height" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "indeterminate" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "inputMode" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "list" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "max" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "maxLength" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "min" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "minLength" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "multiple" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "name" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "pattern" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "placeholder" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "readOnly" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "required" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "size" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "src" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "step" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "type" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "defaultValue" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "value" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "valueAsDate" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "valueAsNumber" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "width" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "stepUp(long)" with the proper type PASS HTMLInputElement interface: calling stepUp(long) on document.createElement("input") with too few arguments must throw TypeError -PASS HTMLInputElement interface: document.createElement("input") must inherit property "stepDown" with the proper type (39) +PASS HTMLInputElement interface: document.createElement("input") must inherit property "stepDown(long)" with the proper type PASS HTMLInputElement interface: calling stepDown(long) on document.createElement("input") with too few arguments must throw TypeError -PASS HTMLInputElement interface: document.createElement("input") must inherit property "willValidate" with the proper type (40) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "validity" with the proper type (41) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "validationMessage" with the proper type (42) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "checkValidity" with the proper type (43) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "reportValidity" with the proper type (44) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "setCustomValidity" with the proper type (45) +PASS HTMLInputElement interface: document.createElement("input") must inherit property "willValidate" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "validity" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "validationMessage" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "checkValidity()" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "reportValidity()" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "setCustomValidity(DOMString)" with the proper type PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on document.createElement("input") with too few arguments must throw TypeError -PASS HTMLInputElement interface: document.createElement("input") must inherit property "labels" with the proper type (46) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "select" with the proper type (47) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "selectionStart" with the proper type (48) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "selectionEnd" with the proper type (49) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "selectionDirection" with the proper type (50) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "setRangeText" with the proper type (51) +PASS HTMLInputElement interface: document.createElement("input") must inherit property "labels" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "select()" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "selectionStart" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "selectionEnd" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "selectionDirection" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "setRangeText(DOMString)" with the proper type PASS HTMLInputElement interface: calling setRangeText(DOMString) on document.createElement("input") with too few arguments must throw TypeError -PASS HTMLInputElement interface: document.createElement("input") must inherit property "setRangeText" with the proper type (52) -PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on document.createElement("input") with too few arguments must throw TypeError -PASS HTMLInputElement interface: document.createElement("input") must inherit property "setSelectionRange" with the proper type (53) -PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on document.createElement("input") with too few arguments must throw TypeError -PASS HTMLInputElement interface: document.createElement("input") must inherit property "align" with the proper type (54) -PASS HTMLInputElement interface: document.createElement("input") must inherit property "useMap" with the proper type (55) +PASS HTMLInputElement interface: document.createElement("input") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on document.createElement("input") with too few arguments must throw TypeError +PASS HTMLInputElement interface: document.createElement("input") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on document.createElement("input") with too few arguments must throw TypeError +PASS HTMLInputElement interface: document.createElement("input") must inherit property "align" with the proper type +PASS HTMLInputElement interface: document.createElement("input") must inherit property "useMap" with the proper type PASS HTMLInputElement must be primary interface of createInput("text") PASS Stringification of createInput("text") -PASS HTMLInputElement interface: createInput("text") must inherit property "accept" with the proper type (0) -PASS HTMLInputElement interface: createInput("text") must inherit property "alt" with the proper type (1) -PASS HTMLInputElement interface: createInput("text") must inherit property "autocomplete" with the proper type (2) -PASS HTMLInputElement interface: createInput("text") must inherit property "autofocus" with the proper type (3) -PASS HTMLInputElement interface: createInput("text") must inherit property "defaultChecked" with the proper type (4) -PASS HTMLInputElement interface: createInput("text") must inherit property "checked" with the proper type (5) -PASS HTMLInputElement interface: createInput("text") must inherit property "dirName" with the proper type (6) -PASS HTMLInputElement interface: createInput("text") must inherit property "disabled" with the proper type (7) -PASS HTMLInputElement interface: createInput("text") must inherit property "form" with the proper type (8) -PASS HTMLInputElement interface: createInput("text") must inherit property "files" with the proper type (9) -PASS HTMLInputElement interface: createInput("text") must inherit property "formAction" with the proper type (10) -PASS HTMLInputElement interface: createInput("text") must inherit property "formEnctype" with the proper type (11) -PASS HTMLInputElement interface: createInput("text") must inherit property "formMethod" with the proper type (12) -PASS HTMLInputElement interface: createInput("text") must inherit property "formNoValidate" with the proper type (13) -PASS HTMLInputElement interface: createInput("text") must inherit property "formTarget" with the proper type (14) -PASS HTMLInputElement interface: createInput("text") must inherit property "height" with the proper type (15) -PASS HTMLInputElement interface: createInput("text") must inherit property "indeterminate" with the proper type (16) -PASS HTMLInputElement interface: createInput("text") must inherit property "inputMode" with the proper type (17) -PASS HTMLInputElement interface: createInput("text") must inherit property "list" with the proper type (18) -PASS HTMLInputElement interface: createInput("text") must inherit property "max" with the proper type (19) -PASS HTMLInputElement interface: createInput("text") must inherit property "maxLength" with the proper type (20) -PASS HTMLInputElement interface: createInput("text") must inherit property "min" with the proper type (21) -PASS HTMLInputElement interface: createInput("text") must inherit property "minLength" with the proper type (22) -PASS HTMLInputElement interface: createInput("text") must inherit property "multiple" with the proper type (23) -PASS HTMLInputElement interface: createInput("text") must inherit property "name" with the proper type (24) -PASS HTMLInputElement interface: createInput("text") must inherit property "pattern" with the proper type (25) -PASS HTMLInputElement interface: createInput("text") must inherit property "placeholder" with the proper type (26) -PASS HTMLInputElement interface: createInput("text") must inherit property "readOnly" with the proper type (27) -PASS HTMLInputElement interface: createInput("text") must inherit property "required" with the proper type (28) -PASS HTMLInputElement interface: createInput("text") must inherit property "size" with the proper type (29) -PASS HTMLInputElement interface: createInput("text") must inherit property "src" with the proper type (30) -PASS HTMLInputElement interface: createInput("text") must inherit property "step" with the proper type (31) -PASS HTMLInputElement interface: createInput("text") must inherit property "type" with the proper type (32) -PASS HTMLInputElement interface: createInput("text") must inherit property "defaultValue" with the proper type (33) -PASS HTMLInputElement interface: createInput("text") must inherit property "value" with the proper type (34) -PASS HTMLInputElement interface: createInput("text") must inherit property "valueAsDate" with the proper type (35) -PASS HTMLInputElement interface: createInput("text") must inherit property "valueAsNumber" with the proper type (36) -PASS HTMLInputElement interface: createInput("text") must inherit property "width" with the proper type (37) -PASS HTMLInputElement interface: createInput("text") must inherit property "stepUp" with the proper type (38) +PASS HTMLInputElement interface: createInput("text") must inherit property "accept" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "alt" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "autocomplete" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "autofocus" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "defaultChecked" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "checked" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "dirName" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "disabled" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "form" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "files" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "formAction" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "formEnctype" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "formMethod" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "formNoValidate" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "formTarget" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "height" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "indeterminate" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "inputMode" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "list" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "max" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "maxLength" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "min" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "minLength" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "multiple" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "name" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "pattern" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "placeholder" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "readOnly" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "required" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "size" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "src" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "step" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "type" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "defaultValue" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "value" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "valueAsDate" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "valueAsNumber" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "width" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "stepUp(long)" with the proper type PASS HTMLInputElement interface: calling stepUp(long) on createInput("text") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("text") must inherit property "stepDown" with the proper type (39) +PASS HTMLInputElement interface: createInput("text") must inherit property "stepDown(long)" with the proper type PASS HTMLInputElement interface: calling stepDown(long) on createInput("text") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("text") must inherit property "willValidate" with the proper type (40) -PASS HTMLInputElement interface: createInput("text") must inherit property "validity" with the proper type (41) -PASS HTMLInputElement interface: createInput("text") must inherit property "validationMessage" with the proper type (42) -PASS HTMLInputElement interface: createInput("text") must inherit property "checkValidity" with the proper type (43) -PASS HTMLInputElement interface: createInput("text") must inherit property "reportValidity" with the proper type (44) -PASS HTMLInputElement interface: createInput("text") must inherit property "setCustomValidity" with the proper type (45) +PASS HTMLInputElement interface: createInput("text") must inherit property "willValidate" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "validity" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "validationMessage" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "checkValidity()" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "reportValidity()" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "setCustomValidity(DOMString)" with the proper type PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("text") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("text") must inherit property "labels" with the proper type (46) -PASS HTMLInputElement interface: createInput("text") must inherit property "select" with the proper type (47) -PASS HTMLInputElement interface: createInput("text") must inherit property "selectionStart" with the proper type (48) -PASS HTMLInputElement interface: createInput("text") must inherit property "selectionEnd" with the proper type (49) -PASS HTMLInputElement interface: createInput("text") must inherit property "selectionDirection" with the proper type (50) -PASS HTMLInputElement interface: createInput("text") must inherit property "setRangeText" with the proper type (51) +PASS HTMLInputElement interface: createInput("text") must inherit property "labels" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "select()" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "selectionStart" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "selectionEnd" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "selectionDirection" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "setRangeText(DOMString)" with the proper type PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("text") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("text") must inherit property "setRangeText" with the proper type (52) -PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("text") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("text") must inherit property "setSelectionRange" with the proper type (53) -PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("text") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("text") must inherit property "align" with the proper type (54) -PASS HTMLInputElement interface: createInput("text") must inherit property "useMap" with the proper type (55) +PASS HTMLInputElement interface: createInput("text") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("text") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("text") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("text") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("text") must inherit property "align" with the proper type +PASS HTMLInputElement interface: createInput("text") must inherit property "useMap" with the proper type PASS HTMLInputElement must be primary interface of createInput("hidden") PASS Stringification of createInput("hidden") -PASS HTMLInputElement interface: createInput("hidden") must inherit property "accept" with the proper type (0) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "alt" with the proper type (1) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "autocomplete" with the proper type (2) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "autofocus" with the proper type (3) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "defaultChecked" with the proper type (4) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "checked" with the proper type (5) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "dirName" with the proper type (6) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "disabled" with the proper type (7) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "form" with the proper type (8) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "files" with the proper type (9) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "formAction" with the proper type (10) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "formEnctype" with the proper type (11) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "formMethod" with the proper type (12) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "formNoValidate" with the proper type (13) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "formTarget" with the proper type (14) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "height" with the proper type (15) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "indeterminate" with the proper type (16) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "inputMode" with the proper type (17) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "list" with the proper type (18) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "max" with the proper type (19) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "maxLength" with the proper type (20) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "min" with the proper type (21) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "minLength" with the proper type (22) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "multiple" with the proper type (23) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "name" with the proper type (24) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "pattern" with the proper type (25) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "placeholder" with the proper type (26) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "readOnly" with the proper type (27) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "required" with the proper type (28) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "size" with the proper type (29) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "src" with the proper type (30) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "step" with the proper type (31) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "type" with the proper type (32) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "defaultValue" with the proper type (33) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "value" with the proper type (34) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "valueAsDate" with the proper type (35) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "valueAsNumber" with the proper type (36) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "width" with the proper type (37) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "stepUp" with the proper type (38) +PASS HTMLInputElement interface: createInput("hidden") must inherit property "accept" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "alt" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "autocomplete" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "autofocus" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "defaultChecked" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "checked" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "dirName" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "disabled" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "form" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "files" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "formAction" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "formEnctype" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "formMethod" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "formNoValidate" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "formTarget" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "height" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "indeterminate" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "inputMode" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "list" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "max" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "maxLength" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "min" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "minLength" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "multiple" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "name" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "pattern" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "placeholder" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "readOnly" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "required" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "size" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "src" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "step" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "type" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "defaultValue" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "value" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "valueAsDate" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "valueAsNumber" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "width" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "stepUp(long)" with the proper type PASS HTMLInputElement interface: calling stepUp(long) on createInput("hidden") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("hidden") must inherit property "stepDown" with the proper type (39) +PASS HTMLInputElement interface: createInput("hidden") must inherit property "stepDown(long)" with the proper type PASS HTMLInputElement interface: calling stepDown(long) on createInput("hidden") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("hidden") must inherit property "willValidate" with the proper type (40) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "validity" with the proper type (41) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "validationMessage" with the proper type (42) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "checkValidity" with the proper type (43) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "reportValidity" with the proper type (44) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "setCustomValidity" with the proper type (45) +PASS HTMLInputElement interface: createInput("hidden") must inherit property "willValidate" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "validity" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "validationMessage" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "checkValidity()" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "reportValidity()" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "setCustomValidity(DOMString)" with the proper type PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("hidden") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("hidden") must inherit property "labels" with the proper type (46) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "select" with the proper type (47) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "selectionStart" with the proper type (48) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "selectionEnd" with the proper type (49) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "selectionDirection" with the proper type (50) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "setRangeText" with the proper type (51) +PASS HTMLInputElement interface: createInput("hidden") must inherit property "labels" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "select()" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "selectionStart" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "selectionEnd" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "selectionDirection" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "setRangeText(DOMString)" with the proper type PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("hidden") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("hidden") must inherit property "setRangeText" with the proper type (52) -PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("hidden") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("hidden") must inherit property "setSelectionRange" with the proper type (53) -PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("hidden") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("hidden") must inherit property "align" with the proper type (54) -PASS HTMLInputElement interface: createInput("hidden") must inherit property "useMap" with the proper type (55) +PASS HTMLInputElement interface: createInput("hidden") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("hidden") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("hidden") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("hidden") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("hidden") must inherit property "align" with the proper type +PASS HTMLInputElement interface: createInput("hidden") must inherit property "useMap" with the proper type PASS HTMLInputElement must be primary interface of createInput("search") PASS Stringification of createInput("search") -PASS HTMLInputElement interface: createInput("search") must inherit property "accept" with the proper type (0) -PASS HTMLInputElement interface: createInput("search") must inherit property "alt" with the proper type (1) -PASS HTMLInputElement interface: createInput("search") must inherit property "autocomplete" with the proper type (2) -PASS HTMLInputElement interface: createInput("search") must inherit property "autofocus" with the proper type (3) -PASS HTMLInputElement interface: createInput("search") must inherit property "defaultChecked" with the proper type (4) -PASS HTMLInputElement interface: createInput("search") must inherit property "checked" with the proper type (5) -PASS HTMLInputElement interface: createInput("search") must inherit property "dirName" with the proper type (6) -PASS HTMLInputElement interface: createInput("search") must inherit property "disabled" with the proper type (7) -PASS HTMLInputElement interface: createInput("search") must inherit property "form" with the proper type (8) -PASS HTMLInputElement interface: createInput("search") must inherit property "files" with the proper type (9) -PASS HTMLInputElement interface: createInput("search") must inherit property "formAction" with the proper type (10) -PASS HTMLInputElement interface: createInput("search") must inherit property "formEnctype" with the proper type (11) -PASS HTMLInputElement interface: createInput("search") must inherit property "formMethod" with the proper type (12) -PASS HTMLInputElement interface: createInput("search") must inherit property "formNoValidate" with the proper type (13) -PASS HTMLInputElement interface: createInput("search") must inherit property "formTarget" with the proper type (14) -PASS HTMLInputElement interface: createInput("search") must inherit property "height" with the proper type (15) -PASS HTMLInputElement interface: createInput("search") must inherit property "indeterminate" with the proper type (16) -PASS HTMLInputElement interface: createInput("search") must inherit property "inputMode" with the proper type (17) -PASS HTMLInputElement interface: createInput("search") must inherit property "list" with the proper type (18) -PASS HTMLInputElement interface: createInput("search") must inherit property "max" with the proper type (19) -PASS HTMLInputElement interface: createInput("search") must inherit property "maxLength" with the proper type (20) -PASS HTMLInputElement interface: createInput("search") must inherit property "min" with the proper type (21) -PASS HTMLInputElement interface: createInput("search") must inherit property "minLength" with the proper type (22) -PASS HTMLInputElement interface: createInput("search") must inherit property "multiple" with the proper type (23) -PASS HTMLInputElement interface: createInput("search") must inherit property "name" with the proper type (24) -PASS HTMLInputElement interface: createInput("search") must inherit property "pattern" with the proper type (25) -PASS HTMLInputElement interface: createInput("search") must inherit property "placeholder" with the proper type (26) -PASS HTMLInputElement interface: createInput("search") must inherit property "readOnly" with the proper type (27) -PASS HTMLInputElement interface: createInput("search") must inherit property "required" with the proper type (28) -PASS HTMLInputElement interface: createInput("search") must inherit property "size" with the proper type (29) -PASS HTMLInputElement interface: createInput("search") must inherit property "src" with the proper type (30) -PASS HTMLInputElement interface: createInput("search") must inherit property "step" with the proper type (31) -PASS HTMLInputElement interface: createInput("search") must inherit property "type" with the proper type (32) -PASS HTMLInputElement interface: createInput("search") must inherit property "defaultValue" with the proper type (33) -PASS HTMLInputElement interface: createInput("search") must inherit property "value" with the proper type (34) -PASS HTMLInputElement interface: createInput("search") must inherit property "valueAsDate" with the proper type (35) -PASS HTMLInputElement interface: createInput("search") must inherit property "valueAsNumber" with the proper type (36) -PASS HTMLInputElement interface: createInput("search") must inherit property "width" with the proper type (37) -PASS HTMLInputElement interface: createInput("search") must inherit property "stepUp" with the proper type (38) +PASS HTMLInputElement interface: createInput("search") must inherit property "accept" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "alt" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "autocomplete" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "autofocus" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "defaultChecked" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "checked" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "dirName" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "disabled" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "form" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "files" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "formAction" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "formEnctype" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "formMethod" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "formNoValidate" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "formTarget" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "height" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "indeterminate" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "inputMode" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "list" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "max" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "maxLength" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "min" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "minLength" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "multiple" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "name" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "pattern" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "placeholder" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "readOnly" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "required" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "size" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "src" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "step" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "type" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "defaultValue" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "value" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "valueAsDate" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "valueAsNumber" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "width" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "stepUp(long)" with the proper type PASS HTMLInputElement interface: calling stepUp(long) on createInput("search") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("search") must inherit property "stepDown" with the proper type (39) +PASS HTMLInputElement interface: createInput("search") must inherit property "stepDown(long)" with the proper type PASS HTMLInputElement interface: calling stepDown(long) on createInput("search") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("search") must inherit property "willValidate" with the proper type (40) -PASS HTMLInputElement interface: createInput("search") must inherit property "validity" with the proper type (41) -PASS HTMLInputElement interface: createInput("search") must inherit property "validationMessage" with the proper type (42) -PASS HTMLInputElement interface: createInput("search") must inherit property "checkValidity" with the proper type (43) -PASS HTMLInputElement interface: createInput("search") must inherit property "reportValidity" with the proper type (44) -PASS HTMLInputElement interface: createInput("search") must inherit property "setCustomValidity" with the proper type (45) +PASS HTMLInputElement interface: createInput("search") must inherit property "willValidate" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "validity" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "validationMessage" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "checkValidity()" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "reportValidity()" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "setCustomValidity(DOMString)" with the proper type PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("search") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("search") must inherit property "labels" with the proper type (46) -PASS HTMLInputElement interface: createInput("search") must inherit property "select" with the proper type (47) -PASS HTMLInputElement interface: createInput("search") must inherit property "selectionStart" with the proper type (48) -PASS HTMLInputElement interface: createInput("search") must inherit property "selectionEnd" with the proper type (49) -PASS HTMLInputElement interface: createInput("search") must inherit property "selectionDirection" with the proper type (50) -PASS HTMLInputElement interface: createInput("search") must inherit property "setRangeText" with the proper type (51) +PASS HTMLInputElement interface: createInput("search") must inherit property "labels" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "select()" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "selectionStart" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "selectionEnd" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "selectionDirection" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "setRangeText(DOMString)" with the proper type PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("search") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("search") must inherit property "setRangeText" with the proper type (52) -PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("search") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("search") must inherit property "setSelectionRange" with the proper type (53) -PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("search") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("search") must inherit property "align" with the proper type (54) -PASS HTMLInputElement interface: createInput("search") must inherit property "useMap" with the proper type (55) +PASS HTMLInputElement interface: createInput("search") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("search") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("search") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("search") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("search") must inherit property "align" with the proper type +PASS HTMLInputElement interface: createInput("search") must inherit property "useMap" with the proper type PASS HTMLInputElement must be primary interface of createInput("tel") PASS Stringification of createInput("tel") -PASS HTMLInputElement interface: createInput("tel") must inherit property "accept" with the proper type (0) -PASS HTMLInputElement interface: createInput("tel") must inherit property "alt" with the proper type (1) -PASS HTMLInputElement interface: createInput("tel") must inherit property "autocomplete" with the proper type (2) -PASS HTMLInputElement interface: createInput("tel") must inherit property "autofocus" with the proper type (3) -PASS HTMLInputElement interface: createInput("tel") must inherit property "defaultChecked" with the proper type (4) -PASS HTMLInputElement interface: createInput("tel") must inherit property "checked" with the proper type (5) -PASS HTMLInputElement interface: createInput("tel") must inherit property "dirName" with the proper type (6) -PASS HTMLInputElement interface: createInput("tel") must inherit property "disabled" with the proper type (7) -PASS HTMLInputElement interface: createInput("tel") must inherit property "form" with the proper type (8) -PASS HTMLInputElement interface: createInput("tel") must inherit property "files" with the proper type (9) -PASS HTMLInputElement interface: createInput("tel") must inherit property "formAction" with the proper type (10) -PASS HTMLInputElement interface: createInput("tel") must inherit property "formEnctype" with the proper type (11) -PASS HTMLInputElement interface: createInput("tel") must inherit property "formMethod" with the proper type (12) -PASS HTMLInputElement interface: createInput("tel") must inherit property "formNoValidate" with the proper type (13) -PASS HTMLInputElement interface: createInput("tel") must inherit property "formTarget" with the proper type (14) -PASS HTMLInputElement interface: createInput("tel") must inherit property "height" with the proper type (15) -PASS HTMLInputElement interface: createInput("tel") must inherit property "indeterminate" with the proper type (16) -PASS HTMLInputElement interface: createInput("tel") must inherit property "inputMode" with the proper type (17) -PASS HTMLInputElement interface: createInput("tel") must inherit property "list" with the proper type (18) -PASS HTMLInputElement interface: createInput("tel") must inherit property "max" with the proper type (19) -PASS HTMLInputElement interface: createInput("tel") must inherit property "maxLength" with the proper type (20) -PASS HTMLInputElement interface: createInput("tel") must inherit property "min" with the proper type (21) -PASS HTMLInputElement interface: createInput("tel") must inherit property "minLength" with the proper type (22) -PASS HTMLInputElement interface: createInput("tel") must inherit property "multiple" with the proper type (23) -PASS HTMLInputElement interface: createInput("tel") must inherit property "name" with the proper type (24) -PASS HTMLInputElement interface: createInput("tel") must inherit property "pattern" with the proper type (25) -PASS HTMLInputElement interface: createInput("tel") must inherit property "placeholder" with the proper type (26) -PASS HTMLInputElement interface: createInput("tel") must inherit property "readOnly" with the proper type (27) -PASS HTMLInputElement interface: createInput("tel") must inherit property "required" with the proper type (28) -PASS HTMLInputElement interface: createInput("tel") must inherit property "size" with the proper type (29) -PASS HTMLInputElement interface: createInput("tel") must inherit property "src" with the proper type (30) -PASS HTMLInputElement interface: createInput("tel") must inherit property "step" with the proper type (31) -PASS HTMLInputElement interface: createInput("tel") must inherit property "type" with the proper type (32) -PASS HTMLInputElement interface: createInput("tel") must inherit property "defaultValue" with the proper type (33) -PASS HTMLInputElement interface: createInput("tel") must inherit property "value" with the proper type (34) -PASS HTMLInputElement interface: createInput("tel") must inherit property "valueAsDate" with the proper type (35) -PASS HTMLInputElement interface: createInput("tel") must inherit property "valueAsNumber" with the proper type (36) -PASS HTMLInputElement interface: createInput("tel") must inherit property "width" with the proper type (37) -PASS HTMLInputElement interface: createInput("tel") must inherit property "stepUp" with the proper type (38) +PASS HTMLInputElement interface: createInput("tel") must inherit property "accept" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "alt" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "autocomplete" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "autofocus" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "defaultChecked" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "checked" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "dirName" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "disabled" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "form" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "files" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "formAction" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "formEnctype" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "formMethod" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "formNoValidate" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "formTarget" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "height" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "indeterminate" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "inputMode" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "list" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "max" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "maxLength" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "min" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "minLength" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "multiple" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "name" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "pattern" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "placeholder" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "readOnly" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "required" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "size" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "src" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "step" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "type" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "defaultValue" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "value" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "valueAsDate" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "valueAsNumber" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "width" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "stepUp(long)" with the proper type PASS HTMLInputElement interface: calling stepUp(long) on createInput("tel") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("tel") must inherit property "stepDown" with the proper type (39) +PASS HTMLInputElement interface: createInput("tel") must inherit property "stepDown(long)" with the proper type PASS HTMLInputElement interface: calling stepDown(long) on createInput("tel") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("tel") must inherit property "willValidate" with the proper type (40) -PASS HTMLInputElement interface: createInput("tel") must inherit property "validity" with the proper type (41) -PASS HTMLInputElement interface: createInput("tel") must inherit property "validationMessage" with the proper type (42) -PASS HTMLInputElement interface: createInput("tel") must inherit property "checkValidity" with the proper type (43) -PASS HTMLInputElement interface: createInput("tel") must inherit property "reportValidity" with the proper type (44) -PASS HTMLInputElement interface: createInput("tel") must inherit property "setCustomValidity" with the proper type (45) +PASS HTMLInputElement interface: createInput("tel") must inherit property "willValidate" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "validity" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "validationMessage" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "checkValidity()" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "reportValidity()" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "setCustomValidity(DOMString)" with the proper type PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("tel") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("tel") must inherit property "labels" with the proper type (46) -PASS HTMLInputElement interface: createInput("tel") must inherit property "select" with the proper type (47) -PASS HTMLInputElement interface: createInput("tel") must inherit property "selectionStart" with the proper type (48) -PASS HTMLInputElement interface: createInput("tel") must inherit property "selectionEnd" with the proper type (49) -PASS HTMLInputElement interface: createInput("tel") must inherit property "selectionDirection" with the proper type (50) -PASS HTMLInputElement interface: createInput("tel") must inherit property "setRangeText" with the proper type (51) +PASS HTMLInputElement interface: createInput("tel") must inherit property "labels" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "select()" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "selectionStart" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "selectionEnd" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "selectionDirection" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "setRangeText(DOMString)" with the proper type PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("tel") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("tel") must inherit property "setRangeText" with the proper type (52) -PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("tel") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("tel") must inherit property "setSelectionRange" with the proper type (53) -PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("tel") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("tel") must inherit property "align" with the proper type (54) -PASS HTMLInputElement interface: createInput("tel") must inherit property "useMap" with the proper type (55) +PASS HTMLInputElement interface: createInput("tel") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("tel") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("tel") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("tel") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("tel") must inherit property "align" with the proper type +PASS HTMLInputElement interface: createInput("tel") must inherit property "useMap" with the proper type PASS HTMLInputElement must be primary interface of createInput("url") PASS Stringification of createInput("url") -PASS HTMLInputElement interface: createInput("url") must inherit property "accept" with the proper type (0) -PASS HTMLInputElement interface: createInput("url") must inherit property "alt" with the proper type (1) -PASS HTMLInputElement interface: createInput("url") must inherit property "autocomplete" with the proper type (2) -PASS HTMLInputElement interface: createInput("url") must inherit property "autofocus" with the proper type (3) -PASS HTMLInputElement interface: createInput("url") must inherit property "defaultChecked" with the proper type (4) -PASS HTMLInputElement interface: createInput("url") must inherit property "checked" with the proper type (5) -PASS HTMLInputElement interface: createInput("url") must inherit property "dirName" with the proper type (6) -PASS HTMLInputElement interface: createInput("url") must inherit property "disabled" with the proper type (7) -PASS HTMLInputElement interface: createInput("url") must inherit property "form" with the proper type (8) -PASS HTMLInputElement interface: createInput("url") must inherit property "files" with the proper type (9) -PASS HTMLInputElement interface: createInput("url") must inherit property "formAction" with the proper type (10) -PASS HTMLInputElement interface: createInput("url") must inherit property "formEnctype" with the proper type (11) -PASS HTMLInputElement interface: createInput("url") must inherit property "formMethod" with the proper type (12) -PASS HTMLInputElement interface: createInput("url") must inherit property "formNoValidate" with the proper type (13) -PASS HTMLInputElement interface: createInput("url") must inherit property "formTarget" with the proper type (14) -PASS HTMLInputElement interface: createInput("url") must inherit property "height" with the proper type (15) -PASS HTMLInputElement interface: createInput("url") must inherit property "indeterminate" with the proper type (16) -PASS HTMLInputElement interface: createInput("url") must inherit property "inputMode" with the proper type (17) -PASS HTMLInputElement interface: createInput("url") must inherit property "list" with the proper type (18) -PASS HTMLInputElement interface: createInput("url") must inherit property "max" with the proper type (19) -PASS HTMLInputElement interface: createInput("url") must inherit property "maxLength" with the proper type (20) -PASS HTMLInputElement interface: createInput("url") must inherit property "min" with the proper type (21) -PASS HTMLInputElement interface: createInput("url") must inherit property "minLength" with the proper type (22) -PASS HTMLInputElement interface: createInput("url") must inherit property "multiple" with the proper type (23) -PASS HTMLInputElement interface: createInput("url") must inherit property "name" with the proper type (24) -PASS HTMLInputElement interface: createInput("url") must inherit property "pattern" with the proper type (25) -PASS HTMLInputElement interface: createInput("url") must inherit property "placeholder" with the proper type (26) -PASS HTMLInputElement interface: createInput("url") must inherit property "readOnly" with the proper type (27) -PASS HTMLInputElement interface: createInput("url") must inherit property "required" with the proper type (28) -PASS HTMLInputElement interface: createInput("url") must inherit property "size" with the proper type (29) -PASS HTMLInputElement interface: createInput("url") must inherit property "src" with the proper type (30) -PASS HTMLInputElement interface: createInput("url") must inherit property "step" with the proper type (31) -PASS HTMLInputElement interface: createInput("url") must inherit property "type" with the proper type (32) -PASS HTMLInputElement interface: createInput("url") must inherit property "defaultValue" with the proper type (33) -PASS HTMLInputElement interface: createInput("url") must inherit property "value" with the proper type (34) -PASS HTMLInputElement interface: createInput("url") must inherit property "valueAsDate" with the proper type (35) -PASS HTMLInputElement interface: createInput("url") must inherit property "valueAsNumber" with the proper type (36) -PASS HTMLInputElement interface: createInput("url") must inherit property "width" with the proper type (37) -PASS HTMLInputElement interface: createInput("url") must inherit property "stepUp" with the proper type (38) +PASS HTMLInputElement interface: createInput("url") must inherit property "accept" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "alt" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "autocomplete" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "autofocus" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "defaultChecked" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "checked" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "dirName" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "disabled" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "form" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "files" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "formAction" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "formEnctype" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "formMethod" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "formNoValidate" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "formTarget" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "height" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "indeterminate" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "inputMode" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "list" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "max" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "maxLength" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "min" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "minLength" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "multiple" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "name" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "pattern" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "placeholder" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "readOnly" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "required" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "size" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "src" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "step" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "type" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "defaultValue" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "value" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "valueAsDate" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "valueAsNumber" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "width" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "stepUp(long)" with the proper type PASS HTMLInputElement interface: calling stepUp(long) on createInput("url") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("url") must inherit property "stepDown" with the proper type (39) +PASS HTMLInputElement interface: createInput("url") must inherit property "stepDown(long)" with the proper type PASS HTMLInputElement interface: calling stepDown(long) on createInput("url") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("url") must inherit property "willValidate" with the proper type (40) -PASS HTMLInputElement interface: createInput("url") must inherit property "validity" with the proper type (41) -PASS HTMLInputElement interface: createInput("url") must inherit property "validationMessage" with the proper type (42) -PASS HTMLInputElement interface: createInput("url") must inherit property "checkValidity" with the proper type (43) -PASS HTMLInputElement interface: createInput("url") must inherit property "reportValidity" with the proper type (44) -PASS HTMLInputElement interface: createInput("url") must inherit property "setCustomValidity" with the proper type (45) +PASS HTMLInputElement interface: createInput("url") must inherit property "willValidate" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "validity" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "validationMessage" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "checkValidity()" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "reportValidity()" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "setCustomValidity(DOMString)" with the proper type PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("url") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("url") must inherit property "labels" with the proper type (46) -PASS HTMLInputElement interface: createInput("url") must inherit property "select" with the proper type (47) -PASS HTMLInputElement interface: createInput("url") must inherit property "selectionStart" with the proper type (48) -PASS HTMLInputElement interface: createInput("url") must inherit property "selectionEnd" with the proper type (49) -PASS HTMLInputElement interface: createInput("url") must inherit property "selectionDirection" with the proper type (50) -PASS HTMLInputElement interface: createInput("url") must inherit property "setRangeText" with the proper type (51) +PASS HTMLInputElement interface: createInput("url") must inherit property "labels" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "select()" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "selectionStart" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "selectionEnd" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "selectionDirection" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "setRangeText(DOMString)" with the proper type PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("url") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("url") must inherit property "setRangeText" with the proper type (52) -PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("url") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("url") must inherit property "setSelectionRange" with the proper type (53) -PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("url") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("url") must inherit property "align" with the proper type (54) -PASS HTMLInputElement interface: createInput("url") must inherit property "useMap" with the proper type (55) +PASS HTMLInputElement interface: createInput("url") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("url") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("url") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("url") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("url") must inherit property "align" with the proper type +PASS HTMLInputElement interface: createInput("url") must inherit property "useMap" with the proper type PASS HTMLInputElement must be primary interface of createInput("email") PASS Stringification of createInput("email") -PASS HTMLInputElement interface: createInput("email") must inherit property "accept" with the proper type (0) -PASS HTMLInputElement interface: createInput("email") must inherit property "alt" with the proper type (1) -PASS HTMLInputElement interface: createInput("email") must inherit property "autocomplete" with the proper type (2) -PASS HTMLInputElement interface: createInput("email") must inherit property "autofocus" with the proper type (3) -PASS HTMLInputElement interface: createInput("email") must inherit property "defaultChecked" with the proper type (4) -PASS HTMLInputElement interface: createInput("email") must inherit property "checked" with the proper type (5) -PASS HTMLInputElement interface: createInput("email") must inherit property "dirName" with the proper type (6) -PASS HTMLInputElement interface: createInput("email") must inherit property "disabled" with the proper type (7) -PASS HTMLInputElement interface: createInput("email") must inherit property "form" with the proper type (8) -PASS HTMLInputElement interface: createInput("email") must inherit property "files" with the proper type (9) -PASS HTMLInputElement interface: createInput("email") must inherit property "formAction" with the proper type (10) -PASS HTMLInputElement interface: createInput("email") must inherit property "formEnctype" with the proper type (11) -PASS HTMLInputElement interface: createInput("email") must inherit property "formMethod" with the proper type (12) -PASS HTMLInputElement interface: createInput("email") must inherit property "formNoValidate" with the proper type (13) -PASS HTMLInputElement interface: createInput("email") must inherit property "formTarget" with the proper type (14) -PASS HTMLInputElement interface: createInput("email") must inherit property "height" with the proper type (15) -PASS HTMLInputElement interface: createInput("email") must inherit property "indeterminate" with the proper type (16) -PASS HTMLInputElement interface: createInput("email") must inherit property "inputMode" with the proper type (17) -PASS HTMLInputElement interface: createInput("email") must inherit property "list" with the proper type (18) -PASS HTMLInputElement interface: createInput("email") must inherit property "max" with the proper type (19) -PASS HTMLInputElement interface: createInput("email") must inherit property "maxLength" with the proper type (20) -PASS HTMLInputElement interface: createInput("email") must inherit property "min" with the proper type (21) -PASS HTMLInputElement interface: createInput("email") must inherit property "minLength" with the proper type (22) -PASS HTMLInputElement interface: createInput("email") must inherit property "multiple" with the proper type (23) -PASS HTMLInputElement interface: createInput("email") must inherit property "name" with the proper type (24) -PASS HTMLInputElement interface: createInput("email") must inherit property "pattern" with the proper type (25) -PASS HTMLInputElement interface: createInput("email") must inherit property "placeholder" with the proper type (26) -PASS HTMLInputElement interface: createInput("email") must inherit property "readOnly" with the proper type (27) -PASS HTMLInputElement interface: createInput("email") must inherit property "required" with the proper type (28) -PASS HTMLInputElement interface: createInput("email") must inherit property "size" with the proper type (29) -PASS HTMLInputElement interface: createInput("email") must inherit property "src" with the proper type (30) -PASS HTMLInputElement interface: createInput("email") must inherit property "step" with the proper type (31) -PASS HTMLInputElement interface: createInput("email") must inherit property "type" with the proper type (32) -PASS HTMLInputElement interface: createInput("email") must inherit property "defaultValue" with the proper type (33) -PASS HTMLInputElement interface: createInput("email") must inherit property "value" with the proper type (34) -PASS HTMLInputElement interface: createInput("email") must inherit property "valueAsDate" with the proper type (35) -PASS HTMLInputElement interface: createInput("email") must inherit property "valueAsNumber" with the proper type (36) -PASS HTMLInputElement interface: createInput("email") must inherit property "width" with the proper type (37) -PASS HTMLInputElement interface: createInput("email") must inherit property "stepUp" with the proper type (38) +PASS HTMLInputElement interface: createInput("email") must inherit property "accept" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "alt" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "autocomplete" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "autofocus" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "defaultChecked" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "checked" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "dirName" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "disabled" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "form" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "files" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "formAction" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "formEnctype" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "formMethod" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "formNoValidate" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "formTarget" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "height" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "indeterminate" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "inputMode" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "list" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "max" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "maxLength" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "min" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "minLength" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "multiple" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "name" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "pattern" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "placeholder" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "readOnly" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "required" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "size" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "src" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "step" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "type" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "defaultValue" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "value" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "valueAsDate" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "valueAsNumber" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "width" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "stepUp(long)" with the proper type PASS HTMLInputElement interface: calling stepUp(long) on createInput("email") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("email") must inherit property "stepDown" with the proper type (39) +PASS HTMLInputElement interface: createInput("email") must inherit property "stepDown(long)" with the proper type PASS HTMLInputElement interface: calling stepDown(long) on createInput("email") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("email") must inherit property "willValidate" with the proper type (40) -PASS HTMLInputElement interface: createInput("email") must inherit property "validity" with the proper type (41) -PASS HTMLInputElement interface: createInput("email") must inherit property "validationMessage" with the proper type (42) -PASS HTMLInputElement interface: createInput("email") must inherit property "checkValidity" with the proper type (43) -PASS HTMLInputElement interface: createInput("email") must inherit property "reportValidity" with the proper type (44) -PASS HTMLInputElement interface: createInput("email") must inherit property "setCustomValidity" with the proper type (45) +PASS HTMLInputElement interface: createInput("email") must inherit property "willValidate" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "validity" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "validationMessage" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "checkValidity()" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "reportValidity()" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "setCustomValidity(DOMString)" with the proper type PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("email") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("email") must inherit property "labels" with the proper type (46) -PASS HTMLInputElement interface: createInput("email") must inherit property "select" with the proper type (47) -PASS HTMLInputElement interface: createInput("email") must inherit property "selectionStart" with the proper type (48) -PASS HTMLInputElement interface: createInput("email") must inherit property "selectionEnd" with the proper type (49) -PASS HTMLInputElement interface: createInput("email") must inherit property "selectionDirection" with the proper type (50) -PASS HTMLInputElement interface: createInput("email") must inherit property "setRangeText" with the proper type (51) +PASS HTMLInputElement interface: createInput("email") must inherit property "labels" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "select()" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "selectionStart" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "selectionEnd" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "selectionDirection" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "setRangeText(DOMString)" with the proper type PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("email") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("email") must inherit property "setRangeText" with the proper type (52) -PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("email") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("email") must inherit property "setSelectionRange" with the proper type (53) -PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("email") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("email") must inherit property "align" with the proper type (54) -PASS HTMLInputElement interface: createInput("email") must inherit property "useMap" with the proper type (55) +PASS HTMLInputElement interface: createInput("email") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("email") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("email") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("email") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("email") must inherit property "align" with the proper type +PASS HTMLInputElement interface: createInput("email") must inherit property "useMap" with the proper type PASS HTMLInputElement must be primary interface of createInput("password") PASS Stringification of createInput("password") -PASS HTMLInputElement interface: createInput("password") must inherit property "accept" with the proper type (0) -PASS HTMLInputElement interface: createInput("password") must inherit property "alt" with the proper type (1) -PASS HTMLInputElement interface: createInput("password") must inherit property "autocomplete" with the proper type (2) -PASS HTMLInputElement interface: createInput("password") must inherit property "autofocus" with the proper type (3) -PASS HTMLInputElement interface: createInput("password") must inherit property "defaultChecked" with the proper type (4) -PASS HTMLInputElement interface: createInput("password") must inherit property "checked" with the proper type (5) -PASS HTMLInputElement interface: createInput("password") must inherit property "dirName" with the proper type (6) -PASS HTMLInputElement interface: createInput("password") must inherit property "disabled" with the proper type (7) -PASS HTMLInputElement interface: createInput("password") must inherit property "form" with the proper type (8) -PASS HTMLInputElement interface: createInput("password") must inherit property "files" with the proper type (9) -PASS HTMLInputElement interface: createInput("password") must inherit property "formAction" with the proper type (10) -PASS HTMLInputElement interface: createInput("password") must inherit property "formEnctype" with the proper type (11) -PASS HTMLInputElement interface: createInput("password") must inherit property "formMethod" with the proper type (12) -PASS HTMLInputElement interface: createInput("password") must inherit property "formNoValidate" with the proper type (13) -PASS HTMLInputElement interface: createInput("password") must inherit property "formTarget" with the proper type (14) -PASS HTMLInputElement interface: createInput("password") must inherit property "height" with the proper type (15) -PASS HTMLInputElement interface: createInput("password") must inherit property "indeterminate" with the proper type (16) -PASS HTMLInputElement interface: createInput("password") must inherit property "inputMode" with the proper type (17) -PASS HTMLInputElement interface: createInput("password") must inherit property "list" with the proper type (18) -PASS HTMLInputElement interface: createInput("password") must inherit property "max" with the proper type (19) -PASS HTMLInputElement interface: createInput("password") must inherit property "maxLength" with the proper type (20) -PASS HTMLInputElement interface: createInput("password") must inherit property "min" with the proper type (21) -PASS HTMLInputElement interface: createInput("password") must inherit property "minLength" with the proper type (22) -PASS HTMLInputElement interface: createInput("password") must inherit property "multiple" with the proper type (23) -PASS HTMLInputElement interface: createInput("password") must inherit property "name" with the proper type (24) -PASS HTMLInputElement interface: createInput("password") must inherit property "pattern" with the proper type (25) -PASS HTMLInputElement interface: createInput("password") must inherit property "placeholder" with the proper type (26) -PASS HTMLInputElement interface: createInput("password") must inherit property "readOnly" with the proper type (27) -PASS HTMLInputElement interface: createInput("password") must inherit property "required" with the proper type (28) -PASS HTMLInputElement interface: createInput("password") must inherit property "size" with the proper type (29) -PASS HTMLInputElement interface: createInput("password") must inherit property "src" with the proper type (30) -PASS HTMLInputElement interface: createInput("password") must inherit property "step" with the proper type (31) -PASS HTMLInputElement interface: createInput("password") must inherit property "type" with the proper type (32) -PASS HTMLInputElement interface: createInput("password") must inherit property "defaultValue" with the proper type (33) -PASS HTMLInputElement interface: createInput("password") must inherit property "value" with the proper type (34) -PASS HTMLInputElement interface: createInput("password") must inherit property "valueAsDate" with the proper type (35) -PASS HTMLInputElement interface: createInput("password") must inherit property "valueAsNumber" with the proper type (36) -PASS HTMLInputElement interface: createInput("password") must inherit property "width" with the proper type (37) -PASS HTMLInputElement interface: createInput("password") must inherit property "stepUp" with the proper type (38) +PASS HTMLInputElement interface: createInput("password") must inherit property "accept" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "alt" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "autocomplete" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "autofocus" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "defaultChecked" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "checked" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "dirName" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "disabled" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "form" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "files" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "formAction" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "formEnctype" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "formMethod" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "formNoValidate" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "formTarget" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "height" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "indeterminate" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "inputMode" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "list" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "max" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "maxLength" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "min" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "minLength" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "multiple" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "name" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "pattern" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "placeholder" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "readOnly" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "required" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "size" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "src" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "step" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "type" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "defaultValue" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "value" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "valueAsDate" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "valueAsNumber" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "width" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "stepUp(long)" with the proper type PASS HTMLInputElement interface: calling stepUp(long) on createInput("password") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("password") must inherit property "stepDown" with the proper type (39) +PASS HTMLInputElement interface: createInput("password") must inherit property "stepDown(long)" with the proper type PASS HTMLInputElement interface: calling stepDown(long) on createInput("password") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("password") must inherit property "willValidate" with the proper type (40) -PASS HTMLInputElement interface: createInput("password") must inherit property "validity" with the proper type (41) -PASS HTMLInputElement interface: createInput("password") must inherit property "validationMessage" with the proper type (42) -PASS HTMLInputElement interface: createInput("password") must inherit property "checkValidity" with the proper type (43) -PASS HTMLInputElement interface: createInput("password") must inherit property "reportValidity" with the proper type (44) -PASS HTMLInputElement interface: createInput("password") must inherit property "setCustomValidity" with the proper type (45) +PASS HTMLInputElement interface: createInput("password") must inherit property "willValidate" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "validity" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "validationMessage" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "checkValidity()" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "reportValidity()" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "setCustomValidity(DOMString)" with the proper type PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("password") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("password") must inherit property "labels" with the proper type (46) -PASS HTMLInputElement interface: createInput("password") must inherit property "select" with the proper type (47) -PASS HTMLInputElement interface: createInput("password") must inherit property "selectionStart" with the proper type (48) -PASS HTMLInputElement interface: createInput("password") must inherit property "selectionEnd" with the proper type (49) -PASS HTMLInputElement interface: createInput("password") must inherit property "selectionDirection" with the proper type (50) -PASS HTMLInputElement interface: createInput("password") must inherit property "setRangeText" with the proper type (51) +PASS HTMLInputElement interface: createInput("password") must inherit property "labels" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "select()" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "selectionStart" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "selectionEnd" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "selectionDirection" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "setRangeText(DOMString)" with the proper type PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("password") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("password") must inherit property "setRangeText" with the proper type (52) -PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("password") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("password") must inherit property "setSelectionRange" with the proper type (53) -PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("password") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("password") must inherit property "align" with the proper type (54) -PASS HTMLInputElement interface: createInput("password") must inherit property "useMap" with the proper type (55) +PASS HTMLInputElement interface: createInput("password") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("password") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("password") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("password") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("password") must inherit property "align" with the proper type +PASS HTMLInputElement interface: createInput("password") must inherit property "useMap" with the proper type PASS HTMLInputElement must be primary interface of createInput("date") PASS Stringification of createInput("date") -PASS HTMLInputElement interface: createInput("date") must inherit property "accept" with the proper type (0) -PASS HTMLInputElement interface: createInput("date") must inherit property "alt" with the proper type (1) -PASS HTMLInputElement interface: createInput("date") must inherit property "autocomplete" with the proper type (2) -PASS HTMLInputElement interface: createInput("date") must inherit property "autofocus" with the proper type (3) -PASS HTMLInputElement interface: createInput("date") must inherit property "defaultChecked" with the proper type (4) -PASS HTMLInputElement interface: createInput("date") must inherit property "checked" with the proper type (5) -PASS HTMLInputElement interface: createInput("date") must inherit property "dirName" with the proper type (6) -PASS HTMLInputElement interface: createInput("date") must inherit property "disabled" with the proper type (7) -PASS HTMLInputElement interface: createInput("date") must inherit property "form" with the proper type (8) -PASS HTMLInputElement interface: createInput("date") must inherit property "files" with the proper type (9) -PASS HTMLInputElement interface: createInput("date") must inherit property "formAction" with the proper type (10) -PASS HTMLInputElement interface: createInput("date") must inherit property "formEnctype" with the proper type (11) -PASS HTMLInputElement interface: createInput("date") must inherit property "formMethod" with the proper type (12) -PASS HTMLInputElement interface: createInput("date") must inherit property "formNoValidate" with the proper type (13) -PASS HTMLInputElement interface: createInput("date") must inherit property "formTarget" with the proper type (14) -PASS HTMLInputElement interface: createInput("date") must inherit property "height" with the proper type (15) -PASS HTMLInputElement interface: createInput("date") must inherit property "indeterminate" with the proper type (16) -PASS HTMLInputElement interface: createInput("date") must inherit property "inputMode" with the proper type (17) -PASS HTMLInputElement interface: createInput("date") must inherit property "list" with the proper type (18) -PASS HTMLInputElement interface: createInput("date") must inherit property "max" with the proper type (19) -PASS HTMLInputElement interface: createInput("date") must inherit property "maxLength" with the proper type (20) -PASS HTMLInputElement interface: createInput("date") must inherit property "min" with the proper type (21) -PASS HTMLInputElement interface: createInput("date") must inherit property "minLength" with the proper type (22) -PASS HTMLInputElement interface: createInput("date") must inherit property "multiple" with the proper type (23) -PASS HTMLInputElement interface: createInput("date") must inherit property "name" with the proper type (24) -PASS HTMLInputElement interface: createInput("date") must inherit property "pattern" with the proper type (25) -PASS HTMLInputElement interface: createInput("date") must inherit property "placeholder" with the proper type (26) -PASS HTMLInputElement interface: createInput("date") must inherit property "readOnly" with the proper type (27) -PASS HTMLInputElement interface: createInput("date") must inherit property "required" with the proper type (28) -PASS HTMLInputElement interface: createInput("date") must inherit property "size" with the proper type (29) -PASS HTMLInputElement interface: createInput("date") must inherit property "src" with the proper type (30) -PASS HTMLInputElement interface: createInput("date") must inherit property "step" with the proper type (31) -PASS HTMLInputElement interface: createInput("date") must inherit property "type" with the proper type (32) -PASS HTMLInputElement interface: createInput("date") must inherit property "defaultValue" with the proper type (33) -PASS HTMLInputElement interface: createInput("date") must inherit property "value" with the proper type (34) -PASS HTMLInputElement interface: createInput("date") must inherit property "valueAsDate" with the proper type (35) -PASS HTMLInputElement interface: createInput("date") must inherit property "valueAsNumber" with the proper type (36) -PASS HTMLInputElement interface: createInput("date") must inherit property "width" with the proper type (37) -PASS HTMLInputElement interface: createInput("date") must inherit property "stepUp" with the proper type (38) +PASS HTMLInputElement interface: createInput("date") must inherit property "accept" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "alt" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "autocomplete" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "autofocus" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "defaultChecked" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "checked" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "dirName" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "disabled" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "form" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "files" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "formAction" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "formEnctype" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "formMethod" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "formNoValidate" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "formTarget" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "height" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "indeterminate" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "inputMode" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "list" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "max" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "maxLength" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "min" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "minLength" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "multiple" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "name" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "pattern" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "placeholder" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "readOnly" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "required" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "size" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "src" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "step" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "type" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "defaultValue" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "value" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "valueAsDate" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "valueAsNumber" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "width" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "stepUp(long)" with the proper type PASS HTMLInputElement interface: calling stepUp(long) on createInput("date") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("date") must inherit property "stepDown" with the proper type (39) +PASS HTMLInputElement interface: createInput("date") must inherit property "stepDown(long)" with the proper type PASS HTMLInputElement interface: calling stepDown(long) on createInput("date") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("date") must inherit property "willValidate" with the proper type (40) -PASS HTMLInputElement interface: createInput("date") must inherit property "validity" with the proper type (41) -PASS HTMLInputElement interface: createInput("date") must inherit property "validationMessage" with the proper type (42) -PASS HTMLInputElement interface: createInput("date") must inherit property "checkValidity" with the proper type (43) -PASS HTMLInputElement interface: createInput("date") must inherit property "reportValidity" with the proper type (44) -PASS HTMLInputElement interface: createInput("date") must inherit property "setCustomValidity" with the proper type (45) +PASS HTMLInputElement interface: createInput("date") must inherit property "willValidate" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "validity" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "validationMessage" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "checkValidity()" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "reportValidity()" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "setCustomValidity(DOMString)" with the proper type PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("date") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("date") must inherit property "labels" with the proper type (46) -PASS HTMLInputElement interface: createInput("date") must inherit property "select" with the proper type (47) -PASS HTMLInputElement interface: createInput("date") must inherit property "selectionStart" with the proper type (48) -PASS HTMLInputElement interface: createInput("date") must inherit property "selectionEnd" with the proper type (49) -PASS HTMLInputElement interface: createInput("date") must inherit property "selectionDirection" with the proper type (50) -PASS HTMLInputElement interface: createInput("date") must inherit property "setRangeText" with the proper type (51) +PASS HTMLInputElement interface: createInput("date") must inherit property "labels" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "select()" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "selectionStart" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "selectionEnd" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "selectionDirection" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "setRangeText(DOMString)" with the proper type PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("date") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("date") must inherit property "setRangeText" with the proper type (52) -PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("date") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("date") must inherit property "setSelectionRange" with the proper type (53) -PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("date") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("date") must inherit property "align" with the proper type (54) -PASS HTMLInputElement interface: createInput("date") must inherit property "useMap" with the proper type (55) +PASS HTMLInputElement interface: createInput("date") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("date") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("date") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("date") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("date") must inherit property "align" with the proper type +PASS HTMLInputElement interface: createInput("date") must inherit property "useMap" with the proper type PASS HTMLInputElement must be primary interface of createInput("month") PASS Stringification of createInput("month") -PASS HTMLInputElement interface: createInput("month") must inherit property "accept" with the proper type (0) -PASS HTMLInputElement interface: createInput("month") must inherit property "alt" with the proper type (1) -PASS HTMLInputElement interface: createInput("month") must inherit property "autocomplete" with the proper type (2) -PASS HTMLInputElement interface: createInput("month") must inherit property "autofocus" with the proper type (3) -PASS HTMLInputElement interface: createInput("month") must inherit property "defaultChecked" with the proper type (4) -PASS HTMLInputElement interface: createInput("month") must inherit property "checked" with the proper type (5) -PASS HTMLInputElement interface: createInput("month") must inherit property "dirName" with the proper type (6) -PASS HTMLInputElement interface: createInput("month") must inherit property "disabled" with the proper type (7) -PASS HTMLInputElement interface: createInput("month") must inherit property "form" with the proper type (8) -PASS HTMLInputElement interface: createInput("month") must inherit property "files" with the proper type (9) -PASS HTMLInputElement interface: createInput("month") must inherit property "formAction" with the proper type (10) -PASS HTMLInputElement interface: createInput("month") must inherit property "formEnctype" with the proper type (11) -PASS HTMLInputElement interface: createInput("month") must inherit property "formMethod" with the proper type (12) -PASS HTMLInputElement interface: createInput("month") must inherit property "formNoValidate" with the proper type (13) -PASS HTMLInputElement interface: createInput("month") must inherit property "formTarget" with the proper type (14) -PASS HTMLInputElement interface: createInput("month") must inherit property "height" with the proper type (15) -PASS HTMLInputElement interface: createInput("month") must inherit property "indeterminate" with the proper type (16) -PASS HTMLInputElement interface: createInput("month") must inherit property "inputMode" with the proper type (17) -PASS HTMLInputElement interface: createInput("month") must inherit property "list" with the proper type (18) -PASS HTMLInputElement interface: createInput("month") must inherit property "max" with the proper type (19) -PASS HTMLInputElement interface: createInput("month") must inherit property "maxLength" with the proper type (20) -PASS HTMLInputElement interface: createInput("month") must inherit property "min" with the proper type (21) -PASS HTMLInputElement interface: createInput("month") must inherit property "minLength" with the proper type (22) -PASS HTMLInputElement interface: createInput("month") must inherit property "multiple" with the proper type (23) -PASS HTMLInputElement interface: createInput("month") must inherit property "name" with the proper type (24) -PASS HTMLInputElement interface: createInput("month") must inherit property "pattern" with the proper type (25) -PASS HTMLInputElement interface: createInput("month") must inherit property "placeholder" with the proper type (26) -PASS HTMLInputElement interface: createInput("month") must inherit property "readOnly" with the proper type (27) -PASS HTMLInputElement interface: createInput("month") must inherit property "required" with the proper type (28) -PASS HTMLInputElement interface: createInput("month") must inherit property "size" with the proper type (29) -PASS HTMLInputElement interface: createInput("month") must inherit property "src" with the proper type (30) -PASS HTMLInputElement interface: createInput("month") must inherit property "step" with the proper type (31) -PASS HTMLInputElement interface: createInput("month") must inherit property "type" with the proper type (32) -PASS HTMLInputElement interface: createInput("month") must inherit property "defaultValue" with the proper type (33) -PASS HTMLInputElement interface: createInput("month") must inherit property "value" with the proper type (34) -PASS HTMLInputElement interface: createInput("month") must inherit property "valueAsDate" with the proper type (35) -PASS HTMLInputElement interface: createInput("month") must inherit property "valueAsNumber" with the proper type (36) -PASS HTMLInputElement interface: createInput("month") must inherit property "width" with the proper type (37) -PASS HTMLInputElement interface: createInput("month") must inherit property "stepUp" with the proper type (38) +PASS HTMLInputElement interface: createInput("month") must inherit property "accept" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "alt" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "autocomplete" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "autofocus" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "defaultChecked" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "checked" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "dirName" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "disabled" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "form" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "files" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "formAction" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "formEnctype" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "formMethod" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "formNoValidate" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "formTarget" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "height" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "indeterminate" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "inputMode" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "list" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "max" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "maxLength" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "min" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "minLength" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "multiple" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "name" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "pattern" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "placeholder" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "readOnly" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "required" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "size" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "src" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "step" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "type" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "defaultValue" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "value" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "valueAsDate" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "valueAsNumber" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "width" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "stepUp(long)" with the proper type PASS HTMLInputElement interface: calling stepUp(long) on createInput("month") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("month") must inherit property "stepDown" with the proper type (39) +PASS HTMLInputElement interface: createInput("month") must inherit property "stepDown(long)" with the proper type PASS HTMLInputElement interface: calling stepDown(long) on createInput("month") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("month") must inherit property "willValidate" with the proper type (40) -PASS HTMLInputElement interface: createInput("month") must inherit property "validity" with the proper type (41) -PASS HTMLInputElement interface: createInput("month") must inherit property "validationMessage" with the proper type (42) -PASS HTMLInputElement interface: createInput("month") must inherit property "checkValidity" with the proper type (43) -PASS HTMLInputElement interface: createInput("month") must inherit property "reportValidity" with the proper type (44) -PASS HTMLInputElement interface: createInput("month") must inherit property "setCustomValidity" with the proper type (45) +PASS HTMLInputElement interface: createInput("month") must inherit property "willValidate" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "validity" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "validationMessage" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "checkValidity()" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "reportValidity()" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "setCustomValidity(DOMString)" with the proper type PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("month") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("month") must inherit property "labels" with the proper type (46) -PASS HTMLInputElement interface: createInput("month") must inherit property "select" with the proper type (47) -PASS HTMLInputElement interface: createInput("month") must inherit property "selectionStart" with the proper type (48) -PASS HTMLInputElement interface: createInput("month") must inherit property "selectionEnd" with the proper type (49) -PASS HTMLInputElement interface: createInput("month") must inherit property "selectionDirection" with the proper type (50) -PASS HTMLInputElement interface: createInput("month") must inherit property "setRangeText" with the proper type (51) +PASS HTMLInputElement interface: createInput("month") must inherit property "labels" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "select()" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "selectionStart" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "selectionEnd" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "selectionDirection" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "setRangeText(DOMString)" with the proper type PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("month") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("month") must inherit property "setRangeText" with the proper type (52) -PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("month") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("month") must inherit property "setSelectionRange" with the proper type (53) -PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("month") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("month") must inherit property "align" with the proper type (54) -PASS HTMLInputElement interface: createInput("month") must inherit property "useMap" with the proper type (55) +PASS HTMLInputElement interface: createInput("month") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("month") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("month") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("month") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("month") must inherit property "align" with the proper type +PASS HTMLInputElement interface: createInput("month") must inherit property "useMap" with the proper type PASS HTMLInputElement must be primary interface of createInput("week") PASS Stringification of createInput("week") -PASS HTMLInputElement interface: createInput("week") must inherit property "accept" with the proper type (0) -PASS HTMLInputElement interface: createInput("week") must inherit property "alt" with the proper type (1) -PASS HTMLInputElement interface: createInput("week") must inherit property "autocomplete" with the proper type (2) -PASS HTMLInputElement interface: createInput("week") must inherit property "autofocus" with the proper type (3) -PASS HTMLInputElement interface: createInput("week") must inherit property "defaultChecked" with the proper type (4) -PASS HTMLInputElement interface: createInput("week") must inherit property "checked" with the proper type (5) -PASS HTMLInputElement interface: createInput("week") must inherit property "dirName" with the proper type (6) -PASS HTMLInputElement interface: createInput("week") must inherit property "disabled" with the proper type (7) -PASS HTMLInputElement interface: createInput("week") must inherit property "form" with the proper type (8) -PASS HTMLInputElement interface: createInput("week") must inherit property "files" with the proper type (9) -PASS HTMLInputElement interface: createInput("week") must inherit property "formAction" with the proper type (10) -PASS HTMLInputElement interface: createInput("week") must inherit property "formEnctype" with the proper type (11) -PASS HTMLInputElement interface: createInput("week") must inherit property "formMethod" with the proper type (12) -PASS HTMLInputElement interface: createInput("week") must inherit property "formNoValidate" with the proper type (13) -PASS HTMLInputElement interface: createInput("week") must inherit property "formTarget" with the proper type (14) -PASS HTMLInputElement interface: createInput("week") must inherit property "height" with the proper type (15) -PASS HTMLInputElement interface: createInput("week") must inherit property "indeterminate" with the proper type (16) -PASS HTMLInputElement interface: createInput("week") must inherit property "inputMode" with the proper type (17) -PASS HTMLInputElement interface: createInput("week") must inherit property "list" with the proper type (18) -PASS HTMLInputElement interface: createInput("week") must inherit property "max" with the proper type (19) -PASS HTMLInputElement interface: createInput("week") must inherit property "maxLength" with the proper type (20) -PASS HTMLInputElement interface: createInput("week") must inherit property "min" with the proper type (21) -PASS HTMLInputElement interface: createInput("week") must inherit property "minLength" with the proper type (22) -PASS HTMLInputElement interface: createInput("week") must inherit property "multiple" with the proper type (23) -PASS HTMLInputElement interface: createInput("week") must inherit property "name" with the proper type (24) -PASS HTMLInputElement interface: createInput("week") must inherit property "pattern" with the proper type (25) -PASS HTMLInputElement interface: createInput("week") must inherit property "placeholder" with the proper type (26) -PASS HTMLInputElement interface: createInput("week") must inherit property "readOnly" with the proper type (27) -PASS HTMLInputElement interface: createInput("week") must inherit property "required" with the proper type (28) -PASS HTMLInputElement interface: createInput("week") must inherit property "size" with the proper type (29) -PASS HTMLInputElement interface: createInput("week") must inherit property "src" with the proper type (30) -PASS HTMLInputElement interface: createInput("week") must inherit property "step" with the proper type (31) -PASS HTMLInputElement interface: createInput("week") must inherit property "type" with the proper type (32) -PASS HTMLInputElement interface: createInput("week") must inherit property "defaultValue" with the proper type (33) -PASS HTMLInputElement interface: createInput("week") must inherit property "value" with the proper type (34) -PASS HTMLInputElement interface: createInput("week") must inherit property "valueAsDate" with the proper type (35) -PASS HTMLInputElement interface: createInput("week") must inherit property "valueAsNumber" with the proper type (36) -PASS HTMLInputElement interface: createInput("week") must inherit property "width" with the proper type (37) -PASS HTMLInputElement interface: createInput("week") must inherit property "stepUp" with the proper type (38) +PASS HTMLInputElement interface: createInput("week") must inherit property "accept" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "alt" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "autocomplete" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "autofocus" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "defaultChecked" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "checked" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "dirName" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "disabled" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "form" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "files" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "formAction" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "formEnctype" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "formMethod" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "formNoValidate" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "formTarget" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "height" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "indeterminate" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "inputMode" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "list" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "max" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "maxLength" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "min" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "minLength" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "multiple" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "name" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "pattern" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "placeholder" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "readOnly" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "required" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "size" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "src" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "step" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "type" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "defaultValue" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "value" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "valueAsDate" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "valueAsNumber" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "width" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "stepUp(long)" with the proper type PASS HTMLInputElement interface: calling stepUp(long) on createInput("week") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("week") must inherit property "stepDown" with the proper type (39) +PASS HTMLInputElement interface: createInput("week") must inherit property "stepDown(long)" with the proper type PASS HTMLInputElement interface: calling stepDown(long) on createInput("week") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("week") must inherit property "willValidate" with the proper type (40) -PASS HTMLInputElement interface: createInput("week") must inherit property "validity" with the proper type (41) -PASS HTMLInputElement interface: createInput("week") must inherit property "validationMessage" with the proper type (42) -PASS HTMLInputElement interface: createInput("week") must inherit property "checkValidity" with the proper type (43) -PASS HTMLInputElement interface: createInput("week") must inherit property "reportValidity" with the proper type (44) -PASS HTMLInputElement interface: createInput("week") must inherit property "setCustomValidity" with the proper type (45) +PASS HTMLInputElement interface: createInput("week") must inherit property "willValidate" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "validity" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "validationMessage" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "checkValidity()" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "reportValidity()" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "setCustomValidity(DOMString)" with the proper type PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("week") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("week") must inherit property "labels" with the proper type (46) -PASS HTMLInputElement interface: createInput("week") must inherit property "select" with the proper type (47) -PASS HTMLInputElement interface: createInput("week") must inherit property "selectionStart" with the proper type (48) -PASS HTMLInputElement interface: createInput("week") must inherit property "selectionEnd" with the proper type (49) -PASS HTMLInputElement interface: createInput("week") must inherit property "selectionDirection" with the proper type (50) -PASS HTMLInputElement interface: createInput("week") must inherit property "setRangeText" with the proper type (51) +PASS HTMLInputElement interface: createInput("week") must inherit property "labels" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "select()" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "selectionStart" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "selectionEnd" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "selectionDirection" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "setRangeText(DOMString)" with the proper type PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("week") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("week") must inherit property "setRangeText" with the proper type (52) -PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("week") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("week") must inherit property "setSelectionRange" with the proper type (53) -PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("week") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("week") must inherit property "align" with the proper type (54) -PASS HTMLInputElement interface: createInput("week") must inherit property "useMap" with the proper type (55) +PASS HTMLInputElement interface: createInput("week") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("week") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("week") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("week") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("week") must inherit property "align" with the proper type +PASS HTMLInputElement interface: createInput("week") must inherit property "useMap" with the proper type PASS HTMLInputElement must be primary interface of createInput("time") PASS Stringification of createInput("time") -PASS HTMLInputElement interface: createInput("time") must inherit property "accept" with the proper type (0) -PASS HTMLInputElement interface: createInput("time") must inherit property "alt" with the proper type (1) -PASS HTMLInputElement interface: createInput("time") must inherit property "autocomplete" with the proper type (2) -PASS HTMLInputElement interface: createInput("time") must inherit property "autofocus" with the proper type (3) -PASS HTMLInputElement interface: createInput("time") must inherit property "defaultChecked" with the proper type (4) -PASS HTMLInputElement interface: createInput("time") must inherit property "checked" with the proper type (5) -PASS HTMLInputElement interface: createInput("time") must inherit property "dirName" with the proper type (6) -PASS HTMLInputElement interface: createInput("time") must inherit property "disabled" with the proper type (7) -PASS HTMLInputElement interface: createInput("time") must inherit property "form" with the proper type (8) -PASS HTMLInputElement interface: createInput("time") must inherit property "files" with the proper type (9) -PASS HTMLInputElement interface: createInput("time") must inherit property "formAction" with the proper type (10) -PASS HTMLInputElement interface: createInput("time") must inherit property "formEnctype" with the proper type (11) -PASS HTMLInputElement interface: createInput("time") must inherit property "formMethod" with the proper type (12) -PASS HTMLInputElement interface: createInput("time") must inherit property "formNoValidate" with the proper type (13) -PASS HTMLInputElement interface: createInput("time") must inherit property "formTarget" with the proper type (14) -PASS HTMLInputElement interface: createInput("time") must inherit property "height" with the proper type (15) -PASS HTMLInputElement interface: createInput("time") must inherit property "indeterminate" with the proper type (16) -PASS HTMLInputElement interface: createInput("time") must inherit property "inputMode" with the proper type (17) -PASS HTMLInputElement interface: createInput("time") must inherit property "list" with the proper type (18) -PASS HTMLInputElement interface: createInput("time") must inherit property "max" with the proper type (19) -PASS HTMLInputElement interface: createInput("time") must inherit property "maxLength" with the proper type (20) -PASS HTMLInputElement interface: createInput("time") must inherit property "min" with the proper type (21) -PASS HTMLInputElement interface: createInput("time") must inherit property "minLength" with the proper type (22) -PASS HTMLInputElement interface: createInput("time") must inherit property "multiple" with the proper type (23) -PASS HTMLInputElement interface: createInput("time") must inherit property "name" with the proper type (24) -PASS HTMLInputElement interface: createInput("time") must inherit property "pattern" with the proper type (25) -PASS HTMLInputElement interface: createInput("time") must inherit property "placeholder" with the proper type (26) -PASS HTMLInputElement interface: createInput("time") must inherit property "readOnly" with the proper type (27) -PASS HTMLInputElement interface: createInput("time") must inherit property "required" with the proper type (28) -PASS HTMLInputElement interface: createInput("time") must inherit property "size" with the proper type (29) -PASS HTMLInputElement interface: createInput("time") must inherit property "src" with the proper type (30) -PASS HTMLInputElement interface: createInput("time") must inherit property "step" with the proper type (31) -PASS HTMLInputElement interface: createInput("time") must inherit property "type" with the proper type (32) -PASS HTMLInputElement interface: createInput("time") must inherit property "defaultValue" with the proper type (33) -PASS HTMLInputElement interface: createInput("time") must inherit property "value" with the proper type (34) -PASS HTMLInputElement interface: createInput("time") must inherit property "valueAsDate" with the proper type (35) -PASS HTMLInputElement interface: createInput("time") must inherit property "valueAsNumber" with the proper type (36) -PASS HTMLInputElement interface: createInput("time") must inherit property "width" with the proper type (37) -PASS HTMLInputElement interface: createInput("time") must inherit property "stepUp" with the proper type (38) +PASS HTMLInputElement interface: createInput("time") must inherit property "accept" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "alt" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "autocomplete" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "autofocus" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "defaultChecked" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "checked" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "dirName" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "disabled" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "form" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "files" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "formAction" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "formEnctype" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "formMethod" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "formNoValidate" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "formTarget" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "height" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "indeterminate" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "inputMode" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "list" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "max" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "maxLength" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "min" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "minLength" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "multiple" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "name" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "pattern" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "placeholder" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "readOnly" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "required" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "size" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "src" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "step" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "type" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "defaultValue" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "value" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "valueAsDate" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "valueAsNumber" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "width" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "stepUp(long)" with the proper type PASS HTMLInputElement interface: calling stepUp(long) on createInput("time") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("time") must inherit property "stepDown" with the proper type (39) +PASS HTMLInputElement interface: createInput("time") must inherit property "stepDown(long)" with the proper type PASS HTMLInputElement interface: calling stepDown(long) on createInput("time") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("time") must inherit property "willValidate" with the proper type (40) -PASS HTMLInputElement interface: createInput("time") must inherit property "validity" with the proper type (41) -PASS HTMLInputElement interface: createInput("time") must inherit property "validationMessage" with the proper type (42) -PASS HTMLInputElement interface: createInput("time") must inherit property "checkValidity" with the proper type (43) -PASS HTMLInputElement interface: createInput("time") must inherit property "reportValidity" with the proper type (44) -PASS HTMLInputElement interface: createInput("time") must inherit property "setCustomValidity" with the proper type (45) +PASS HTMLInputElement interface: createInput("time") must inherit property "willValidate" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "validity" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "validationMessage" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "checkValidity()" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "reportValidity()" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "setCustomValidity(DOMString)" with the proper type PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("time") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("time") must inherit property "labels" with the proper type (46) -PASS HTMLInputElement interface: createInput("time") must inherit property "select" with the proper type (47) -PASS HTMLInputElement interface: createInput("time") must inherit property "selectionStart" with the proper type (48) -PASS HTMLInputElement interface: createInput("time") must inherit property "selectionEnd" with the proper type (49) -PASS HTMLInputElement interface: createInput("time") must inherit property "selectionDirection" with the proper type (50) -PASS HTMLInputElement interface: createInput("time") must inherit property "setRangeText" with the proper type (51) +PASS HTMLInputElement interface: createInput("time") must inherit property "labels" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "select()" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "selectionStart" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "selectionEnd" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "selectionDirection" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "setRangeText(DOMString)" with the proper type PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("time") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("time") must inherit property "setRangeText" with the proper type (52) -PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("time") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("time") must inherit property "setSelectionRange" with the proper type (53) -PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("time") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("time") must inherit property "align" with the proper type (54) -PASS HTMLInputElement interface: createInput("time") must inherit property "useMap" with the proper type (55) +PASS HTMLInputElement interface: createInput("time") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("time") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("time") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("time") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("time") must inherit property "align" with the proper type +PASS HTMLInputElement interface: createInput("time") must inherit property "useMap" with the proper type PASS HTMLInputElement must be primary interface of createInput("datetime-local") PASS Stringification of createInput("datetime-local") -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "accept" with the proper type (0) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "alt" with the proper type (1) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "autocomplete" with the proper type (2) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "autofocus" with the proper type (3) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "defaultChecked" with the proper type (4) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "checked" with the proper type (5) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "dirName" with the proper type (6) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "disabled" with the proper type (7) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "form" with the proper type (8) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "files" with the proper type (9) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "formAction" with the proper type (10) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "formEnctype" with the proper type (11) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "formMethod" with the proper type (12) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "formNoValidate" with the proper type (13) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "formTarget" with the proper type (14) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "height" with the proper type (15) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "indeterminate" with the proper type (16) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "inputMode" with the proper type (17) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "list" with the proper type (18) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "max" with the proper type (19) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "maxLength" with the proper type (20) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "min" with the proper type (21) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "minLength" with the proper type (22) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "multiple" with the proper type (23) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "name" with the proper type (24) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "pattern" with the proper type (25) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "placeholder" with the proper type (26) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "readOnly" with the proper type (27) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "required" with the proper type (28) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "size" with the proper type (29) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "src" with the proper type (30) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "step" with the proper type (31) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "type" with the proper type (32) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "defaultValue" with the proper type (33) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "value" with the proper type (34) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "valueAsDate" with the proper type (35) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "valueAsNumber" with the proper type (36) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "width" with the proper type (37) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "stepUp" with the proper type (38) +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "accept" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "alt" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "autocomplete" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "autofocus" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "defaultChecked" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "checked" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "dirName" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "disabled" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "form" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "files" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "formAction" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "formEnctype" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "formMethod" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "formNoValidate" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "formTarget" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "height" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "indeterminate" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "inputMode" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "list" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "max" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "maxLength" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "min" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "minLength" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "multiple" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "name" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "pattern" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "placeholder" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "readOnly" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "required" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "size" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "src" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "step" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "type" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "defaultValue" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "value" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "valueAsDate" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "valueAsNumber" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "width" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "stepUp(long)" with the proper type PASS HTMLInputElement interface: calling stepUp(long) on createInput("datetime-local") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "stepDown" with the proper type (39) +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "stepDown(long)" with the proper type PASS HTMLInputElement interface: calling stepDown(long) on createInput("datetime-local") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "willValidate" with the proper type (40) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "validity" with the proper type (41) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "validationMessage" with the proper type (42) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "checkValidity" with the proper type (43) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "reportValidity" with the proper type (44) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "setCustomValidity" with the proper type (45) +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "willValidate" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "validity" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "validationMessage" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "checkValidity()" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "reportValidity()" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "setCustomValidity(DOMString)" with the proper type PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("datetime-local") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "labels" with the proper type (46) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "select" with the proper type (47) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "selectionStart" with the proper type (48) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "selectionEnd" with the proper type (49) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "selectionDirection" with the proper type (50) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "setRangeText" with the proper type (51) +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "labels" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "select()" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "selectionStart" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "selectionEnd" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "selectionDirection" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "setRangeText(DOMString)" with the proper type PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("datetime-local") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "setRangeText" with the proper type (52) -PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("datetime-local") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "setSelectionRange" with the proper type (53) -PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("datetime-local") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "align" with the proper type (54) -PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "useMap" with the proper type (55) +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("datetime-local") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("datetime-local") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "align" with the proper type +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "useMap" with the proper type PASS HTMLInputElement must be primary interface of createInput("number") PASS Stringification of createInput("number") -PASS HTMLInputElement interface: createInput("number") must inherit property "accept" with the proper type (0) -PASS HTMLInputElement interface: createInput("number") must inherit property "alt" with the proper type (1) -PASS HTMLInputElement interface: createInput("number") must inherit property "autocomplete" with the proper type (2) -PASS HTMLInputElement interface: createInput("number") must inherit property "autofocus" with the proper type (3) -PASS HTMLInputElement interface: createInput("number") must inherit property "defaultChecked" with the proper type (4) -PASS HTMLInputElement interface: createInput("number") must inherit property "checked" with the proper type (5) -PASS HTMLInputElement interface: createInput("number") must inherit property "dirName" with the proper type (6) -PASS HTMLInputElement interface: createInput("number") must inherit property "disabled" with the proper type (7) -PASS HTMLInputElement interface: createInput("number") must inherit property "form" with the proper type (8) -PASS HTMLInputElement interface: createInput("number") must inherit property "files" with the proper type (9) -PASS HTMLInputElement interface: createInput("number") must inherit property "formAction" with the proper type (10) -PASS HTMLInputElement interface: createInput("number") must inherit property "formEnctype" with the proper type (11) -PASS HTMLInputElement interface: createInput("number") must inherit property "formMethod" with the proper type (12) -PASS HTMLInputElement interface: createInput("number") must inherit property "formNoValidate" with the proper type (13) -PASS HTMLInputElement interface: createInput("number") must inherit property "formTarget" with the proper type (14) -PASS HTMLInputElement interface: createInput("number") must inherit property "height" with the proper type (15) -PASS HTMLInputElement interface: createInput("number") must inherit property "indeterminate" with the proper type (16) -PASS HTMLInputElement interface: createInput("number") must inherit property "inputMode" with the proper type (17) -PASS HTMLInputElement interface: createInput("number") must inherit property "list" with the proper type (18) -PASS HTMLInputElement interface: createInput("number") must inherit property "max" with the proper type (19) -PASS HTMLInputElement interface: createInput("number") must inherit property "maxLength" with the proper type (20) -PASS HTMLInputElement interface: createInput("number") must inherit property "min" with the proper type (21) -PASS HTMLInputElement interface: createInput("number") must inherit property "minLength" with the proper type (22) -PASS HTMLInputElement interface: createInput("number") must inherit property "multiple" with the proper type (23) -PASS HTMLInputElement interface: createInput("number") must inherit property "name" with the proper type (24) -PASS HTMLInputElement interface: createInput("number") must inherit property "pattern" with the proper type (25) -PASS HTMLInputElement interface: createInput("number") must inherit property "placeholder" with the proper type (26) -PASS HTMLInputElement interface: createInput("number") must inherit property "readOnly" with the proper type (27) -PASS HTMLInputElement interface: createInput("number") must inherit property "required" with the proper type (28) -PASS HTMLInputElement interface: createInput("number") must inherit property "size" with the proper type (29) -PASS HTMLInputElement interface: createInput("number") must inherit property "src" with the proper type (30) -PASS HTMLInputElement interface: createInput("number") must inherit property "step" with the proper type (31) -PASS HTMLInputElement interface: createInput("number") must inherit property "type" with the proper type (32) -PASS HTMLInputElement interface: createInput("number") must inherit property "defaultValue" with the proper type (33) -PASS HTMLInputElement interface: createInput("number") must inherit property "value" with the proper type (34) -PASS HTMLInputElement interface: createInput("number") must inherit property "valueAsDate" with the proper type (35) -PASS HTMLInputElement interface: createInput("number") must inherit property "valueAsNumber" with the proper type (36) -PASS HTMLInputElement interface: createInput("number") must inherit property "width" with the proper type (37) -PASS HTMLInputElement interface: createInput("number") must inherit property "stepUp" with the proper type (38) +PASS HTMLInputElement interface: createInput("number") must inherit property "accept" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "alt" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "autocomplete" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "autofocus" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "defaultChecked" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "checked" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "dirName" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "disabled" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "form" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "files" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "formAction" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "formEnctype" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "formMethod" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "formNoValidate" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "formTarget" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "height" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "indeterminate" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "inputMode" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "list" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "max" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "maxLength" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "min" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "minLength" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "multiple" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "name" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "pattern" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "placeholder" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "readOnly" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "required" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "size" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "src" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "step" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "type" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "defaultValue" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "value" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "valueAsDate" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "valueAsNumber" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "width" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "stepUp(long)" with the proper type PASS HTMLInputElement interface: calling stepUp(long) on createInput("number") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("number") must inherit property "stepDown" with the proper type (39) +PASS HTMLInputElement interface: createInput("number") must inherit property "stepDown(long)" with the proper type PASS HTMLInputElement interface: calling stepDown(long) on createInput("number") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("number") must inherit property "willValidate" with the proper type (40) -PASS HTMLInputElement interface: createInput("number") must inherit property "validity" with the proper type (41) -PASS HTMLInputElement interface: createInput("number") must inherit property "validationMessage" with the proper type (42) -PASS HTMLInputElement interface: createInput("number") must inherit property "checkValidity" with the proper type (43) -PASS HTMLInputElement interface: createInput("number") must inherit property "reportValidity" with the proper type (44) -PASS HTMLInputElement interface: createInput("number") must inherit property "setCustomValidity" with the proper type (45) +PASS HTMLInputElement interface: createInput("number") must inherit property "willValidate" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "validity" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "validationMessage" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "checkValidity()" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "reportValidity()" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "setCustomValidity(DOMString)" with the proper type PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("number") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("number") must inherit property "labels" with the proper type (46) -PASS HTMLInputElement interface: createInput("number") must inherit property "select" with the proper type (47) -PASS HTMLInputElement interface: createInput("number") must inherit property "selectionStart" with the proper type (48) -PASS HTMLInputElement interface: createInput("number") must inherit property "selectionEnd" with the proper type (49) -PASS HTMLInputElement interface: createInput("number") must inherit property "selectionDirection" with the proper type (50) -PASS HTMLInputElement interface: createInput("number") must inherit property "setRangeText" with the proper type (51) +PASS HTMLInputElement interface: createInput("number") must inherit property "labels" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "select()" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "selectionStart" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "selectionEnd" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "selectionDirection" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "setRangeText(DOMString)" with the proper type PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("number") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("number") must inherit property "setRangeText" with the proper type (52) -PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("number") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("number") must inherit property "setSelectionRange" with the proper type (53) -PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("number") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("number") must inherit property "align" with the proper type (54) -PASS HTMLInputElement interface: createInput("number") must inherit property "useMap" with the proper type (55) +PASS HTMLInputElement interface: createInput("number") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("number") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("number") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("number") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("number") must inherit property "align" with the proper type +PASS HTMLInputElement interface: createInput("number") must inherit property "useMap" with the proper type PASS HTMLInputElement must be primary interface of createInput("range") PASS Stringification of createInput("range") -PASS HTMLInputElement interface: createInput("range") must inherit property "accept" with the proper type (0) -PASS HTMLInputElement interface: createInput("range") must inherit property "alt" with the proper type (1) -PASS HTMLInputElement interface: createInput("range") must inherit property "autocomplete" with the proper type (2) -PASS HTMLInputElement interface: createInput("range") must inherit property "autofocus" with the proper type (3) -PASS HTMLInputElement interface: createInput("range") must inherit property "defaultChecked" with the proper type (4) -PASS HTMLInputElement interface: createInput("range") must inherit property "checked" with the proper type (5) -PASS HTMLInputElement interface: createInput("range") must inherit property "dirName" with the proper type (6) -PASS HTMLInputElement interface: createInput("range") must inherit property "disabled" with the proper type (7) -PASS HTMLInputElement interface: createInput("range") must inherit property "form" with the proper type (8) -PASS HTMLInputElement interface: createInput("range") must inherit property "files" with the proper type (9) -PASS HTMLInputElement interface: createInput("range") must inherit property "formAction" with the proper type (10) -PASS HTMLInputElement interface: createInput("range") must inherit property "formEnctype" with the proper type (11) -PASS HTMLInputElement interface: createInput("range") must inherit property "formMethod" with the proper type (12) -PASS HTMLInputElement interface: createInput("range") must inherit property "formNoValidate" with the proper type (13) -PASS HTMLInputElement interface: createInput("range") must inherit property "formTarget" with the proper type (14) -PASS HTMLInputElement interface: createInput("range") must inherit property "height" with the proper type (15) -PASS HTMLInputElement interface: createInput("range") must inherit property "indeterminate" with the proper type (16) -PASS HTMLInputElement interface: createInput("range") must inherit property "inputMode" with the proper type (17) -PASS HTMLInputElement interface: createInput("range") must inherit property "list" with the proper type (18) -PASS HTMLInputElement interface: createInput("range") must inherit property "max" with the proper type (19) -PASS HTMLInputElement interface: createInput("range") must inherit property "maxLength" with the proper type (20) -PASS HTMLInputElement interface: createInput("range") must inherit property "min" with the proper type (21) -PASS HTMLInputElement interface: createInput("range") must inherit property "minLength" with the proper type (22) -PASS HTMLInputElement interface: createInput("range") must inherit property "multiple" with the proper type (23) -PASS HTMLInputElement interface: createInput("range") must inherit property "name" with the proper type (24) -PASS HTMLInputElement interface: createInput("range") must inherit property "pattern" with the proper type (25) -PASS HTMLInputElement interface: createInput("range") must inherit property "placeholder" with the proper type (26) -PASS HTMLInputElement interface: createInput("range") must inherit property "readOnly" with the proper type (27) -PASS HTMLInputElement interface: createInput("range") must inherit property "required" with the proper type (28) -PASS HTMLInputElement interface: createInput("range") must inherit property "size" with the proper type (29) -PASS HTMLInputElement interface: createInput("range") must inherit property "src" with the proper type (30) -PASS HTMLInputElement interface: createInput("range") must inherit property "step" with the proper type (31) -PASS HTMLInputElement interface: createInput("range") must inherit property "type" with the proper type (32) -PASS HTMLInputElement interface: createInput("range") must inherit property "defaultValue" with the proper type (33) -PASS HTMLInputElement interface: createInput("range") must inherit property "value" with the proper type (34) -PASS HTMLInputElement interface: createInput("range") must inherit property "valueAsDate" with the proper type (35) -PASS HTMLInputElement interface: createInput("range") must inherit property "valueAsNumber" with the proper type (36) -PASS HTMLInputElement interface: createInput("range") must inherit property "width" with the proper type (37) -PASS HTMLInputElement interface: createInput("range") must inherit property "stepUp" with the proper type (38) +PASS HTMLInputElement interface: createInput("range") must inherit property "accept" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "alt" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "autocomplete" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "autofocus" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "defaultChecked" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "checked" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "dirName" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "disabled" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "form" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "files" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "formAction" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "formEnctype" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "formMethod" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "formNoValidate" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "formTarget" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "height" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "indeterminate" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "inputMode" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "list" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "max" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "maxLength" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "min" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "minLength" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "multiple" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "name" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "pattern" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "placeholder" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "readOnly" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "required" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "size" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "src" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "step" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "type" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "defaultValue" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "value" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "valueAsDate" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "valueAsNumber" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "width" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "stepUp(long)" with the proper type PASS HTMLInputElement interface: calling stepUp(long) on createInput("range") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("range") must inherit property "stepDown" with the proper type (39) +PASS HTMLInputElement interface: createInput("range") must inherit property "stepDown(long)" with the proper type PASS HTMLInputElement interface: calling stepDown(long) on createInput("range") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("range") must inherit property "willValidate" with the proper type (40) -PASS HTMLInputElement interface: createInput("range") must inherit property "validity" with the proper type (41) -PASS HTMLInputElement interface: createInput("range") must inherit property "validationMessage" with the proper type (42) -PASS HTMLInputElement interface: createInput("range") must inherit property "checkValidity" with the proper type (43) -PASS HTMLInputElement interface: createInput("range") must inherit property "reportValidity" with the proper type (44) -PASS HTMLInputElement interface: createInput("range") must inherit property "setCustomValidity" with the proper type (45) +PASS HTMLInputElement interface: createInput("range") must inherit property "willValidate" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "validity" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "validationMessage" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "checkValidity()" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "reportValidity()" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "setCustomValidity(DOMString)" with the proper type PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("range") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("range") must inherit property "labels" with the proper type (46) -PASS HTMLInputElement interface: createInput("range") must inherit property "select" with the proper type (47) -PASS HTMLInputElement interface: createInput("range") must inherit property "selectionStart" with the proper type (48) -PASS HTMLInputElement interface: createInput("range") must inherit property "selectionEnd" with the proper type (49) -PASS HTMLInputElement interface: createInput("range") must inherit property "selectionDirection" with the proper type (50) -PASS HTMLInputElement interface: createInput("range") must inherit property "setRangeText" with the proper type (51) +PASS HTMLInputElement interface: createInput("range") must inherit property "labels" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "select()" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "selectionStart" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "selectionEnd" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "selectionDirection" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "setRangeText(DOMString)" with the proper type PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("range") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("range") must inherit property "setRangeText" with the proper type (52) -PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("range") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("range") must inherit property "setSelectionRange" with the proper type (53) -PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("range") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("range") must inherit property "align" with the proper type (54) -PASS HTMLInputElement interface: createInput("range") must inherit property "useMap" with the proper type (55) +PASS HTMLInputElement interface: createInput("range") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("range") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("range") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("range") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("range") must inherit property "align" with the proper type +PASS HTMLInputElement interface: createInput("range") must inherit property "useMap" with the proper type PASS HTMLInputElement must be primary interface of createInput("color") PASS Stringification of createInput("color") -PASS HTMLInputElement interface: createInput("color") must inherit property "accept" with the proper type (0) -PASS HTMLInputElement interface: createInput("color") must inherit property "alt" with the proper type (1) -PASS HTMLInputElement interface: createInput("color") must inherit property "autocomplete" with the proper type (2) -PASS HTMLInputElement interface: createInput("color") must inherit property "autofocus" with the proper type (3) -PASS HTMLInputElement interface: createInput("color") must inherit property "defaultChecked" with the proper type (4) -PASS HTMLInputElement interface: createInput("color") must inherit property "checked" with the proper type (5) -PASS HTMLInputElement interface: createInput("color") must inherit property "dirName" with the proper type (6) -PASS HTMLInputElement interface: createInput("color") must inherit property "disabled" with the proper type (7) -PASS HTMLInputElement interface: createInput("color") must inherit property "form" with the proper type (8) -PASS HTMLInputElement interface: createInput("color") must inherit property "files" with the proper type (9) -PASS HTMLInputElement interface: createInput("color") must inherit property "formAction" with the proper type (10) -PASS HTMLInputElement interface: createInput("color") must inherit property "formEnctype" with the proper type (11) -PASS HTMLInputElement interface: createInput("color") must inherit property "formMethod" with the proper type (12) -PASS HTMLInputElement interface: createInput("color") must inherit property "formNoValidate" with the proper type (13) -PASS HTMLInputElement interface: createInput("color") must inherit property "formTarget" with the proper type (14) -PASS HTMLInputElement interface: createInput("color") must inherit property "height" with the proper type (15) -PASS HTMLInputElement interface: createInput("color") must inherit property "indeterminate" with the proper type (16) -PASS HTMLInputElement interface: createInput("color") must inherit property "inputMode" with the proper type (17) -PASS HTMLInputElement interface: createInput("color") must inherit property "list" with the proper type (18) -PASS HTMLInputElement interface: createInput("color") must inherit property "max" with the proper type (19) -PASS HTMLInputElement interface: createInput("color") must inherit property "maxLength" with the proper type (20) -PASS HTMLInputElement interface: createInput("color") must inherit property "min" with the proper type (21) -PASS HTMLInputElement interface: createInput("color") must inherit property "minLength" with the proper type (22) -PASS HTMLInputElement interface: createInput("color") must inherit property "multiple" with the proper type (23) -PASS HTMLInputElement interface: createInput("color") must inherit property "name" with the proper type (24) -PASS HTMLInputElement interface: createInput("color") must inherit property "pattern" with the proper type (25) -PASS HTMLInputElement interface: createInput("color") must inherit property "placeholder" with the proper type (26) -PASS HTMLInputElement interface: createInput("color") must inherit property "readOnly" with the proper type (27) -PASS HTMLInputElement interface: createInput("color") must inherit property "required" with the proper type (28) -PASS HTMLInputElement interface: createInput("color") must inherit property "size" with the proper type (29) -PASS HTMLInputElement interface: createInput("color") must inherit property "src" with the proper type (30) -PASS HTMLInputElement interface: createInput("color") must inherit property "step" with the proper type (31) -PASS HTMLInputElement interface: createInput("color") must inherit property "type" with the proper type (32) -PASS HTMLInputElement interface: createInput("color") must inherit property "defaultValue" with the proper type (33) -PASS HTMLInputElement interface: createInput("color") must inherit property "value" with the proper type (34) -PASS HTMLInputElement interface: createInput("color") must inherit property "valueAsDate" with the proper type (35) -PASS HTMLInputElement interface: createInput("color") must inherit property "valueAsNumber" with the proper type (36) -PASS HTMLInputElement interface: createInput("color") must inherit property "width" with the proper type (37) -PASS HTMLInputElement interface: createInput("color") must inherit property "stepUp" with the proper type (38) +PASS HTMLInputElement interface: createInput("color") must inherit property "accept" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "alt" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "autocomplete" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "autofocus" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "defaultChecked" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "checked" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "dirName" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "disabled" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "form" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "files" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "formAction" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "formEnctype" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "formMethod" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "formNoValidate" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "formTarget" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "height" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "indeterminate" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "inputMode" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "list" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "max" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "maxLength" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "min" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "minLength" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "multiple" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "name" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "pattern" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "placeholder" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "readOnly" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "required" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "size" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "src" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "step" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "type" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "defaultValue" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "value" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "valueAsDate" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "valueAsNumber" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "width" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "stepUp(long)" with the proper type PASS HTMLInputElement interface: calling stepUp(long) on createInput("color") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("color") must inherit property "stepDown" with the proper type (39) +PASS HTMLInputElement interface: createInput("color") must inherit property "stepDown(long)" with the proper type PASS HTMLInputElement interface: calling stepDown(long) on createInput("color") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("color") must inherit property "willValidate" with the proper type (40) -PASS HTMLInputElement interface: createInput("color") must inherit property "validity" with the proper type (41) -PASS HTMLInputElement interface: createInput("color") must inherit property "validationMessage" with the proper type (42) -PASS HTMLInputElement interface: createInput("color") must inherit property "checkValidity" with the proper type (43) -PASS HTMLInputElement interface: createInput("color") must inherit property "reportValidity" with the proper type (44) -PASS HTMLInputElement interface: createInput("color") must inherit property "setCustomValidity" with the proper type (45) +PASS HTMLInputElement interface: createInput("color") must inherit property "willValidate" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "validity" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "validationMessage" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "checkValidity()" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "reportValidity()" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "setCustomValidity(DOMString)" with the proper type PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("color") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("color") must inherit property "labels" with the proper type (46) -PASS HTMLInputElement interface: createInput("color") must inherit property "select" with the proper type (47) -PASS HTMLInputElement interface: createInput("color") must inherit property "selectionStart" with the proper type (48) -PASS HTMLInputElement interface: createInput("color") must inherit property "selectionEnd" with the proper type (49) -PASS HTMLInputElement interface: createInput("color") must inherit property "selectionDirection" with the proper type (50) -PASS HTMLInputElement interface: createInput("color") must inherit property "setRangeText" with the proper type (51) +PASS HTMLInputElement interface: createInput("color") must inherit property "labels" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "select()" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "selectionStart" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "selectionEnd" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "selectionDirection" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "setRangeText(DOMString)" with the proper type PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("color") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("color") must inherit property "setRangeText" with the proper type (52) -PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("color") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("color") must inherit property "setSelectionRange" with the proper type (53) -PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("color") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("color") must inherit property "align" with the proper type (54) -PASS HTMLInputElement interface: createInput("color") must inherit property "useMap" with the proper type (55) +PASS HTMLInputElement interface: createInput("color") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("color") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("color") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("color") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("color") must inherit property "align" with the proper type +PASS HTMLInputElement interface: createInput("color") must inherit property "useMap" with the proper type PASS HTMLInputElement must be primary interface of createInput("checkbox") PASS Stringification of createInput("checkbox") -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "accept" with the proper type (0) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "alt" with the proper type (1) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "autocomplete" with the proper type (2) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "autofocus" with the proper type (3) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "defaultChecked" with the proper type (4) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "checked" with the proper type (5) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "dirName" with the proper type (6) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "disabled" with the proper type (7) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "form" with the proper type (8) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "files" with the proper type (9) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "formAction" with the proper type (10) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "formEnctype" with the proper type (11) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "formMethod" with the proper type (12) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "formNoValidate" with the proper type (13) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "formTarget" with the proper type (14) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "height" with the proper type (15) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "indeterminate" with the proper type (16) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "inputMode" with the proper type (17) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "list" with the proper type (18) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "max" with the proper type (19) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "maxLength" with the proper type (20) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "min" with the proper type (21) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "minLength" with the proper type (22) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "multiple" with the proper type (23) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "name" with the proper type (24) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "pattern" with the proper type (25) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "placeholder" with the proper type (26) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "readOnly" with the proper type (27) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "required" with the proper type (28) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "size" with the proper type (29) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "src" with the proper type (30) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "step" with the proper type (31) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "type" with the proper type (32) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "defaultValue" with the proper type (33) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "value" with the proper type (34) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "valueAsDate" with the proper type (35) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "valueAsNumber" with the proper type (36) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "width" with the proper type (37) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "stepUp" with the proper type (38) +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "accept" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "alt" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "autocomplete" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "autofocus" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "defaultChecked" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "checked" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "dirName" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "disabled" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "form" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "files" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "formAction" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "formEnctype" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "formMethod" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "formNoValidate" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "formTarget" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "height" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "indeterminate" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "inputMode" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "list" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "max" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "maxLength" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "min" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "minLength" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "multiple" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "name" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "pattern" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "placeholder" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "readOnly" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "required" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "size" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "src" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "step" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "type" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "defaultValue" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "value" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "valueAsDate" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "valueAsNumber" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "width" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "stepUp(long)" with the proper type PASS HTMLInputElement interface: calling stepUp(long) on createInput("checkbox") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "stepDown" with the proper type (39) +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "stepDown(long)" with the proper type PASS HTMLInputElement interface: calling stepDown(long) on createInput("checkbox") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "willValidate" with the proper type (40) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "validity" with the proper type (41) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "validationMessage" with the proper type (42) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "checkValidity" with the proper type (43) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "reportValidity" with the proper type (44) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "setCustomValidity" with the proper type (45) +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "willValidate" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "validity" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "validationMessage" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "checkValidity()" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "reportValidity()" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "setCustomValidity(DOMString)" with the proper type PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("checkbox") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "labels" with the proper type (46) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "select" with the proper type (47) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "selectionStart" with the proper type (48) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "selectionEnd" with the proper type (49) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "selectionDirection" with the proper type (50) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "setRangeText" with the proper type (51) +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "labels" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "select()" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "selectionStart" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "selectionEnd" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "selectionDirection" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "setRangeText(DOMString)" with the proper type PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("checkbox") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "setRangeText" with the proper type (52) -PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("checkbox") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "setSelectionRange" with the proper type (53) -PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("checkbox") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "align" with the proper type (54) -PASS HTMLInputElement interface: createInput("checkbox") must inherit property "useMap" with the proper type (55) +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("checkbox") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("checkbox") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "align" with the proper type +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "useMap" with the proper type PASS HTMLInputElement must be primary interface of createInput("radio") PASS Stringification of createInput("radio") -PASS HTMLInputElement interface: createInput("radio") must inherit property "accept" with the proper type (0) -PASS HTMLInputElement interface: createInput("radio") must inherit property "alt" with the proper type (1) -PASS HTMLInputElement interface: createInput("radio") must inherit property "autocomplete" with the proper type (2) -PASS HTMLInputElement interface: createInput("radio") must inherit property "autofocus" with the proper type (3) -PASS HTMLInputElement interface: createInput("radio") must inherit property "defaultChecked" with the proper type (4) -PASS HTMLInputElement interface: createInput("radio") must inherit property "checked" with the proper type (5) -PASS HTMLInputElement interface: createInput("radio") must inherit property "dirName" with the proper type (6) -PASS HTMLInputElement interface: createInput("radio") must inherit property "disabled" with the proper type (7) -PASS HTMLInputElement interface: createInput("radio") must inherit property "form" with the proper type (8) -PASS HTMLInputElement interface: createInput("radio") must inherit property "files" with the proper type (9) -PASS HTMLInputElement interface: createInput("radio") must inherit property "formAction" with the proper type (10) -PASS HTMLInputElement interface: createInput("radio") must inherit property "formEnctype" with the proper type (11) -PASS HTMLInputElement interface: createInput("radio") must inherit property "formMethod" with the proper type (12) -PASS HTMLInputElement interface: createInput("radio") must inherit property "formNoValidate" with the proper type (13) -PASS HTMLInputElement interface: createInput("radio") must inherit property "formTarget" with the proper type (14) -PASS HTMLInputElement interface: createInput("radio") must inherit property "height" with the proper type (15) -PASS HTMLInputElement interface: createInput("radio") must inherit property "indeterminate" with the proper type (16) -PASS HTMLInputElement interface: createInput("radio") must inherit property "inputMode" with the proper type (17) -PASS HTMLInputElement interface: createInput("radio") must inherit property "list" with the proper type (18) -PASS HTMLInputElement interface: createInput("radio") must inherit property "max" with the proper type (19) -PASS HTMLInputElement interface: createInput("radio") must inherit property "maxLength" with the proper type (20) -PASS HTMLInputElement interface: createInput("radio") must inherit property "min" with the proper type (21) -PASS HTMLInputElement interface: createInput("radio") must inherit property "minLength" with the proper type (22) -PASS HTMLInputElement interface: createInput("radio") must inherit property "multiple" with the proper type (23) -PASS HTMLInputElement interface: createInput("radio") must inherit property "name" with the proper type (24) -PASS HTMLInputElement interface: createInput("radio") must inherit property "pattern" with the proper type (25) -PASS HTMLInputElement interface: createInput("radio") must inherit property "placeholder" with the proper type (26) -PASS HTMLInputElement interface: createInput("radio") must inherit property "readOnly" with the proper type (27) -PASS HTMLInputElement interface: createInput("radio") must inherit property "required" with the proper type (28) -PASS HTMLInputElement interface: createInput("radio") must inherit property "size" with the proper type (29) -PASS HTMLInputElement interface: createInput("radio") must inherit property "src" with the proper type (30) -PASS HTMLInputElement interface: createInput("radio") must inherit property "step" with the proper type (31) -PASS HTMLInputElement interface: createInput("radio") must inherit property "type" with the proper type (32) -PASS HTMLInputElement interface: createInput("radio") must inherit property "defaultValue" with the proper type (33) -PASS HTMLInputElement interface: createInput("radio") must inherit property "value" with the proper type (34) -PASS HTMLInputElement interface: createInput("radio") must inherit property "valueAsDate" with the proper type (35) -PASS HTMLInputElement interface: createInput("radio") must inherit property "valueAsNumber" with the proper type (36) -PASS HTMLInputElement interface: createInput("radio") must inherit property "width" with the proper type (37) -PASS HTMLInputElement interface: createInput("radio") must inherit property "stepUp" with the proper type (38) +PASS HTMLInputElement interface: createInput("radio") must inherit property "accept" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "alt" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "autocomplete" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "autofocus" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "defaultChecked" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "checked" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "dirName" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "disabled" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "form" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "files" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "formAction" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "formEnctype" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "formMethod" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "formNoValidate" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "formTarget" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "height" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "indeterminate" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "inputMode" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "list" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "max" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "maxLength" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "min" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "minLength" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "multiple" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "name" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "pattern" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "placeholder" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "readOnly" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "required" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "size" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "src" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "step" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "type" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "defaultValue" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "value" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "valueAsDate" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "valueAsNumber" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "width" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "stepUp(long)" with the proper type PASS HTMLInputElement interface: calling stepUp(long) on createInput("radio") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("radio") must inherit property "stepDown" with the proper type (39) +PASS HTMLInputElement interface: createInput("radio") must inherit property "stepDown(long)" with the proper type PASS HTMLInputElement interface: calling stepDown(long) on createInput("radio") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("radio") must inherit property "willValidate" with the proper type (40) -PASS HTMLInputElement interface: createInput("radio") must inherit property "validity" with the proper type (41) -PASS HTMLInputElement interface: createInput("radio") must inherit property "validationMessage" with the proper type (42) -PASS HTMLInputElement interface: createInput("radio") must inherit property "checkValidity" with the proper type (43) -PASS HTMLInputElement interface: createInput("radio") must inherit property "reportValidity" with the proper type (44) -PASS HTMLInputElement interface: createInput("radio") must inherit property "setCustomValidity" with the proper type (45) +PASS HTMLInputElement interface: createInput("radio") must inherit property "willValidate" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "validity" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "validationMessage" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "checkValidity()" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "reportValidity()" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "setCustomValidity(DOMString)" with the proper type PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("radio") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("radio") must inherit property "labels" with the proper type (46) -PASS HTMLInputElement interface: createInput("radio") must inherit property "select" with the proper type (47) -PASS HTMLInputElement interface: createInput("radio") must inherit property "selectionStart" with the proper type (48) -PASS HTMLInputElement interface: createInput("radio") must inherit property "selectionEnd" with the proper type (49) -PASS HTMLInputElement interface: createInput("radio") must inherit property "selectionDirection" with the proper type (50) -PASS HTMLInputElement interface: createInput("radio") must inherit property "setRangeText" with the proper type (51) +PASS HTMLInputElement interface: createInput("radio") must inherit property "labels" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "select()" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "selectionStart" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "selectionEnd" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "selectionDirection" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "setRangeText(DOMString)" with the proper type PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("radio") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("radio") must inherit property "setRangeText" with the proper type (52) -PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("radio") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("radio") must inherit property "setSelectionRange" with the proper type (53) -PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("radio") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("radio") must inherit property "align" with the proper type (54) -PASS HTMLInputElement interface: createInput("radio") must inherit property "useMap" with the proper type (55) +PASS HTMLInputElement interface: createInput("radio") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("radio") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("radio") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("radio") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("radio") must inherit property "align" with the proper type +PASS HTMLInputElement interface: createInput("radio") must inherit property "useMap" with the proper type PASS HTMLInputElement must be primary interface of createInput("file") PASS Stringification of createInput("file") -PASS HTMLInputElement interface: createInput("file") must inherit property "accept" with the proper type (0) -PASS HTMLInputElement interface: createInput("file") must inherit property "alt" with the proper type (1) -PASS HTMLInputElement interface: createInput("file") must inherit property "autocomplete" with the proper type (2) -PASS HTMLInputElement interface: createInput("file") must inherit property "autofocus" with the proper type (3) -PASS HTMLInputElement interface: createInput("file") must inherit property "defaultChecked" with the proper type (4) -PASS HTMLInputElement interface: createInput("file") must inherit property "checked" with the proper type (5) -PASS HTMLInputElement interface: createInput("file") must inherit property "dirName" with the proper type (6) -PASS HTMLInputElement interface: createInput("file") must inherit property "disabled" with the proper type (7) -PASS HTMLInputElement interface: createInput("file") must inherit property "form" with the proper type (8) -FAIL HTMLInputElement interface: createInput("file") must inherit property "files" with the proper type (9) Unrecognized type FileList -PASS HTMLInputElement interface: createInput("file") must inherit property "formAction" with the proper type (10) -PASS HTMLInputElement interface: createInput("file") must inherit property "formEnctype" with the proper type (11) -PASS HTMLInputElement interface: createInput("file") must inherit property "formMethod" with the proper type (12) -PASS HTMLInputElement interface: createInput("file") must inherit property "formNoValidate" with the proper type (13) -PASS HTMLInputElement interface: createInput("file") must inherit property "formTarget" with the proper type (14) -PASS HTMLInputElement interface: createInput("file") must inherit property "height" with the proper type (15) -PASS HTMLInputElement interface: createInput("file") must inherit property "indeterminate" with the proper type (16) -PASS HTMLInputElement interface: createInput("file") must inherit property "inputMode" with the proper type (17) -PASS HTMLInputElement interface: createInput("file") must inherit property "list" with the proper type (18) -PASS HTMLInputElement interface: createInput("file") must inherit property "max" with the proper type (19) -PASS HTMLInputElement interface: createInput("file") must inherit property "maxLength" with the proper type (20) -PASS HTMLInputElement interface: createInput("file") must inherit property "min" with the proper type (21) -PASS HTMLInputElement interface: createInput("file") must inherit property "minLength" with the proper type (22) -PASS HTMLInputElement interface: createInput("file") must inherit property "multiple" with the proper type (23) -PASS HTMLInputElement interface: createInput("file") must inherit property "name" with the proper type (24) -PASS HTMLInputElement interface: createInput("file") must inherit property "pattern" with the proper type (25) -PASS HTMLInputElement interface: createInput("file") must inherit property "placeholder" with the proper type (26) -PASS HTMLInputElement interface: createInput("file") must inherit property "readOnly" with the proper type (27) -PASS HTMLInputElement interface: createInput("file") must inherit property "required" with the proper type (28) -PASS HTMLInputElement interface: createInput("file") must inherit property "size" with the proper type (29) -PASS HTMLInputElement interface: createInput("file") must inherit property "src" with the proper type (30) -PASS HTMLInputElement interface: createInput("file") must inherit property "step" with the proper type (31) -PASS HTMLInputElement interface: createInput("file") must inherit property "type" with the proper type (32) -PASS HTMLInputElement interface: createInput("file") must inherit property "defaultValue" with the proper type (33) -PASS HTMLInputElement interface: createInput("file") must inherit property "value" with the proper type (34) -PASS HTMLInputElement interface: createInput("file") must inherit property "valueAsDate" with the proper type (35) -PASS HTMLInputElement interface: createInput("file") must inherit property "valueAsNumber" with the proper type (36) -PASS HTMLInputElement interface: createInput("file") must inherit property "width" with the proper type (37) -PASS HTMLInputElement interface: createInput("file") must inherit property "stepUp" with the proper type (38) +PASS HTMLInputElement interface: createInput("file") must inherit property "accept" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "alt" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "autocomplete" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "autofocus" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "defaultChecked" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "checked" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "dirName" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "disabled" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "form" with the proper type +FAIL HTMLInputElement interface: createInput("file") must inherit property "files" with the proper type Unrecognized type FileList +PASS HTMLInputElement interface: createInput("file") must inherit property "formAction" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "formEnctype" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "formMethod" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "formNoValidate" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "formTarget" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "height" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "indeterminate" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "inputMode" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "list" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "max" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "maxLength" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "min" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "minLength" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "multiple" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "name" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "pattern" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "placeholder" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "readOnly" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "required" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "size" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "src" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "step" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "type" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "defaultValue" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "value" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "valueAsDate" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "valueAsNumber" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "width" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "stepUp(long)" with the proper type PASS HTMLInputElement interface: calling stepUp(long) on createInput("file") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("file") must inherit property "stepDown" with the proper type (39) +PASS HTMLInputElement interface: createInput("file") must inherit property "stepDown(long)" with the proper type PASS HTMLInputElement interface: calling stepDown(long) on createInput("file") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("file") must inherit property "willValidate" with the proper type (40) -PASS HTMLInputElement interface: createInput("file") must inherit property "validity" with the proper type (41) -PASS HTMLInputElement interface: createInput("file") must inherit property "validationMessage" with the proper type (42) -PASS HTMLInputElement interface: createInput("file") must inherit property "checkValidity" with the proper type (43) -PASS HTMLInputElement interface: createInput("file") must inherit property "reportValidity" with the proper type (44) -PASS HTMLInputElement interface: createInput("file") must inherit property "setCustomValidity" with the proper type (45) +PASS HTMLInputElement interface: createInput("file") must inherit property "willValidate" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "validity" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "validationMessage" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "checkValidity()" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "reportValidity()" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "setCustomValidity(DOMString)" with the proper type PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("file") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("file") must inherit property "labels" with the proper type (46) -PASS HTMLInputElement interface: createInput("file") must inherit property "select" with the proper type (47) -PASS HTMLInputElement interface: createInput("file") must inherit property "selectionStart" with the proper type (48) -PASS HTMLInputElement interface: createInput("file") must inherit property "selectionEnd" with the proper type (49) -PASS HTMLInputElement interface: createInput("file") must inherit property "selectionDirection" with the proper type (50) -PASS HTMLInputElement interface: createInput("file") must inherit property "setRangeText" with the proper type (51) +PASS HTMLInputElement interface: createInput("file") must inherit property "labels" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "select()" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "selectionStart" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "selectionEnd" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "selectionDirection" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "setRangeText(DOMString)" with the proper type PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("file") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("file") must inherit property "setRangeText" with the proper type (52) -PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("file") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("file") must inherit property "setSelectionRange" with the proper type (53) -PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("file") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("file") must inherit property "align" with the proper type (54) -PASS HTMLInputElement interface: createInput("file") must inherit property "useMap" with the proper type (55) +PASS HTMLInputElement interface: createInput("file") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("file") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("file") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("file") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("file") must inherit property "align" with the proper type +PASS HTMLInputElement interface: createInput("file") must inherit property "useMap" with the proper type PASS HTMLInputElement must be primary interface of createInput("submit") PASS Stringification of createInput("submit") -PASS HTMLInputElement interface: createInput("submit") must inherit property "accept" with the proper type (0) -PASS HTMLInputElement interface: createInput("submit") must inherit property "alt" with the proper type (1) -PASS HTMLInputElement interface: createInput("submit") must inherit property "autocomplete" with the proper type (2) -PASS HTMLInputElement interface: createInput("submit") must inherit property "autofocus" with the proper type (3) -PASS HTMLInputElement interface: createInput("submit") must inherit property "defaultChecked" with the proper type (4) -PASS HTMLInputElement interface: createInput("submit") must inherit property "checked" with the proper type (5) -PASS HTMLInputElement interface: createInput("submit") must inherit property "dirName" with the proper type (6) -PASS HTMLInputElement interface: createInput("submit") must inherit property "disabled" with the proper type (7) -PASS HTMLInputElement interface: createInput("submit") must inherit property "form" with the proper type (8) -PASS HTMLInputElement interface: createInput("submit") must inherit property "files" with the proper type (9) -PASS HTMLInputElement interface: createInput("submit") must inherit property "formAction" with the proper type (10) -PASS HTMLInputElement interface: createInput("submit") must inherit property "formEnctype" with the proper type (11) -PASS HTMLInputElement interface: createInput("submit") must inherit property "formMethod" with the proper type (12) -PASS HTMLInputElement interface: createInput("submit") must inherit property "formNoValidate" with the proper type (13) -PASS HTMLInputElement interface: createInput("submit") must inherit property "formTarget" with the proper type (14) -PASS HTMLInputElement interface: createInput("submit") must inherit property "height" with the proper type (15) -PASS HTMLInputElement interface: createInput("submit") must inherit property "indeterminate" with the proper type (16) -PASS HTMLInputElement interface: createInput("submit") must inherit property "inputMode" with the proper type (17) -PASS HTMLInputElement interface: createInput("submit") must inherit property "list" with the proper type (18) -PASS HTMLInputElement interface: createInput("submit") must inherit property "max" with the proper type (19) -PASS HTMLInputElement interface: createInput("submit") must inherit property "maxLength" with the proper type (20) -PASS HTMLInputElement interface: createInput("submit") must inherit property "min" with the proper type (21) -PASS HTMLInputElement interface: createInput("submit") must inherit property "minLength" with the proper type (22) -PASS HTMLInputElement interface: createInput("submit") must inherit property "multiple" with the proper type (23) -PASS HTMLInputElement interface: createInput("submit") must inherit property "name" with the proper type (24) -PASS HTMLInputElement interface: createInput("submit") must inherit property "pattern" with the proper type (25) -PASS HTMLInputElement interface: createInput("submit") must inherit property "placeholder" with the proper type (26) -PASS HTMLInputElement interface: createInput("submit") must inherit property "readOnly" with the proper type (27) -PASS HTMLInputElement interface: createInput("submit") must inherit property "required" with the proper type (28) -PASS HTMLInputElement interface: createInput("submit") must inherit property "size" with the proper type (29) -PASS HTMLInputElement interface: createInput("submit") must inherit property "src" with the proper type (30) -PASS HTMLInputElement interface: createInput("submit") must inherit property "step" with the proper type (31) -PASS HTMLInputElement interface: createInput("submit") must inherit property "type" with the proper type (32) -PASS HTMLInputElement interface: createInput("submit") must inherit property "defaultValue" with the proper type (33) -PASS HTMLInputElement interface: createInput("submit") must inherit property "value" with the proper type (34) -PASS HTMLInputElement interface: createInput("submit") must inherit property "valueAsDate" with the proper type (35) -PASS HTMLInputElement interface: createInput("submit") must inherit property "valueAsNumber" with the proper type (36) -PASS HTMLInputElement interface: createInput("submit") must inherit property "width" with the proper type (37) -PASS HTMLInputElement interface: createInput("submit") must inherit property "stepUp" with the proper type (38) +PASS HTMLInputElement interface: createInput("submit") must inherit property "accept" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "alt" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "autocomplete" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "autofocus" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "defaultChecked" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "checked" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "dirName" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "disabled" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "form" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "files" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "formAction" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "formEnctype" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "formMethod" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "formNoValidate" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "formTarget" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "height" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "indeterminate" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "inputMode" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "list" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "max" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "maxLength" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "min" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "minLength" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "multiple" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "name" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "pattern" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "placeholder" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "readOnly" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "required" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "size" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "src" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "step" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "type" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "defaultValue" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "value" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "valueAsDate" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "valueAsNumber" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "width" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "stepUp(long)" with the proper type PASS HTMLInputElement interface: calling stepUp(long) on createInput("submit") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("submit") must inherit property "stepDown" with the proper type (39) +PASS HTMLInputElement interface: createInput("submit") must inherit property "stepDown(long)" with the proper type PASS HTMLInputElement interface: calling stepDown(long) on createInput("submit") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("submit") must inherit property "willValidate" with the proper type (40) -PASS HTMLInputElement interface: createInput("submit") must inherit property "validity" with the proper type (41) -PASS HTMLInputElement interface: createInput("submit") must inherit property "validationMessage" with the proper type (42) -PASS HTMLInputElement interface: createInput("submit") must inherit property "checkValidity" with the proper type (43) -PASS HTMLInputElement interface: createInput("submit") must inherit property "reportValidity" with the proper type (44) -PASS HTMLInputElement interface: createInput("submit") must inherit property "setCustomValidity" with the proper type (45) +PASS HTMLInputElement interface: createInput("submit") must inherit property "willValidate" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "validity" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "validationMessage" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "checkValidity()" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "reportValidity()" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "setCustomValidity(DOMString)" with the proper type PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("submit") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("submit") must inherit property "labels" with the proper type (46) -PASS HTMLInputElement interface: createInput("submit") must inherit property "select" with the proper type (47) -PASS HTMLInputElement interface: createInput("submit") must inherit property "selectionStart" with the proper type (48) -PASS HTMLInputElement interface: createInput("submit") must inherit property "selectionEnd" with the proper type (49) -PASS HTMLInputElement interface: createInput("submit") must inherit property "selectionDirection" with the proper type (50) -PASS HTMLInputElement interface: createInput("submit") must inherit property "setRangeText" with the proper type (51) +PASS HTMLInputElement interface: createInput("submit") must inherit property "labels" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "select()" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "selectionStart" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "selectionEnd" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "selectionDirection" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "setRangeText(DOMString)" with the proper type PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("submit") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("submit") must inherit property "setRangeText" with the proper type (52) -PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("submit") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("submit") must inherit property "setSelectionRange" with the proper type (53) -PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("submit") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("submit") must inherit property "align" with the proper type (54) -PASS HTMLInputElement interface: createInput("submit") must inherit property "useMap" with the proper type (55) +PASS HTMLInputElement interface: createInput("submit") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("submit") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("submit") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("submit") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("submit") must inherit property "align" with the proper type +PASS HTMLInputElement interface: createInput("submit") must inherit property "useMap" with the proper type PASS HTMLInputElement must be primary interface of createInput("image") PASS Stringification of createInput("image") -PASS HTMLInputElement interface: createInput("image") must inherit property "accept" with the proper type (0) -PASS HTMLInputElement interface: createInput("image") must inherit property "alt" with the proper type (1) -PASS HTMLInputElement interface: createInput("image") must inherit property "autocomplete" with the proper type (2) -PASS HTMLInputElement interface: createInput("image") must inherit property "autofocus" with the proper type (3) -PASS HTMLInputElement interface: createInput("image") must inherit property "defaultChecked" with the proper type (4) -PASS HTMLInputElement interface: createInput("image") must inherit property "checked" with the proper type (5) -PASS HTMLInputElement interface: createInput("image") must inherit property "dirName" with the proper type (6) -PASS HTMLInputElement interface: createInput("image") must inherit property "disabled" with the proper type (7) -PASS HTMLInputElement interface: createInput("image") must inherit property "form" with the proper type (8) -PASS HTMLInputElement interface: createInput("image") must inherit property "files" with the proper type (9) -PASS HTMLInputElement interface: createInput("image") must inherit property "formAction" with the proper type (10) -PASS HTMLInputElement interface: createInput("image") must inherit property "formEnctype" with the proper type (11) -PASS HTMLInputElement interface: createInput("image") must inherit property "formMethod" with the proper type (12) -PASS HTMLInputElement interface: createInput("image") must inherit property "formNoValidate" with the proper type (13) -PASS HTMLInputElement interface: createInput("image") must inherit property "formTarget" with the proper type (14) -PASS HTMLInputElement interface: createInput("image") must inherit property "height" with the proper type (15) -PASS HTMLInputElement interface: createInput("image") must inherit property "indeterminate" with the proper type (16) -PASS HTMLInputElement interface: createInput("image") must inherit property "inputMode" with the proper type (17) -PASS HTMLInputElement interface: createInput("image") must inherit property "list" with the proper type (18) -PASS HTMLInputElement interface: createInput("image") must inherit property "max" with the proper type (19) -PASS HTMLInputElement interface: createInput("image") must inherit property "maxLength" with the proper type (20) -PASS HTMLInputElement interface: createInput("image") must inherit property "min" with the proper type (21) -PASS HTMLInputElement interface: createInput("image") must inherit property "minLength" with the proper type (22) -PASS HTMLInputElement interface: createInput("image") must inherit property "multiple" with the proper type (23) -PASS HTMLInputElement interface: createInput("image") must inherit property "name" with the proper type (24) -PASS HTMLInputElement interface: createInput("image") must inherit property "pattern" with the proper type (25) -PASS HTMLInputElement interface: createInput("image") must inherit property "placeholder" with the proper type (26) -PASS HTMLInputElement interface: createInput("image") must inherit property "readOnly" with the proper type (27) -PASS HTMLInputElement interface: createInput("image") must inherit property "required" with the proper type (28) -PASS HTMLInputElement interface: createInput("image") must inherit property "size" with the proper type (29) -PASS HTMLInputElement interface: createInput("image") must inherit property "src" with the proper type (30) -PASS HTMLInputElement interface: createInput("image") must inherit property "step" with the proper type (31) -PASS HTMLInputElement interface: createInput("image") must inherit property "type" with the proper type (32) -PASS HTMLInputElement interface: createInput("image") must inherit property "defaultValue" with the proper type (33) -PASS HTMLInputElement interface: createInput("image") must inherit property "value" with the proper type (34) -PASS HTMLInputElement interface: createInput("image") must inherit property "valueAsDate" with the proper type (35) -PASS HTMLInputElement interface: createInput("image") must inherit property "valueAsNumber" with the proper type (36) -PASS HTMLInputElement interface: createInput("image") must inherit property "width" with the proper type (37) -PASS HTMLInputElement interface: createInput("image") must inherit property "stepUp" with the proper type (38) +PASS HTMLInputElement interface: createInput("image") must inherit property "accept" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "alt" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "autocomplete" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "autofocus" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "defaultChecked" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "checked" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "dirName" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "disabled" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "form" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "files" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "formAction" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "formEnctype" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "formMethod" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "formNoValidate" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "formTarget" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "height" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "indeterminate" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "inputMode" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "list" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "max" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "maxLength" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "min" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "minLength" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "multiple" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "name" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "pattern" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "placeholder" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "readOnly" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "required" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "size" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "src" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "step" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "type" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "defaultValue" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "value" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "valueAsDate" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "valueAsNumber" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "width" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "stepUp(long)" with the proper type PASS HTMLInputElement interface: calling stepUp(long) on createInput("image") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("image") must inherit property "stepDown" with the proper type (39) +PASS HTMLInputElement interface: createInput("image") must inherit property "stepDown(long)" with the proper type PASS HTMLInputElement interface: calling stepDown(long) on createInput("image") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("image") must inherit property "willValidate" with the proper type (40) -PASS HTMLInputElement interface: createInput("image") must inherit property "validity" with the proper type (41) -PASS HTMLInputElement interface: createInput("image") must inherit property "validationMessage" with the proper type (42) -PASS HTMLInputElement interface: createInput("image") must inherit property "checkValidity" with the proper type (43) -PASS HTMLInputElement interface: createInput("image") must inherit property "reportValidity" with the proper type (44) -PASS HTMLInputElement interface: createInput("image") must inherit property "setCustomValidity" with the proper type (45) +PASS HTMLInputElement interface: createInput("image") must inherit property "willValidate" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "validity" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "validationMessage" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "checkValidity()" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "reportValidity()" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "setCustomValidity(DOMString)" with the proper type PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("image") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("image") must inherit property "labels" with the proper type (46) -PASS HTMLInputElement interface: createInput("image") must inherit property "select" with the proper type (47) -PASS HTMLInputElement interface: createInput("image") must inherit property "selectionStart" with the proper type (48) -PASS HTMLInputElement interface: createInput("image") must inherit property "selectionEnd" with the proper type (49) -PASS HTMLInputElement interface: createInput("image") must inherit property "selectionDirection" with the proper type (50) -PASS HTMLInputElement interface: createInput("image") must inherit property "setRangeText" with the proper type (51) +PASS HTMLInputElement interface: createInput("image") must inherit property "labels" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "select()" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "selectionStart" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "selectionEnd" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "selectionDirection" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "setRangeText(DOMString)" with the proper type PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("image") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("image") must inherit property "setRangeText" with the proper type (52) -PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("image") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("image") must inherit property "setSelectionRange" with the proper type (53) -PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("image") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("image") must inherit property "align" with the proper type (54) -PASS HTMLInputElement interface: createInput("image") must inherit property "useMap" with the proper type (55) +PASS HTMLInputElement interface: createInput("image") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("image") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("image") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("image") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("image") must inherit property "align" with the proper type +PASS HTMLInputElement interface: createInput("image") must inherit property "useMap" with the proper type PASS HTMLInputElement must be primary interface of createInput("reset") PASS Stringification of createInput("reset") -PASS HTMLInputElement interface: createInput("reset") must inherit property "accept" with the proper type (0) -PASS HTMLInputElement interface: createInput("reset") must inherit property "alt" with the proper type (1) -PASS HTMLInputElement interface: createInput("reset") must inherit property "autocomplete" with the proper type (2) -PASS HTMLInputElement interface: createInput("reset") must inherit property "autofocus" with the proper type (3) -PASS HTMLInputElement interface: createInput("reset") must inherit property "defaultChecked" with the proper type (4) -PASS HTMLInputElement interface: createInput("reset") must inherit property "checked" with the proper type (5) -PASS HTMLInputElement interface: createInput("reset") must inherit property "dirName" with the proper type (6) -PASS HTMLInputElement interface: createInput("reset") must inherit property "disabled" with the proper type (7) -PASS HTMLInputElement interface: createInput("reset") must inherit property "form" with the proper type (8) -PASS HTMLInputElement interface: createInput("reset") must inherit property "files" with the proper type (9) -PASS HTMLInputElement interface: createInput("reset") must inherit property "formAction" with the proper type (10) -PASS HTMLInputElement interface: createInput("reset") must inherit property "formEnctype" with the proper type (11) -PASS HTMLInputElement interface: createInput("reset") must inherit property "formMethod" with the proper type (12) -PASS HTMLInputElement interface: createInput("reset") must inherit property "formNoValidate" with the proper type (13) -PASS HTMLInputElement interface: createInput("reset") must inherit property "formTarget" with the proper type (14) -PASS HTMLInputElement interface: createInput("reset") must inherit property "height" with the proper type (15) -PASS HTMLInputElement interface: createInput("reset") must inherit property "indeterminate" with the proper type (16) -PASS HTMLInputElement interface: createInput("reset") must inherit property "inputMode" with the proper type (17) -PASS HTMLInputElement interface: createInput("reset") must inherit property "list" with the proper type (18) -PASS HTMLInputElement interface: createInput("reset") must inherit property "max" with the proper type (19) -PASS HTMLInputElement interface: createInput("reset") must inherit property "maxLength" with the proper type (20) -PASS HTMLInputElement interface: createInput("reset") must inherit property "min" with the proper type (21) -PASS HTMLInputElement interface: createInput("reset") must inherit property "minLength" with the proper type (22) -PASS HTMLInputElement interface: createInput("reset") must inherit property "multiple" with the proper type (23) -PASS HTMLInputElement interface: createInput("reset") must inherit property "name" with the proper type (24) -PASS HTMLInputElement interface: createInput("reset") must inherit property "pattern" with the proper type (25) -PASS HTMLInputElement interface: createInput("reset") must inherit property "placeholder" with the proper type (26) -PASS HTMLInputElement interface: createInput("reset") must inherit property "readOnly" with the proper type (27) -PASS HTMLInputElement interface: createInput("reset") must inherit property "required" with the proper type (28) -PASS HTMLInputElement interface: createInput("reset") must inherit property "size" with the proper type (29) -PASS HTMLInputElement interface: createInput("reset") must inherit property "src" with the proper type (30) -PASS HTMLInputElement interface: createInput("reset") must inherit property "step" with the proper type (31) -PASS HTMLInputElement interface: createInput("reset") must inherit property "type" with the proper type (32) -PASS HTMLInputElement interface: createInput("reset") must inherit property "defaultValue" with the proper type (33) -PASS HTMLInputElement interface: createInput("reset") must inherit property "value" with the proper type (34) -PASS HTMLInputElement interface: createInput("reset") must inherit property "valueAsDate" with the proper type (35) -PASS HTMLInputElement interface: createInput("reset") must inherit property "valueAsNumber" with the proper type (36) -PASS HTMLInputElement interface: createInput("reset") must inherit property "width" with the proper type (37) -PASS HTMLInputElement interface: createInput("reset") must inherit property "stepUp" with the proper type (38) +PASS HTMLInputElement interface: createInput("reset") must inherit property "accept" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "alt" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "autocomplete" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "autofocus" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "defaultChecked" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "checked" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "dirName" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "disabled" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "form" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "files" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "formAction" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "formEnctype" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "formMethod" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "formNoValidate" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "formTarget" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "height" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "indeterminate" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "inputMode" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "list" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "max" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "maxLength" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "min" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "minLength" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "multiple" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "name" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "pattern" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "placeholder" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "readOnly" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "required" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "size" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "src" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "step" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "type" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "defaultValue" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "value" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "valueAsDate" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "valueAsNumber" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "width" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "stepUp(long)" with the proper type PASS HTMLInputElement interface: calling stepUp(long) on createInput("reset") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("reset") must inherit property "stepDown" with the proper type (39) +PASS HTMLInputElement interface: createInput("reset") must inherit property "stepDown(long)" with the proper type PASS HTMLInputElement interface: calling stepDown(long) on createInput("reset") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("reset") must inherit property "willValidate" with the proper type (40) -PASS HTMLInputElement interface: createInput("reset") must inherit property "validity" with the proper type (41) -PASS HTMLInputElement interface: createInput("reset") must inherit property "validationMessage" with the proper type (42) -PASS HTMLInputElement interface: createInput("reset") must inherit property "checkValidity" with the proper type (43) -PASS HTMLInputElement interface: createInput("reset") must inherit property "reportValidity" with the proper type (44) -PASS HTMLInputElement interface: createInput("reset") must inherit property "setCustomValidity" with the proper type (45) +PASS HTMLInputElement interface: createInput("reset") must inherit property "willValidate" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "validity" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "validationMessage" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "checkValidity()" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "reportValidity()" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "setCustomValidity(DOMString)" with the proper type PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("reset") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("reset") must inherit property "labels" with the proper type (46) -PASS HTMLInputElement interface: createInput("reset") must inherit property "select" with the proper type (47) -PASS HTMLInputElement interface: createInput("reset") must inherit property "selectionStart" with the proper type (48) -PASS HTMLInputElement interface: createInput("reset") must inherit property "selectionEnd" with the proper type (49) -PASS HTMLInputElement interface: createInput("reset") must inherit property "selectionDirection" with the proper type (50) -PASS HTMLInputElement interface: createInput("reset") must inherit property "setRangeText" with the proper type (51) +PASS HTMLInputElement interface: createInput("reset") must inherit property "labels" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "select()" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "selectionStart" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "selectionEnd" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "selectionDirection" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "setRangeText(DOMString)" with the proper type PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("reset") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("reset") must inherit property "setRangeText" with the proper type (52) -PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("reset") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("reset") must inherit property "setSelectionRange" with the proper type (53) -PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("reset") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("reset") must inherit property "align" with the proper type (54) -PASS HTMLInputElement interface: createInput("reset") must inherit property "useMap" with the proper type (55) +PASS HTMLInputElement interface: createInput("reset") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("reset") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("reset") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("reset") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("reset") must inherit property "align" with the proper type +PASS HTMLInputElement interface: createInput("reset") must inherit property "useMap" with the proper type PASS HTMLInputElement must be primary interface of createInput("button") PASS Stringification of createInput("button") -PASS HTMLInputElement interface: createInput("button") must inherit property "accept" with the proper type (0) -PASS HTMLInputElement interface: createInput("button") must inherit property "alt" with the proper type (1) -PASS HTMLInputElement interface: createInput("button") must inherit property "autocomplete" with the proper type (2) -PASS HTMLInputElement interface: createInput("button") must inherit property "autofocus" with the proper type (3) -PASS HTMLInputElement interface: createInput("button") must inherit property "defaultChecked" with the proper type (4) -PASS HTMLInputElement interface: createInput("button") must inherit property "checked" with the proper type (5) -PASS HTMLInputElement interface: createInput("button") must inherit property "dirName" with the proper type (6) -PASS HTMLInputElement interface: createInput("button") must inherit property "disabled" with the proper type (7) -PASS HTMLInputElement interface: createInput("button") must inherit property "form" with the proper type (8) -PASS HTMLInputElement interface: createInput("button") must inherit property "files" with the proper type (9) -PASS HTMLInputElement interface: createInput("button") must inherit property "formAction" with the proper type (10) -PASS HTMLInputElement interface: createInput("button") must inherit property "formEnctype" with the proper type (11) -PASS HTMLInputElement interface: createInput("button") must inherit property "formMethod" with the proper type (12) -PASS HTMLInputElement interface: createInput("button") must inherit property "formNoValidate" with the proper type (13) -PASS HTMLInputElement interface: createInput("button") must inherit property "formTarget" with the proper type (14) -PASS HTMLInputElement interface: createInput("button") must inherit property "height" with the proper type (15) -PASS HTMLInputElement interface: createInput("button") must inherit property "indeterminate" with the proper type (16) -PASS HTMLInputElement interface: createInput("button") must inherit property "inputMode" with the proper type (17) -PASS HTMLInputElement interface: createInput("button") must inherit property "list" with the proper type (18) -PASS HTMLInputElement interface: createInput("button") must inherit property "max" with the proper type (19) -PASS HTMLInputElement interface: createInput("button") must inherit property "maxLength" with the proper type (20) -PASS HTMLInputElement interface: createInput("button") must inherit property "min" with the proper type (21) -PASS HTMLInputElement interface: createInput("button") must inherit property "minLength" with the proper type (22) -PASS HTMLInputElement interface: createInput("button") must inherit property "multiple" with the proper type (23) -PASS HTMLInputElement interface: createInput("button") must inherit property "name" with the proper type (24) -PASS HTMLInputElement interface: createInput("button") must inherit property "pattern" with the proper type (25) -PASS HTMLInputElement interface: createInput("button") must inherit property "placeholder" with the proper type (26) -PASS HTMLInputElement interface: createInput("button") must inherit property "readOnly" with the proper type (27) -PASS HTMLInputElement interface: createInput("button") must inherit property "required" with the proper type (28) -PASS HTMLInputElement interface: createInput("button") must inherit property "size" with the proper type (29) -PASS HTMLInputElement interface: createInput("button") must inherit property "src" with the proper type (30) -PASS HTMLInputElement interface: createInput("button") must inherit property "step" with the proper type (31) -PASS HTMLInputElement interface: createInput("button") must inherit property "type" with the proper type (32) -PASS HTMLInputElement interface: createInput("button") must inherit property "defaultValue" with the proper type (33) -PASS HTMLInputElement interface: createInput("button") must inherit property "value" with the proper type (34) -PASS HTMLInputElement interface: createInput("button") must inherit property "valueAsDate" with the proper type (35) -PASS HTMLInputElement interface: createInput("button") must inherit property "valueAsNumber" with the proper type (36) -PASS HTMLInputElement interface: createInput("button") must inherit property "width" with the proper type (37) -PASS HTMLInputElement interface: createInput("button") must inherit property "stepUp" with the proper type (38) +PASS HTMLInputElement interface: createInput("button") must inherit property "accept" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "alt" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "autocomplete" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "autofocus" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "defaultChecked" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "checked" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "dirName" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "disabled" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "form" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "files" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "formAction" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "formEnctype" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "formMethod" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "formNoValidate" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "formTarget" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "height" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "indeterminate" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "inputMode" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "list" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "max" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "maxLength" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "min" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "minLength" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "multiple" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "name" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "pattern" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "placeholder" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "readOnly" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "required" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "size" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "src" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "step" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "type" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "defaultValue" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "value" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "valueAsDate" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "valueAsNumber" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "width" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "stepUp(long)" with the proper type PASS HTMLInputElement interface: calling stepUp(long) on createInput("button") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("button") must inherit property "stepDown" with the proper type (39) +PASS HTMLInputElement interface: createInput("button") must inherit property "stepDown(long)" with the proper type PASS HTMLInputElement interface: calling stepDown(long) on createInput("button") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("button") must inherit property "willValidate" with the proper type (40) -PASS HTMLInputElement interface: createInput("button") must inherit property "validity" with the proper type (41) -PASS HTMLInputElement interface: createInput("button") must inherit property "validationMessage" with the proper type (42) -PASS HTMLInputElement interface: createInput("button") must inherit property "checkValidity" with the proper type (43) -PASS HTMLInputElement interface: createInput("button") must inherit property "reportValidity" with the proper type (44) -PASS HTMLInputElement interface: createInput("button") must inherit property "setCustomValidity" with the proper type (45) +PASS HTMLInputElement interface: createInput("button") must inherit property "willValidate" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "validity" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "validationMessage" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "checkValidity()" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "reportValidity()" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "setCustomValidity(DOMString)" with the proper type PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("button") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("button") must inherit property "labels" with the proper type (46) -PASS HTMLInputElement interface: createInput("button") must inherit property "select" with the proper type (47) -PASS HTMLInputElement interface: createInput("button") must inherit property "selectionStart" with the proper type (48) -PASS HTMLInputElement interface: createInput("button") must inherit property "selectionEnd" with the proper type (49) -PASS HTMLInputElement interface: createInput("button") must inherit property "selectionDirection" with the proper type (50) -PASS HTMLInputElement interface: createInput("button") must inherit property "setRangeText" with the proper type (51) +PASS HTMLInputElement interface: createInput("button") must inherit property "labels" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "select()" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "selectionStart" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "selectionEnd" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "selectionDirection" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "setRangeText(DOMString)" with the proper type PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("button") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("button") must inherit property "setRangeText" with the proper type (52) -PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("button") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("button") must inherit property "setSelectionRange" with the proper type (53) -PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("button") with too few arguments must throw TypeError -PASS HTMLInputElement interface: createInput("button") must inherit property "align" with the proper type (54) -PASS HTMLInputElement interface: createInput("button") must inherit property "useMap" with the proper type (55) +PASS HTMLInputElement interface: createInput("button") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("button") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("button") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("button") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("button") must inherit property "align" with the proper type +PASS HTMLInputElement interface: createInput("button") must inherit property "useMap" with the proper type PASS HTMLButtonElement interface: existence and properties of interface object PASS HTMLButtonElement interface object length PASS HTMLButtonElement interface object name @@ -3585,25 +3585,25 @@ PASS HTMLButtonElement interface: attribute labels PASS HTMLButtonElement must be primary interface of document.createElement("button") PASS Stringification of document.createElement("button") -PASS HTMLButtonElement interface: document.createElement("button") must inherit property "autofocus" with the proper type (0) -PASS HTMLButtonElement interface: document.createElement("button") must inherit property "disabled" with the proper type (1) -PASS HTMLButtonElement interface: document.createElement("button") must inherit property "form" with the proper type (2) -PASS HTMLButtonElement interface: document.createElement("button") must inherit property "formAction" with the proper type (3) -PASS HTMLButtonElement interface: document.createElement("button") must inherit property "formEnctype" with the proper type (4) -PASS HTMLButtonElement interface: document.createElement("button") must inherit property "formMethod" with the proper type (5) -PASS HTMLButtonElement interface: document.createElement("button") must inherit property "formNoValidate" with the proper type (6) -PASS HTMLButtonElement interface: document.createElement("button") must inherit property "formTarget" with the proper type (7) -PASS HTMLButtonElement interface: document.createElement("button") must inherit property "name" with the proper type (8) -PASS HTMLButtonElement interface: document.createElement("button") must inherit property "type" with the proper type (9) -PASS HTMLButtonElement interface: document.createElement("button") must inherit property "value" with the proper type (10) -PASS HTMLButtonElement interface: document.createElement("button") must inherit property "willValidate" with the proper type (11) -PASS HTMLButtonElement interface: document.createElement("button") must inherit property "validity" with the proper type (12) -PASS HTMLButtonElement interface: document.createElement("button") must inherit property "validationMessage" with the proper type (13) -PASS HTMLButtonElement interface: document.createElement("button") must inherit property "checkValidity" with the proper type (14) -PASS HTMLButtonElement interface: document.createElement("button") must inherit property "reportValidity" with the proper type (15) -PASS HTMLButtonElement interface: document.createElement("button") must inherit property "setCustomValidity" with the proper type (16) +PASS HTMLButtonElement interface: document.createElement("button") must inherit property "autofocus" with the proper type +PASS HTMLButtonElement interface: document.createElement("button") must inherit property "disabled" with the proper type +PASS HTMLButtonElement interface: document.createElement("button") must inherit property "form" with the proper type +PASS HTMLButtonElement interface: document.createElement("button") must inherit property "formAction" with the proper type +PASS HTMLButtonElement interface: document.createElement("button") must inherit property "formEnctype" with the proper type +PASS HTMLButtonElement interface: document.createElement("button") must inherit property "formMethod" with the proper type +PASS HTMLButtonElement interface: document.createElement("button") must inherit property "formNoValidate" with the proper type +PASS HTMLButtonElement interface: document.createElement("button") must inherit property "formTarget" with the proper type +PASS HTMLButtonElement interface: document.createElement("button") must inherit property "name" with the proper type +PASS HTMLButtonElement interface: document.createElement("button") must inherit property "type" with the proper type +PASS HTMLButtonElement interface: document.createElement("button") must inherit property "value" with the proper type +PASS HTMLButtonElement interface: document.createElement("button") must inherit property "willValidate" with the proper type +PASS HTMLButtonElement interface: document.createElement("button") must inherit property "validity" with the proper type +PASS HTMLButtonElement interface: document.createElement("button") must inherit property "validationMessage" with the proper type +PASS HTMLButtonElement interface: document.createElement("button") must inherit property "checkValidity()" with the proper type +PASS HTMLButtonElement interface: document.createElement("button") must inherit property "reportValidity()" with the proper type +PASS HTMLButtonElement interface: document.createElement("button") must inherit property "setCustomValidity(DOMString)" with the proper type PASS HTMLButtonElement interface: calling setCustomValidity(DOMString) on document.createElement("button") with too few arguments must throw TypeError -PASS HTMLButtonElement interface: document.createElement("button") must inherit property "labels" with the proper type (17) +PASS HTMLButtonElement interface: document.createElement("button") must inherit property "labels" with the proper type PASS HTMLSelectElement interface: existence and properties of interface object PASS HTMLSelectElement interface object length PASS HTMLSelectElement interface object name @@ -3622,7 +3622,7 @@ PASS HTMLSelectElement interface: attribute length PASS HTMLSelectElement interface: operation item(unsigned long) PASS HTMLSelectElement interface: operation namedItem(DOMString) -PASS HTMLSelectElement interface: operation add([object Object],[object Object],[object Object],[object Object]) +PASS HTMLSelectElement interface: operation add([object Object],[object Object], [object Object],[object Object]) PASS HTMLSelectElement interface: operation remove() PASS HTMLSelectElement interface: operation remove(long) PASS HTMLSelectElement interface: attribute selectedOptions @@ -3637,37 +3637,37 @@ PASS HTMLSelectElement interface: attribute labels PASS HTMLSelectElement must be primary interface of document.createElement("select") PASS Stringification of document.createElement("select") -FAIL HTMLSelectElement interface: document.createElement("select") must inherit property "autocomplete" with the proper type (0) assert_inherits: property "autocomplete" not found in prototype chain -PASS HTMLSelectElement interface: document.createElement("select") must inherit property "autofocus" with the proper type (1) -PASS HTMLSelectElement interface: document.createElement("select") must inherit property "disabled" with the proper type (2) -PASS HTMLSelectElement interface: document.createElement("select") must inherit property "form" with the proper type (3) -PASS HTMLSelectElement interface: document.createElement("select") must inherit property "multiple" with the proper type (4) -PASS HTMLSelectElement interface: document.createElement("select") must inherit property "name" with the proper type (5) -PASS HTMLSelectElement interface: document.createElement("select") must inherit property "required" with the proper type (6) -PASS HTMLSelectElement interface: document.createElement("select") must inherit property "size" with the proper type (7) -PASS HTMLSelectElement interface: document.createElement("select") must inherit property "type" with the proper type (8) -PASS HTMLSelectElement interface: document.createElement("select") must inherit property "options" with the proper type (9) -PASS HTMLSelectElement interface: document.createElement("select") must inherit property "length" with the proper type (10) -PASS HTMLSelectElement interface: document.createElement("select") must inherit property "item" with the proper type (11) +FAIL HTMLSelectElement interface: document.createElement("select") must inherit property "autocomplete" with the proper type assert_inherits: property "autocomplete" not found in prototype chain +PASS HTMLSelectElement interface: document.createElement("select") must inherit property "autofocus" with the proper type +PASS HTMLSelectElement interface: document.createElement("select") must inherit property "disabled" with the proper type +PASS HTMLSelectElement interface: document.createElement("select") must inherit property "form" with the proper type +PASS HTMLSelectElement interface: document.createElement("select") must inherit property "multiple" with the proper type +PASS HTMLSelectElement interface: document.createElement("select") must inherit property "name" with the proper type +PASS HTMLSelectElement interface: document.createElement("select") must inherit property "required" with the proper type +PASS HTMLSelectElement interface: document.createElement("select") must inherit property "size" with the proper type +PASS HTMLSelectElement interface: document.createElement("select") must inherit property "type" with the proper type +PASS HTMLSelectElement interface: document.createElement("select") must inherit property "options" with the proper type +PASS HTMLSelectElement interface: document.createElement("select") must inherit property "length" with the proper type +PASS HTMLSelectElement interface: document.createElement("select") must inherit property "item(unsigned long)" with the proper type PASS HTMLSelectElement interface: calling item(unsigned long) on document.createElement("select") with too few arguments must throw TypeError -PASS HTMLSelectElement interface: document.createElement("select") must inherit property "namedItem" with the proper type (12) +PASS HTMLSelectElement interface: document.createElement("select") must inherit property "namedItem(DOMString)" with the proper type PASS HTMLSelectElement interface: calling namedItem(DOMString) on document.createElement("select") with too few arguments must throw TypeError -PASS HTMLSelectElement interface: document.createElement("select") must inherit property "add" with the proper type (13) -PASS HTMLSelectElement interface: calling add([object Object],[object Object],[object Object],[object Object]) on document.createElement("select") with too few arguments must throw TypeError -PASS HTMLSelectElement interface: document.createElement("select") must inherit property "remove" with the proper type (14) -PASS HTMLSelectElement interface: document.createElement("select") must inherit property "remove" with the proper type (15) +PASS HTMLSelectElement interface: document.createElement("select") must inherit property "add([object Object],[object Object], [object Object],[object Object])" with the proper type +PASS HTMLSelectElement interface: calling add([object Object],[object Object], [object Object],[object Object]) on document.createElement("select") with too few arguments must throw TypeError +PASS HTMLSelectElement interface: document.createElement("select") must inherit property "remove()" with the proper type +PASS HTMLSelectElement interface: document.createElement("select") must inherit property "remove(long)" with the proper type PASS HTMLSelectElement interface: calling remove(long) on document.createElement("select") with too few arguments must throw TypeError -PASS HTMLSelectElement interface: document.createElement("select") must inherit property "selectedOptions" with the proper type (17) -PASS HTMLSelectElement interface: document.createElement("select") must inherit property "selectedIndex" with the proper type (18) -PASS HTMLSelectElement interface: document.createElement("select") must inherit property "value" with the proper type (19) -PASS HTMLSelectElement interface: document.createElement("select") must inherit property "willValidate" with the proper type (20) -PASS HTMLSelectElement interface: document.createElement("select") must inherit property "validity" with the proper type (21) -PASS HTMLSelectElement interface: document.createElement("select") must inherit property "validationMessage" with the proper type (22) -PASS HTMLSelectElement interface: document.createElement("select") must inherit property "checkValidity" with the proper type (23) -PASS HTMLSelectElement interface: document.createElement("select") must inherit property "reportValidity" with the proper type (24) -PASS HTMLSelectElement interface: document.createElement("select") must inherit property "setCustomValidity" with the proper type (25) +PASS HTMLSelectElement interface: document.createElement("select") must inherit property "selectedOptions" with the proper type +PASS HTMLSelectElement interface: document.createElement("select") must inherit property "selectedIndex" with the proper type +PASS HTMLSelectElement interface: document.createElement("select") must inherit property "value" with the proper type +PASS HTMLSelectElement interface: document.createElement("select") must inherit property "willValidate" with the proper type +PASS HTMLSelectElement interface: document.createElement("select") must inherit property "validity" with the proper type +PASS HTMLSelectElement interface: document.createElement("select") must inherit property "validationMessage" with the proper type +PASS HTMLSelectElement interface: document.createElement("select") must inherit property "checkValidity()" with the proper type +PASS HTMLSelectElement interface: document.createElement("select") must inherit property "reportValidity()" with the proper type +PASS HTMLSelectElement interface: document.createElement("select") must inherit property "setCustomValidity(DOMString)" with the proper type PASS HTMLSelectElement interface: calling setCustomValidity(DOMString) on document.createElement("select") with too few arguments must throw TypeError -PASS HTMLSelectElement interface: document.createElement("select") must inherit property "labels" with the proper type (26) +PASS HTMLSelectElement interface: document.createElement("select") must inherit property "labels" with the proper type PASS HTMLDataListElement interface: existence and properties of interface object PASS HTMLDataListElement interface object length PASS HTMLDataListElement interface object name @@ -3676,7 +3676,7 @@ PASS HTMLDataListElement interface: attribute options PASS HTMLDataListElement must be primary interface of document.createElement("datalist") PASS Stringification of document.createElement("datalist") -PASS HTMLDataListElement interface: document.createElement("datalist") must inherit property "options" with the proper type (0) +PASS HTMLDataListElement interface: document.createElement("datalist") must inherit property "options" with the proper type PASS HTMLOptGroupElement interface: existence and properties of interface object PASS HTMLOptGroupElement interface object length PASS HTMLOptGroupElement interface object name @@ -3686,8 +3686,8 @@ PASS HTMLOptGroupElement interface: attribute label PASS HTMLOptGroupElement must be primary interface of document.createElement("optgroup") PASS Stringification of document.createElement("optgroup") -PASS HTMLOptGroupElement interface: document.createElement("optgroup") must inherit property "disabled" with the proper type (0) -PASS HTMLOptGroupElement interface: document.createElement("optgroup") must inherit property "label" with the proper type (1) +PASS HTMLOptGroupElement interface: document.createElement("optgroup") must inherit property "disabled" with the proper type +PASS HTMLOptGroupElement interface: document.createElement("optgroup") must inherit property "label" with the proper type PASS HTMLOptionElement interface: existence and properties of interface object PASS HTMLOptionElement interface object length PASS HTMLOptionElement interface object name @@ -3703,24 +3703,24 @@ PASS HTMLOptionElement interface: attribute index PASS HTMLOptionElement must be primary interface of document.createElement("option") PASS Stringification of document.createElement("option") -PASS HTMLOptionElement interface: document.createElement("option") must inherit property "disabled" with the proper type (0) -PASS HTMLOptionElement interface: document.createElement("option") must inherit property "form" with the proper type (1) -PASS HTMLOptionElement interface: document.createElement("option") must inherit property "label" with the proper type (2) -PASS HTMLOptionElement interface: document.createElement("option") must inherit property "defaultSelected" with the proper type (3) -PASS HTMLOptionElement interface: document.createElement("option") must inherit property "selected" with the proper type (4) -PASS HTMLOptionElement interface: document.createElement("option") must inherit property "value" with the proper type (5) -PASS HTMLOptionElement interface: document.createElement("option") must inherit property "text" with the proper type (6) -PASS HTMLOptionElement interface: document.createElement("option") must inherit property "index" with the proper type (7) +PASS HTMLOptionElement interface: document.createElement("option") must inherit property "disabled" with the proper type +PASS HTMLOptionElement interface: document.createElement("option") must inherit property "form" with the proper type +PASS HTMLOptionElement interface: document.createElement("option") must inherit property "label" with the proper type +PASS HTMLOptionElement interface: document.createElement("option") must inherit property "defaultSelected" with the proper type +PASS HTMLOptionElement interface: document.createElement("option") must inherit property "selected" with the proper type +PASS HTMLOptionElement interface: document.createElement("option") must inherit property "value" with the proper type +PASS HTMLOptionElement interface: document.createElement("option") must inherit property "text" with the proper type +PASS HTMLOptionElement interface: document.createElement("option") must inherit property "index" with the proper type PASS HTMLOptionElement must be primary interface of new Option() PASS Stringification of new Option() -PASS HTMLOptionElement interface: new Option() must inherit property "disabled" with the proper type (0) -PASS HTMLOptionElement interface: new Option() must inherit property "form" with the proper type (1) -PASS HTMLOptionElement interface: new Option() must inherit property "label" with the proper type (2) -PASS HTMLOptionElement interface: new Option() must inherit property "defaultSelected" with the proper type (3) -PASS HTMLOptionElement interface: new Option() must inherit property "selected" with the proper type (4) -PASS HTMLOptionElement interface: new Option() must inherit property "value" with the proper type (5) -PASS HTMLOptionElement interface: new Option() must inherit property "text" with the proper type (6) -PASS HTMLOptionElement interface: new Option() must inherit property "index" with the proper type (7) +PASS HTMLOptionElement interface: new Option() must inherit property "disabled" with the proper type +PASS HTMLOptionElement interface: new Option() must inherit property "form" with the proper type +PASS HTMLOptionElement interface: new Option() must inherit property "label" with the proper type +PASS HTMLOptionElement interface: new Option() must inherit property "defaultSelected" with the proper type +PASS HTMLOptionElement interface: new Option() must inherit property "selected" with the proper type +PASS HTMLOptionElement interface: new Option() must inherit property "value" with the proper type +PASS HTMLOptionElement interface: new Option() must inherit property "text" with the proper type +PASS HTMLOptionElement interface: new Option() must inherit property "index" with the proper type PASS HTMLTextAreaElement interface: existence and properties of interface object PASS HTMLTextAreaElement interface object length PASS HTMLTextAreaElement interface object name @@ -3757,47 +3757,47 @@ PASS HTMLTextAreaElement interface: attribute selectionEnd PASS HTMLTextAreaElement interface: attribute selectionDirection PASS HTMLTextAreaElement interface: operation setRangeText(DOMString) -PASS HTMLTextAreaElement interface: operation setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) -PASS HTMLTextAreaElement interface: operation setSelectionRange(unsigned long,unsigned long,DOMString) +PASS HTMLTextAreaElement interface: operation setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) +PASS HTMLTextAreaElement interface: operation setSelectionRange(unsigned long, unsigned long, DOMString) PASS HTMLTextAreaElement must be primary interface of document.createElement("textarea") PASS Stringification of document.createElement("textarea") -FAIL HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "autocomplete" with the proper type (0) assert_inherits: property "autocomplete" not found in prototype chain -PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "autofocus" with the proper type (1) -PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "cols" with the proper type (2) -PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "dirName" with the proper type (3) -PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "disabled" with the proper type (4) -PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "form" with the proper type (5) -PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "inputMode" with the proper type (6) -PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "maxLength" with the proper type (7) -PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "minLength" with the proper type (8) -PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "name" with the proper type (9) -PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "placeholder" with the proper type (10) -PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "readOnly" with the proper type (11) -PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "required" with the proper type (12) -PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "rows" with the proper type (13) -PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "wrap" with the proper type (14) -PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "type" with the proper type (15) -PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "defaultValue" with the proper type (16) -PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "value" with the proper type (17) -PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "textLength" with the proper type (18) -PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "willValidate" with the proper type (19) -PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "validity" with the proper type (20) -PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "validationMessage" with the proper type (21) -PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "checkValidity" with the proper type (22) -PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "reportValidity" with the proper type (23) -PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "setCustomValidity" with the proper type (24) +FAIL HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "autocomplete" with the proper type assert_inherits: property "autocomplete" not found in prototype chain +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "autofocus" with the proper type +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "cols" with the proper type +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "dirName" with the proper type +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "disabled" with the proper type +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "form" with the proper type +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "inputMode" with the proper type +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "maxLength" with the proper type +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "minLength" with the proper type +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "name" with the proper type +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "placeholder" with the proper type +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "readOnly" with the proper type +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "required" with the proper type +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "rows" with the proper type +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "wrap" with the proper type +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "type" with the proper type +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "defaultValue" with the proper type +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "value" with the proper type +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "textLength" with the proper type +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "willValidate" with the proper type +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "validity" with the proper type +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "validationMessage" with the proper type +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "checkValidity()" with the proper type +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "reportValidity()" with the proper type +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "setCustomValidity(DOMString)" with the proper type PASS HTMLTextAreaElement interface: calling setCustomValidity(DOMString) on document.createElement("textarea") with too few arguments must throw TypeError -PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "labels" with the proper type (25) -PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "select" with the proper type (26) -PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "selectionStart" with the proper type (27) -PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "selectionEnd" with the proper type (28) -PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "selectionDirection" with the proper type (29) -PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "setRangeText" with the proper type (30) +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "labels" with the proper type +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "select()" with the proper type +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "selectionStart" with the proper type +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "selectionEnd" with the proper type +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "selectionDirection" with the proper type +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "setRangeText(DOMString)" with the proper type PASS HTMLTextAreaElement interface: calling setRangeText(DOMString) on document.createElement("textarea") with too few arguments must throw TypeError -PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "setRangeText" with the proper type (31) -PASS HTMLTextAreaElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on document.createElement("textarea") with too few arguments must throw TypeError -PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "setSelectionRange" with the proper type (32) -PASS HTMLTextAreaElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on document.createElement("textarea") with too few arguments must throw TypeError +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type +PASS HTMLTextAreaElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on document.createElement("textarea") with too few arguments must throw TypeError +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type +PASS HTMLTextAreaElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on document.createElement("textarea") with too few arguments must throw TypeError PASS HTMLOutputElement interface: existence and properties of interface object PASS HTMLOutputElement interface object length PASS HTMLOutputElement interface object name @@ -3818,20 +3818,20 @@ PASS HTMLOutputElement interface: attribute labels PASS HTMLOutputElement must be primary interface of document.createElement("output") PASS Stringification of document.createElement("output") -PASS HTMLOutputElement interface: document.createElement("output") must inherit property "htmlFor" with the proper type (0) -PASS HTMLOutputElement interface: document.createElement("output") must inherit property "form" with the proper type (1) -PASS HTMLOutputElement interface: document.createElement("output") must inherit property "name" with the proper type (2) -PASS HTMLOutputElement interface: document.createElement("output") must inherit property "type" with the proper type (3) -PASS HTMLOutputElement interface: document.createElement("output") must inherit property "defaultValue" with the proper type (4) -PASS HTMLOutputElement interface: document.createElement("output") must inherit property "value" with the proper type (5) -PASS HTMLOutputElement interface: document.createElement("output") must inherit property "willValidate" with the proper type (6) -PASS HTMLOutputElement interface: document.createElement("output") must inherit property "validity" with the proper type (7) -PASS HTMLOutputElement interface: document.createElement("output") must inherit property "validationMessage" with the proper type (8) -PASS HTMLOutputElement interface: document.createElement("output") must inherit property "checkValidity" with the proper type (9) -PASS HTMLOutputElement interface: document.createElement("output") must inherit property "reportValidity" with the proper type (10) -PASS HTMLOutputElement interface: document.createElement("output") must inherit property "setCustomValidity" with the proper type (11) +PASS HTMLOutputElement interface: document.createElement("output") must inherit property "htmlFor" with the proper type +PASS HTMLOutputElement interface: document.createElement("output") must inherit property "form" with the proper type +PASS HTMLOutputElement interface: document.createElement("output") must inherit property "name" with the proper type +PASS HTMLOutputElement interface: document.createElement("output") must inherit property "type" with the proper type +PASS HTMLOutputElement interface: document.createElement("output") must inherit property "defaultValue" with the proper type +PASS HTMLOutputElement interface: document.createElement("output") must inherit property "value" with the proper type +PASS HTMLOutputElement interface: document.createElement("output") must inherit property "willValidate" with the proper type +PASS HTMLOutputElement interface: document.createElement("output") must inherit property "validity" with the proper type +PASS HTMLOutputElement interface: document.createElement("output") must inherit property "validationMessage" with the proper type +PASS HTMLOutputElement interface: document.createElement("output") must inherit property "checkValidity()" with the proper type +PASS HTMLOutputElement interface: document.createElement("output") must inherit property "reportValidity()" with the proper type +PASS HTMLOutputElement interface: document.createElement("output") must inherit property "setCustomValidity(DOMString)" with the proper type PASS HTMLOutputElement interface: calling setCustomValidity(DOMString) on document.createElement("output") with too few arguments must throw TypeError -PASS HTMLOutputElement interface: document.createElement("output") must inherit property "labels" with the proper type (12) +PASS HTMLOutputElement interface: document.createElement("output") must inherit property "labels" with the proper type PASS HTMLProgressElement interface: existence and properties of interface object PASS HTMLProgressElement interface object length PASS HTMLProgressElement interface object name @@ -3843,10 +3843,10 @@ PASS HTMLProgressElement interface: attribute labels PASS HTMLProgressElement must be primary interface of document.createElement("progress") PASS Stringification of document.createElement("progress") -PASS HTMLProgressElement interface: document.createElement("progress") must inherit property "value" with the proper type (0) -PASS HTMLProgressElement interface: document.createElement("progress") must inherit property "max" with the proper type (1) -PASS HTMLProgressElement interface: document.createElement("progress") must inherit property "position" with the proper type (2) -PASS HTMLProgressElement interface: document.createElement("progress") must inherit property "labels" with the proper type (3) +PASS HTMLProgressElement interface: document.createElement("progress") must inherit property "value" with the proper type +PASS HTMLProgressElement interface: document.createElement("progress") must inherit property "max" with the proper type +PASS HTMLProgressElement interface: document.createElement("progress") must inherit property "position" with the proper type +PASS HTMLProgressElement interface: document.createElement("progress") must inherit property "labels" with the proper type PASS HTMLMeterElement interface: existence and properties of interface object PASS HTMLMeterElement interface object length PASS HTMLMeterElement interface object name @@ -3861,13 +3861,13 @@ PASS HTMLMeterElement interface: attribute labels PASS HTMLMeterElement must be primary interface of document.createElement("meter") PASS Stringification of document.createElement("meter") -PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "value" with the proper type (0) -PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "min" with the proper type (1) -PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "max" with the proper type (2) -PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "low" with the proper type (3) -PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "high" with the proper type (4) -PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "optimum" with the proper type (5) -PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "labels" with the proper type (6) +PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "value" with the proper type +PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "min" with the proper type +PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "max" with the proper type +PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "low" with the proper type +PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "high" with the proper type +PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "optimum" with the proper type +PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "labels" with the proper type PASS HTMLFieldSetElement interface: existence and properties of interface object PASS HTMLFieldSetElement interface object length PASS HTMLFieldSetElement interface object name @@ -3893,8 +3893,8 @@ PASS HTMLLegendElement interface: attribute align PASS HTMLLegendElement must be primary interface of document.createElement("legend") PASS Stringification of document.createElement("legend") -PASS HTMLLegendElement interface: document.createElement("legend") must inherit property "form" with the proper type (0) -PASS HTMLLegendElement interface: document.createElement("legend") must inherit property "align" with the proper type (1) +PASS HTMLLegendElement interface: document.createElement("legend") must inherit property "form" with the proper type +PASS HTMLLegendElement interface: document.createElement("legend") must inherit property "align" with the proper type PASS ValidityState interface: existence and properties of interface object PASS ValidityState interface object length PASS ValidityState interface object name @@ -3913,17 +3913,17 @@ PASS ValidityState interface: attribute valid PASS ValidityState must be primary interface of document.createElement("input").validity PASS Stringification of document.createElement("input").validity -PASS ValidityState interface: document.createElement("input").validity must inherit property "valueMissing" with the proper type (0) -PASS ValidityState interface: document.createElement("input").validity must inherit property "typeMismatch" with the proper type (1) -PASS ValidityState interface: document.createElement("input").validity must inherit property "patternMismatch" with the proper type (2) -PASS ValidityState interface: document.createElement("input").validity must inherit property "tooLong" with the proper type (3) -PASS ValidityState interface: document.createElement("input").validity must inherit property "tooShort" with the proper type (4) -PASS ValidityState interface: document.createElement("input").validity must inherit property "rangeUnderflow" with the proper type (5) -PASS ValidityState interface: document.createElement("input").validity must inherit property "rangeOverflow" with the proper type (6) -PASS ValidityState interface: document.createElement("input").validity must inherit property "stepMismatch" with the proper type (7) -PASS ValidityState interface: document.createElement("input").validity must inherit property "badInput" with the proper type (8) -PASS ValidityState interface: document.createElement("input").validity must inherit property "customError" with the proper type (9) -PASS ValidityState interface: document.createElement("input").validity must inherit property "valid" with the proper type (10) +PASS ValidityState interface: document.createElement("input").validity must inherit property "valueMissing" with the proper type +PASS ValidityState interface: document.createElement("input").validity must inherit property "typeMismatch" with the proper type +PASS ValidityState interface: document.createElement("input").validity must inherit property "patternMismatch" with the proper type +PASS ValidityState interface: document.createElement("input").validity must inherit property "tooLong" with the proper type +PASS ValidityState interface: document.createElement("input").validity must inherit property "tooShort" with the proper type +PASS ValidityState interface: document.createElement("input").validity must inherit property "rangeUnderflow" with the proper type +PASS ValidityState interface: document.createElement("input").validity must inherit property "rangeOverflow" with the proper type +PASS ValidityState interface: document.createElement("input").validity must inherit property "stepMismatch" with the proper type +PASS ValidityState interface: document.createElement("input").validity must inherit property "badInput" with the proper type +PASS ValidityState interface: document.createElement("input").validity must inherit property "customError" with the proper type +PASS ValidityState interface: document.createElement("input").validity must inherit property "valid" with the proper type PASS HTMLDetailsElement interface: existence and properties of interface object PASS HTMLDetailsElement interface object length PASS HTMLDetailsElement interface object name @@ -3932,7 +3932,7 @@ PASS HTMLDetailsElement interface: attribute open PASS HTMLDetailsElement must be primary interface of document.createElement("details") PASS Stringification of document.createElement("details") -PASS HTMLDetailsElement interface: document.createElement("details") must inherit property "open" with the proper type (0) +PASS HTMLDetailsElement interface: document.createElement("details") must inherit property "open" with the proper type PASS HTMLMenuElement interface: existence and properties of interface object PASS HTMLMenuElement interface object length PASS HTMLMenuElement interface object name @@ -3941,7 +3941,7 @@ PASS HTMLMenuElement interface: attribute compact PASS HTMLMenuElement must be primary interface of document.createElement("menu") PASS Stringification of document.createElement("menu") -PASS HTMLMenuElement interface: document.createElement("menu") must inherit property "compact" with the proper type (0) +PASS HTMLMenuElement interface: document.createElement("menu") must inherit property "compact" with the proper type PASS HTMLDialogElement interface: existence and properties of interface object PASS HTMLDialogElement interface object length PASS HTMLDialogElement interface object name @@ -3971,18 +3971,18 @@ PASS HTMLScriptElement interface: attribute htmlFor PASS HTMLScriptElement must be primary interface of document.createElement("script") PASS Stringification of document.createElement("script") -PASS HTMLScriptElement interface: document.createElement("script") must inherit property "src" with the proper type (0) -PASS HTMLScriptElement interface: document.createElement("script") must inherit property "type" with the proper type (1) -PASS HTMLScriptElement interface: document.createElement("script") must inherit property "noModule" with the proper type (2) -PASS HTMLScriptElement interface: document.createElement("script") must inherit property "charset" with the proper type (3) -PASS HTMLScriptElement interface: document.createElement("script") must inherit property "async" with the proper type (4) -PASS HTMLScriptElement interface: document.createElement("script") must inherit property "defer" with the proper type (5) -PASS HTMLScriptElement interface: document.createElement("script") must inherit property "crossOrigin" with the proper type (6) -PASS HTMLScriptElement interface: document.createElement("script") must inherit property "text" with the proper type (7) -PASS HTMLScriptElement interface: document.createElement("script") must inherit property "nonce" with the proper type (8) -PASS HTMLScriptElement interface: document.createElement("script") must inherit property "integrity" with the proper type (9) -PASS HTMLScriptElement interface: document.createElement("script") must inherit property "event" with the proper type (10) -PASS HTMLScriptElement interface: document.createElement("script") must inherit property "htmlFor" with the proper type (11) +PASS HTMLScriptElement interface: document.createElement("script") must inherit property "src" with the proper type +PASS HTMLScriptElement interface: document.createElement("script") must inherit property "type" with the proper type +PASS HTMLScriptElement interface: document.createElement("script") must inherit property "noModule" with the proper type +PASS HTMLScriptElement interface: document.createElement("script") must inherit property "charset" with the proper type +PASS HTMLScriptElement interface: document.createElement("script") must inherit property "async" with the proper type +PASS HTMLScriptElement interface: document.createElement("script") must inherit property "defer" with the proper type +PASS HTMLScriptElement interface: document.createElement("script") must inherit property "crossOrigin" with the proper type +PASS HTMLScriptElement interface: document.createElement("script") must inherit property "text" with the proper type +PASS HTMLScriptElement interface: document.createElement("script") must inherit property "nonce" with the proper type +PASS HTMLScriptElement interface: document.createElement("script") must inherit property "integrity" with the proper type +PASS HTMLScriptElement interface: document.createElement("script") must inherit property "event" with the proper type +PASS HTMLScriptElement interface: document.createElement("script") must inherit property "htmlFor" with the proper type PASS HTMLTemplateElement interface: existence and properties of interface object PASS HTMLTemplateElement interface object length PASS HTMLTemplateElement interface object name @@ -3991,7 +3991,7 @@ PASS HTMLTemplateElement interface: attribute content PASS HTMLTemplateElement must be primary interface of document.createElement("template") PASS Stringification of document.createElement("template") -PASS HTMLTemplateElement interface: document.createElement("template") must inherit property "content" with the proper type (0) +PASS HTMLTemplateElement interface: document.createElement("template") must inherit property "content" with the proper type PASS HTMLSlotElement interface: existence and properties of interface object PASS HTMLSlotElement interface object length PASS HTMLSlotElement interface object name @@ -4001,8 +4001,8 @@ PASS HTMLSlotElement interface: operation assignedNodes(AssignedNodesOptions) PASS HTMLSlotElement must be primary interface of document.createElement("slot") PASS Stringification of document.createElement("slot") -PASS HTMLSlotElement interface: document.createElement("slot") must inherit property "name" with the proper type (0) -PASS HTMLSlotElement interface: document.createElement("slot") must inherit property "assignedNodes" with the proper type (1) +PASS HTMLSlotElement interface: document.createElement("slot") must inherit property "name" with the proper type +PASS HTMLSlotElement interface: document.createElement("slot") must inherit property "assignedNodes(AssignedNodesOptions)" with the proper type PASS HTMLSlotElement interface: calling assignedNodes(AssignedNodesOptions) on document.createElement("slot") with too few arguments must throw TypeError PASS HTMLCanvasElement interface: existence and properties of interface object PASS HTMLCanvasElement interface object length @@ -4011,19 +4011,19 @@ PASS HTMLCanvasElement interface: existence and properties of interface prototype object's "constructor" property PASS HTMLCanvasElement interface: attribute width PASS HTMLCanvasElement interface: attribute height -PASS HTMLCanvasElement interface: operation getContext(DOMString,any) -PASS HTMLCanvasElement interface: operation toDataURL(DOMString,any) -PASS HTMLCanvasElement interface: operation toBlob(BlobCallback,DOMString,any) +PASS HTMLCanvasElement interface: operation getContext(DOMString, any) +PASS HTMLCanvasElement interface: operation toDataURL(DOMString, any) +PASS HTMLCanvasElement interface: operation toBlob(BlobCallback, DOMString, any) PASS HTMLCanvasElement must be primary interface of document.createElement("canvas") PASS Stringification of document.createElement("canvas") -PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "width" with the proper type (0) -PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "height" with the proper type (1) -PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "getContext" with the proper type (2) -PASS HTMLCanvasElement interface: calling getContext(DOMString,any) on document.createElement("canvas") with too few arguments must throw TypeError -PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "toDataURL" with the proper type (3) -PASS HTMLCanvasElement interface: calling toDataURL(DOMString,any) on document.createElement("canvas") with too few arguments must throw TypeError -PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "toBlob" with the proper type (4) -PASS HTMLCanvasElement interface: calling toBlob(BlobCallback,DOMString,any) on document.createElement("canvas") with too few arguments must throw TypeError +PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "width" with the proper type +PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "height" with the proper type +PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "getContext(DOMString, any)" with the proper type +PASS HTMLCanvasElement interface: calling getContext(DOMString, any) on document.createElement("canvas") with too few arguments must throw TypeError +PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "toDataURL(DOMString, any)" with the proper type +PASS HTMLCanvasElement interface: calling toDataURL(DOMString, any) on document.createElement("canvas") with too few arguments must throw TypeError +PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "toBlob(BlobCallback, DOMString, any)" with the proper type +PASS HTMLCanvasElement interface: calling toBlob(BlobCallback, DOMString, any) on document.createElement("canvas") with too few arguments must throw TypeError PASS CanvasRenderingContext2D interface: existence and properties of interface object PASS CanvasRenderingContext2D interface object length PASS CanvasRenderingContext2D interface object name @@ -4032,12 +4032,12 @@ PASS CanvasRenderingContext2D interface: attribute canvas PASS CanvasRenderingContext2D interface: operation save() PASS CanvasRenderingContext2D interface: operation restore() -PASS CanvasRenderingContext2D interface: operation scale(unrestricted double,unrestricted double) +PASS CanvasRenderingContext2D interface: operation scale(unrestricted double, unrestricted double) PASS CanvasRenderingContext2D interface: operation rotate(unrestricted double) -PASS CanvasRenderingContext2D interface: operation translate(unrestricted double,unrestricted double) -PASS CanvasRenderingContext2D interface: operation transform(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) +PASS CanvasRenderingContext2D interface: operation translate(unrestricted double, unrestricted double) +PASS CanvasRenderingContext2D interface: operation transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) FAIL CanvasRenderingContext2D interface: operation getTransform() assert_own_property: interface prototype object missing non-static operation expected property "getTransform" missing -FAIL CanvasRenderingContext2D interface: operation setTransform(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) assert_equals: property has wrong .length expected 0 but got 6 +FAIL CanvasRenderingContext2D interface: operation setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) assert_equals: property has wrong .length expected 0 but got 6 FAIL CanvasRenderingContext2D interface: operation setTransform(DOMMatrixInit) assert_equals: property has wrong .length expected 0 but got 6 PASS CanvasRenderingContext2D interface: operation resetTransform() PASS CanvasRenderingContext2D interface: attribute globalAlpha @@ -4046,47 +4046,47 @@ PASS CanvasRenderingContext2D interface: attribute imageSmoothingQuality PASS CanvasRenderingContext2D interface: attribute strokeStyle PASS CanvasRenderingContext2D interface: attribute fillStyle -PASS CanvasRenderingContext2D interface: operation createLinearGradient(double,double,double,double) -PASS CanvasRenderingContext2D interface: operation createRadialGradient(double,double,double,double,double,double) -PASS CanvasRenderingContext2D interface: operation createPattern(CanvasImageSource,DOMString) +PASS CanvasRenderingContext2D interface: operation createLinearGradient(double, double, double, double) +PASS CanvasRenderingContext2D interface: operation createRadialGradient(double, double, double, double, double, double) +PASS CanvasRenderingContext2D interface: operation createPattern(CanvasImageSource, DOMString) PASS CanvasRenderingContext2D interface: attribute shadowOffsetX PASS CanvasRenderingContext2D interface: attribute shadowOffsetY PASS CanvasRenderingContext2D interface: attribute shadowBlur PASS CanvasRenderingContext2D interface: attribute shadowColor PASS CanvasRenderingContext2D interface: attribute filter -PASS CanvasRenderingContext2D interface: operation clearRect(unrestricted double,unrestricted double,unrestricted double,unrestricted double) -PASS CanvasRenderingContext2D interface: operation fillRect(unrestricted double,unrestricted double,unrestricted double,unrestricted double) -PASS CanvasRenderingContext2D interface: operation strokeRect(unrestricted double,unrestricted double,unrestricted double,unrestricted double) +PASS CanvasRenderingContext2D interface: operation clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) +PASS CanvasRenderingContext2D interface: operation fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) +PASS CanvasRenderingContext2D interface: operation strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) PASS CanvasRenderingContext2D interface: operation beginPath() PASS CanvasRenderingContext2D interface: operation fill(CanvasFillRule) -PASS CanvasRenderingContext2D interface: operation fill(Path2D,CanvasFillRule) +PASS CanvasRenderingContext2D interface: operation fill(Path2D, CanvasFillRule) PASS CanvasRenderingContext2D interface: operation stroke() PASS CanvasRenderingContext2D interface: operation stroke(Path2D) PASS CanvasRenderingContext2D interface: operation clip(CanvasFillRule) -PASS CanvasRenderingContext2D interface: operation clip(Path2D,CanvasFillRule) +PASS CanvasRenderingContext2D interface: operation clip(Path2D, CanvasFillRule) FAIL CanvasRenderingContext2D interface: operation resetClip() assert_own_property: interface prototype object missing non-static operation expected property "resetClip" missing -PASS CanvasRenderingContext2D interface: operation isPointInPath(unrestricted double,unrestricted double,CanvasFillRule) -PASS CanvasRenderingContext2D interface: operation isPointInPath(Path2D,unrestricted double,unrestricted double,CanvasFillRule) -PASS CanvasRenderingContext2D interface: operation isPointInStroke(unrestricted double,unrestricted double) -PASS CanvasRenderingContext2D interface: operation isPointInStroke(Path2D,unrestricted double,unrestricted double) +PASS CanvasRenderingContext2D interface: operation isPointInPath(unrestricted double, unrestricted double, CanvasFillRule) +PASS CanvasRenderingContext2D interface: operation isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule) +PASS CanvasRenderingContext2D interface: operation isPointInStroke(unrestricted double, unrestricted double) +PASS CanvasRenderingContext2D interface: operation isPointInStroke(Path2D, unrestricted double, unrestricted double) PASS CanvasRenderingContext2D interface: operation drawFocusIfNeeded(Element) -PASS CanvasRenderingContext2D interface: operation drawFocusIfNeeded(Path2D,Element) +PASS CanvasRenderingContext2D interface: operation drawFocusIfNeeded(Path2D, Element) PASS CanvasRenderingContext2D interface: operation scrollPathIntoView() PASS CanvasRenderingContext2D interface: operation scrollPathIntoView(Path2D) -PASS CanvasRenderingContext2D interface: operation fillText(DOMString,unrestricted double,unrestricted double,unrestricted double) -PASS CanvasRenderingContext2D interface: operation strokeText(DOMString,unrestricted double,unrestricted double,unrestricted double) +PASS CanvasRenderingContext2D interface: operation fillText(DOMString, unrestricted double, unrestricted double, unrestricted double) +PASS CanvasRenderingContext2D interface: operation strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double) PASS CanvasRenderingContext2D interface: operation measureText(DOMString) -PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource,unrestricted double,unrestricted double) -PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource,unrestricted double,unrestricted double,unrestricted double,unrestricted double) -PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) +PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double) +PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double) +PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) PASS CanvasRenderingContext2D interface: operation addHitRegion(HitRegionOptions) PASS CanvasRenderingContext2D interface: operation removeHitRegion(DOMString) PASS CanvasRenderingContext2D interface: operation clearHitRegions() -PASS CanvasRenderingContext2D interface: operation createImageData(double,double) +PASS CanvasRenderingContext2D interface: operation createImageData(double, double) PASS CanvasRenderingContext2D interface: operation createImageData(ImageData) -PASS CanvasRenderingContext2D interface: operation getImageData(double,double,double,double) -PASS CanvasRenderingContext2D interface: operation putImageData(ImageData,double,double) -PASS CanvasRenderingContext2D interface: operation putImageData(ImageData,double,double,double,double,double,double) +PASS CanvasRenderingContext2D interface: operation getImageData(double, double, double, double) +PASS CanvasRenderingContext2D interface: operation putImageData(ImageData, double, double) +PASS CanvasRenderingContext2D interface: operation putImageData(ImageData, double, double, double, double, double, double) PASS CanvasRenderingContext2D interface: attribute lineWidth PASS CanvasRenderingContext2D interface: attribute lineCap PASS CanvasRenderingContext2D interface: attribute lineJoin @@ -4099,149 +4099,149 @@ PASS CanvasRenderingContext2D interface: attribute textBaseline PASS CanvasRenderingContext2D interface: attribute direction PASS CanvasRenderingContext2D interface: operation closePath() -PASS CanvasRenderingContext2D interface: operation moveTo(unrestricted double,unrestricted double) -PASS CanvasRenderingContext2D interface: operation lineTo(unrestricted double,unrestricted double) -PASS CanvasRenderingContext2D interface: operation quadraticCurveTo(unrestricted double,unrestricted double,unrestricted double,unrestricted double) -PASS CanvasRenderingContext2D interface: operation bezierCurveTo(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) -PASS CanvasRenderingContext2D interface: operation arcTo(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) -PASS CanvasRenderingContext2D interface: operation arcTo(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) -PASS CanvasRenderingContext2D interface: operation rect(unrestricted double,unrestricted double,unrestricted double,unrestricted double) -PASS CanvasRenderingContext2D interface: operation arc(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,boolean) -PASS CanvasRenderingContext2D interface: operation ellipse(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,boolean) +PASS CanvasRenderingContext2D interface: operation moveTo(unrestricted double, unrestricted double) +PASS CanvasRenderingContext2D interface: operation lineTo(unrestricted double, unrestricted double) +PASS CanvasRenderingContext2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double) +PASS CanvasRenderingContext2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) +PASS CanvasRenderingContext2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) +PASS CanvasRenderingContext2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) +PASS CanvasRenderingContext2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) +PASS CanvasRenderingContext2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) +PASS CanvasRenderingContext2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) PASS CanvasRenderingContext2D must be primary interface of document.createElement("canvas").getContext("2d") PASS Stringification of document.createElement("canvas").getContext("2d") -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "canvas" with the proper type (0) -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "save" with the proper type (1) -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "restore" with the proper type (2) -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scale" with the proper type (3) -PASS CanvasRenderingContext2D interface: calling scale(unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "rotate" with the proper type (4) +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "canvas" with the proper type +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "save()" with the proper type +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "restore()" with the proper type +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scale(unrestricted double, unrestricted double)" with the proper type +PASS CanvasRenderingContext2D interface: calling scale(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "rotate(unrestricted double)" with the proper type PASS CanvasRenderingContext2D interface: calling rotate(unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "translate" with the proper type (5) -PASS CanvasRenderingContext2D interface: calling translate(unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "transform" with the proper type (6) -PASS CanvasRenderingContext2D interface: calling transform(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -FAIL CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getTransform" with the proper type (7) assert_inherits: property "getTransform" not found in prototype chain -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setTransform" with the proper type (8) -PASS CanvasRenderingContext2D interface: calling setTransform(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setTransform" with the proper type (9) +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "translate(unrestricted double, unrestricted double)" with the proper type +PASS CanvasRenderingContext2D interface: calling translate(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS CanvasRenderingContext2D interface: calling transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +FAIL CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getTransform()" with the proper type assert_inherits: property "getTransform" not found in prototype chain +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS CanvasRenderingContext2D interface: calling setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setTransform(DOMMatrixInit)" with the proper type PASS CanvasRenderingContext2D interface: calling setTransform(DOMMatrixInit) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "resetTransform" with the proper type (10) -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "globalAlpha" with the proper type (11) -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "globalCompositeOperation" with the proper type (12) -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "imageSmoothingEnabled" with the proper type (13) -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "imageSmoothingQuality" with the proper type (14) -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeStyle" with the proper type (15) -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillStyle" with the proper type (16) -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createLinearGradient" with the proper type (17) -PASS CanvasRenderingContext2D interface: calling createLinearGradient(double,double,double,double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createRadialGradient" with the proper type (18) -PASS CanvasRenderingContext2D interface: calling createRadialGradient(double,double,double,double,double,double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createPattern" with the proper type (19) -PASS CanvasRenderingContext2D interface: calling createPattern(CanvasImageSource,DOMString) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowOffsetX" with the proper type (20) -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowOffsetY" with the proper type (21) -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowBlur" with the proper type (22) -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowColor" with the proper type (23) -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "filter" with the proper type (24) -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clearRect" with the proper type (25) -PASS CanvasRenderingContext2D interface: calling clearRect(unrestricted double,unrestricted double,unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillRect" with the proper type (26) -PASS CanvasRenderingContext2D interface: calling fillRect(unrestricted double,unrestricted double,unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeRect" with the proper type (27) -PASS CanvasRenderingContext2D interface: calling strokeRect(unrestricted double,unrestricted double,unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "beginPath" with the proper type (28) -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fill" with the proper type (29) +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "resetTransform()" with the proper type +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "globalAlpha" with the proper type +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "globalCompositeOperation" with the proper type +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "imageSmoothingEnabled" with the proper type +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "imageSmoothingQuality" with the proper type +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeStyle" with the proper type +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillStyle" with the proper type +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createLinearGradient(double, double, double, double)" with the proper type +PASS CanvasRenderingContext2D interface: calling createLinearGradient(double, double, double, double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createRadialGradient(double, double, double, double, double, double)" with the proper type +PASS CanvasRenderingContext2D interface: calling createRadialGradient(double, double, double, double, double, double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createPattern(CanvasImageSource, DOMString)" with the proper type +PASS CanvasRenderingContext2D interface: calling createPattern(CanvasImageSource, DOMString) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowOffsetX" with the proper type +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowOffsetY" with the proper type +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowBlur" with the proper type +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowColor" with the proper type +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "filter" with the proper type +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS CanvasRenderingContext2D interface: calling clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS CanvasRenderingContext2D interface: calling fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS CanvasRenderingContext2D interface: calling strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "beginPath()" with the proper type +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fill(CanvasFillRule)" with the proper type PASS CanvasRenderingContext2D interface: calling fill(CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fill" with the proper type (30) -PASS CanvasRenderingContext2D interface: calling fill(Path2D,CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "stroke" with the proper type (31) -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "stroke" with the proper type (32) +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fill(Path2D, CanvasFillRule)" with the proper type +PASS CanvasRenderingContext2D interface: calling fill(Path2D, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "stroke()" with the proper type +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "stroke(Path2D)" with the proper type PASS CanvasRenderingContext2D interface: calling stroke(Path2D) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clip" with the proper type (33) +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clip(CanvasFillRule)" with the proper type PASS CanvasRenderingContext2D interface: calling clip(CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clip" with the proper type (34) -PASS CanvasRenderingContext2D interface: calling clip(Path2D,CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -FAIL CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "resetClip" with the proper type (35) assert_inherits: property "resetClip" not found in prototype chain -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInPath" with the proper type (36) -PASS CanvasRenderingContext2D interface: calling isPointInPath(unrestricted double,unrestricted double,CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInPath" with the proper type (37) -PASS CanvasRenderingContext2D interface: calling isPointInPath(Path2D,unrestricted double,unrestricted double,CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInStroke" with the proper type (38) -PASS CanvasRenderingContext2D interface: calling isPointInStroke(unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInStroke" with the proper type (39) -PASS CanvasRenderingContext2D interface: calling isPointInStroke(Path2D,unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawFocusIfNeeded" with the proper type (40) +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clip(Path2D, CanvasFillRule)" with the proper type +PASS CanvasRenderingContext2D interface: calling clip(Path2D, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +FAIL CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "resetClip()" with the proper type assert_inherits: property "resetClip" not found in prototype chain +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInPath(unrestricted double, unrestricted double, CanvasFillRule)" with the proper type +PASS CanvasRenderingContext2D interface: calling isPointInPath(unrestricted double, unrestricted double, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule)" with the proper type +PASS CanvasRenderingContext2D interface: calling isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInStroke(unrestricted double, unrestricted double)" with the proper type +PASS CanvasRenderingContext2D interface: calling isPointInStroke(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInStroke(Path2D, unrestricted double, unrestricted double)" with the proper type +PASS CanvasRenderingContext2D interface: calling isPointInStroke(Path2D, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawFocusIfNeeded(Element)" with the proper type PASS CanvasRenderingContext2D interface: calling drawFocusIfNeeded(Element) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawFocusIfNeeded" with the proper type (41) -PASS CanvasRenderingContext2D interface: calling drawFocusIfNeeded(Path2D,Element) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scrollPathIntoView" with the proper type (42) -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scrollPathIntoView" with the proper type (43) +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawFocusIfNeeded(Path2D, Element)" with the proper type +PASS CanvasRenderingContext2D interface: calling drawFocusIfNeeded(Path2D, Element) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scrollPathIntoView()" with the proper type +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scrollPathIntoView(Path2D)" with the proper type PASS CanvasRenderingContext2D interface: calling scrollPathIntoView(Path2D) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillText" with the proper type (44) -PASS CanvasRenderingContext2D interface: calling fillText(DOMString,unrestricted double,unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeText" with the proper type (45) -PASS CanvasRenderingContext2D interface: calling strokeText(DOMString,unrestricted double,unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "measureText" with the proper type (46) +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillText(DOMString, unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS CanvasRenderingContext2D interface: calling fillText(DOMString, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS CanvasRenderingContext2D interface: calling strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "measureText(DOMString)" with the proper type PASS CanvasRenderingContext2D interface: calling measureText(DOMString) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage" with the proper type (47) -PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource,unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage" with the proper type (48) -PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource,unrestricted double,unrestricted double,unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage" with the proper type (49) -PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "addHitRegion" with the proper type (50) +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double)" with the proper type +PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "addHitRegion(HitRegionOptions)" with the proper type PASS CanvasRenderingContext2D interface: calling addHitRegion(HitRegionOptions) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "removeHitRegion" with the proper type (51) +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "removeHitRegion(DOMString)" with the proper type PASS CanvasRenderingContext2D interface: calling removeHitRegion(DOMString) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clearHitRegions" with the proper type (52) -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createImageData" with the proper type (53) -PASS CanvasRenderingContext2D interface: calling createImageData(double,double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createImageData" with the proper type (54) +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clearHitRegions()" with the proper type +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createImageData(double, double)" with the proper type +PASS CanvasRenderingContext2D interface: calling createImageData(double, double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createImageData(ImageData)" with the proper type PASS CanvasRenderingContext2D interface: calling createImageData(ImageData) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getImageData" with the proper type (55) -PASS CanvasRenderingContext2D interface: calling getImageData(double,double,double,double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "putImageData" with the proper type (56) -PASS CanvasRenderingContext2D interface: calling putImageData(ImageData,double,double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "putImageData" with the proper type (57) -PASS CanvasRenderingContext2D interface: calling putImageData(ImageData,double,double,double,double,double,double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineWidth" with the proper type (58) -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineCap" with the proper type (59) -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineJoin" with the proper type (60) -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "miterLimit" with the proper type (61) -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setLineDash" with the proper type (62) +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getImageData(double, double, double, double)" with the proper type +PASS CanvasRenderingContext2D interface: calling getImageData(double, double, double, double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "putImageData(ImageData, double, double)" with the proper type +PASS CanvasRenderingContext2D interface: calling putImageData(ImageData, double, double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "putImageData(ImageData, double, double, double, double, double, double)" with the proper type +PASS CanvasRenderingContext2D interface: calling putImageData(ImageData, double, double, double, double, double, double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineWidth" with the proper type +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineCap" with the proper type +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineJoin" with the proper type +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "miterLimit" with the proper type +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setLineDash([object Object])" with the proper type PASS CanvasRenderingContext2D interface: calling setLineDash([object Object]) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getLineDash" with the proper type (63) -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineDashOffset" with the proper type (64) -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "font" with the proper type (65) -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "textAlign" with the proper type (66) -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "textBaseline" with the proper type (67) -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "direction" with the proper type (68) -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "closePath" with the proper type (69) -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "moveTo" with the proper type (70) -PASS CanvasRenderingContext2D interface: calling moveTo(unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineTo" with the proper type (71) -PASS CanvasRenderingContext2D interface: calling lineTo(unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "quadraticCurveTo" with the proper type (72) -PASS CanvasRenderingContext2D interface: calling quadraticCurveTo(unrestricted double,unrestricted double,unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "bezierCurveTo" with the proper type (73) -PASS CanvasRenderingContext2D interface: calling bezierCurveTo(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "arcTo" with the proper type (74) -PASS CanvasRenderingContext2D interface: calling arcTo(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "arcTo" with the proper type (75) -PASS CanvasRenderingContext2D interface: calling arcTo(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "rect" with the proper type (76) -PASS CanvasRenderingContext2D interface: calling rect(unrestricted double,unrestricted double,unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "arc" with the proper type (77) -PASS CanvasRenderingContext2D interface: calling arc(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,boolean) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError -PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "ellipse" with the proper type (78) -PASS CanvasRenderingContext2D interface: calling ellipse(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,boolean) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getLineDash()" with the proper type +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineDashOffset" with the proper type +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "font" with the proper type +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "textAlign" with the proper type +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "textBaseline" with the proper type +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "direction" with the proper type +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "closePath()" with the proper type +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "moveTo(unrestricted double, unrestricted double)" with the proper type +PASS CanvasRenderingContext2D interface: calling moveTo(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineTo(unrestricted double, unrestricted double)" with the proper type +PASS CanvasRenderingContext2D interface: calling lineTo(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS CanvasRenderingContext2D interface: calling quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS CanvasRenderingContext2D interface: calling bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS CanvasRenderingContext2D interface: calling arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS CanvasRenderingContext2D interface: calling arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type +PASS CanvasRenderingContext2D interface: calling rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)" with the proper type +PASS CanvasRenderingContext2D interface: calling arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError +PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)" with the proper type +PASS CanvasRenderingContext2D interface: calling ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError PASS CanvasGradient interface: existence and properties of interface object PASS CanvasGradient interface object length PASS CanvasGradient interface object name PASS CanvasGradient interface: existence and properties of interface prototype object PASS CanvasGradient interface: existence and properties of interface prototype object's "constructor" property -PASS CanvasGradient interface: operation addColorStop(double,DOMString) +PASS CanvasGradient interface: operation addColorStop(double, DOMString) PASS CanvasPattern interface: existence and properties of interface object PASS CanvasPattern interface object length PASS CanvasPattern interface object name @@ -4278,17 +4278,17 @@ PASS Path2D interface object name PASS Path2D interface: existence and properties of interface prototype object PASS Path2D interface: existence and properties of interface prototype object's "constructor" property -PASS Path2D interface: operation addPath(Path2D,DOMMatrixInit) +PASS Path2D interface: operation addPath(Path2D, DOMMatrixInit) PASS Path2D interface: operation closePath() -PASS Path2D interface: operation moveTo(unrestricted double,unrestricted double) -PASS Path2D interface: operation lineTo(unrestricted double,unrestricted double) -PASS Path2D interface: operation quadraticCurveTo(unrestricted double,unrestricted double,unrestricted double,unrestricted double) -PASS Path2D interface: operation bezierCurveTo(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) -PASS Path2D interface: operation arcTo(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) -PASS Path2D interface: operation arcTo(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) -PASS Path2D interface: operation rect(unrestricted double,unrestricted double,unrestricted double,unrestricted double) -PASS Path2D interface: operation arc(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,boolean) -PASS Path2D interface: operation ellipse(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,boolean) +PASS Path2D interface: operation moveTo(unrestricted double, unrestricted double) +PASS Path2D interface: operation lineTo(unrestricted double, unrestricted double) +PASS Path2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double) +PASS Path2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) +PASS Path2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) +PASS Path2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) +PASS Path2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) +PASS Path2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) +PASS Path2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) FAIL DataTransfer interface: existence and properties of interface object assert_throws: interface object didn't throw TypeError when called as a constructor function "function () { [native code] }" did not throw PASS DataTransfer interface object length PASS DataTransfer interface object name @@ -4297,10 +4297,10 @@ PASS DataTransfer interface: attribute dropEffect PASS DataTransfer interface: attribute effectAllowed PASS DataTransfer interface: attribute items -PASS DataTransfer interface: operation setDragImage(Element,long,long) +PASS DataTransfer interface: operation setDragImage(Element, long, long) PASS DataTransfer interface: attribute types PASS DataTransfer interface: operation getData(DOMString) -PASS DataTransfer interface: operation setData(DOMString,DOMString) +PASS DataTransfer interface: operation setData(DOMString, DOMString) PASS DataTransfer interface: operation clearData(DOMString) PASS DataTransfer interface: attribute files PASS DataTransferItemList interface: existence and properties of interface object @@ -4309,7 +4309,7 @@ PASS DataTransferItemList interface: existence and properties of interface prototype object PASS DataTransferItemList interface: existence and properties of interface prototype object's "constructor" property PASS DataTransferItemList interface: attribute length -PASS DataTransferItemList interface: operation add(DOMString,DOMString) +PASS DataTransferItemList interface: operation add(DOMString, DOMString) PASS DataTransferItemList interface: operation add(File) PASS DataTransferItemList interface: operation remove(unsigned long) PASS DataTransferItemList interface: operation clear() @@ -4359,15 +4359,15 @@ FAIL Window interface: attribute opener assert_equals: "opener" must have a getter expected "function" but got "undefined" FAIL Window interface: attribute parent assert_equals: "parent" must have a getter expected "function" but got "undefined" PASS Window interface: attribute frameElement -FAIL Window interface: operation open(DOMString,DOMString,DOMString,boolean) assert_equals: property has wrong .length expected 0 but got 2 +FAIL Window interface: operation open(DOMString, DOMString, DOMString, boolean) assert_equals: property has wrong .length expected 0 but got 2 PASS Window interface: attribute navigator PASS Window interface: attribute external PASS Window interface: attribute applicationCache PASS Window interface: operation alert() PASS Window interface: operation confirm(DOMString) -PASS Window interface: operation prompt(DOMString,DOMString) +PASS Window interface: operation prompt(DOMString, DOMString) PASS Window interface: operation print() -PASS Window interface: operation postMessage(any,DOMString,[object Object]) +PASS Window interface: operation postMessage(any, DOMString, [object Object]) PASS Window interface: operation captureEvents() PASS Window interface: operation releaseEvents() PASS Window interface: attribute onabort @@ -4450,12 +4450,12 @@ PASS Window interface: attribute origin PASS Window interface: operation btoa(DOMString) PASS Window interface: operation atob(DOMString) -PASS Window interface: operation setTimeout(TimerHandler,long,any) +PASS Window interface: operation setTimeout(TimerHandler, long, any) PASS Window interface: operation clearTimeout(long) -PASS Window interface: operation setInterval(TimerHandler,long,any) +PASS Window interface: operation setInterval(TimerHandler, long, any) PASS Window interface: operation clearInterval(long) -PASS Window interface: operation createImageBitmap(ImageBitmapSource,ImageBitmapOptions) -PASS Window interface: operation createImageBitmap(ImageBitmapSource,long,long,long,long,ImageBitmapOptions) +PASS Window interface: operation createImageBitmap(ImageBitmapSource, ImageBitmapOptions) +PASS Window interface: operation createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions) PASS Window interface: attribute sessionStorage PASS Window interface: attribute localStorage PASS Window interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Object.setPrototypeOf should throw a TypeError @@ -4467,140 +4467,140 @@ PASS Window must be primary interface of window PASS Stringification of window FAIL Window interface: window must have own property "window" assert_false: property descriptor should not have a "value" field expected false got true -PASS Window interface: window must inherit property "self" with the proper type (1) +PASS Window interface: window must inherit property "self" with the proper type PASS Window interface: window must have own property "document" -PASS Window interface: window must inherit property "name" with the proper type (3) +PASS Window interface: window must inherit property "name" with the proper type FAIL Window interface: window must have own property "location" assert_false: property descriptor should not have a "value" field expected false got true -PASS Window interface: window must inherit property "history" with the proper type (5) -PASS Window interface: window must inherit property "locationbar" with the proper type (6) -PASS Window interface: window must inherit property "menubar" with the proper type (7) -PASS Window interface: window must inherit property "personalbar" with the proper type (8) -PASS Window interface: window must inherit property "scrollbars" with the proper type (9) -PASS Window interface: window must inherit property "statusbar" with the proper type (10) -PASS Window interface: window must inherit property "toolbar" with the proper type (11) -PASS Window interface: window must inherit property "status" with the proper type (12) -PASS Window interface: window must inherit property "close" with the proper type (13) -PASS Window interface: window must inherit property "closed" with the proper type (14) -PASS Window interface: window must inherit property "stop" with the proper type (15) -PASS Window interface: window must inherit property "focus" with the proper type (16) -PASS Window interface: window must inherit property "blur" with the proper type (17) -PASS Window interface: window must inherit property "frames" with the proper type (18) -PASS Window interface: window must inherit property "length" with the proper type (19) +PASS Window interface: window must inherit property "history" with the proper type +PASS Window interface: window must inherit property "locationbar" with the proper type +PASS Window interface: window must inherit property "menubar" with the proper type +PASS Window interface: window must inherit property "personalbar" with the proper type +PASS Window interface: window must inherit property "scrollbars" with the proper type +PASS Window interface: window must inherit property "statusbar" with the proper type +PASS Window interface: window must inherit property "toolbar" with the proper type +PASS Window interface: window must inherit property "status" with the proper type +PASS Window interface: window must inherit property "close()" with the proper type +PASS Window interface: window must inherit property "closed" with the proper type +PASS Window interface: window must inherit property "stop()" with the proper type +PASS Window interface: window must inherit property "focus()" with the proper type +PASS Window interface: window must inherit property "blur()" with the proper type +PASS Window interface: window must inherit property "frames" with the proper type +PASS Window interface: window must inherit property "length" with the proper type FAIL Window interface: window must have own property "top" assert_false: property descriptor should not have a "value" field expected false got true -PASS Window interface: window must inherit property "opener" with the proper type (21) -PASS Window interface: window must inherit property "parent" with the proper type (22) -PASS Window interface: window must inherit property "frameElement" with the proper type (23) -PASS Window interface: window must inherit property "open" with the proper type (24) -PASS Window interface: calling open(DOMString,DOMString,DOMString,boolean) on window with too few arguments must throw TypeError -PASS Window interface: window must inherit property "navigator" with the proper type (27) -PASS Window interface: window must inherit property "external" with the proper type (28) -PASS Window interface: window must inherit property "applicationCache" with the proper type (29) -PASS Window interface: window must inherit property "alert" with the proper type (30) -PASS Window interface: window must inherit property "confirm" with the proper type (31) +PASS Window interface: window must inherit property "opener" with the proper type +PASS Window interface: window must inherit property "parent" with the proper type +PASS Window interface: window must inherit property "frameElement" with the proper type +PASS Window interface: window must inherit property "open(DOMString, DOMString, DOMString, boolean)" with the proper type +PASS Window interface: calling open(DOMString, DOMString, DOMString, boolean) on window with too few arguments must throw TypeError +PASS Window interface: window must inherit property "navigator" with the proper type +PASS Window interface: window must inherit property "external" with the proper type +PASS Window interface: window must inherit property "applicationCache" with the proper type +PASS Window interface: window must inherit property "alert()" with the proper type +PASS Window interface: window must inherit property "confirm(DOMString)" with the proper type PASS Window interface: calling confirm(DOMString) on window with too few arguments must throw TypeError -PASS Window interface: window must inherit property "prompt" with the proper type (32) -PASS Window interface: calling prompt(DOMString,DOMString) on window with too few arguments must throw TypeError -PASS Window interface: window must inherit property "print" with the proper type (33) -PASS Window interface: window must inherit property "postMessage" with the proper type (34) -PASS Window interface: calling postMessage(any,DOMString,[object Object]) on window with too few arguments must throw TypeError -PASS Window interface: window must inherit property "captureEvents" with the proper type (35) -PASS Window interface: window must inherit property "releaseEvents" with the proper type (36) -PASS Window interface: window must inherit property "onabort" with the proper type (37) -PASS Window interface: window must inherit property "onauxclick" with the proper type (38) -PASS Window interface: window must inherit property "onblur" with the proper type (39) -PASS Window interface: window must inherit property "oncancel" with the proper type (40) -PASS Window interface: window must inherit property "oncanplay" with the proper type (41) -PASS Window interface: window must inherit property "oncanplaythrough" with the proper type (42) -PASS Window interface: window must inherit property "onchange" with the proper type (43) -PASS Window interface: window must inherit property "onclick" with the proper type (44) -PASS Window interface: window must inherit property "onclose" with the proper type (45) -PASS Window interface: window must inherit property "oncontextmenu" with the proper type (46) -PASS Window interface: window must inherit property "oncuechange" with the proper type (47) -PASS Window interface: window must inherit property "ondblclick" with the proper type (48) -PASS Window interface: window must inherit property "ondrag" with the proper type (49) -PASS Window interface: window must inherit property "ondragend" with the proper type (50) -PASS Window interface: window must inherit property "ondragenter" with the proper type (51) -FAIL Window interface: window must inherit property "ondragexit" with the proper type (52) assert_own_property: expected property "ondragexit" missing -PASS Window interface: window must inherit property "ondragleave" with the proper type (53) -PASS Window interface: window must inherit property "ondragover" with the proper type (54) -PASS Window interface: window must inherit property "ondragstart" with the proper type (55) -PASS Window interface: window must inherit property "ondrop" with the proper type (56) -PASS Window interface: window must inherit property "ondurationchange" with the proper type (57) -PASS Window interface: window must inherit property "onemptied" with the proper type (58) -PASS Window interface: window must inherit property "onended" with the proper type (59) -PASS Window interface: window must inherit property "onerror" with the proper type (60) -PASS Window interface: window must inherit property "onfocus" with the proper type (61) -PASS Window interface: window must inherit property "oninput" with the proper type (62) -PASS Window interface: window must inherit property "oninvalid" with the proper type (63) -PASS Window interface: window must inherit property "onkeydown" with the proper type (64) -PASS Window interface: window must inherit property "onkeypress" with the proper type (65) -PASS Window interface: window must inherit property "onkeyup" with the proper type (66) -PASS Window interface: window must inherit property "onload" with the proper type (67) -PASS Window interface: window must inherit property "onloadeddata" with the proper type (68) -PASS Window interface: window must inherit property "onloadedmetadata" with the proper type (69) -FAIL Window interface: window must inherit property "onloadend" with the proper type (70) assert_own_property: expected property "onloadend" missing -PASS Window interface: window must inherit property "onloadstart" with the proper type (71) -PASS Window interface: window must inherit property "onmousedown" with the proper type (72) -PASS Window interface: window must inherit property "onmouseenter" with the proper type (73) -PASS Window interface: window must inherit property "onmouseleave" with the proper type (74) -PASS Window interface: window must inherit property "onmousemove" with the proper type (75) -PASS Window interface: window must inherit property "onmouseout" with the proper type (76) -PASS Window interface: window must inherit property "onmouseover" with the proper type (77) -PASS Window interface: window must inherit property "onmouseup" with the proper type (78) -PASS Window interface: window must inherit property "onwheel" with the proper type (79) -PASS Window interface: window must inherit property "onpause" with the proper type (80) -PASS Window interface: window must inherit property "onplay" with the proper type (81) -PASS Window interface: window must inherit property "onplaying" with the proper type (82) -PASS Window interface: window must inherit property "onprogress" with the proper type (83) -PASS Window interface: window must inherit property "onratechange" with the proper type (84) -PASS Window interface: window must inherit property "onreset" with the proper type (85) -PASS Window interface: window must inherit property "onresize" with the proper type (86) -PASS Window interface: window must inherit property "onscroll" with the proper type (87) -PASS Window interface: window must inherit property "onseeked" with the proper type (88) -PASS Window interface: window must inherit property "onseeking" with the proper type (89) -PASS Window interface: window must inherit property "onselect" with the proper type (90) -PASS Window interface: window must inherit property "onstalled" with the proper type (91) -PASS Window interface: window must inherit property "onsubmit" with the proper type (92) -PASS Window interface: window must inherit property "onsuspend" with the proper type (93) -PASS Window interface: window must inherit property "ontimeupdate" with the proper type (94) -PASS Window interface: window must inherit property "ontoggle" with the proper type (95) -PASS Window interface: window must inherit property "onvolumechange" with the proper type (96) -PASS Window interface: window must inherit property "onwaiting" with the proper type (97) -FAIL Window interface: window must inherit property "onafterprint" with the proper type (98) assert_own_property: expected property "onafterprint" missing -FAIL Window interface: window must inherit property "onbeforeprint" with the proper type (99) assert_own_property: expected property "onbeforeprint" missing -PASS Window interface: window must inherit property "onbeforeunload" with the proper type (100) -PASS Window interface: window must inherit property "onhashchange" with the proper type (101) -PASS Window interface: window must inherit property "onlanguagechange" with the proper type (102) -PASS Window interface: window must inherit property "onmessage" with the proper type (103) -PASS Window interface: window must inherit property "onmessageerror" with the proper type (104) -PASS Window interface: window must inherit property "onoffline" with the proper type (105) -PASS Window interface: window must inherit property "ononline" with the proper type (106) -PASS Window interface: window must inherit property "onpagehide" with the proper type (107) -PASS Window interface: window must inherit property "onpageshow" with the proper type (108) -PASS Window interface: window must inherit property "onpopstate" with the proper type (109) -PASS Window interface: window must inherit property "onrejectionhandled" with the proper type (110) -PASS Window interface: window must inherit property "onstorage" with the proper type (111) -PASS Window interface: window must inherit property "onunhandledrejection" with the proper type (112) -PASS Window interface: window must inherit property "onunload" with the proper type (113) -PASS Window interface: window must inherit property "origin" with the proper type (114) -PASS Window interface: window must inherit property "btoa" with the proper type (115) +PASS Window interface: window must inherit property "prompt(DOMString, DOMString)" with the proper type +PASS Window interface: calling prompt(DOMString, DOMString) on window with too few arguments must throw TypeError +PASS Window interface: window must inherit property "print()" with the proper type +PASS Window interface: window must inherit property "postMessage(any, DOMString, [object Object])" with the proper type +PASS Window interface: calling postMessage(any, DOMString, [object Object]) on window with too few arguments must throw TypeError +PASS Window interface: window must inherit property "captureEvents()" with the proper type +PASS Window interface: window must inherit property "releaseEvents()" with the proper type +PASS Window interface: window must inherit property "onabort" with the proper type +PASS Window interface: window must inherit property "onauxclick" with the proper type +PASS Window interface: window must inherit property "onblur" with the proper type +PASS Window interface: window must inherit property "oncancel" with the proper type +PASS Window interface: window must inherit property "oncanplay" with the proper type +PASS Window interface: window must inherit property "oncanplaythrough" with the proper type +PASS Window interface: window must inherit property "onchange" with the proper type +PASS Window interface: window must inherit property "onclick" with the proper type +PASS Window interface: window must inherit property "onclose" with the proper type +PASS Window interface: window must inherit property "oncontextmenu" with the proper type +PASS Window interface: window must inherit property "oncuechange" with the proper type +PASS Window interface: window must inherit property "ondblclick" with the proper type +PASS Window interface: window must inherit property "ondrag" with the proper type +PASS Window interface: window must inherit property "ondragend" with the proper type +PASS Window interface: window must inherit property "ondragenter" with the proper type +FAIL Window interface: window must inherit property "ondragexit" with the proper type assert_own_property: expected property "ondragexit" missing +PASS Window interface: window must inherit property "ondragleave" with the proper type +PASS Window interface: window must inherit property "ondragover" with the proper type +PASS Window interface: window must inherit property "ondragstart" with the proper type +PASS Window interface: window must inherit property "ondrop" with the proper type +PASS Window interface: window must inherit property "ondurationchange" with the proper type +PASS Window interface: window must inherit property "onemptied" with the proper type +PASS Window interface: window must inherit property "onended" with the proper type +PASS Window interface: window must inherit property "onerror" with the proper type +PASS Window interface: window must inherit property "onfocus" with the proper type +PASS Window interface: window must inherit property "oninput" with the proper type +PASS Window interface: window must inherit property "oninvalid" with the proper type +PASS Window interface: window must inherit property "onkeydown" with the proper type +PASS Window interface: window must inherit property "onkeypress" with the proper type +PASS Window interface: window must inherit property "onkeyup" with the proper type +PASS Window interface: window must inherit property "onload" with the proper type +PASS Window interface: window must inherit property "onloadeddata" with the proper type +PASS Window interface: window must inherit property "onloadedmetadata" with the proper type +FAIL Window interface: window must inherit property "onloadend" with the proper type assert_own_property: expected property "onloadend" missing +PASS Window interface: window must inherit property "onloadstart" with the proper type +PASS Window interface: window must inherit property "onmousedown" with the proper type +PASS Window interface: window must inherit property "onmouseenter" with the proper type +PASS Window interface: window must inherit property "onmouseleave" with the proper type +PASS Window interface: window must inherit property "onmousemove" with the proper type +PASS Window interface: window must inherit property "onmouseout" with the proper type +PASS Window interface: window must inherit property "onmouseover" with the proper type +PASS Window interface: window must inherit property "onmouseup" with the proper type +PASS Window interface: window must inherit property "onwheel" with the proper type +PASS Window interface: window must inherit property "onpause" with the proper type +PASS Window interface: window must inherit property "onplay" with the proper type +PASS Window interface: window must inherit property "onplaying" with the proper type +PASS Window interface: window must inherit property "onprogress" with the proper type +PASS Window interface: window must inherit property "onratechange" with the proper type +PASS Window interface: window must inherit property "onreset" with the proper type +PASS Window interface: window must inherit property "onresize" with the proper type +PASS Window interface: window must inherit property "onscroll" with the proper type +PASS Window interface: window must inherit property "onseeked" with the proper type +PASS Window interface: window must inherit property "onseeking" with the proper type +PASS Window interface: window must inherit property "onselect" with the proper type +PASS Window interface: window must inherit property "onstalled" with the proper type +PASS Window interface: window must inherit property "onsubmit" with the proper type +PASS Window interface: window must inherit property "onsuspend" with the proper type +PASS Window interface: window must inherit property "ontimeupdate" with the proper type +PASS Window interface: window must inherit property "ontoggle" with the proper type +PASS Window interface: window must inherit property "onvolumechange" with the proper type +PASS Window interface: window must inherit property "onwaiting" with the proper type +FAIL Window interface: window must inherit property "onafterprint" with the proper type assert_own_property: expected property "onafterprint" missing +FAIL Window interface: window must inherit property "onbeforeprint" with the proper type assert_own_property: expected property "onbeforeprint" missing +PASS Window interface: window must inherit property "onbeforeunload" with the proper type +PASS Window interface: window must inherit property "onhashchange" with the proper type +PASS Window interface: window must inherit property "onlanguagechange" with the proper type +PASS Window interface: window must inherit property "onmessage" with the proper type +PASS Window interface: window must inherit property "onmessageerror" with the proper type +PASS Window interface: window must inherit property "onoffline" with the proper type +PASS Window interface: window must inherit property "ononline" with the proper type +PASS Window interface: window must inherit property "onpagehide" with the proper type +PASS Window interface: window must inherit property "onpageshow" with the proper type +PASS Window interface: window must inherit property "onpopstate" with the proper type +PASS Window interface: window must inherit property "onrejectionhandled" with the proper type +PASS Window interface: window must inherit property "onstorage" with the proper type +PASS Window interface: window must inherit property "onunhandledrejection" with the proper type +PASS Window interface: window must inherit property "onunload" with the proper type +PASS Window interface: window must inherit property "origin" with the proper type +PASS Window interface: window must inherit property "btoa(DOMString)" with the proper type PASS Window interface: calling btoa(DOMString) on window with too few arguments must throw TypeError -PASS Window interface: window must inherit property "atob" with the proper type (116) +PASS Window interface: window must inherit property "atob(DOMString)" with the proper type PASS Window interface: calling atob(DOMString) on window with too few arguments must throw TypeError -PASS Window interface: window must inherit property "setTimeout" with the proper type (117) -PASS Window interface: calling setTimeout(TimerHandler,long,any) on window with too few arguments must throw TypeError -PASS Window interface: window must inherit property "clearTimeout" with the proper type (118) +PASS Window interface: window must inherit property "setTimeout(TimerHandler, long, any)" with the proper type +PASS Window interface: calling setTimeout(TimerHandler, long, any) on window with too few arguments must throw TypeError +PASS Window interface: window must inherit property "clearTimeout(long)" with the proper type PASS Window interface: calling clearTimeout(long) on window with too few arguments must throw TypeError -PASS Window interface: window must inherit property "setInterval" with the proper type (119) -PASS Window interface: calling setInterval(TimerHandler,long,any) on window with too few arguments must throw TypeError -PASS Window interface: window must inherit property "clearInterval" with the proper type (120) +PASS Window interface: window must inherit property "setInterval(TimerHandler, long, any)" with the proper type +PASS Window interface: calling setInterval(TimerHandler, long, any) on window with too few arguments must throw TypeError +PASS Window interface: window must inherit property "clearInterval(long)" with the proper type PASS Window interface: calling clearInterval(long) on window with too few arguments must throw TypeError -PASS Window interface: window must inherit property "createImageBitmap" with the proper type (121) -PASS Window interface: calling createImageBitmap(ImageBitmapSource,ImageBitmapOptions) on window with too few arguments must throw TypeError -PASS Window interface: window must inherit property "createImageBitmap" with the proper type (122) -PASS Window interface: calling createImageBitmap(ImageBitmapSource,long,long,long,long,ImageBitmapOptions) on window with too few arguments must throw TypeError -PASS Window interface: window must inherit property "sessionStorage" with the proper type (123) -PASS Window interface: window must inherit property "localStorage" with the proper type (124) +PASS Window interface: window must inherit property "createImageBitmap(ImageBitmapSource, ImageBitmapOptions)" with the proper type +PASS Window interface: calling createImageBitmap(ImageBitmapSource, ImageBitmapOptions) on window with too few arguments must throw TypeError +PASS Window interface: window must inherit property "createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions)" with the proper type +PASS Window interface: calling createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions) on window with too few arguments must throw TypeError +PASS Window interface: window must inherit property "sessionStorage" with the proper type +PASS Window interface: window must inherit property "localStorage" with the proper type PASS BarProp interface: existence and properties of interface object PASS BarProp interface object length PASS BarProp interface object name @@ -4618,21 +4618,21 @@ PASS History interface: operation go(long) PASS History interface: operation back() PASS History interface: operation forward() -PASS History interface: operation pushState(any,DOMString,DOMString) -PASS History interface: operation replaceState(any,DOMString,DOMString) +PASS History interface: operation pushState(any, DOMString, DOMString) +PASS History interface: operation replaceState(any, DOMString, DOMString) PASS History must be primary interface of window.history PASS Stringification of window.history -PASS History interface: window.history must inherit property "length" with the proper type (0) -PASS History interface: window.history must inherit property "scrollRestoration" with the proper type (1) -PASS History interface: window.history must inherit property "state" with the proper type (2) -PASS History interface: window.history must inherit property "go" with the proper type (3) +PASS History interface: window.history must inherit property "length" with the proper type +PASS History interface: window.history must inherit property "scrollRestoration" with the proper type +PASS History interface: window.history must inherit property "state" with the proper type +PASS History interface: window.history must inherit property "go(long)" with the proper type PASS History interface: calling go(long) on window.history with too few arguments must throw TypeError -PASS History interface: window.history must inherit property "back" with the proper type (4) -PASS History interface: window.history must inherit property "forward" with the proper type (5) -PASS History interface: window.history must inherit property "pushState" with the proper type (6) -PASS History interface: calling pushState(any,DOMString,DOMString) on window.history with too few arguments must throw TypeError -PASS History interface: window.history must inherit property "replaceState" with the proper type (7) -PASS History interface: calling replaceState(any,DOMString,DOMString) on window.history with too few arguments must throw TypeError +PASS History interface: window.history must inherit property "back()" with the proper type +PASS History interface: window.history must inherit property "forward()" with the proper type +PASS History interface: window.history must inherit property "pushState(any, DOMString, DOMString)" with the proper type +PASS History interface: calling pushState(any, DOMString, DOMString) on window.history with too few arguments must throw TypeError +PASS History interface: window.history must inherit property "replaceState(any, DOMString, DOMString)" with the proper type +PASS History interface: calling replaceState(any, DOMString, DOMString) on window.history with too few arguments must throw TypeError PASS Location interface: existence and properties of interface object PASS Location interface object length PASS Location interface object name @@ -4664,7 +4664,7 @@ PASS PopStateEvent interface: attribute state PASS PopStateEvent must be primary interface of new PopStateEvent("popstate", { data: {} }) PASS Stringification of new PopStateEvent("popstate", { data: {} }) -PASS PopStateEvent interface: new PopStateEvent("popstate", { data: {} }) must inherit property "state" with the proper type (0) +PASS PopStateEvent interface: new PopStateEvent("popstate", { data: {} }) must inherit property "state" with the proper type PASS HashChangeEvent interface: existence and properties of interface object PASS HashChangeEvent interface object length PASS HashChangeEvent interface object name @@ -4715,24 +4715,24 @@ PASS ApplicationCache interface: attribute onobsolete PASS ApplicationCache must be primary interface of window.applicationCache PASS Stringification of window.applicationCache -PASS ApplicationCache interface: window.applicationCache must inherit property "UNCACHED" with the proper type (0) -PASS ApplicationCache interface: window.applicationCache must inherit property "IDLE" with the proper type (1) -PASS ApplicationCache interface: window.applicationCache must inherit property "CHECKING" with the proper type (2) -PASS ApplicationCache interface: window.applicationCache must inherit property "DOWNLOADING" with the proper type (3) -PASS ApplicationCache interface: window.applicationCache must inherit property "UPDATEREADY" with the proper type (4) -PASS ApplicationCache interface: window.applicationCache must inherit property "OBSOLETE" with the proper type (5) -PASS ApplicationCache interface: window.applicationCache must inherit property "status" with the proper type (6) -PASS ApplicationCache interface: window.applicationCache must inherit property "update" with the proper type (7) -PASS ApplicationCache interface: window.applicationCache must inherit property "abort" with the proper type (8) -PASS ApplicationCache interface: window.applicationCache must inherit property "swapCache" with the proper type (9) -PASS ApplicationCache interface: window.applicationCache must inherit property "onchecking" with the proper type (10) -PASS ApplicationCache interface: window.applicationCache must inherit property "onerror" with the proper type (11) -PASS ApplicationCache interface: window.applicationCache must inherit property "onnoupdate" with the proper type (12) -PASS ApplicationCache interface: window.applicationCache must inherit property "ondownloading" with the proper type (13) -PASS ApplicationCache interface: window.applicationCache must inherit property "onprogress" with the proper type (14) -PASS ApplicationCache interface: window.applicationCache must inherit property "onupdateready" with the proper type (15) -PASS ApplicationCache interface: window.applicationCache must inherit property "oncached" with the proper type (16) -PASS ApplicationCache interface: window.applicationCache must inherit property "onobsolete" with the proper type (17) +PASS ApplicationCache interface: window.applicationCache must inherit property "UNCACHED" with the proper type +PASS ApplicationCache interface: window.applicationCache must inherit property "IDLE" with the proper type +PASS ApplicationCache interface: window.applicationCache must inherit property "CHECKING" with the proper type +PASS ApplicationCache interface: window.applicationCache must inherit property "DOWNLOADING" with the proper type +PASS ApplicationCache interface: window.applicationCache must inherit property "UPDATEREADY" with the proper type +PASS ApplicationCache interface: window.applicationCache must inherit property "OBSOLETE" with the proper type +PASS ApplicationCache interface: window.applicationCache must inherit property "status" with the proper type +PASS ApplicationCache interface: window.applicationCache must inherit property "update()" with the proper type +PASS ApplicationCache interface: window.applicationCache must inherit property "abort()" with the proper type +PASS ApplicationCache interface: window.applicationCache must inherit property "swapCache()" with the proper type +PASS ApplicationCache interface: window.applicationCache must inherit property "onchecking" with the proper type +PASS ApplicationCache interface: window.applicationCache must inherit property "onerror" with the proper type +PASS ApplicationCache interface: window.applicationCache must inherit property "onnoupdate" with the proper type +PASS ApplicationCache interface: window.applicationCache must inherit property "ondownloading" with the proper type +PASS ApplicationCache interface: window.applicationCache must inherit property "onprogress" with the proper type +PASS ApplicationCache interface: window.applicationCache must inherit property "onupdateready" with the proper type +PASS ApplicationCache interface: window.applicationCache must inherit property "oncached" with the proper type +PASS ApplicationCache interface: window.applicationCache must inherit property "onobsolete" with the proper type PASS ErrorEvent interface: existence and properties of interface object PASS ErrorEvent interface object length PASS ErrorEvent interface object name @@ -4760,12 +4760,12 @@ PASS Navigator interface: attribute language PASS Navigator interface: attribute languages PASS Navigator interface: attribute onLine -PASS Navigator interface: operation registerProtocolHandler(DOMString,USVString,DOMString) -FAIL Navigator interface: operation registerContentHandler(DOMString,USVString,DOMString) assert_own_property: interface prototype object missing non-static operation expected property "registerContentHandler" missing -PASS Navigator interface: operation isProtocolHandlerRegistered(DOMString,USVString) -FAIL Navigator interface: operation isContentHandlerRegistered(DOMString,USVString) assert_own_property: interface prototype object missing non-static operation expected property "isContentHandlerRegistered" missing -PASS Navigator interface: operation unregisterProtocolHandler(DOMString,USVString) -FAIL Navigator interface: operation unregisterContentHandler(DOMString,USVString) assert_own_property: interface prototype object missing non-static operation expected property "unregisterContentHandler" missing +PASS Navigator interface: operation registerProtocolHandler(DOMString, USVString, DOMString) +FAIL Navigator interface: operation registerContentHandler(DOMString, USVString, DOMString) assert_own_property: interface prototype object missing non-static operation expected property "registerContentHandler" missing +PASS Navigator interface: operation isProtocolHandlerRegistered(DOMString, USVString) +FAIL Navigator interface: operation isContentHandlerRegistered(DOMString, USVString) assert_own_property: interface prototype object missing non-static operation expected property "isContentHandlerRegistered" missing +PASS Navigator interface: operation unregisterProtocolHandler(DOMString, USVString) +FAIL Navigator interface: operation unregisterContentHandler(DOMString, USVString) assert_own_property: interface prototype object missing non-static operation expected property "unregisterContentHandler" missing PASS Navigator interface: attribute cookieEnabled PASS Navigator interface: attribute plugins PASS Navigator interface: attribute mimeTypes @@ -4773,35 +4773,35 @@ PASS Navigator interface: attribute hardwareConcurrency PASS Navigator must be primary interface of window.navigator PASS Stringification of window.navigator -PASS Navigator interface: window.navigator must inherit property "appCodeName" with the proper type (0) -PASS Navigator interface: window.navigator must inherit property "appName" with the proper type (1) -PASS Navigator interface: window.navigator must inherit property "appVersion" with the proper type (2) -PASS Navigator interface: window.navigator must inherit property "platform" with the proper type (3) -PASS Navigator interface: window.navigator must inherit property "product" with the proper type (4) -PASS Navigator interface: window.navigator must inherit property "productSub" with the proper type (5) -PASS Navigator interface: window.navigator must inherit property "userAgent" with the proper type (6) -PASS Navigator interface: window.navigator must inherit property "vendor" with the proper type (7) -PASS Navigator interface: window.navigator must inherit property "vendorSub" with the proper type (8) -PASS Navigator interface: window.navigator must inherit property "language" with the proper type (9) -PASS Navigator interface: window.navigator must inherit property "languages" with the proper type (10) -PASS Navigator interface: window.navigator must inherit property "onLine" with the proper type (11) -PASS Navigator interface: window.navigator must inherit property "registerProtocolHandler" with the proper type (12) -PASS Navigator interface: calling registerProtocolHandler(DOMString,USVString,DOMString) on window.navigator with too few arguments must throw TypeError -FAIL Navigator interface: window.navigator must inherit property "registerContentHandler" with the proper type (13) assert_inherits: property "registerContentHandler" not found in prototype chain -FAIL Navigator interface: calling registerContentHandler(DOMString,USVString,DOMString) on window.navigator with too few arguments must throw TypeError assert_inherits: property "registerContentHandler" not found in prototype chain -PASS Navigator interface: window.navigator must inherit property "isProtocolHandlerRegistered" with the proper type (14) -PASS Navigator interface: calling isProtocolHandlerRegistered(DOMString,USVString) on window.navigator with too few arguments must throw TypeError -FAIL Navigator interface: window.navigator must inherit property "isContentHandlerRegistered" with the proper type (15) assert_inherits: property "isContentHandlerRegistered" not found in prototype chain -FAIL Navigator interface: calling isContentHandlerRegistered(DOMString,USVString) on window.navigator with too few arguments must throw TypeError assert_inherits: property "isContentHandlerRegistered" not found in prototype chain -PASS Navigator interface: window.navigator must inherit property "unregisterProtocolHandler" with the proper type (16) -PASS Navigator interface: calling unregisterProtocolHandler(DOMString,USVString) on window.navigator with too few arguments must throw TypeError -FAIL Navigator interface: window.navigator must inherit property "unregisterContentHandler" with the proper type (17) assert_inherits: property "unregisterContentHandler" not found in prototype chain -FAIL Navigator interface: calling unregisterContentHandler(DOMString,USVString) on window.navigator with too few arguments must throw TypeError assert_inherits: property "unregisterContentHandler" not found in prototype chain -PASS Navigator interface: window.navigator must inherit property "cookieEnabled" with the proper type (18) -PASS Navigator interface: window.navigator must inherit property "plugins" with the proper type (19) -PASS Navigator interface: window.navigator must inherit property "mimeTypes" with the proper type (20) -PASS Navigator interface: window.navigator must inherit property "javaEnabled" with the proper type (21) -PASS Navigator interface: window.navigator must inherit property "hardwareConcurrency" with the proper type (22) +PASS Navigator interface: window.navigator must inherit property "appCodeName" with the proper type +PASS Navigator interface: window.navigator must inherit property "appName" with the proper type +PASS Navigator interface: window.navigator must inherit property "appVersion" with the proper type +PASS Navigator interface: window.navigator must inherit property "platform" with the proper type +PASS Navigator interface: window.navigator must inherit property "product" with the proper type +PASS Navigator interface: window.navigator must inherit property "productSub" with the proper type +PASS Navigator interface: window.navigator must inherit property "userAgent" with the proper type +PASS Navigator interface: window.navigator must inherit property "vendor" with the proper type +PASS Navigator interface: window.navigator must inherit property "vendorSub" with the proper type +PASS Navigator interface: window.navigator must inherit property "language" with the proper type +PASS Navigator interface: window.navigator must inherit property "languages" with the proper type +PASS Navigator interface: window.navigator must inherit property "onLine" with the proper type +PASS Navigator interface: window.navigator must inherit property "registerProtocolHandler(DOMString, USVString, DOMString)" with the proper type +PASS Navigator interface: calling registerProtocolHandler(DOMString, USVString, DOMString) on window.navigator with too few arguments must throw TypeError +FAIL Navigator interface: window.navigator must inherit property "registerContentHandler(DOMString, USVString, DOMString)" with the proper type assert_inherits: property "registerContentHandler" not found in prototype chain +FAIL Navigator interface: calling registerContentHandler(DOMString, USVString, DOMString) on window.navigator with too few arguments must throw TypeError assert_inherits: property "registerContentHandler" not found in prototype chain +PASS Navigator interface: window.navigator must inherit property "isProtocolHandlerRegistered(DOMString, USVString)" with the proper type +PASS Navigator interface: calling isProtocolHandlerRegistered(DOMString, USVString) on window.navigator with too few arguments must throw TypeError +FAIL Navigator interface: window.navigator must inherit property "isContentHandlerRegistered(DOMString, USVString)" with the proper type assert_inherits: property "isContentHandlerRegistered" not found in prototype chain +FAIL Navigator interface: calling isContentHandlerRegistered(DOMString, USVString) on window.navigator with too few arguments must throw TypeError assert_inherits: property "isContentHandlerRegistered" not found in prototype chain +PASS Navigator interface: window.navigator must inherit property "unregisterProtocolHandler(DOMString, USVString)" with the proper type +PASS Navigator interface: calling unregisterProtocolHandler(DOMString, USVString) on window.navigator with too few arguments must throw TypeError +FAIL Navigator interface: window.navigator must inherit property "unregisterContentHandler(DOMString, USVString)" with the proper type assert_inherits: property "unregisterContentHandler" not found in prototype chain +FAIL Navigator interface: calling unregisterContentHandler(DOMString, USVString) on window.navigator with too few arguments must throw TypeError assert_inherits: property "unregisterContentHandler" not found in prototype chain +PASS Navigator interface: window.navigator must inherit property "cookieEnabled" with the proper type +PASS Navigator interface: window.navigator must inherit property "plugins" with the proper type +PASS Navigator interface: window.navigator must inherit property "mimeTypes" with the proper type +PASS Navigator interface: window.navigator must inherit property "javaEnabled()" with the proper type +PASS Navigator interface: window.navigator must inherit property "hardwareConcurrency" with the proper type PASS PluginArray interface: existence and properties of interface object PASS PluginArray interface object length PASS PluginArray interface object name @@ -4848,11 +4848,11 @@ FAIL External interface: operation IsSearchProviderInstalled(DOMString) assert_own_property: self does not have own property "External" expected property "External" missing FAIL External must be primary interface of window.external assert_own_property: self does not have own property "External" expected property "External" missing PASS Stringification of window.external -PASS External interface: window.external must inherit property "AddSearchProvider" with the proper type (0) +PASS External interface: window.external must inherit property "AddSearchProvider(DOMString)" with the proper type FAIL External interface: calling AddSearchProvider(DOMString) on window.external with too few arguments must throw TypeError assert_throws: Called with 0 arguments function "function () { fn.apply(obj, args); }" did not throw -PASS External interface: window.external must inherit property "IsSearchProviderInstalled" with the proper type (1) +PASS External interface: window.external must inherit property "IsSearchProviderInstalled(DOMString)" with the proper type FAIL External interface: calling IsSearchProviderInstalled(DOMString) on window.external with too few arguments must throw TypeError assert_throws: Called with 0 arguments function "function () { fn.apply(obj, args); }" did not throw @@ -4873,16 +4873,16 @@ PASS MessageEvent interface: attribute lastEventId PASS MessageEvent interface: attribute source PASS MessageEvent interface: attribute ports -FAIL MessageEvent interface: operation initMessageEvent(DOMString,boolean,boolean,any,DOMString,DOMString,[object Object],[object Object],[object Object]) assert_equals: property has wrong .length expected 1 but got 0 +FAIL MessageEvent interface: operation initMessageEvent(DOMString, boolean, boolean, any, DOMString, DOMString, [object Object],[object Object], [object Object]) assert_equals: property has wrong .length expected 1 but got 0 PASS MessageEvent must be primary interface of new MessageEvent("message", { data: 5 }) PASS Stringification of new MessageEvent("message", { data: 5 }) -PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "data" with the proper type (0) -PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "origin" with the proper type (1) -PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "lastEventId" with the proper type (2) -PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "source" with the proper type (3) -FAIL MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "ports" with the proper type (4) assert_true: Value should be array expected true got false -PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "initMessageEvent" with the proper type (5) -FAIL MessageEvent interface: calling initMessageEvent(DOMString,boolean,boolean,any,DOMString,DOMString,[object Object],[object Object],[object Object]) on new MessageEvent("message", { data: 5 }) with too few arguments must throw TypeError assert_throws: Called with 0 arguments function "function () { +PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "data" with the proper type +PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "origin" with the proper type +PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "lastEventId" with the proper type +PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "source" with the proper type +FAIL MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "ports" with the proper type assert_true: Value should be array expected true got false +PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "initMessageEvent(DOMString, boolean, boolean, any, DOMString, DOMString, [object Object],[object Object], [object Object])" with the proper type +FAIL MessageEvent interface: calling initMessageEvent(DOMString, boolean, boolean, any, DOMString, DOMString, [object Object],[object Object], [object Object]) on new MessageEvent("message", { data: 5 }) with too few arguments must throw TypeError assert_throws: Called with 0 arguments function "function () { fn.apply(obj, args); }" did not throw PASS EventSource interface: existence and properties of interface object @@ -4924,7 +4924,7 @@ PASS WebSocket interface: attribute onclose PASS WebSocket interface: attribute extensions PASS WebSocket interface: attribute protocol -PASS WebSocket interface: operation close(unsigned short,USVString) +PASS WebSocket interface: operation close(unsigned short, USVString) PASS WebSocket interface: attribute onmessage PASS WebSocket interface: attribute binaryType PASS WebSocket interface: operation send(USVString) @@ -4933,29 +4933,29 @@ PASS WebSocket interface: operation send(ArrayBufferView) PASS WebSocket must be primary interface of new WebSocket("ws://foo") PASS Stringification of new WebSocket("ws://foo") -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "url" with the proper type (0) -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "CONNECTING" with the proper type (1) -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "OPEN" with the proper type (2) -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "CLOSING" with the proper type (3) -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "CLOSED" with the proper type (4) -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "readyState" with the proper type (5) -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "bufferedAmount" with the proper type (6) -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onopen" with the proper type (7) -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onerror" with the proper type (8) -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onclose" with the proper type (9) -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "extensions" with the proper type (10) -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "protocol" with the proper type (11) -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "close" with the proper type (12) -PASS WebSocket interface: calling close(unsigned short,USVString) on new WebSocket("ws://foo") with too few arguments must throw TypeError -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onmessage" with the proper type (13) -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "binaryType" with the proper type (14) -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send" with the proper type (15) +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "url" with the proper type +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "CONNECTING" with the proper type +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "OPEN" with the proper type +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "CLOSING" with the proper type +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "CLOSED" with the proper type +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "readyState" with the proper type +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "bufferedAmount" with the proper type +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onopen" with the proper type +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onerror" with the proper type +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onclose" with the proper type +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "extensions" with the proper type +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "protocol" with the proper type +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "close(unsigned short, USVString)" with the proper type +PASS WebSocket interface: calling close(unsigned short, USVString) on new WebSocket("ws://foo") with too few arguments must throw TypeError +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onmessage" with the proper type +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "binaryType" with the proper type +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send(USVString)" with the proper type PASS WebSocket interface: calling send(USVString) on new WebSocket("ws://foo") with too few arguments must throw TypeError -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send" with the proper type (16) +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send(Blob)" with the proper type PASS WebSocket interface: calling send(Blob) on new WebSocket("ws://foo") with too few arguments must throw TypeError -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send" with the proper type (17) +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send(ArrayBuffer)" with the proper type PASS WebSocket interface: calling send(ArrayBuffer) on new WebSocket("ws://foo") with too few arguments must throw TypeError -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send" with the proper type (18) +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send(ArrayBufferView)" with the proper type PASS WebSocket interface: calling send(ArrayBufferView) on new WebSocket("ws://foo") with too few arguments must throw TypeError PASS CloseEvent interface: existence and properties of interface object PASS CloseEvent interface object length @@ -4967,9 +4967,9 @@ PASS CloseEvent interface: attribute reason PASS CloseEvent must be primary interface of new CloseEvent("close") PASS Stringification of new CloseEvent("close") -PASS CloseEvent interface: new CloseEvent("close") must inherit property "wasClean" with the proper type (0) -PASS CloseEvent interface: new CloseEvent("close") must inherit property "code" with the proper type (1) -PASS CloseEvent interface: new CloseEvent("close") must inherit property "reason" with the proper type (2) +PASS CloseEvent interface: new CloseEvent("close") must inherit property "wasClean" with the proper type +PASS CloseEvent interface: new CloseEvent("close") must inherit property "code" with the proper type +PASS CloseEvent interface: new CloseEvent("close") must inherit property "reason" with the proper type PASS MessageChannel interface: existence and properties of interface object PASS MessageChannel interface object length PASS MessageChannel interface object name @@ -4982,7 +4982,7 @@ PASS MessagePort interface object name PASS MessagePort interface: existence and properties of interface prototype object PASS MessagePort interface: existence and properties of interface prototype object's "constructor" property -PASS MessagePort interface: operation postMessage(any,[object Object]) +PASS MessagePort interface: operation postMessage(any, [object Object]) PASS MessagePort interface: operation start() PASS MessagePort interface: operation close() PASS MessagePort interface: attribute onmessage @@ -5006,7 +5006,7 @@ PASS Worker interface: existence and properties of interface prototype object PASS Worker interface: existence and properties of interface prototype object's "constructor" property PASS Worker interface: operation terminate() -PASS Worker interface: operation postMessage(any,[object Object]) +PASS Worker interface: operation postMessage(any, [object Object]) PASS Worker interface: attribute onmessage PASS Worker interface: attribute onerror PASS SharedWorker interface: existence and properties of interface object @@ -5026,7 +5026,7 @@ FAIL Storage interface: attribute length assert_true: property should be enumerable expected true got false FAIL Storage interface: operation key(unsigned long) assert_true: property should be enumerable expected true got false FAIL Storage interface: operation getItem(DOMString) assert_true: property should be enumerable expected true got false -FAIL Storage interface: operation setItem(DOMString,DOMString) assert_true: property should be enumerable expected true got false +FAIL Storage interface: operation setItem(DOMString, DOMString) assert_true: property should be enumerable expected true got false FAIL Storage interface: operation removeItem(DOMString) assert_true: property should be enumerable expected true got false FAIL Storage interface: operation clear() assert_true: property should be enumerable expected true got false PASS StorageEvent interface: existence and properties of interface object @@ -5057,17 +5057,17 @@ FAIL HTMLAppletElement interface: attribute width assert_own_property: self does not have own property "HTMLAppletElement" expected property "HTMLAppletElement" missing FAIL HTMLAppletElement must be primary interface of document.createElement("applet") assert_own_property: self does not have own property "HTMLAppletElement" expected property "HTMLAppletElement" missing FAIL Stringification of document.createElement("applet") assert_equals: class string of document.createElement("applet") expected "[object HTMLAppletElement]" but got "[object HTMLUnknownElement]" -FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "align" with the proper type (0) assert_inherits: property "align" not found in prototype chain -FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "alt" with the proper type (1) assert_inherits: property "alt" not found in prototype chain -FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "archive" with the proper type (2) assert_inherits: property "archive" not found in prototype chain -FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "code" with the proper type (3) assert_inherits: property "code" not found in prototype chain -FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "codeBase" with the proper type (4) assert_inherits: property "codeBase" not found in prototype chain -FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "height" with the proper type (5) assert_inherits: property "height" not found in prototype chain -FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "hspace" with the proper type (6) assert_inherits: property "hspace" not found in prototype chain -FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "name" with the proper type (7) assert_inherits: property "name" not found in prototype chain -FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "object" with the proper type (8) assert_inherits: property "object" not found in prototype chain -FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "vspace" with the proper type (9) assert_inherits: property "vspace" not found in prototype chain -FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "width" with the proper type (10) assert_inherits: property "width" not found in prototype chain +FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "align" with the proper type assert_inherits: property "align" not found in prototype chain +FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "alt" with the proper type assert_inherits: property "alt" not found in prototype chain +FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "archive" with the proper type assert_inherits: property "archive" not found in prototype chain +FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "code" with the proper type assert_inherits: property "code" not found in prototype chain +FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "codeBase" with the proper type assert_inherits: property "codeBase" not found in prototype chain +FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "height" with the proper type assert_inherits: property "height" not found in prototype chain +FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "hspace" with the proper type assert_inherits: property "hspace" not found in prototype chain +FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "name" with the proper type assert_inherits: property "name" not found in prototype chain +FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "object" with the proper type assert_inherits: property "object" not found in prototype chain +FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "vspace" with the proper type assert_inherits: property "vspace" not found in prototype chain +FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "width" with the proper type assert_inherits: property "width" not found in prototype chain PASS HTMLMarqueeElement interface: existence and properties of interface object PASS HTMLMarqueeElement interface object length PASS HTMLMarqueeElement interface object name @@ -5091,22 +5091,22 @@ PASS HTMLMarqueeElement interface: operation stop() PASS HTMLMarqueeElement must be primary interface of document.createElement("marquee") PASS Stringification of document.createElement("marquee") -PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "behavior" with the proper type (0) -PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "bgColor" with the proper type (1) -PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "direction" with the proper type (2) -PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "height" with the proper type (3) -PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "hspace" with the proper type (4) -PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "loop" with the proper type (5) -PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "scrollAmount" with the proper type (6) -PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "scrollDelay" with the proper type (7) -PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "trueSpeed" with the proper type (8) -PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "vspace" with the proper type (9) -PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "width" with the proper type (10) -FAIL HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "onbounce" with the proper type (11) assert_inherits: property "onbounce" not found in prototype chain -FAIL HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "onfinish" with the proper type (12) assert_inherits: property "onfinish" not found in prototype chain -FAIL HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "onstart" with the proper type (13) assert_inherits: property "onstart" not found in prototype chain -PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "start" with the proper type (14) -PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "stop" with the proper type (15) +PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "behavior" with the proper type +PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "bgColor" with the proper type +PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "direction" with the proper type +PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "height" with the proper type +PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "hspace" with the proper type +PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "loop" with the proper type +PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "scrollAmount" with the proper type +PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "scrollDelay" with the proper type +PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "trueSpeed" with the proper type +PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "vspace" with the proper type +PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "width" with the proper type +FAIL HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "onbounce" with the proper type assert_inherits: property "onbounce" not found in prototype chain +FAIL HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "onfinish" with the proper type assert_inherits: property "onfinish" not found in prototype chain +FAIL HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "onstart" with the proper type assert_inherits: property "onstart" not found in prototype chain +PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "start()" with the proper type +PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "stop()" with the proper type PASS HTMLFrameSetElement interface: existence and properties of interface object PASS HTMLFrameSetElement interface object length PASS HTMLFrameSetElement interface object name @@ -5132,24 +5132,24 @@ PASS HTMLFrameSetElement interface: attribute onunload PASS HTMLFrameSetElement must be primary interface of document.createElement("frameset") PASS Stringification of document.createElement("frameset") -PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "cols" with the proper type (0) -PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "rows" with the proper type (1) -FAIL HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onafterprint" with the proper type (2) assert_inherits: property "onafterprint" not found in prototype chain -FAIL HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onbeforeprint" with the proper type (3) assert_inherits: property "onbeforeprint" not found in prototype chain -PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onbeforeunload" with the proper type (4) -PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onhashchange" with the proper type (5) -PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onlanguagechange" with the proper type (6) -PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onmessage" with the proper type (7) -PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onmessageerror" with the proper type (8) -PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onoffline" with the proper type (9) -PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "ononline" with the proper type (10) -PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpagehide" with the proper type (11) -PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpageshow" with the proper type (12) -PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpopstate" with the proper type (13) -PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onrejectionhandled" with the proper type (14) -PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onstorage" with the proper type (15) -PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onunhandledrejection" with the proper type (16) -PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onunload" with the proper type (17) +PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "cols" with the proper type +PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "rows" with the proper type +FAIL HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onafterprint" with the proper type assert_inherits: property "onafterprint" not found in prototype chain +FAIL HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onbeforeprint" with the proper type assert_inherits: property "onbeforeprint" not found in prototype chain +PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onbeforeunload" with the proper type +PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onhashchange" with the proper type +PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onlanguagechange" with the proper type +PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onmessage" with the proper type +PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onmessageerror" with the proper type +PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onoffline" with the proper type +PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "ononline" with the proper type +PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpagehide" with the proper type +PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpageshow" with the proper type +PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpopstate" with the proper type +PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onrejectionhandled" with the proper type +PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onstorage" with the proper type +PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onunhandledrejection" with the proper type +PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onunload" with the proper type PASS HTMLFrameElement interface: existence and properties of interface object PASS HTMLFrameElement interface object length PASS HTMLFrameElement interface object name @@ -5167,16 +5167,16 @@ PASS HTMLFrameElement interface: attribute marginWidth PASS HTMLFrameElement must be primary interface of document.createElement("frame") PASS Stringification of document.createElement("frame") -PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "name" with the proper type (0) -PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "scrolling" with the proper type (1) -PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "src" with the proper type (2) -PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "frameBorder" with the proper type (3) -PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "longDesc" with the proper type (4) -PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "noResize" with the proper type (5) -PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "contentDocument" with the proper type (6) -PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "contentWindow" with the proper type (7) -PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "marginHeight" with the proper type (8) -PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "marginWidth" with the proper type (9) +PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "name" with the proper type +PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "scrolling" with the proper type +PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "src" with the proper type +PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "frameBorder" with the proper type +PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "longDesc" with the proper type +PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "noResize" with the proper type +PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "contentDocument" with the proper type +PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "contentWindow" with the proper type +PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "marginHeight" with the proper type +PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "marginWidth" with the proper type PASS HTMLDirectoryElement interface: existence and properties of interface object PASS HTMLDirectoryElement interface object length PASS HTMLDirectoryElement interface object name @@ -5185,7 +5185,7 @@ PASS HTMLDirectoryElement interface: attribute compact PASS HTMLDirectoryElement must be primary interface of document.createElement("dir") PASS Stringification of document.createElement("dir") -PASS HTMLDirectoryElement interface: document.createElement("dir") must inherit property "compact" with the proper type (0) +PASS HTMLDirectoryElement interface: document.createElement("dir") must inherit property "compact" with the proper type PASS HTMLFontElement interface: existence and properties of interface object PASS HTMLFontElement interface object length PASS HTMLFontElement interface object name @@ -5196,8 +5196,8 @@ PASS HTMLFontElement interface: attribute size PASS HTMLFontElement must be primary interface of document.createElement("font") PASS Stringification of document.createElement("font") -PASS HTMLFontElement interface: document.createElement("font") must inherit property "color" with the proper type (0) -PASS HTMLFontElement interface: document.createElement("font") must inherit property "face" with the proper type (1) -PASS HTMLFontElement interface: document.createElement("font") must inherit property "size" with the proper type (2) +PASS HTMLFontElement interface: document.createElement("font") must inherit property "color" with the proper type +PASS HTMLFontElement interface: document.createElement("font") must inherit property "face" with the proper type +PASS HTMLFontElement interface: document.createElement("font") must inherit property "size" with the proper type Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces.worker-expected.txt index b0cc4e40..4c9e33b 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces.worker-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces.worker-expected.txt
@@ -142,17 +142,17 @@ PASS Path2D interface object name PASS Path2D interface: existence and properties of interface prototype object PASS Path2D interface: existence and properties of interface prototype object's "constructor" property -PASS Path2D interface: operation addPath(Path2D,DOMMatrixInit) +PASS Path2D interface: operation addPath(Path2D, DOMMatrixInit) PASS Path2D interface: operation closePath() -PASS Path2D interface: operation moveTo(unrestricted double,unrestricted double) -PASS Path2D interface: operation lineTo(unrestricted double,unrestricted double) -PASS Path2D interface: operation quadraticCurveTo(unrestricted double,unrestricted double,unrestricted double,unrestricted double) -PASS Path2D interface: operation bezierCurveTo(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) -PASS Path2D interface: operation arcTo(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) -PASS Path2D interface: operation arcTo(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) -PASS Path2D interface: operation rect(unrestricted double,unrestricted double,unrestricted double,unrestricted double) -PASS Path2D interface: operation arc(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,boolean) -PASS Path2D interface: operation ellipse(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,boolean) +PASS Path2D interface: operation moveTo(unrestricted double, unrestricted double) +PASS Path2D interface: operation lineTo(unrestricted double, unrestricted double) +PASS Path2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double) +PASS Path2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) +PASS Path2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) +PASS Path2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) +PASS Path2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) +PASS Path2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) +PASS Path2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) PASS DataTransfer interface: existence and properties of interface object PASS DataTransferItemList interface: existence and properties of interface object PASS DataTransferItem interface: existence and properties of interface object @@ -199,16 +199,16 @@ PASS MessageEvent interface: attribute lastEventId PASS MessageEvent interface: attribute source PASS MessageEvent interface: attribute ports -FAIL MessageEvent interface: operation initMessageEvent(DOMString,boolean,boolean,any,DOMString,DOMString,[object Object],[object Object],[object Object]) assert_equals: property has wrong .length expected 1 but got 0 +FAIL MessageEvent interface: operation initMessageEvent(DOMString, boolean, boolean, any, DOMString, DOMString, [object Object],[object Object], [object Object]) assert_equals: property has wrong .length expected 1 but got 0 PASS MessageEvent must be primary interface of new MessageEvent("message", { data: 5 }) PASS Stringification of new MessageEvent("message", { data: 5 }) -PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "data" with the proper type (0) -PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "origin" with the proper type (1) -PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "lastEventId" with the proper type (2) -PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "source" with the proper type (3) -FAIL MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "ports" with the proper type (4) assert_true: Value should be array expected true got false -PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "initMessageEvent" with the proper type (5) -FAIL MessageEvent interface: calling initMessageEvent(DOMString,boolean,boolean,any,DOMString,DOMString,[object Object],[object Object],[object Object]) on new MessageEvent("message", { data: 5 }) with too few arguments must throw TypeError assert_throws: Called with 0 arguments function "function () { +PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "data" with the proper type +PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "origin" with the proper type +PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "lastEventId" with the proper type +PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "source" with the proper type +FAIL MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "ports" with the proper type assert_true: Value should be array expected true got false +PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "initMessageEvent(DOMString, boolean, boolean, any, DOMString, DOMString, [object Object],[object Object], [object Object])" with the proper type +FAIL MessageEvent interface: calling initMessageEvent(DOMString, boolean, boolean, any, DOMString, DOMString, [object Object],[object Object], [object Object]) on new MessageEvent("message", { data: 5 }) with too few arguments must throw TypeError assert_throws: Called with 0 arguments function "function () { fn.apply(obj, args); }" did not throw PASS EventSource interface: existence and properties of interface object @@ -250,7 +250,7 @@ PASS WebSocket interface: attribute onclose PASS WebSocket interface: attribute extensions PASS WebSocket interface: attribute protocol -PASS WebSocket interface: operation close(unsigned short,USVString) +PASS WebSocket interface: operation close(unsigned short, USVString) PASS WebSocket interface: attribute onmessage PASS WebSocket interface: attribute binaryType PASS WebSocket interface: operation send(USVString) @@ -259,29 +259,29 @@ PASS WebSocket interface: operation send(ArrayBufferView) PASS WebSocket must be primary interface of new WebSocket("ws://foo") PASS Stringification of new WebSocket("ws://foo") -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "url" with the proper type (0) -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "CONNECTING" with the proper type (1) -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "OPEN" with the proper type (2) -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "CLOSING" with the proper type (3) -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "CLOSED" with the proper type (4) -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "readyState" with the proper type (5) -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "bufferedAmount" with the proper type (6) -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onopen" with the proper type (7) -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onerror" with the proper type (8) -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onclose" with the proper type (9) -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "extensions" with the proper type (10) -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "protocol" with the proper type (11) -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "close" with the proper type (12) -PASS WebSocket interface: calling close(unsigned short,USVString) on new WebSocket("ws://foo") with too few arguments must throw TypeError -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onmessage" with the proper type (13) -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "binaryType" with the proper type (14) -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send" with the proper type (15) +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "url" with the proper type +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "CONNECTING" with the proper type +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "OPEN" with the proper type +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "CLOSING" with the proper type +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "CLOSED" with the proper type +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "readyState" with the proper type +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "bufferedAmount" with the proper type +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onopen" with the proper type +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onerror" with the proper type +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onclose" with the proper type +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "extensions" with the proper type +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "protocol" with the proper type +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "close(unsigned short, USVString)" with the proper type +PASS WebSocket interface: calling close(unsigned short, USVString) on new WebSocket("ws://foo") with too few arguments must throw TypeError +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onmessage" with the proper type +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "binaryType" with the proper type +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send(USVString)" with the proper type PASS WebSocket interface: calling send(USVString) on new WebSocket("ws://foo") with too few arguments must throw TypeError -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send" with the proper type (16) +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send(Blob)" with the proper type PASS WebSocket interface: calling send(Blob) on new WebSocket("ws://foo") with too few arguments must throw TypeError -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send" with the proper type (17) +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send(ArrayBuffer)" with the proper type PASS WebSocket interface: calling send(ArrayBuffer) on new WebSocket("ws://foo") with too few arguments must throw TypeError -PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send" with the proper type (18) +PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send(ArrayBufferView)" with the proper type PASS WebSocket interface: calling send(ArrayBufferView) on new WebSocket("ws://foo") with too few arguments must throw TypeError PASS CloseEvent interface: existence and properties of interface object PASS CloseEvent interface object length @@ -293,9 +293,9 @@ PASS CloseEvent interface: attribute reason PASS CloseEvent must be primary interface of new CloseEvent("close") PASS Stringification of new CloseEvent("close") -PASS CloseEvent interface: new CloseEvent("close") must inherit property "wasClean" with the proper type (0) -PASS CloseEvent interface: new CloseEvent("close") must inherit property "code" with the proper type (1) -PASS CloseEvent interface: new CloseEvent("close") must inherit property "reason" with the proper type (2) +PASS CloseEvent interface: new CloseEvent("close") must inherit property "wasClean" with the proper type +PASS CloseEvent interface: new CloseEvent("close") must inherit property "code" with the proper type +PASS CloseEvent interface: new CloseEvent("close") must inherit property "reason" with the proper type PASS MessageChannel interface: existence and properties of interface object PASS MessageChannel interface object length PASS MessageChannel interface object name @@ -308,7 +308,7 @@ PASS MessagePort interface object name PASS MessagePort interface: existence and properties of interface prototype object PASS MessagePort interface: existence and properties of interface prototype object's "constructor" property -PASS MessagePort interface: operation postMessage(any,[object Object]) +PASS MessagePort interface: operation postMessage(any, [object Object]) PASS MessagePort interface: operation start() PASS MessagePort interface: operation close() PASS MessagePort interface: attribute onmessage @@ -339,12 +339,12 @@ PASS WorkerGlobalScope interface: attribute origin PASS WorkerGlobalScope interface: operation btoa(DOMString) PASS WorkerGlobalScope interface: operation atob(DOMString) -PASS WorkerGlobalScope interface: operation setTimeout(TimerHandler,long,any) +PASS WorkerGlobalScope interface: operation setTimeout(TimerHandler, long, any) PASS WorkerGlobalScope interface: operation clearTimeout(long) -PASS WorkerGlobalScope interface: operation setInterval(TimerHandler,long,any) +PASS WorkerGlobalScope interface: operation setInterval(TimerHandler, long, any) PASS WorkerGlobalScope interface: operation clearInterval(long) -PASS WorkerGlobalScope interface: operation createImageBitmap(ImageBitmapSource,ImageBitmapOptions) -PASS WorkerGlobalScope interface: operation createImageBitmap(ImageBitmapSource,long,long,long,long,ImageBitmapOptions) +PASS WorkerGlobalScope interface: operation createImageBitmap(ImageBitmapSource, ImageBitmapOptions) +PASS WorkerGlobalScope interface: operation createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions) PASS DedicatedWorkerGlobalScope interface: existence and properties of interface object PASS DedicatedWorkerGlobalScope interface object length PASS DedicatedWorkerGlobalScope interface object name @@ -356,7 +356,7 @@ PASS DedicatedWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via __proto__ should not throw PASS DedicatedWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Reflect.setPrototypeOf should return true PASS DedicatedWorkerGlobalScope interface: existence and properties of interface prototype object's "constructor" property -PASS DedicatedWorkerGlobalScope interface: operation postMessage(any,[object Object]) +PASS DedicatedWorkerGlobalScope interface: operation postMessage(any, [object Object]) PASS DedicatedWorkerGlobalScope interface: operation close() PASS DedicatedWorkerGlobalScope interface: attribute onmessage PASS DedicatedWorkerGlobalScope interface: attribute onmessageerror @@ -368,37 +368,37 @@ PASS DedicatedWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Reflect.setPrototypeOf should return true PASS DedicatedWorkerGlobalScope must be primary interface of self PASS Stringification of self -PASS DedicatedWorkerGlobalScope interface: self must inherit property "postMessage" with the proper type (0) -PASS DedicatedWorkerGlobalScope interface: calling postMessage(any,[object Object]) on self with too few arguments must throw TypeError -PASS DedicatedWorkerGlobalScope interface: self must inherit property "close" with the proper type (1) -PASS DedicatedWorkerGlobalScope interface: self must inherit property "onmessage" with the proper type (2) -PASS DedicatedWorkerGlobalScope interface: self must inherit property "onmessageerror" with the proper type (3) -PASS WorkerGlobalScope interface: self must inherit property "self" with the proper type (0) -PASS WorkerGlobalScope interface: self must inherit property "location" with the proper type (1) -PASS WorkerGlobalScope interface: self must inherit property "navigator" with the proper type (2) -PASS WorkerGlobalScope interface: self must inherit property "importScripts" with the proper type (3) +PASS DedicatedWorkerGlobalScope interface: self must inherit property "postMessage(any, [object Object])" with the proper type +PASS DedicatedWorkerGlobalScope interface: calling postMessage(any, [object Object]) on self with too few arguments must throw TypeError +PASS DedicatedWorkerGlobalScope interface: self must inherit property "close()" with the proper type +PASS DedicatedWorkerGlobalScope interface: self must inherit property "onmessage" with the proper type +PASS DedicatedWorkerGlobalScope interface: self must inherit property "onmessageerror" with the proper type +PASS WorkerGlobalScope interface: self must inherit property "self" with the proper type +PASS WorkerGlobalScope interface: self must inherit property "location" with the proper type +PASS WorkerGlobalScope interface: self must inherit property "navigator" with the proper type +PASS WorkerGlobalScope interface: self must inherit property "importScripts(USVString)" with the proper type PASS WorkerGlobalScope interface: calling importScripts(USVString) on self with too few arguments must throw TypeError -PASS WorkerGlobalScope interface: self must inherit property "onerror" with the proper type (4) -FAIL WorkerGlobalScope interface: self must inherit property "onlanguagechange" with the proper type (5) assert_inherits: property "onlanguagechange" not found in prototype chain -FAIL WorkerGlobalScope interface: self must inherit property "onoffline" with the proper type (6) assert_inherits: property "onoffline" not found in prototype chain -FAIL WorkerGlobalScope interface: self must inherit property "ononline" with the proper type (7) assert_inherits: property "ononline" not found in prototype chain -PASS WorkerGlobalScope interface: self must inherit property "origin" with the proper type (8) -PASS WorkerGlobalScope interface: self must inherit property "btoa" with the proper type (9) +PASS WorkerGlobalScope interface: self must inherit property "onerror" with the proper type +FAIL WorkerGlobalScope interface: self must inherit property "onlanguagechange" with the proper type assert_inherits: property "onlanguagechange" not found in prototype chain +FAIL WorkerGlobalScope interface: self must inherit property "onoffline" with the proper type assert_inherits: property "onoffline" not found in prototype chain +FAIL WorkerGlobalScope interface: self must inherit property "ononline" with the proper type assert_inherits: property "ononline" not found in prototype chain +PASS WorkerGlobalScope interface: self must inherit property "origin" with the proper type +PASS WorkerGlobalScope interface: self must inherit property "btoa(DOMString)" with the proper type PASS WorkerGlobalScope interface: calling btoa(DOMString) on self with too few arguments must throw TypeError -PASS WorkerGlobalScope interface: self must inherit property "atob" with the proper type (10) +PASS WorkerGlobalScope interface: self must inherit property "atob(DOMString)" with the proper type PASS WorkerGlobalScope interface: calling atob(DOMString) on self with too few arguments must throw TypeError -PASS WorkerGlobalScope interface: self must inherit property "setTimeout" with the proper type (11) -PASS WorkerGlobalScope interface: calling setTimeout(TimerHandler,long,any) on self with too few arguments must throw TypeError -PASS WorkerGlobalScope interface: self must inherit property "clearTimeout" with the proper type (12) +PASS WorkerGlobalScope interface: self must inherit property "setTimeout(TimerHandler, long, any)" with the proper type +PASS WorkerGlobalScope interface: calling setTimeout(TimerHandler, long, any) on self with too few arguments must throw TypeError +PASS WorkerGlobalScope interface: self must inherit property "clearTimeout(long)" with the proper type PASS WorkerGlobalScope interface: calling clearTimeout(long) on self with too few arguments must throw TypeError -PASS WorkerGlobalScope interface: self must inherit property "setInterval" with the proper type (13) -PASS WorkerGlobalScope interface: calling setInterval(TimerHandler,long,any) on self with too few arguments must throw TypeError -PASS WorkerGlobalScope interface: self must inherit property "clearInterval" with the proper type (14) +PASS WorkerGlobalScope interface: self must inherit property "setInterval(TimerHandler, long, any)" with the proper type +PASS WorkerGlobalScope interface: calling setInterval(TimerHandler, long, any) on self with too few arguments must throw TypeError +PASS WorkerGlobalScope interface: self must inherit property "clearInterval(long)" with the proper type PASS WorkerGlobalScope interface: calling clearInterval(long) on self with too few arguments must throw TypeError -PASS WorkerGlobalScope interface: self must inherit property "createImageBitmap" with the proper type (15) -PASS WorkerGlobalScope interface: calling createImageBitmap(ImageBitmapSource,ImageBitmapOptions) on self with too few arguments must throw TypeError -PASS WorkerGlobalScope interface: self must inherit property "createImageBitmap" with the proper type (16) -PASS WorkerGlobalScope interface: calling createImageBitmap(ImageBitmapSource,long,long,long,long,ImageBitmapOptions) on self with too few arguments must throw TypeError +PASS WorkerGlobalScope interface: self must inherit property "createImageBitmap(ImageBitmapSource, ImageBitmapOptions)" with the proper type +PASS WorkerGlobalScope interface: calling createImageBitmap(ImageBitmapSource, ImageBitmapOptions) on self with too few arguments must throw TypeError +PASS WorkerGlobalScope interface: self must inherit property "createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions)" with the proper type +PASS WorkerGlobalScope interface: calling createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions) on self with too few arguments must throw TypeError PASS SharedWorkerGlobalScope interface: existence and properties of interface object FAIL Worker interface: existence and properties of interface object assert_own_property: self does not have own property "Worker" expected property "Worker" missing FAIL Worker interface object length assert_own_property: self does not have own property "Worker" expected property "Worker" missing @@ -406,7 +406,7 @@ FAIL Worker interface: existence and properties of interface prototype object assert_own_property: self does not have own property "Worker" expected property "Worker" missing FAIL Worker interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "Worker" expected property "Worker" missing FAIL Worker interface: operation terminate() assert_own_property: self does not have own property "Worker" expected property "Worker" missing -FAIL Worker interface: operation postMessage(any,[object Object]) assert_own_property: self does not have own property "Worker" expected property "Worker" missing +FAIL Worker interface: operation postMessage(any, [object Object]) assert_own_property: self does not have own property "Worker" expected property "Worker" missing FAIL Worker interface: attribute onmessage assert_own_property: self does not have own property "Worker" expected property "Worker" missing FAIL Worker interface: attribute onerror assert_own_property: self does not have own property "Worker" expected property "Worker" missing FAIL SharedWorker interface: existence and properties of interface object assert_own_property: self does not have own property "SharedWorker" expected property "SharedWorker" missing @@ -435,18 +435,18 @@ PASS WorkerNavigator interface: attribute onLine PASS WorkerNavigator must be primary interface of self.navigator PASS Stringification of self.navigator -PASS WorkerNavigator interface: self.navigator must inherit property "appCodeName" with the proper type (0) -PASS WorkerNavigator interface: self.navigator must inherit property "appName" with the proper type (1) -PASS WorkerNavigator interface: self.navigator must inherit property "appVersion" with the proper type (2) -PASS WorkerNavigator interface: self.navigator must inherit property "platform" with the proper type (3) -PASS WorkerNavigator interface: self.navigator must inherit property "product" with the proper type (4) +PASS WorkerNavigator interface: self.navigator must inherit property "appCodeName" with the proper type +PASS WorkerNavigator interface: self.navigator must inherit property "appName" with the proper type +PASS WorkerNavigator interface: self.navigator must inherit property "appVersion" with the proper type +PASS WorkerNavigator interface: self.navigator must inherit property "platform" with the proper type +PASS WorkerNavigator interface: self.navigator must inherit property "product" with the proper type PASS WorkerNavigatorinterface: self.navigatormust not have property "productSub" -PASS WorkerNavigator interface: self.navigator must inherit property "userAgent" with the proper type (6) +PASS WorkerNavigator interface: self.navigator must inherit property "userAgent" with the proper type PASS WorkerNavigatorinterface: self.navigatormust not have property "vendor" PASS WorkerNavigatorinterface: self.navigatormust not have property "vendorSub" -FAIL WorkerNavigator interface: self.navigator must inherit property "language" with the proper type (9) assert_inherits: property "language" not found in prototype chain -FAIL WorkerNavigator interface: self.navigator must inherit property "languages" with the proper type (10) assert_inherits: property "languages" not found in prototype chain -PASS WorkerNavigator interface: self.navigator must inherit property "onLine" with the proper type (11) +FAIL WorkerNavigator interface: self.navigator must inherit property "language" with the proper type assert_inherits: property "language" not found in prototype chain +FAIL WorkerNavigator interface: self.navigator must inherit property "languages" with the proper type assert_inherits: property "languages" not found in prototype chain +PASS WorkerNavigator interface: self.navigator must inherit property "onLine" with the proper type PASS WorkerLocation interface: existence and properties of interface object PASS WorkerLocation interface object length PASS WorkerLocation interface object name
diff --git a/third_party/WebKit/LayoutTests/external/wpt/image-decodes/image-decode-iframe.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/the-img-element/decode/image-decode-iframe.html similarity index 100% rename from third_party/WebKit/LayoutTests/external/wpt/image-decodes/image-decode-iframe.html rename to third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/the-img-element/decode/image-decode-iframe.html
diff --git a/third_party/WebKit/LayoutTests/external/wpt/image-decodes/image-decode-path-changes.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes.html similarity index 100% rename from third_party/WebKit/LayoutTests/external/wpt/image-decodes/image-decode-path-changes.html rename to third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes.html
diff --git a/third_party/WebKit/LayoutTests/external/wpt/image-decodes/image-decode.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/the-img-element/decode/image-decode.html similarity index 100% rename from third_party/WebKit/LayoutTests/external/wpt/image-decodes/image-decode.html rename to third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/the-img-element/decode/image-decode.html
diff --git a/third_party/WebKit/LayoutTests/external/wpt/input-events/input-events-typing-data-manual.html b/third_party/WebKit/LayoutTests/external/wpt/input-events/input-events-typing-data-manual.html index 2b4a809..26e179c3 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/input-events/input-events-typing-data-manual.html +++ b/third_party/WebKit/LayoutTests/external/wpt/input-events/input-events-typing-data-manual.html
@@ -9,7 +9,7 @@ <br/> If a "PASS" result appears the test passes, otherwise it fails</p> <textarea id='plain'></textarea> -<div id='rich' style='border-style: solid;' contenteditable></div> +<div id='rich' style='border-style: solid;' contenteditable><br></div> <script> async_test(t => { const expectedResult = [
diff --git a/third_party/WebKit/LayoutTests/external/wpt/intersection-observer/timestamp.html b/third_party/WebKit/LayoutTests/external/wpt/intersection-observer/timestamp.html index cffd915..90032560 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/intersection-observer/timestamp.html +++ b/third_party/WebKit/LayoutTests/external/wpt/intersection-observer/timestamp.html
@@ -87,7 +87,13 @@ // Test results are only significant if there's a gap between // top window time and iframe window time. assert_greater_than(topWindowTimeBeforeNotification, iframeWindowTimeAfterNotification, - "Time ranges for top and iframe windows are disjoint."); + "Time ranges for top and iframe windows are disjoint. Times: " + + [topWindowTimeOnTestStart, topWindowTimeBeforeCreatingIframe, + topWindowTimeBeforeNotification, topWindowTimeAfterNotification, + iframeWindowTimeBeforeNotification, iframeWindowTimeAfterNotification, + topWindowEntries[1].time - topWindowTimeBeforeNotification, + iframeWindowEntries[1].time - iframeWindowTimeBeforeNotification + ]); assert_equals(topWindowEntries.length, 2, "Top window observer has two notifications."); assert_between_inclusive(
diff --git a/third_party/WebKit/LayoutTests/external/wpt/keyboard-lock/idlharness.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/keyboard-lock/idlharness.https-expected.txt index 888b6049..3a95eb3 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/keyboard-lock/idlharness.https-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/keyboard-lock/idlharness.https-expected.txt
@@ -3,8 +3,8 @@ fn.apply(obj, args); }" did not throw PASS Navigator interface: operation cancelKeyboardLock() -PASS Navigator interface: navigator must inherit property "requestKeyboardLock" with the proper type (0) +PASS Navigator interface: navigator must inherit property "requestKeyboardLock(sequence)" with the proper type PASS Navigator interface: calling requestKeyboardLock(sequence) on navigator with too few arguments must throw TypeError -PASS Navigator interface: navigator must inherit property "cancelKeyboardLock" with the proper type (1) +PASS Navigator interface: navigator must inherit property "cancelKeyboardLock()" with the proper type Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/idlharness-expected.txt index c455fe7..a488b2c 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/idlharness-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/idlharness-expected.txt
@@ -1,6 +1,6 @@ This is a testharness.js-based test. PASS Navigator interface: attribute mediaCapabilities -PASS Navigator interface: navigator must inherit property "mediaCapabilities" with the proper type (0) +PASS Navigator interface: navigator must inherit property "mediaCapabilities" with the proper type PASS WorkerNavigator interface: existence and properties of interface object PASS MediaCapabilitiesInfo interface: existence and properties of interface object PASS MediaCapabilitiesInfo interface object length
diff --git a/third_party/WebKit/LayoutTests/external/wpt/media-source/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/media-source/interfaces-expected.txt index 19f99bb..98f4a88 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/media-source/interfaces-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/media-source/interfaces-expected.txt
@@ -19,28 +19,28 @@ PASS MediaSource interface: operation addSourceBuffer(DOMString) PASS MediaSource interface: operation removeSourceBuffer(SourceBuffer) PASS MediaSource interface: operation endOfStream(EndOfStreamError) -PASS MediaSource interface: operation setLiveSeekableRange(double,double) +PASS MediaSource interface: operation setLiveSeekableRange(double, double) PASS MediaSource interface: operation clearLiveSeekableRange() PASS MediaSource interface: operation isTypeSupported(DOMString) PASS MediaSource must be primary interface of mediaSource PASS Stringification of mediaSource -PASS MediaSource interface: mediaSource must inherit property "sourceBuffers" with the proper type (0) -PASS MediaSource interface: mediaSource must inherit property "activeSourceBuffers" with the proper type (1) -PASS MediaSource interface: mediaSource must inherit property "readyState" with the proper type (2) -PASS MediaSource interface: mediaSource must inherit property "duration" with the proper type (3) -PASS MediaSource interface: mediaSource must inherit property "onsourceopen" with the proper type (4) -PASS MediaSource interface: mediaSource must inherit property "onsourceended" with the proper type (5) -PASS MediaSource interface: mediaSource must inherit property "onsourceclose" with the proper type (6) -PASS MediaSource interface: mediaSource must inherit property "addSourceBuffer" with the proper type (7) +PASS MediaSource interface: mediaSource must inherit property "sourceBuffers" with the proper type +PASS MediaSource interface: mediaSource must inherit property "activeSourceBuffers" with the proper type +PASS MediaSource interface: mediaSource must inherit property "readyState" with the proper type +PASS MediaSource interface: mediaSource must inherit property "duration" with the proper type +PASS MediaSource interface: mediaSource must inherit property "onsourceopen" with the proper type +PASS MediaSource interface: mediaSource must inherit property "onsourceended" with the proper type +PASS MediaSource interface: mediaSource must inherit property "onsourceclose" with the proper type +PASS MediaSource interface: mediaSource must inherit property "addSourceBuffer(DOMString)" with the proper type PASS MediaSource interface: calling addSourceBuffer(DOMString) on mediaSource with too few arguments must throw TypeError -PASS MediaSource interface: mediaSource must inherit property "removeSourceBuffer" with the proper type (8) +PASS MediaSource interface: mediaSource must inherit property "removeSourceBuffer(SourceBuffer)" with the proper type PASS MediaSource interface: calling removeSourceBuffer(SourceBuffer) on mediaSource with too few arguments must throw TypeError -PASS MediaSource interface: mediaSource must inherit property "endOfStream" with the proper type (9) +PASS MediaSource interface: mediaSource must inherit property "endOfStream(EndOfStreamError)" with the proper type PASS MediaSource interface: calling endOfStream(EndOfStreamError) on mediaSource with too few arguments must throw TypeError -PASS MediaSource interface: mediaSource must inherit property "setLiveSeekableRange" with the proper type (10) -PASS MediaSource interface: calling setLiveSeekableRange(double,double) on mediaSource with too few arguments must throw TypeError -PASS MediaSource interface: mediaSource must inherit property "clearLiveSeekableRange" with the proper type (11) -PASS MediaSource interface: mediaSource must inherit property "isTypeSupported" with the proper type (12) +PASS MediaSource interface: mediaSource must inherit property "setLiveSeekableRange(double, double)" with the proper type +PASS MediaSource interface: calling setLiveSeekableRange(double, double) on mediaSource with too few arguments must throw TypeError +PASS MediaSource interface: mediaSource must inherit property "clearLiveSeekableRange()" with the proper type +PASS MediaSource interface: mediaSource must inherit property "isTypeSupported(DOMString)" with the proper type PASS MediaSource interface: calling isTypeSupported(DOMString) on mediaSource with too few arguments must throw TypeError PASS SourceBuffer interface: existence and properties of interface object PASS SourceBuffer interface object length @@ -63,28 +63,28 @@ PASS SourceBuffer interface: attribute onabort PASS SourceBuffer interface: operation appendBuffer(BufferSource) PASS SourceBuffer interface: operation abort() -PASS SourceBuffer interface: operation remove(double,unrestricted double) +PASS SourceBuffer interface: operation remove(double, unrestricted double) PASS SourceBuffer must be primary interface of sourceBuffer PASS Stringification of sourceBuffer -PASS SourceBuffer interface: sourceBuffer must inherit property "mode" with the proper type (0) -PASS SourceBuffer interface: sourceBuffer must inherit property "updating" with the proper type (1) -PASS SourceBuffer interface: sourceBuffer must inherit property "buffered" with the proper type (2) -PASS SourceBuffer interface: sourceBuffer must inherit property "timestampOffset" with the proper type (3) -PASS SourceBuffer interface: sourceBuffer must inherit property "audioTracks" with the proper type (4) -PASS SourceBuffer interface: sourceBuffer must inherit property "videoTracks" with the proper type (5) -FAIL SourceBuffer interface: sourceBuffer must inherit property "textTracks" with the proper type (6) assert_inherits: property "textTracks" not found in prototype chain -PASS SourceBuffer interface: sourceBuffer must inherit property "appendWindowStart" with the proper type (7) -PASS SourceBuffer interface: sourceBuffer must inherit property "appendWindowEnd" with the proper type (8) -PASS SourceBuffer interface: sourceBuffer must inherit property "onupdatestart" with the proper type (9) -PASS SourceBuffer interface: sourceBuffer must inherit property "onupdate" with the proper type (10) -PASS SourceBuffer interface: sourceBuffer must inherit property "onupdateend" with the proper type (11) -PASS SourceBuffer interface: sourceBuffer must inherit property "onerror" with the proper type (12) -PASS SourceBuffer interface: sourceBuffer must inherit property "onabort" with the proper type (13) -PASS SourceBuffer interface: sourceBuffer must inherit property "appendBuffer" with the proper type (14) +PASS SourceBuffer interface: sourceBuffer must inherit property "mode" with the proper type +PASS SourceBuffer interface: sourceBuffer must inherit property "updating" with the proper type +PASS SourceBuffer interface: sourceBuffer must inherit property "buffered" with the proper type +PASS SourceBuffer interface: sourceBuffer must inherit property "timestampOffset" with the proper type +PASS SourceBuffer interface: sourceBuffer must inherit property "audioTracks" with the proper type +PASS SourceBuffer interface: sourceBuffer must inherit property "videoTracks" with the proper type +FAIL SourceBuffer interface: sourceBuffer must inherit property "textTracks" with the proper type assert_inherits: property "textTracks" not found in prototype chain +PASS SourceBuffer interface: sourceBuffer must inherit property "appendWindowStart" with the proper type +PASS SourceBuffer interface: sourceBuffer must inherit property "appendWindowEnd" with the proper type +PASS SourceBuffer interface: sourceBuffer must inherit property "onupdatestart" with the proper type +PASS SourceBuffer interface: sourceBuffer must inherit property "onupdate" with the proper type +PASS SourceBuffer interface: sourceBuffer must inherit property "onupdateend" with the proper type +PASS SourceBuffer interface: sourceBuffer must inherit property "onerror" with the proper type +PASS SourceBuffer interface: sourceBuffer must inherit property "onabort" with the proper type +PASS SourceBuffer interface: sourceBuffer must inherit property "appendBuffer(BufferSource)" with the proper type PASS SourceBuffer interface: calling appendBuffer(BufferSource) on sourceBuffer with too few arguments must throw TypeError -PASS SourceBuffer interface: sourceBuffer must inherit property "abort" with the proper type (15) -PASS SourceBuffer interface: sourceBuffer must inherit property "remove" with the proper type (16) -PASS SourceBuffer interface: calling remove(double,unrestricted double) on sourceBuffer with too few arguments must throw TypeError +PASS SourceBuffer interface: sourceBuffer must inherit property "abort()" with the proper type +PASS SourceBuffer interface: sourceBuffer must inherit property "remove(double, unrestricted double)" with the proper type +PASS SourceBuffer interface: calling remove(double, unrestricted double) on sourceBuffer with too few arguments must throw TypeError PASS SourceBufferList interface: existence and properties of interface object PASS SourceBufferList interface object length PASS SourceBufferList interface object name @@ -95,8 +95,8 @@ PASS SourceBufferList interface: attribute onremovesourcebuffer PASS SourceBufferList must be primary interface of mediaSource.sourceBuffers PASS Stringification of mediaSource.sourceBuffers -PASS SourceBufferList interface: mediaSource.sourceBuffers must inherit property "length" with the proper type (0) -PASS SourceBufferList interface: mediaSource.sourceBuffers must inherit property "onaddsourcebuffer" with the proper type (1) -PASS SourceBufferList interface: mediaSource.sourceBuffers must inherit property "onremovesourcebuffer" with the proper type (2) +PASS SourceBufferList interface: mediaSource.sourceBuffers must inherit property "length" with the proper type +PASS SourceBufferList interface: mediaSource.sourceBuffers must inherit property "onaddsourcebuffer" with the proper type +PASS SourceBufferList interface: mediaSource.sourceBuffers must inherit property "onremovesourcebuffer" with the proper type Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-fromelement/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-fromelement/idlharness-expected.txt index a2ccb543..f782506 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-fromelement/idlharness-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-fromelement/idlharness-expected.txt
@@ -1,9 +1,9 @@ This is a testharness.js-based test. PASS HTMLCanvasElement interface: operation captureStream(double) -PASS HTMLCanvasElement interface: [object HTMLCanvasElement] must inherit property "captureStream" with the proper type (0) +PASS HTMLCanvasElement interface: [object HTMLCanvasElement] must inherit property "captureStream(double)" with the proper type PASS HTMLCanvasElement interface: calling captureStream(double) on [object HTMLCanvasElement] with too few arguments must throw TypeError PASS HTMLMediaElement interface: operation captureStream() -FAIL HTMLMediaElement interface: [object HTMLUnknownElement] must inherit property "captureStream" with the proper type (0) assert_inherits: property "captureStream" not found in prototype chain +FAIL HTMLMediaElement interface: [object HTMLUnknownElement] must inherit property "captureStream()" with the proper type assert_inherits: property "captureStream" not found in prototype chain PASS CanvasCaptureMediaStreamTrack interface: existence and properties of interface object PASS CanvasCaptureMediaStreamTrack interface object length PASS CanvasCaptureMediaStreamTrack interface object name @@ -13,7 +13,7 @@ PASS CanvasCaptureMediaStreamTrack interface: operation requestFrame() PASS CanvasCaptureMediaStreamTrack must be primary interface of [object CanvasCaptureMediaStreamTrack] PASS Stringification of [object CanvasCaptureMediaStreamTrack] -PASS CanvasCaptureMediaStreamTrack interface: [object CanvasCaptureMediaStreamTrack] must inherit property "canvas" with the proper type (0) -PASS CanvasCaptureMediaStreamTrack interface: [object CanvasCaptureMediaStreamTrack] must inherit property "requestFrame" with the proper type (1) +PASS CanvasCaptureMediaStreamTrack interface: [object CanvasCaptureMediaStreamTrack] must inherit property "canvas" with the proper type +PASS CanvasCaptureMediaStreamTrack interface: [object CanvasCaptureMediaStreamTrack] must inherit property "requestFrame()" with the proper type Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-record/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-record/idlharness-expected.txt index c50ba89..d2bf23a 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-record/idlharness-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-record/idlharness-expected.txt
@@ -24,24 +24,24 @@ PASS MediaRecorder interface: operation isTypeSupported(DOMString) PASS MediaRecorder must be primary interface of [object MediaRecorder] PASS Stringification of [object MediaRecorder] -PASS MediaRecorder interface: [object MediaRecorder] must inherit property "stream" with the proper type (0) -PASS MediaRecorder interface: [object MediaRecorder] must inherit property "mimeType" with the proper type (1) -PASS MediaRecorder interface: [object MediaRecorder] must inherit property "state" with the proper type (2) -PASS MediaRecorder interface: [object MediaRecorder] must inherit property "onstart" with the proper type (3) -PASS MediaRecorder interface: [object MediaRecorder] must inherit property "onstop" with the proper type (4) -PASS MediaRecorder interface: [object MediaRecorder] must inherit property "ondataavailable" with the proper type (5) -PASS MediaRecorder interface: [object MediaRecorder] must inherit property "onpause" with the proper type (6) -PASS MediaRecorder interface: [object MediaRecorder] must inherit property "onresume" with the proper type (7) -PASS MediaRecorder interface: [object MediaRecorder] must inherit property "onerror" with the proper type (8) -PASS MediaRecorder interface: [object MediaRecorder] must inherit property "videoBitsPerSecond" with the proper type (9) -PASS MediaRecorder interface: [object MediaRecorder] must inherit property "audioBitsPerSecond" with the proper type (10) -PASS MediaRecorder interface: [object MediaRecorder] must inherit property "start" with the proper type (11) +PASS MediaRecorder interface: [object MediaRecorder] must inherit property "stream" with the proper type +PASS MediaRecorder interface: [object MediaRecorder] must inherit property "mimeType" with the proper type +PASS MediaRecorder interface: [object MediaRecorder] must inherit property "state" with the proper type +PASS MediaRecorder interface: [object MediaRecorder] must inherit property "onstart" with the proper type +PASS MediaRecorder interface: [object MediaRecorder] must inherit property "onstop" with the proper type +PASS MediaRecorder interface: [object MediaRecorder] must inherit property "ondataavailable" with the proper type +PASS MediaRecorder interface: [object MediaRecorder] must inherit property "onpause" with the proper type +PASS MediaRecorder interface: [object MediaRecorder] must inherit property "onresume" with the proper type +PASS MediaRecorder interface: [object MediaRecorder] must inherit property "onerror" with the proper type +PASS MediaRecorder interface: [object MediaRecorder] must inherit property "videoBitsPerSecond" with the proper type +PASS MediaRecorder interface: [object MediaRecorder] must inherit property "audioBitsPerSecond" with the proper type +PASS MediaRecorder interface: [object MediaRecorder] must inherit property "start(long)" with the proper type PASS MediaRecorder interface: calling start(long) on [object MediaRecorder] with too few arguments must throw TypeError -PASS MediaRecorder interface: [object MediaRecorder] must inherit property "stop" with the proper type (12) -PASS MediaRecorder interface: [object MediaRecorder] must inherit property "pause" with the proper type (13) -PASS MediaRecorder interface: [object MediaRecorder] must inherit property "resume" with the proper type (14) -PASS MediaRecorder interface: [object MediaRecorder] must inherit property "requestData" with the proper type (15) -PASS MediaRecorder interface: [object MediaRecorder] must inherit property "isTypeSupported" with the proper type (16) +PASS MediaRecorder interface: [object MediaRecorder] must inherit property "stop()" with the proper type +PASS MediaRecorder interface: [object MediaRecorder] must inherit property "pause()" with the proper type +PASS MediaRecorder interface: [object MediaRecorder] must inherit property "resume()" with the proper type +PASS MediaRecorder interface: [object MediaRecorder] must inherit property "requestData()" with the proper type +PASS MediaRecorder interface: [object MediaRecorder] must inherit property "isTypeSupported(DOMString)" with the proper type PASS MediaRecorder interface: calling isTypeSupported(DOMString) on [object MediaRecorder] with too few arguments must throw TypeError PASS BlobEvent interface: existence and properties of interface object PASS BlobEvent interface object length
diff --git a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaDevices-IDL-all-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaDevices-IDL-all-expected.txt index b8c4217f..bbb473c7 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaDevices-IDL-all-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaDevices-IDL-all-expected.txt
@@ -2,10 +2,10 @@ Found 86 tests; 71 PASS, 15 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS Test driver PASS Navigator interface: attribute mediaDevices -PASS Navigator interface: operation getUserMedia(MediaStreamConstraints,NavigatorUserMediaSuccessCallback,NavigatorUserMediaErrorCallback) -PASS Navigator interface: navigator must inherit property "mediaDevices" with the proper type (0) -PASS Navigator interface: navigator must inherit property "getUserMedia" with the proper type (1) -PASS Navigator interface: calling getUserMedia(MediaStreamConstraints,NavigatorUserMediaSuccessCallback,NavigatorUserMediaErrorCallback) on navigator with too few arguments must throw TypeError +PASS Navigator interface: operation getUserMedia(MediaStreamConstraints, NavigatorUserMediaSuccessCallback, NavigatorUserMediaErrorCallback) +PASS Navigator interface: navigator must inherit property "mediaDevices" with the proper type +PASS Navigator interface: navigator must inherit property "getUserMedia(MediaStreamConstraints, NavigatorUserMediaSuccessCallback, NavigatorUserMediaErrorCallback)" with the proper type +PASS Navigator interface: calling getUserMedia(MediaStreamConstraints, NavigatorUserMediaSuccessCallback, NavigatorUserMediaErrorCallback) on navigator with too few arguments must throw TypeError PASS MediaStream interface: existence and properties of interface object PASS MediaStream interface object length PASS MediaStream interface object name @@ -66,10 +66,10 @@ PASS MediaDevices interface: operation getUserMedia(MediaStreamConstraints) PASS MediaDevices must be primary interface of navigator.mediaDevices PASS Stringification of navigator.mediaDevices -PASS MediaDevices interface: navigator.mediaDevices must inherit property "ondevicechange" with the proper type (0) -PASS MediaDevices interface: navigator.mediaDevices must inherit property "enumerateDevices" with the proper type (1) -PASS MediaDevices interface: navigator.mediaDevices must inherit property "getSupportedConstraints" with the proper type (2) -PASS MediaDevices interface: navigator.mediaDevices must inherit property "getUserMedia" with the proper type (3) +PASS MediaDevices interface: navigator.mediaDevices must inherit property "ondevicechange" with the proper type +PASS MediaDevices interface: navigator.mediaDevices must inherit property "enumerateDevices()" with the proper type +PASS MediaDevices interface: navigator.mediaDevices must inherit property "getSupportedConstraints()" with the proper type +PASS MediaDevices interface: navigator.mediaDevices must inherit property "getUserMedia(MediaStreamConstraints)" with the proper type PASS MediaDevices interface: calling getUserMedia(MediaStreamConstraints) on navigator.mediaDevices with too few arguments must throw TypeError PASS MediaDeviceInfo interface: existence and properties of interface object PASS MediaDeviceInfo interface object length
diff --git a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaDevices-IDL-enumerateDevices-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaDevices-IDL-enumerateDevices-expected.txt index 274fec7..c86482c 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaDevices-IDL-enumerateDevices-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaDevices-IDL-enumerateDevices-expected.txt
@@ -2,7 +2,7 @@ Found 82 tests; 61 PASS, 21 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS Test MediaDevices.enumerateDevices call and result. Types only. PASS Navigator interface: attribute mediaDevices -PASS Navigator interface: operation getUserMedia(MediaStreamConstraints,NavigatorUserMediaSuccessCallback,NavigatorUserMediaErrorCallback) +PASS Navigator interface: operation getUserMedia(MediaStreamConstraints, NavigatorUserMediaSuccessCallback, NavigatorUserMediaErrorCallback) FAIL MediaStream interface: existence and properties of interface object Cannot read property 'has_extended_attribute' of undefined PASS MediaStream interface object length PASS MediaStream interface object name @@ -72,10 +72,10 @@ PASS MediaDeviceInfo interface: attribute groupId PASS MediaDeviceInfo must be primary interface of _mediaInfo PASS Stringification of _mediaInfo -PASS MediaDeviceInfo interface: _mediaInfo must inherit property "deviceId" with the proper type (0) -PASS MediaDeviceInfo interface: _mediaInfo must inherit property "kind" with the proper type (1) -PASS MediaDeviceInfo interface: _mediaInfo must inherit property "label" with the proper type (2) -PASS MediaDeviceInfo interface: _mediaInfo must inherit property "groupId" with the proper type (3) +PASS MediaDeviceInfo interface: _mediaInfo must inherit property "deviceId" with the proper type +PASS MediaDeviceInfo interface: _mediaInfo must inherit property "kind" with the proper type +PASS MediaDeviceInfo interface: _mediaInfo must inherit property "label" with the proper type +PASS MediaDeviceInfo interface: _mediaInfo must inherit property "groupId" with the proper type FAIL InputDeviceInfo interface: existence and properties of interface object assert_own_property: self does not have own property "InputDeviceInfo" expected property "InputDeviceInfo" missing FAIL InputDeviceInfo interface object length assert_own_property: self does not have own property "InputDeviceInfo" expected property "InputDeviceInfo" missing FAIL InputDeviceInfo interface object name assert_own_property: self does not have own property "InputDeviceInfo" expected property "InputDeviceInfo" missing
diff --git a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaStreamTrack-init.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaStreamTrack-init.https-expected.txt index dac4e22a..8fd95d4 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaStreamTrack-init.https-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaStreamTrack-init.https-expected.txt
@@ -5,8 +5,8 @@ PASS EventTarget interface object name PASS EventTarget interface: existence and properties of interface prototype object PASS EventTarget interface: existence and properties of interface prototype object's "constructor" property -PASS EventTarget interface: operation addEventListener(DOMString,EventListener,boolean) -PASS EventTarget interface: operation removeEventListener(DOMString,EventListener,boolean) +PASS EventTarget interface: operation addEventListener(DOMString, EventListener, boolean) +PASS EventTarget interface: operation removeEventListener(DOMString, EventListener, boolean) PASS EventTarget interface: operation dispatchEvent(Event) PASS MediaStreamTrack interface: existence and properties of interface object PASS MediaStreamTrack interface object length @@ -31,28 +31,28 @@ PASS MediaStreamTrack interface: operation applyConstraints(MediaTrackConstraints) PASS MediaStreamTrack must be primary interface of track PASS Stringification of track -PASS MediaStreamTrack interface: track must inherit property "kind" with the proper type (0) -PASS MediaStreamTrack interface: track must inherit property "id" with the proper type (1) -PASS MediaStreamTrack interface: track must inherit property "label" with the proper type (2) -PASS MediaStreamTrack interface: track must inherit property "enabled" with the proper type (3) -PASS MediaStreamTrack interface: track must inherit property "muted" with the proper type (4) -FAIL MediaStreamTrack interface: track must inherit property "onmute" with the proper type (5) Unrecognized type EventHandler -FAIL MediaStreamTrack interface: track must inherit property "onunmute" with the proper type (6) Unrecognized type EventHandler -FAIL MediaStreamTrack interface: track must inherit property "readyState" with the proper type (7) Unrecognized type MediaStreamTrackState -FAIL MediaStreamTrack interface: track must inherit property "onended" with the proper type (8) Unrecognized type EventHandler -FAIL MediaStreamTrack interface: track must inherit property "onoverconstrained" with the proper type (9) assert_inherits: property "onoverconstrained" not found in prototype chain -PASS MediaStreamTrack interface: track must inherit property "clone" with the proper type (10) -PASS MediaStreamTrack interface: track must inherit property "stop" with the proper type (11) -PASS MediaStreamTrack interface: track must inherit property "getCapabilities" with the proper type (12) -PASS MediaStreamTrack interface: track must inherit property "getConstraints" with the proper type (13) -PASS MediaStreamTrack interface: track must inherit property "getSettings" with the proper type (14) -PASS MediaStreamTrack interface: track must inherit property "applyConstraints" with the proper type (15) +PASS MediaStreamTrack interface: track must inherit property "kind" with the proper type +PASS MediaStreamTrack interface: track must inherit property "id" with the proper type +PASS MediaStreamTrack interface: track must inherit property "label" with the proper type +PASS MediaStreamTrack interface: track must inherit property "enabled" with the proper type +PASS MediaStreamTrack interface: track must inherit property "muted" with the proper type +FAIL MediaStreamTrack interface: track must inherit property "onmute" with the proper type Unrecognized type EventHandler +FAIL MediaStreamTrack interface: track must inherit property "onunmute" with the proper type Unrecognized type EventHandler +FAIL MediaStreamTrack interface: track must inherit property "readyState" with the proper type Unrecognized type MediaStreamTrackState +FAIL MediaStreamTrack interface: track must inherit property "onended" with the proper type Unrecognized type EventHandler +FAIL MediaStreamTrack interface: track must inherit property "onoverconstrained" with the proper type assert_inherits: property "onoverconstrained" not found in prototype chain +PASS MediaStreamTrack interface: track must inherit property "clone()" with the proper type +PASS MediaStreamTrack interface: track must inherit property "stop()" with the proper type +PASS MediaStreamTrack interface: track must inherit property "getCapabilities()" with the proper type +PASS MediaStreamTrack interface: track must inherit property "getConstraints()" with the proper type +PASS MediaStreamTrack interface: track must inherit property "getSettings()" with the proper type +PASS MediaStreamTrack interface: track must inherit property "applyConstraints(MediaTrackConstraints)" with the proper type PASS MediaStreamTrack interface: calling applyConstraints(MediaTrackConstraints) on track with too few arguments must throw TypeError -PASS EventTarget interface: track must inherit property "addEventListener" with the proper type (0) -PASS EventTarget interface: calling addEventListener(DOMString,EventListener,boolean) on track with too few arguments must throw TypeError -PASS EventTarget interface: track must inherit property "removeEventListener" with the proper type (1) -PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,boolean) on track with too few arguments must throw TypeError -PASS EventTarget interface: track must inherit property "dispatchEvent" with the proper type (2) +PASS EventTarget interface: track must inherit property "addEventListener(DOMString, EventListener, boolean)" with the proper type +PASS EventTarget interface: calling addEventListener(DOMString, EventListener, boolean) on track with too few arguments must throw TypeError +PASS EventTarget interface: track must inherit property "removeEventListener(DOMString, EventListener, boolean)" with the proper type +PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, boolean) on track with too few arguments must throw TypeError +PASS EventTarget interface: track must inherit property "dispatchEvent(Event)" with the proper type PASS EventTarget interface: calling dispatchEvent(Event) on track with too few arguments must throw TypeError Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/mediasession/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/mediasession/idlharness-expected.txt index 3aa5626c..f4b7381 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/mediasession/idlharness-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/mediasession/idlharness-expected.txt
@@ -1,6 +1,6 @@ This is a testharness.js-based test. PASS Navigator interface: attribute mediaSession -PASS Navigator interface: navigator must inherit property "mediaSession" with the proper type (0) +PASS Navigator interface: navigator must inherit property "mediaSession" with the proper type PASS MediaSession interface: existence and properties of interface object PASS MediaSession interface object length PASS MediaSession interface object name @@ -8,7 +8,7 @@ PASS MediaSession interface: existence and properties of interface prototype object's "constructor" property PASS MediaSession interface: attribute metadata PASS MediaSession interface: attribute playbackState -PASS MediaSession interface: operation setActionHandler(MediaSessionAction,MediaSessionActionHandler) +PASS MediaSession interface: operation setActionHandler(MediaSessionAction, MediaSessionActionHandler) PASS MediaMetadata interface: existence and properties of interface object PASS MediaMetadata interface object length PASS MediaMetadata interface object name @@ -20,9 +20,9 @@ PASS MediaMetadata interface: attribute artwork PASS MediaMetadata must be primary interface of [object MediaMetadata] PASS Stringification of [object MediaMetadata] -PASS MediaMetadata interface: [object MediaMetadata] must inherit property "title" with the proper type (0) -PASS MediaMetadata interface: [object MediaMetadata] must inherit property "artist" with the proper type (1) -PASS MediaMetadata interface: [object MediaMetadata] must inherit property "album" with the proper type (2) -FAIL MediaMetadata interface: [object MediaMetadata] must inherit property "artwork" with the proper type (3) Unrecognized type FrozenArray +PASS MediaMetadata interface: [object MediaMetadata] must inherit property "title" with the proper type +PASS MediaMetadata interface: [object MediaMetadata] must inherit property "artist" with the proper type +PASS MediaMetadata interface: [object MediaMetadata] must inherit property "album" with the proper type +FAIL MediaMetadata interface: [object MediaMetadata] must inherit property "artwork" with the proper type Unrecognized type FrozenArray Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/orientation-event/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/orientation-event/idlharness-expected.txt index 69f4502f..7966052 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/orientation-event/idlharness-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/orientation-event/idlharness-expected.txt
@@ -12,10 +12,10 @@ PASS DeviceOrientationEvent interface: attribute absolute PASS DeviceOrientationEvent must be primary interface of new DeviceOrientationEvent("foo") PASS Stringification of new DeviceOrientationEvent("foo") -PASS DeviceOrientationEvent interface: new DeviceOrientationEvent("foo") must inherit property "alpha" with the proper type (0) -PASS DeviceOrientationEvent interface: new DeviceOrientationEvent("foo") must inherit property "beta" with the proper type (1) -PASS DeviceOrientationEvent interface: new DeviceOrientationEvent("foo") must inherit property "gamma" with the proper type (2) -PASS DeviceOrientationEvent interface: new DeviceOrientationEvent("foo") must inherit property "absolute" with the proper type (3) +PASS DeviceOrientationEvent interface: new DeviceOrientationEvent("foo") must inherit property "alpha" with the proper type +PASS DeviceOrientationEvent interface: new DeviceOrientationEvent("foo") must inherit property "beta" with the proper type +PASS DeviceOrientationEvent interface: new DeviceOrientationEvent("foo") must inherit property "gamma" with the proper type +PASS DeviceOrientationEvent interface: new DeviceOrientationEvent("foo") must inherit property "absolute" with the proper type PASS DeviceMotionEvent interface: existence and properties of interface object PASS DeviceMotionEvent interface object length PASS DeviceMotionEvent interface object name @@ -27,9 +27,9 @@ PASS DeviceMotionEvent interface: attribute interval PASS DeviceMotionEvent must be primary interface of new DeviceMotionEvent("foo") PASS Stringification of new DeviceMotionEvent("foo") -PASS DeviceMotionEvent interface: new DeviceMotionEvent("foo") must inherit property "acceleration" with the proper type (0) -PASS DeviceMotionEvent interface: new DeviceMotionEvent("foo") must inherit property "accelerationIncludingGravity" with the proper type (1) -PASS DeviceMotionEvent interface: new DeviceMotionEvent("foo") must inherit property "rotationRate" with the proper type (2) -PASS DeviceMotionEvent interface: new DeviceMotionEvent("foo") must inherit property "interval" with the proper type (3) +PASS DeviceMotionEvent interface: new DeviceMotionEvent("foo") must inherit property "acceleration" with the proper type +PASS DeviceMotionEvent interface: new DeviceMotionEvent("foo") must inherit property "accelerationIncludingGravity" with the proper type +PASS DeviceMotionEvent interface: new DeviceMotionEvent("foo") must inherit property "rotationRate" with the proper type +PASS DeviceMotionEvent interface: new DeviceMotionEvent("foo") must inherit property "interval" with the proper type Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/page-visibility/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/page-visibility/idlharness-expected.txt index 11c3e67..12ab6fc 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/page-visibility/idlharness-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/page-visibility/idlharness-expected.txt
@@ -2,8 +2,8 @@ PASS Document interface: attribute hidden PASS Document interface: attribute visibilityState FAIL Document interface: attribute onvisibilitychange assert_true: The prototype object must have a property "onvisibilitychange" expected true got false -PASS Document interface: window.document must inherit property "hidden" with the proper type (0) -PASS Document interface: window.document must inherit property "visibilityState" with the proper type (1) -FAIL Document interface: window.document must inherit property "onvisibilitychange" with the proper type (2) assert_inherits: property "onvisibilitychange" not found in prototype chain +PASS Document interface: window.document must inherit property "hidden" with the proper type +PASS Document interface: window.document must inherit property "visibilityState" with the proper type +FAIL Document interface: window.document must inherit property "onvisibilitychange" with the proper type assert_inherits: property "onvisibilitychange" not found in prototype chain Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/payment-request/interfaces.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/payment-request/interfaces.https-expected.txt index 170486c..9e920f5 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/payment-request/interfaces.https-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/payment-request/interfaces.https-expected.txt
@@ -15,20 +15,22 @@ PASS PaymentRequest interface: attribute onshippingoptionchange FAIL PaymentRequest must be primary interface of new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence." FAIL Stringification of new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence." -FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "show" with the proper type (0) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence." -FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "abort" with the proper type (1) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence." -FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "canMakePayment" with the proper type (2) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence." -FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "id" with the proper type (3) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence." -FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "shippingAddress" with the proper type (4) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence." -FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "shippingOption" with the proper type (5) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence." -FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "shippingType" with the proper type (6) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence." -FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "onshippingaddresschange" with the proper type (7) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence." -FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "onshippingoptionchange" with the proper type (8) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence." +FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "show()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence." +FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "abort()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence." +FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "canMakePayment()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence." +FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "id" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence." +FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "shippingAddress" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence." +FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "shippingOption" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence." +FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "shippingType" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence." +FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "onshippingaddresschange" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence." +FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "onshippingoptionchange" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence." PASS PaymentAddress interface: existence and properties of interface object PASS PaymentAddress interface object length PASS PaymentAddress interface object name PASS PaymentAddress interface: existence and properties of interface prototype object PASS PaymentAddress interface: existence and properties of interface prototype object's "constructor" property +PASS PaymentAddress interface: operation toJSON() +FAIL Test default toJSON operation of PaymentAddress Illegal invocation PASS PaymentAddress interface: attribute country PASS PaymentAddress interface: attribute addressLine PASS PaymentAddress interface: attribute region @@ -45,6 +47,8 @@ PASS PaymentResponse interface object name PASS PaymentResponse interface: existence and properties of interface prototype object PASS PaymentResponse interface: existence and properties of interface prototype object's "constructor" property +PASS PaymentResponse interface: operation toJSON() +FAIL Test default toJSON operation of PaymentResponse Illegal invocation PASS PaymentResponse interface: attribute requestId PASS PaymentResponse interface: attribute methodName PASS PaymentResponse interface: attribute details
diff --git a/third_party/WebKit/LayoutTests/external/wpt/payment-request/interfaces.https.html b/third_party/WebKit/LayoutTests/external/wpt/payment-request/interfaces.https.html index bc76247..db70765 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/payment-request/interfaces.https.html +++ b/third_party/WebKit/LayoutTests/external/wpt/payment-request/interfaces.https.html
@@ -12,112 +12,112 @@ interface EventTarget {}; </script> <script type=text/plain> -[Constructor(sequence<PaymentMethodData> methodData, PaymentDetailsInit details, optional PaymentOptions options), - SecureContext] +[Constructor(sequence<PaymentMethodData> methodData, PaymentDetailsInit details, optional PaymentOptions options), SecureContext] interface PaymentRequest : EventTarget { - Promise<PaymentResponse> show(); - Promise<void> abort(); - Promise<boolean> canMakePayment(); + Promise<PaymentResponse> show(); + Promise<void> abort(); + Promise<boolean> canMakePayment(); - readonly attribute DOMString id; - readonly attribute PaymentAddress? shippingAddress; - readonly attribute DOMString? shippingOption; - readonly attribute PaymentShippingType? shippingType; + readonly attribute DOMString id; + readonly attribute PaymentAddress? shippingAddress; + readonly attribute DOMString? shippingOption; + readonly attribute PaymentShippingType? shippingType; - attribute EventHandler onshippingaddresschange; + attribute EventHandler onshippingaddresschange; - attribute EventHandler onshippingoptionchange; + attribute EventHandler onshippingoptionchange; }; dictionary PaymentMethodData { - required DOMString supportedMethods; - object data; + required DOMString supportedMethods; + object data; }; dictionary PaymentCurrencyAmount { - required DOMString currency; - required DOMString value; - DOMString currencySystem = "urn:iso:std:iso:4217"; + required DOMString currency; + required DOMString value; + // Note: currencySystem is "at risk" of being removed! + DOMString currencySystem = "urn:iso:std:iso:4217"; }; dictionary PaymentDetailsBase { - sequence<PaymentItem> displayItems; - sequence<PaymentShippingOption> shippingOptions; - sequence<PaymentDetailsModifier> modifiers; + sequence<PaymentItem> displayItems; + sequence<PaymentShippingOption> shippingOptions; + sequence<PaymentDetailsModifier> modifiers; }; dictionary PaymentDetailsInit : PaymentDetailsBase { - DOMString id; - required PaymentItem total; + DOMString id; + required PaymentItem total; }; dictionary PaymentDetailsUpdate : PaymentDetailsBase { - DOMString error; - PaymentItem total; + DOMString error; + PaymentItem total; }; dictionary PaymentDetailsModifier { - required DOMString supportedMethods; - PaymentItem total; - sequence<PaymentItem> additionalDisplayItems; - object data; + required DOMString supportedMethods; + PaymentItem total; + sequence<PaymentItem> additionalDisplayItems; + object data; }; enum PaymentShippingType { - "shipping", - "delivery", - "pickup" + "shipping", + "delivery", + "pickup" }; dictionary PaymentOptions { - boolean requestPayerName = false; - boolean requestPayerEmail = false; - boolean requestPayerPhone = false; - boolean requestShipping = false; - PaymentShippingType shippingType = "shipping"; + boolean requestPayerName = false; + boolean requestPayerEmail = false; + boolean requestPayerPhone = false; + boolean requestShipping = false; + PaymentShippingType shippingType = "shipping"; }; dictionary PaymentItem { - required DOMString label; - required PaymentCurrencyAmount amount; - boolean pending = false; + required DOMString label; + required PaymentCurrencyAmount amount; + boolean pending = false; }; [SecureContext] interface PaymentAddress { - serializer = {attribute}; - readonly attribute DOMString country; - readonly attribute FrozenArray<DOMString> addressLine; - readonly attribute DOMString region; - readonly attribute DOMString city; - readonly attribute DOMString dependentLocality; - readonly attribute DOMString postalCode; - readonly attribute DOMString sortingCode; - readonly attribute DOMString languageCode; - readonly attribute DOMString organization; - readonly attribute DOMString recipient; - readonly attribute DOMString phone; + [Default] object toJSON(); + readonly attribute DOMString country; + readonly attribute FrozenArray<DOMString> addressLine; + readonly attribute DOMString region; + readonly attribute DOMString city; + readonly attribute DOMString dependentLocality; + readonly attribute DOMString postalCode; + readonly attribute DOMString sortingCode; + readonly attribute DOMString languageCode; + readonly attribute DOMString organization; + readonly attribute DOMString recipient; + readonly attribute DOMString phone; }; dictionary PaymentShippingOption { - required DOMString id; - required DOMString label; - required PaymentCurrencyAmount amount; - boolean selected = false; + required DOMString id; + required DOMString label; + required PaymentCurrencyAmount amount; + boolean selected = false; }; enum PaymentComplete { - "fail", - "success", - "unknown" + "fail", + "success", + "unknown" }; [SecureContext] interface PaymentResponse { - serializer = {attribute}; + [Default] object toJSON(); - readonly attribute DOMString requestId; - readonly attribute DOMString methodName; - readonly attribute object details; - readonly attribute PaymentAddress? shippingAddress; - readonly attribute DOMString? shippingOption; - readonly attribute DOMString? payerName; - readonly attribute DOMString? payerEmail; - readonly attribute DOMString? payerPhone; + readonly attribute DOMString requestId; + readonly attribute DOMString methodName; + readonly attribute object details; + readonly attribute PaymentAddress? shippingAddress; + readonly attribute DOMString? shippingOption; + readonly attribute DOMString? payerName; + readonly attribute DOMString? payerEmail; + readonly attribute DOMString? payerPhone; - Promise<void> complete(optional PaymentComplete result = "unknown"); + Promise<void> complete(optional PaymentComplete result = "unknown"); }; [Constructor(DOMString type, optional PaymentRequestUpdateEventInit eventInitDict), - SecureContext] + SecureContext] interface PaymentRequestUpdateEvent : Event { - void updateWith(Promise<PaymentDetailsUpdate> detailsPromise); + void updateWith(Promise<PaymentDetailsUpdate> detailsPromise); }; dictionary PaymentRequestUpdateEventInit : EventInit { };
diff --git a/third_party/WebKit/LayoutTests/external/wpt/performance-timeline/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/performance-timeline/idlharness-expected.txt index 61a1522..76539705 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/performance-timeline/idlharness-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/performance-timeline/idlharness-expected.txt
@@ -1,13 +1,13 @@ This is a testharness.js-based test. PASS Performance interface: operation getEntries(PerformanceEntryFilterOptions) PASS Performance interface: operation getEntriesByType(DOMString) -PASS Performance interface: operation getEntriesByName(DOMString,DOMString) -PASS Performance interface: window.performance must inherit property "getEntries" with the proper type (0) +PASS Performance interface: operation getEntriesByName(DOMString, DOMString) +PASS Performance interface: window.performance must inherit property "getEntries(PerformanceEntryFilterOptions)" with the proper type PASS Performance interface: calling getEntries(PerformanceEntryFilterOptions) on window.performance with too few arguments must throw TypeError -PASS Performance interface: window.performance must inherit property "getEntriesByType" with the proper type (1) +PASS Performance interface: window.performance must inherit property "getEntriesByType(DOMString)" with the proper type PASS Performance interface: calling getEntriesByType(DOMString) on window.performance with too few arguments must throw TypeError -PASS Performance interface: window.performance must inherit property "getEntriesByName" with the proper type (2) -PASS Performance interface: calling getEntriesByName(DOMString,DOMString) on window.performance with too few arguments must throw TypeError +PASS Performance interface: window.performance must inherit property "getEntriesByName(DOMString, DOMString)" with the proper type +PASS Performance interface: calling getEntriesByName(DOMString, DOMString) on window.performance with too few arguments must throw TypeError PASS PerformanceEntry interface: existence and properties of interface object PASS PerformanceEntry interface object length PASS PerformanceEntry interface object name @@ -25,7 +25,7 @@ PASS PerformanceObserverEntryList interface: existence and properties of interface prototype object's "constructor" property PASS PerformanceObserverEntryList interface: operation getEntries(PerformanceEntryFilterOptions) PASS PerformanceObserverEntryList interface: operation getEntriesByType(DOMString) -PASS PerformanceObserverEntryList interface: operation getEntriesByName(DOMString,DOMString) +PASS PerformanceObserverEntryList interface: operation getEntriesByName(DOMString, DOMString) PASS PerformanceObserver interface: existence and properties of interface object PASS PerformanceObserver interface object length PASS PerformanceObserver interface object name
diff --git a/third_party/WebKit/LayoutTests/external/wpt/pointerlock/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/pointerlock/idlharness-expected.txt index 3a47aae..50ba585 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/pointerlock/idlharness-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/pointerlock/idlharness-expected.txt
@@ -1,19 +1,19 @@ This is a testharness.js-based test. PASS Element interface: operation requestPointerLock() -PASS Element interface: window.document.documentElement must inherit property "requestPointerLock" with the proper type (0) +PASS Element interface: window.document.documentElement must inherit property "requestPointerLock()" with the proper type PASS Document interface: attribute onpointerlockchange PASS Document interface: attribute onpointerlockerror PASS Document interface: attribute pointerLockElement PASS Document interface: operation exitPointerLock() -FAIL Document interface: window.document must inherit property "onpointerlockchange" with the proper type (0) Unrecognized type EventHandler -FAIL Document interface: window.document must inherit property "onpointerlockerror" with the proper type (1) Unrecognized type EventHandler -PASS Document interface: window.document must inherit property "pointerLockElement" with the proper type (2) -PASS Document interface: window.document must inherit property "exitPointerLock" with the proper type (3) +FAIL Document interface: window.document must inherit property "onpointerlockchange" with the proper type Unrecognized type EventHandler +FAIL Document interface: window.document must inherit property "onpointerlockerror" with the proper type Unrecognized type EventHandler +PASS Document interface: window.document must inherit property "pointerLockElement" with the proper type +PASS Document interface: window.document must inherit property "exitPointerLock()" with the proper type PASS MouseEvent interface: attribute movementX PASS MouseEvent interface: attribute movementY -PASS MouseEvent interface: new MouseEvent('mousemove') must inherit property "movementX" with the proper type (0) -PASS MouseEvent interface: new MouseEvent('mousemove') must inherit property "movementY" with the proper type (1) -PASS MouseEvent interface: new MouseEvent('pointerlockchange') must inherit property "movementX" with the proper type (0) -PASS MouseEvent interface: new MouseEvent('pointerlockchange') must inherit property "movementY" with the proper type (1) +PASS MouseEvent interface: new MouseEvent('mousemove') must inherit property "movementX" with the proper type +PASS MouseEvent interface: new MouseEvent('mousemove') must inherit property "movementY" with the proper type +PASS MouseEvent interface: new MouseEvent('pointerlockchange') must inherit property "movementX" with the proper type +PASS MouseEvent interface: new MouseEvent('pointerlockchange') must inherit property "movementY" with the proper type Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/resource-timing/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/resource-timing/idlharness-expected.txt index 451d5a9..a3a616b 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/resource-timing/idlharness-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/resource-timing/idlharness-expected.txt
@@ -2,10 +2,10 @@ PASS Performance interface: operation clearResourceTimings() PASS Performance interface: operation setResourceTimingBufferSize(unsigned long) PASS Performance interface: attribute onresourcetimingbufferfull -PASS Performance interface: window.performance must inherit property "clearResourceTimings" with the proper type (3) -PASS Performance interface: window.performance must inherit property "setResourceTimingBufferSize" with the proper type (4) +PASS Performance interface: window.performance must inherit property "clearResourceTimings()" with the proper type +PASS Performance interface: window.performance must inherit property "setResourceTimingBufferSize(unsigned long)" with the proper type PASS Performance interface: calling setResourceTimingBufferSize(unsigned long) on window.performance with too few arguments must throw TypeError -PASS Performance interface: window.performance must inherit property "onresourcetimingbufferfull" with the proper type (5) +PASS Performance interface: window.performance must inherit property "onresourcetimingbufferfull" with the proper type PASS PerformanceResourceTiming interface: existence and properties of interface object PASS PerformanceResourceTiming interface object length PASS PerformanceResourceTiming interface object name
diff --git a/third_party/WebKit/LayoutTests/external/wpt/resources/idlharness.js b/third_party/WebKit/LayoutTests/external/wpt/resources/idlharness.js index d12748f..adaef20 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/resources/idlharness.js +++ b/third_party/WebKit/LayoutTests/external/wpt/resources/idlharness.js
@@ -1687,7 +1687,7 @@ { var a_test = async_test(this.name + " interface: operation " + member.name + "(" + member.arguments.map( - function(m) {return m.idlType.idlType; } ) + function(m) {return m.idlType.idlType; } ).join(", ") +")"); a_test.step(function() { @@ -2182,6 +2182,11 @@ || member.type == "operation") && member.name) { + var described_name = member.name; + if (member.type == "operation") + { + described_name += "(" + member.arguments.map(arg => arg.idlType.idlType).join(", ") + ")"; + } test(function() { assert_equals(exception, null, "Unexpected exception when evaluating object"); @@ -2221,7 +2226,7 @@ assert_equals(typeof obj[member.name], "function"); } } - }.bind(this), this.name + " interface: " + desc + ' must inherit property "' + member.name + '" with the proper type (' + i + ')'); + }.bind(this), this.name + " interface: " + desc + ' must inherit property "' + described_name + '" with the proper type'); } // TODO: This is wrong if there are multiple operations with the same // identifier. @@ -2229,7 +2234,7 @@ if (member.type == "operation" && member.name && member.arguments.length) { var a_test = async_test( this.name + " interface: calling " + member.name + - "(" + member.arguments.map(function(m) { return m.idlType.idlType; }) + + "(" + member.arguments.map(function(m) { return m.idlType.idlType; }).join(", ") + ") on " + desc + " with too few arguments must throw TypeError"); a_test.step(function() {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/server-timing/test_server_timing.html b/third_party/WebKit/LayoutTests/external/wpt/server-timing/test_server_timing.html index 43164d69..6a6c8977 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/server-timing/test_server_timing.html +++ b/third_party/WebKit/LayoutTests/external/wpt/server-timing/test_server_timing.html
@@ -11,21 +11,21 @@ window.addEventListener('load', function() { // there should be exactly two server-timing entries, 1 for document, 1 for img#one test_entries(performance.getEntriesByType('navigation')[0].serverTiming, [{ - value: 1.2, - metric: 'metric1', + duration: 1.2, + name: 'metric1', description: 'document', }]) test_entries(performance.getEntriesByName(document.querySelector('img#one').src)[0].serverTiming, [{ - value: 3.4, - metric: 'metric2', + duration: 3.4, + name: 'metric2', description: 'blue.png', }]) new PerformanceObserver(function(entryList, observer) { // there should be exactly one server-timing entry, 1 for img#two test_entries(entryList.getEntriesByName(document.querySelector('img#two').src)[0].serverTiming, [{ - value: 5.6, - metric: 'metric3', + duration: 5.6, + name: 'metric3', description: 'green.png', }]) observer.disconnect()
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt index 7970a4e..b92d7aa 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
@@ -30,15 +30,15 @@ PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Reflect.setPrototypeOf should return true PASS ServiceWorkerGlobalScope must be primary interface of self PASS Stringification of self -PASS ServiceWorkerGlobalScope interface: self must inherit property "clients" with the proper type (0) -PASS ServiceWorkerGlobalScope interface: self must inherit property "registration" with the proper type (1) -PASS ServiceWorkerGlobalScope interface: self must inherit property "skipWaiting" with the proper type (2) -PASS ServiceWorkerGlobalScope interface: self must inherit property "oninstall" with the proper type (3) -PASS ServiceWorkerGlobalScope interface: self must inherit property "onactivate" with the proper type (4) -PASS ServiceWorkerGlobalScope interface: self must inherit property "onfetch" with the proper type (5) -PASS ServiceWorkerGlobalScope interface: self must inherit property "onforeignfetch" with the proper type (6) -PASS ServiceWorkerGlobalScope interface: self must inherit property "onmessage" with the proper type (7) -FAIL ServiceWorkerGlobalScope interface: self must inherit property "onmessageerror" with the proper type (8) assert_own_property: expected property "onmessageerror" missing +PASS ServiceWorkerGlobalScope interface: self must inherit property "clients" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "registration" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "skipWaiting()" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "oninstall" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "onactivate" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "onfetch" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "onforeignfetch" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "onmessage" with the proper type +FAIL ServiceWorkerGlobalScope interface: self must inherit property "onmessageerror" with the proper type assert_own_property: expected property "onmessageerror" missing PASS Client interface: existence and properties of interface object PASS Client interface object length PASS Client interface object name @@ -48,7 +48,7 @@ PASS Client interface: attribute id PASS Client interface: attribute type FAIL Client interface: attribute reserved assert_true: The prototype object must have a property "reserved" expected true got false -PASS Client interface: operation postMessage(any,[object Object]) +PASS Client interface: operation postMessage(any, [object Object]) PASS WindowClient interface: existence and properties of interface object PASS WindowClient interface object length PASS WindowClient interface object name @@ -70,13 +70,13 @@ PASS Clients interface: operation claim() PASS Clients must be primary interface of self.clients PASS Stringification of self.clients -PASS Clients interface: self.clients must inherit property "get" with the proper type (0) +PASS Clients interface: self.clients must inherit property "get(DOMString)" with the proper type PASS Clients interface: calling get(DOMString) on self.clients with too few arguments must throw TypeError -PASS Clients interface: self.clients must inherit property "matchAll" with the proper type (1) +PASS Clients interface: self.clients must inherit property "matchAll(ClientQueryOptions)" with the proper type PASS Clients interface: calling matchAll(ClientQueryOptions) on self.clients with too few arguments must throw TypeError -PASS Clients interface: self.clients must inherit property "openWindow" with the proper type (2) +PASS Clients interface: self.clients must inherit property "openWindow(USVString)" with the proper type PASS Clients interface: calling openWindow(USVString) on self.clients with too few arguments must throw TypeError -PASS Clients interface: self.clients must inherit property "claim" with the proper type (3) +PASS Clients interface: self.clients must inherit property "claim()" with the proper type FAIL ServiceWorker interface: existence and properties of interface object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing FAIL ServiceWorker interface object length assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing FAIL ServiceWorker interface object name assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing @@ -84,7 +84,7 @@ FAIL ServiceWorker interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing FAIL ServiceWorker interface: attribute scriptURL assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing FAIL ServiceWorker interface: attribute state assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface: operation postMessage(any,[object Object]) assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: operation postMessage(any, [object Object]) assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing FAIL ServiceWorker interface: attribute onstatechange assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing PASS ServiceWorkerRegistration interface: existence and properties of interface object PASS ServiceWorkerRegistration interface object length @@ -102,28 +102,28 @@ PASS ServiceWorkerRegistration interface: attribute onupdatefound PASS ServiceWorkerRegistration must be primary interface of self.registration PASS Stringification of self.registration -PASS ServiceWorkerRegistration interface: self.registration must inherit property "installing" with the proper type (0) -PASS ServiceWorkerRegistration interface: self.registration must inherit property "waiting" with the proper type (1) -PASS ServiceWorkerRegistration interface: self.registration must inherit property "active" with the proper type (2) -PASS ServiceWorkerRegistration interface: self.registration must inherit property "navigationPreload" with the proper type (3) -PASS ServiceWorkerRegistration interface: self.registration must inherit property "scope" with the proper type (4) -FAIL ServiceWorkerRegistration interface: self.registration must inherit property "updateViaCache" with the proper type (5) assert_inherits: property "updateViaCache" not found in prototype chain -PASS ServiceWorkerRegistration interface: self.registration must inherit property "update" with the proper type (6) -PASS ServiceWorkerRegistration interface: self.registration must inherit property "unregister" with the proper type (7) -PASS ServiceWorkerRegistration interface: self.registration must inherit property "onupdatefound" with the proper type (8) -PASS EventTarget interface: self.registration must inherit property "addEventListener" with the proper type (0) -PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on self.registration with too few arguments must throw TypeError -PASS EventTarget interface: self.registration must inherit property "removeEventListener" with the proper type (1) -PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on self.registration with too few arguments must throw TypeError -PASS EventTarget interface: self.registration must inherit property "dispatchEvent" with the proper type (2) +PASS ServiceWorkerRegistration interface: self.registration must inherit property "installing" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "waiting" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "active" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "navigationPreload" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "scope" with the proper type +FAIL ServiceWorkerRegistration interface: self.registration must inherit property "updateViaCache" with the proper type assert_inherits: property "updateViaCache" not found in prototype chain +PASS ServiceWorkerRegistration interface: self.registration must inherit property "update()" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "unregister()" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "onupdatefound" with the proper type +PASS EventTarget interface: self.registration must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on self.registration with too few arguments must throw TypeError +PASS EventTarget interface: self.registration must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on self.registration with too few arguments must throw TypeError +PASS EventTarget interface: self.registration must inherit property "dispatchEvent(Event)" with the proper type PASS EventTarget interface: calling dispatchEvent(Event) on self.registration with too few arguments must throw TypeError PASS EventTarget interface: existence and properties of interface object PASS EventTarget interface object length PASS EventTarget interface object name PASS EventTarget interface: existence and properties of interface prototype object PASS EventTarget interface: existence and properties of interface prototype object's "constructor" property -PASS EventTarget interface: operation addEventListener(DOMString,EventListener,[object Object],[object Object]) -PASS EventTarget interface: operation removeEventListener(DOMString,EventListener,[object Object],[object Object]) +PASS EventTarget interface: operation addEventListener(DOMString, EventListener, [object Object],[object Object]) +PASS EventTarget interface: operation removeEventListener(DOMString, EventListener, [object Object],[object Object]) PASS EventTarget interface: operation dispatchEvent(Event) PASS NavigationPreloadManager interface: existence and properties of interface object PASS NavigationPreloadManager interface object length @@ -139,49 +139,49 @@ PASS Cache interface object name PASS Cache interface: existence and properties of interface prototype object PASS Cache interface: existence and properties of interface prototype object's "constructor" property -PASS Cache interface: operation match(RequestInfo,CacheQueryOptions) -PASS Cache interface: operation matchAll(RequestInfo,CacheQueryOptions) +PASS Cache interface: operation match(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation matchAll(RequestInfo, CacheQueryOptions) PASS Cache interface: operation add(RequestInfo) PASS Cache interface: operation addAll([object Object]) -PASS Cache interface: operation put(RequestInfo,Response) -PASS Cache interface: operation delete(RequestInfo,CacheQueryOptions) -PASS Cache interface: operation keys(RequestInfo,CacheQueryOptions) +PASS Cache interface: operation put(RequestInfo, Response) +PASS Cache interface: operation delete(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation keys(RequestInfo, CacheQueryOptions) PASS Cache must be primary interface of self.cacheInstance PASS Stringification of self.cacheInstance -PASS Cache interface: self.cacheInstance must inherit property "match" with the proper type (0) -PASS Cache interface: calling match(RequestInfo,CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError -PASS Cache interface: self.cacheInstance must inherit property "matchAll" with the proper type (1) -PASS Cache interface: calling matchAll(RequestInfo,CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError -PASS Cache interface: self.cacheInstance must inherit property "add" with the proper type (2) +PASS Cache interface: self.cacheInstance must inherit property "match(RequestInfo, CacheQueryOptions)" with the proper type +PASS Cache interface: calling match(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "matchAll(RequestInfo, CacheQueryOptions)" with the proper type +PASS Cache interface: calling matchAll(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "add(RequestInfo)" with the proper type PASS Cache interface: calling add(RequestInfo) on self.cacheInstance with too few arguments must throw TypeError -PASS Cache interface: self.cacheInstance must inherit property "addAll" with the proper type (3) +PASS Cache interface: self.cacheInstance must inherit property "addAll([object Object])" with the proper type PASS Cache interface: calling addAll([object Object]) on self.cacheInstance with too few arguments must throw TypeError -PASS Cache interface: self.cacheInstance must inherit property "put" with the proper type (4) -PASS Cache interface: calling put(RequestInfo,Response) on self.cacheInstance with too few arguments must throw TypeError -PASS Cache interface: self.cacheInstance must inherit property "delete" with the proper type (5) -PASS Cache interface: calling delete(RequestInfo,CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError -PASS Cache interface: self.cacheInstance must inherit property "keys" with the proper type (6) -PASS Cache interface: calling keys(RequestInfo,CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "put(RequestInfo, Response)" with the proper type +PASS Cache interface: calling put(RequestInfo, Response) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "delete(RequestInfo, CacheQueryOptions)" with the proper type +PASS Cache interface: calling delete(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "keys(RequestInfo, CacheQueryOptions)" with the proper type +PASS Cache interface: calling keys(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError PASS CacheStorage interface: existence and properties of interface object PASS CacheStorage interface object length PASS CacheStorage interface object name PASS CacheStorage interface: existence and properties of interface prototype object PASS CacheStorage interface: existence and properties of interface prototype object's "constructor" property -PASS CacheStorage interface: operation match(RequestInfo,CacheQueryOptions) +PASS CacheStorage interface: operation match(RequestInfo, CacheQueryOptions) PASS CacheStorage interface: operation has(DOMString) PASS CacheStorage interface: operation open(DOMString) PASS CacheStorage interface: operation delete(DOMString) PASS CacheStorage interface: operation keys() PASS CacheStorage must be primary interface of self.caches PASS Stringification of self.caches -PASS CacheStorage interface: self.caches must inherit property "match" with the proper type (0) -PASS CacheStorage interface: calling match(RequestInfo,CacheQueryOptions) on self.caches with too few arguments must throw TypeError -PASS CacheStorage interface: self.caches must inherit property "has" with the proper type (1) +PASS CacheStorage interface: self.caches must inherit property "match(RequestInfo, CacheQueryOptions)" with the proper type +PASS CacheStorage interface: calling match(RequestInfo, CacheQueryOptions) on self.caches with too few arguments must throw TypeError +PASS CacheStorage interface: self.caches must inherit property "has(DOMString)" with the proper type PASS CacheStorage interface: calling has(DOMString) on self.caches with too few arguments must throw TypeError -PASS CacheStorage interface: self.caches must inherit property "open" with the proper type (2) +PASS CacheStorage interface: self.caches must inherit property "open(DOMString)" with the proper type PASS CacheStorage interface: calling open(DOMString) on self.caches with too few arguments must throw TypeError -PASS CacheStorage interface: self.caches must inherit property "delete" with the proper type (3) +PASS CacheStorage interface: self.caches must inherit property "delete(DOMString)" with the proper type PASS CacheStorage interface: calling delete(DOMString) on self.caches with too few arguments must throw TypeError -PASS CacheStorage interface: self.caches must inherit property "keys" with the proper type (4) +PASS CacheStorage interface: self.caches must inherit property "keys()" with the proper type Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt index 02fed36..c9f3ca90 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt
@@ -12,20 +12,20 @@ PASS ServiceWorker interface: existence and properties of interface prototype object's "constructor" property PASS ServiceWorker interface: attribute scriptURL PASS ServiceWorker interface: attribute state -PASS ServiceWorker interface: operation postMessage(any,[object Object]) +PASS ServiceWorker interface: operation postMessage(any, [object Object]) PASS ServiceWorker interface: attribute onstatechange PASS ServiceWorker must be primary interface of window.registrationInstance.installing PASS Stringification of window.registrationInstance.installing -PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "scriptURL" with the proper type (0) -PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "state" with the proper type (1) -PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "postMessage" with the proper type (2) -PASS ServiceWorker interface: calling postMessage(any,[object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError -PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "onstatechange" with the proper type (3) -PASS EventTarget interface: window.registrationInstance.installing must inherit property "addEventListener" with the proper type (0) -PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError -PASS EventTarget interface: window.registrationInstance.installing must inherit property "removeEventListener" with the proper type (1) -PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError -PASS EventTarget interface: window.registrationInstance.installing must inherit property "dispatchEvent" with the proper type (2) +PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "scriptURL" with the proper type +PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "state" with the proper type +PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "postMessage(any, [object Object])" with the proper type +PASS ServiceWorker interface: calling postMessage(any, [object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError +PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "onstatechange" with the proper type +PASS EventTarget interface: window.registrationInstance.installing must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError +PASS EventTarget interface: window.registrationInstance.installing must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError +PASS EventTarget interface: window.registrationInstance.installing must inherit property "dispatchEvent(Event)" with the proper type PASS EventTarget interface: calling dispatchEvent(Event) on window.registrationInstance.installing with too few arguments must throw TypeError PASS ServiceWorkerRegistration interface: existence and properties of interface object PASS ServiceWorkerRegistration interface object length @@ -43,28 +43,28 @@ PASS ServiceWorkerRegistration interface: attribute onupdatefound PASS ServiceWorkerRegistration must be primary interface of window.registrationInstance PASS Stringification of window.registrationInstance -PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "installing" with the proper type (0) -PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "waiting" with the proper type (1) -PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "active" with the proper type (2) -PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "navigationPreload" with the proper type (3) -PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "scope" with the proper type (4) -FAIL ServiceWorkerRegistration interface: window.registrationInstance must inherit property "updateViaCache" with the proper type (5) assert_inherits: property "updateViaCache" not found in prototype chain -PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "update" with the proper type (6) -PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "unregister" with the proper type (7) -PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "onupdatefound" with the proper type (8) -PASS EventTarget interface: window.registrationInstance must inherit property "addEventListener" with the proper type (0) -PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on window.registrationInstance with too few arguments must throw TypeError -PASS EventTarget interface: window.registrationInstance must inherit property "removeEventListener" with the proper type (1) -PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on window.registrationInstance with too few arguments must throw TypeError -PASS EventTarget interface: window.registrationInstance must inherit property "dispatchEvent" with the proper type (2) +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "installing" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "waiting" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "active" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "navigationPreload" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "scope" with the proper type +FAIL ServiceWorkerRegistration interface: window.registrationInstance must inherit property "updateViaCache" with the proper type assert_inherits: property "updateViaCache" not found in prototype chain +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "update()" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "unregister()" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "onupdatefound" with the proper type +PASS EventTarget interface: window.registrationInstance must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance with too few arguments must throw TypeError +PASS EventTarget interface: window.registrationInstance must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance with too few arguments must throw TypeError +PASS EventTarget interface: window.registrationInstance must inherit property "dispatchEvent(Event)" with the proper type PASS EventTarget interface: calling dispatchEvent(Event) on window.registrationInstance with too few arguments must throw TypeError PASS EventTarget interface: existence and properties of interface object PASS EventTarget interface object length PASS EventTarget interface object name PASS EventTarget interface: existence and properties of interface prototype object PASS EventTarget interface: existence and properties of interface prototype object's "constructor" property -PASS EventTarget interface: operation addEventListener(DOMString,EventListener,[object Object],[object Object]) -PASS EventTarget interface: operation removeEventListener(DOMString,EventListener,[object Object],[object Object]) +PASS EventTarget interface: operation addEventListener(DOMString, EventListener, [object Object],[object Object]) +PASS EventTarget interface: operation removeEventListener(DOMString, EventListener, [object Object],[object Object]) PASS EventTarget interface: operation dispatchEvent(Event) PASS NavigationPreloadManager interface: existence and properties of interface object PASS NavigationPreloadManager interface object length @@ -80,19 +80,19 @@ PASS Cache interface object name PASS Cache interface: existence and properties of interface prototype object PASS Cache interface: existence and properties of interface prototype object's "constructor" property -PASS Cache interface: operation match(RequestInfo,CacheQueryOptions) -PASS Cache interface: operation matchAll(RequestInfo,CacheQueryOptions) +PASS Cache interface: operation match(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation matchAll(RequestInfo, CacheQueryOptions) PASS Cache interface: operation add(RequestInfo) PASS Cache interface: operation addAll([object Object]) -PASS Cache interface: operation put(RequestInfo,Response) -PASS Cache interface: operation delete(RequestInfo,CacheQueryOptions) -PASS Cache interface: operation keys(RequestInfo,CacheQueryOptions) +PASS Cache interface: operation put(RequestInfo, Response) +PASS Cache interface: operation delete(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation keys(RequestInfo, CacheQueryOptions) PASS CacheStorage interface: existence and properties of interface object PASS CacheStorage interface object length PASS CacheStorage interface object name PASS CacheStorage interface: existence and properties of interface prototype object PASS CacheStorage interface: existence and properties of interface prototype object's "constructor" property -PASS CacheStorage interface: operation match(RequestInfo,CacheQueryOptions) +PASS CacheStorage interface: operation match(RequestInfo, CacheQueryOptions) PASS CacheStorage interface: operation has(DOMString) PASS CacheStorage interface: operation open(DOMString) PASS CacheStorage interface: operation delete(DOMString)
diff --git a/third_party/WebKit/LayoutTests/external/wpt/svg/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/svg/interfaces-expected.txt index d691a5a0..d077ff5cde 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/svg/interfaces-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/svg/interfaces-expected.txt
@@ -42,7 +42,7 @@ PASS SVGNumber interface: attribute value PASS SVGNumber must be primary interface of svg.createSVGNumber() PASS Stringification of svg.createSVGNumber() -PASS SVGNumber interface: svg.createSVGNumber() must inherit property "value" with the proper type (0) +PASS SVGNumber interface: svg.createSVGNumber() must inherit property "value" with the proper type PASS SVGLength interface: existence and properties of interface object PASS SVGLength interface object length PASS SVGLength interface object name @@ -74,28 +74,28 @@ PASS SVGLength interface: attribute value PASS SVGLength interface: attribute valueInSpecifiedUnits PASS SVGLength interface: attribute valueAsString -PASS SVGLength interface: operation newValueSpecifiedUnits(unsigned short,float) +PASS SVGLength interface: operation newValueSpecifiedUnits(unsigned short, float) PASS SVGLength interface: operation convertToSpecifiedUnits(unsigned short) PASS SVGLength must be primary interface of svg.createSVGLength() PASS Stringification of svg.createSVGLength() -PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_UNKNOWN" with the proper type (0) -PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_NUMBER" with the proper type (1) -PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_PERCENTAGE" with the proper type (2) -PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_EMS" with the proper type (3) -PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_EXS" with the proper type (4) -PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_PX" with the proper type (5) -PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_CM" with the proper type (6) -PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_MM" with the proper type (7) -PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_IN" with the proper type (8) -PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_PT" with the proper type (9) -PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_PC" with the proper type (10) -PASS SVGLength interface: svg.createSVGLength() must inherit property "unitType" with the proper type (11) -PASS SVGLength interface: svg.createSVGLength() must inherit property "value" with the proper type (12) -PASS SVGLength interface: svg.createSVGLength() must inherit property "valueInSpecifiedUnits" with the proper type (13) -PASS SVGLength interface: svg.createSVGLength() must inherit property "valueAsString" with the proper type (14) -PASS SVGLength interface: svg.createSVGLength() must inherit property "newValueSpecifiedUnits" with the proper type (15) -PASS SVGLength interface: calling newValueSpecifiedUnits(unsigned short,float) on svg.createSVGLength() with too few arguments must throw TypeError -PASS SVGLength interface: svg.createSVGLength() must inherit property "convertToSpecifiedUnits" with the proper type (16) +PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_UNKNOWN" with the proper type +PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_NUMBER" with the proper type +PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_PERCENTAGE" with the proper type +PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_EMS" with the proper type +PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_EXS" with the proper type +PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_PX" with the proper type +PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_CM" with the proper type +PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_MM" with the proper type +PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_IN" with the proper type +PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_PT" with the proper type +PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_PC" with the proper type +PASS SVGLength interface: svg.createSVGLength() must inherit property "unitType" with the proper type +PASS SVGLength interface: svg.createSVGLength() must inherit property "value" with the proper type +PASS SVGLength interface: svg.createSVGLength() must inherit property "valueInSpecifiedUnits" with the proper type +PASS SVGLength interface: svg.createSVGLength() must inherit property "valueAsString" with the proper type +PASS SVGLength interface: svg.createSVGLength() must inherit property "newValueSpecifiedUnits(unsigned short, float)" with the proper type +PASS SVGLength interface: calling newValueSpecifiedUnits(unsigned short, float) on svg.createSVGLength() with too few arguments must throw TypeError +PASS SVGLength interface: svg.createSVGLength() must inherit property "convertToSpecifiedUnits(unsigned short)" with the proper type PASS SVGLength interface: calling convertToSpecifiedUnits(unsigned short) on svg.createSVGLength() with too few arguments must throw TypeError PASS SVGAngle interface: existence and properties of interface object PASS SVGAngle interface object length @@ -116,22 +116,22 @@ PASS SVGAngle interface: attribute value PASS SVGAngle interface: attribute valueInSpecifiedUnits PASS SVGAngle interface: attribute valueAsString -PASS SVGAngle interface: operation newValueSpecifiedUnits(unsigned short,float) +PASS SVGAngle interface: operation newValueSpecifiedUnits(unsigned short, float) PASS SVGAngle interface: operation convertToSpecifiedUnits(unsigned short) PASS SVGAngle must be primary interface of svg.createSVGAngle() PASS Stringification of svg.createSVGAngle() -PASS SVGAngle interface: svg.createSVGAngle() must inherit property "SVG_ANGLETYPE_UNKNOWN" with the proper type (0) -PASS SVGAngle interface: svg.createSVGAngle() must inherit property "SVG_ANGLETYPE_UNSPECIFIED" with the proper type (1) -PASS SVGAngle interface: svg.createSVGAngle() must inherit property "SVG_ANGLETYPE_DEG" with the proper type (2) -PASS SVGAngle interface: svg.createSVGAngle() must inherit property "SVG_ANGLETYPE_RAD" with the proper type (3) -PASS SVGAngle interface: svg.createSVGAngle() must inherit property "SVG_ANGLETYPE_GRAD" with the proper type (4) -PASS SVGAngle interface: svg.createSVGAngle() must inherit property "unitType" with the proper type (5) -PASS SVGAngle interface: svg.createSVGAngle() must inherit property "value" with the proper type (6) -PASS SVGAngle interface: svg.createSVGAngle() must inherit property "valueInSpecifiedUnits" with the proper type (7) -PASS SVGAngle interface: svg.createSVGAngle() must inherit property "valueAsString" with the proper type (8) -PASS SVGAngle interface: svg.createSVGAngle() must inherit property "newValueSpecifiedUnits" with the proper type (9) -PASS SVGAngle interface: calling newValueSpecifiedUnits(unsigned short,float) on svg.createSVGAngle() with too few arguments must throw TypeError -PASS SVGAngle interface: svg.createSVGAngle() must inherit property "convertToSpecifiedUnits" with the proper type (10) +PASS SVGAngle interface: svg.createSVGAngle() must inherit property "SVG_ANGLETYPE_UNKNOWN" with the proper type +PASS SVGAngle interface: svg.createSVGAngle() must inherit property "SVG_ANGLETYPE_UNSPECIFIED" with the proper type +PASS SVGAngle interface: svg.createSVGAngle() must inherit property "SVG_ANGLETYPE_DEG" with the proper type +PASS SVGAngle interface: svg.createSVGAngle() must inherit property "SVG_ANGLETYPE_RAD" with the proper type +PASS SVGAngle interface: svg.createSVGAngle() must inherit property "SVG_ANGLETYPE_GRAD" with the proper type +PASS SVGAngle interface: svg.createSVGAngle() must inherit property "unitType" with the proper type +PASS SVGAngle interface: svg.createSVGAngle() must inherit property "value" with the proper type +PASS SVGAngle interface: svg.createSVGAngle() must inherit property "valueInSpecifiedUnits" with the proper type +PASS SVGAngle interface: svg.createSVGAngle() must inherit property "valueAsString" with the proper type +PASS SVGAngle interface: svg.createSVGAngle() must inherit property "newValueSpecifiedUnits(unsigned short, float)" with the proper type +PASS SVGAngle interface: calling newValueSpecifiedUnits(unsigned short, float) on svg.createSVGAngle() with too few arguments must throw TypeError +PASS SVGAngle interface: svg.createSVGAngle() must inherit property "convertToSpecifiedUnits(unsigned short)" with the proper type PASS SVGAngle interface: calling convertToSpecifiedUnits(unsigned short) on svg.createSVGAngle() with too few arguments must throw TypeError PASS SVGNumberList interface: existence and properties of interface object PASS SVGNumberList interface object length @@ -143,26 +143,26 @@ PASS SVGNumberList interface: operation clear() PASS SVGNumberList interface: operation initialize(SVGNumber) PASS SVGNumberList interface: operation getItem(unsigned long) -PASS SVGNumberList interface: operation insertItemBefore(SVGNumber,unsigned long) -PASS SVGNumberList interface: operation replaceItem(SVGNumber,unsigned long) +PASS SVGNumberList interface: operation insertItemBefore(SVGNumber, unsigned long) +PASS SVGNumberList interface: operation replaceItem(SVGNumber, unsigned long) PASS SVGNumberList interface: operation removeItem(unsigned long) PASS SVGNumberList interface: operation appendItem(SVGNumber) PASS SVGNumberList must be primary interface of text.rotate.baseVal PASS Stringification of text.rotate.baseVal -PASS SVGNumberList interface: text.rotate.baseVal must inherit property "length" with the proper type (0) -PASS SVGNumberList interface: text.rotate.baseVal must inherit property "numberOfItems" with the proper type (1) -PASS SVGNumberList interface: text.rotate.baseVal must inherit property "clear" with the proper type (2) -PASS SVGNumberList interface: text.rotate.baseVal must inherit property "initialize" with the proper type (3) +PASS SVGNumberList interface: text.rotate.baseVal must inherit property "length" with the proper type +PASS SVGNumberList interface: text.rotate.baseVal must inherit property "numberOfItems" with the proper type +PASS SVGNumberList interface: text.rotate.baseVal must inherit property "clear()" with the proper type +PASS SVGNumberList interface: text.rotate.baseVal must inherit property "initialize(SVGNumber)" with the proper type PASS SVGNumberList interface: calling initialize(SVGNumber) on text.rotate.baseVal with too few arguments must throw TypeError -PASS SVGNumberList interface: text.rotate.baseVal must inherit property "getItem" with the proper type (4) +PASS SVGNumberList interface: text.rotate.baseVal must inherit property "getItem(unsigned long)" with the proper type PASS SVGNumberList interface: calling getItem(unsigned long) on text.rotate.baseVal with too few arguments must throw TypeError -PASS SVGNumberList interface: text.rotate.baseVal must inherit property "insertItemBefore" with the proper type (5) -PASS SVGNumberList interface: calling insertItemBefore(SVGNumber,unsigned long) on text.rotate.baseVal with too few arguments must throw TypeError -PASS SVGNumberList interface: text.rotate.baseVal must inherit property "replaceItem" with the proper type (6) -PASS SVGNumberList interface: calling replaceItem(SVGNumber,unsigned long) on text.rotate.baseVal with too few arguments must throw TypeError -PASS SVGNumberList interface: text.rotate.baseVal must inherit property "removeItem" with the proper type (7) +PASS SVGNumberList interface: text.rotate.baseVal must inherit property "insertItemBefore(SVGNumber, unsigned long)" with the proper type +PASS SVGNumberList interface: calling insertItemBefore(SVGNumber, unsigned long) on text.rotate.baseVal with too few arguments must throw TypeError +PASS SVGNumberList interface: text.rotate.baseVal must inherit property "replaceItem(SVGNumber, unsigned long)" with the proper type +PASS SVGNumberList interface: calling replaceItem(SVGNumber, unsigned long) on text.rotate.baseVal with too few arguments must throw TypeError +PASS SVGNumberList interface: text.rotate.baseVal must inherit property "removeItem(unsigned long)" with the proper type PASS SVGNumberList interface: calling removeItem(unsigned long) on text.rotate.baseVal with too few arguments must throw TypeError -PASS SVGNumberList interface: text.rotate.baseVal must inherit property "appendItem" with the proper type (8) +PASS SVGNumberList interface: text.rotate.baseVal must inherit property "appendItem(SVGNumber)" with the proper type PASS SVGNumberList interface: calling appendItem(SVGNumber) on text.rotate.baseVal with too few arguments must throw TypeError PASS SVGLengthList interface: existence and properties of interface object PASS SVGLengthList interface object length @@ -174,8 +174,8 @@ PASS SVGLengthList interface: operation clear() PASS SVGLengthList interface: operation initialize(SVGLength) PASS SVGLengthList interface: operation getItem(unsigned long) -PASS SVGLengthList interface: operation insertItemBefore(SVGLength,unsigned long) -PASS SVGLengthList interface: operation replaceItem(SVGLength,unsigned long) +PASS SVGLengthList interface: operation insertItemBefore(SVGLength, unsigned long) +PASS SVGLengthList interface: operation replaceItem(SVGLength, unsigned long) PASS SVGLengthList interface: operation removeItem(unsigned long) PASS SVGLengthList interface: operation appendItem(SVGLength) PASS SVGAnimatedBoolean interface: existence and properties of interface object @@ -187,8 +187,8 @@ PASS SVGAnimatedBoolean interface: attribute animVal PASS SVGAnimatedBoolean must be primary interface of feConvolveMatrix.preserveAlpha PASS Stringification of feConvolveMatrix.preserveAlpha -PASS SVGAnimatedBoolean interface: feConvolveMatrix.preserveAlpha must inherit property "baseVal" with the proper type (0) -PASS SVGAnimatedBoolean interface: feConvolveMatrix.preserveAlpha must inherit property "animVal" with the proper type (1) +PASS SVGAnimatedBoolean interface: feConvolveMatrix.preserveAlpha must inherit property "baseVal" with the proper type +PASS SVGAnimatedBoolean interface: feConvolveMatrix.preserveAlpha must inherit property "animVal" with the proper type PASS SVGAnimatedEnumeration interface: existence and properties of interface object PASS SVGAnimatedEnumeration interface object length PASS SVGAnimatedEnumeration interface object name @@ -198,8 +198,8 @@ PASS SVGAnimatedEnumeration interface: attribute animVal PASS SVGAnimatedEnumeration must be primary interface of text.lengthAdjust PASS Stringification of text.lengthAdjust -PASS SVGAnimatedEnumeration interface: text.lengthAdjust must inherit property "baseVal" with the proper type (0) -PASS SVGAnimatedEnumeration interface: text.lengthAdjust must inherit property "animVal" with the proper type (1) +PASS SVGAnimatedEnumeration interface: text.lengthAdjust must inherit property "baseVal" with the proper type +PASS SVGAnimatedEnumeration interface: text.lengthAdjust must inherit property "animVal" with the proper type PASS SVGAnimatedInteger interface: existence and properties of interface object PASS SVGAnimatedInteger interface object length PASS SVGAnimatedInteger interface object name @@ -209,8 +209,8 @@ PASS SVGAnimatedInteger interface: attribute animVal PASS SVGAnimatedInteger must be primary interface of feConvolveMatrix.orderX PASS Stringification of feConvolveMatrix.orderX -PASS SVGAnimatedInteger interface: feConvolveMatrix.orderX must inherit property "baseVal" with the proper type (0) -PASS SVGAnimatedInteger interface: feConvolveMatrix.orderX must inherit property "animVal" with the proper type (1) +PASS SVGAnimatedInteger interface: feConvolveMatrix.orderX must inherit property "baseVal" with the proper type +PASS SVGAnimatedInteger interface: feConvolveMatrix.orderX must inherit property "animVal" with the proper type PASS SVGAnimatedNumber interface: existence and properties of interface object PASS SVGAnimatedNumber interface object length PASS SVGAnimatedNumber interface object name @@ -220,8 +220,8 @@ PASS SVGAnimatedNumber interface: attribute animVal PASS SVGAnimatedNumber must be primary interface of stop.offset PASS Stringification of stop.offset -PASS SVGAnimatedNumber interface: stop.offset must inherit property "baseVal" with the proper type (0) -PASS SVGAnimatedNumber interface: stop.offset must inherit property "animVal" with the proper type (1) +PASS SVGAnimatedNumber interface: stop.offset must inherit property "baseVal" with the proper type +PASS SVGAnimatedNumber interface: stop.offset must inherit property "animVal" with the proper type PASS SVGAnimatedLength interface: existence and properties of interface object PASS SVGAnimatedLength interface object length PASS SVGAnimatedLength interface object name @@ -231,8 +231,8 @@ PASS SVGAnimatedLength interface: attribute animVal PASS SVGAnimatedLength must be primary interface of svg.x PASS Stringification of svg.x -PASS SVGAnimatedLength interface: svg.x must inherit property "baseVal" with the proper type (0) -PASS SVGAnimatedLength interface: svg.x must inherit property "animVal" with the proper type (1) +PASS SVGAnimatedLength interface: svg.x must inherit property "baseVal" with the proper type +PASS SVGAnimatedLength interface: svg.x must inherit property "animVal" with the proper type PASS SVGAnimatedAngle interface: existence and properties of interface object PASS SVGAnimatedAngle interface object length PASS SVGAnimatedAngle interface object name @@ -242,8 +242,8 @@ PASS SVGAnimatedAngle interface: attribute animVal PASS SVGAnimatedAngle must be primary interface of marker.orientAngle PASS Stringification of marker.orientAngle -PASS SVGAnimatedAngle interface: marker.orientAngle must inherit property "baseVal" with the proper type (0) -PASS SVGAnimatedAngle interface: marker.orientAngle must inherit property "animVal" with the proper type (1) +PASS SVGAnimatedAngle interface: marker.orientAngle must inherit property "baseVal" with the proper type +PASS SVGAnimatedAngle interface: marker.orientAngle must inherit property "animVal" with the proper type PASS SVGAnimatedString interface: existence and properties of interface object PASS SVGAnimatedString interface object length PASS SVGAnimatedString interface object name @@ -253,8 +253,8 @@ PASS SVGAnimatedString interface: attribute animVal PASS SVGAnimatedString must be primary interface of a.target PASS Stringification of a.target -PASS SVGAnimatedString interface: a.target must inherit property "baseVal" with the proper type (0) -PASS SVGAnimatedString interface: a.target must inherit property "animVal" with the proper type (1) +PASS SVGAnimatedString interface: a.target must inherit property "baseVal" with the proper type +PASS SVGAnimatedString interface: a.target must inherit property "animVal" with the proper type PASS SVGAnimatedRect interface: existence and properties of interface object PASS SVGAnimatedRect interface object length PASS SVGAnimatedRect interface object name @@ -264,8 +264,8 @@ PASS SVGAnimatedRect interface: attribute animVal PASS SVGAnimatedRect must be primary interface of svg.viewBox PASS Stringification of svg.viewBox -FAIL SVGAnimatedRect interface: svg.viewBox must inherit property "baseVal" with the proper type (0) assert_true: instanceof DOMRect expected true got false -FAIL SVGAnimatedRect interface: svg.viewBox must inherit property "animVal" with the proper type (1) assert_true: instanceof DOMRectReadOnly expected true got false +FAIL SVGAnimatedRect interface: svg.viewBox must inherit property "baseVal" with the proper type assert_true: instanceof DOMRect expected true got false +FAIL SVGAnimatedRect interface: svg.viewBox must inherit property "animVal" with the proper type assert_true: instanceof DOMRectReadOnly expected true got false PASS SVGAnimatedNumberList interface: existence and properties of interface object PASS SVGAnimatedNumberList interface object length PASS SVGAnimatedNumberList interface object name @@ -275,8 +275,8 @@ PASS SVGAnimatedNumberList interface: attribute animVal PASS SVGAnimatedNumberList must be primary interface of text.rotate PASS Stringification of text.rotate -PASS SVGAnimatedNumberList interface: text.rotate must inherit property "baseVal" with the proper type (0) -PASS SVGAnimatedNumberList interface: text.rotate must inherit property "animVal" with the proper type (1) +PASS SVGAnimatedNumberList interface: text.rotate must inherit property "baseVal" with the proper type +PASS SVGAnimatedNumberList interface: text.rotate must inherit property "animVal" with the proper type PASS SVGAnimatedLengthList interface: existence and properties of interface object PASS SVGAnimatedLengthList interface object length PASS SVGAnimatedLengthList interface object name @@ -286,8 +286,8 @@ PASS SVGAnimatedLengthList interface: attribute animVal PASS SVGAnimatedLengthList must be primary interface of text.x PASS Stringification of text.x -PASS SVGAnimatedLengthList interface: text.x must inherit property "baseVal" with the proper type (0) -PASS SVGAnimatedLengthList interface: text.x must inherit property "animVal" with the proper type (1) +PASS SVGAnimatedLengthList interface: text.x must inherit property "baseVal" with the proper type +PASS SVGAnimatedLengthList interface: text.x must inherit property "animVal" with the proper type PASS SVGStringList interface: existence and properties of interface object PASS SVGStringList interface object length PASS SVGStringList interface object name @@ -298,26 +298,26 @@ PASS SVGStringList interface: operation clear() PASS SVGStringList interface: operation initialize(DOMString) PASS SVGStringList interface: operation getItem(unsigned long) -PASS SVGStringList interface: operation insertItemBefore(DOMString,unsigned long) -PASS SVGStringList interface: operation replaceItem(DOMString,unsigned long) +PASS SVGStringList interface: operation insertItemBefore(DOMString, unsigned long) +PASS SVGStringList interface: operation replaceItem(DOMString, unsigned long) PASS SVGStringList interface: operation removeItem(unsigned long) PASS SVGStringList interface: operation appendItem(DOMString) PASS SVGStringList must be primary interface of a.requiredExtensions PASS Stringification of a.requiredExtensions -PASS SVGStringList interface: a.requiredExtensions must inherit property "length" with the proper type (0) -PASS SVGStringList interface: a.requiredExtensions must inherit property "numberOfItems" with the proper type (1) -PASS SVGStringList interface: a.requiredExtensions must inherit property "clear" with the proper type (2) -PASS SVGStringList interface: a.requiredExtensions must inherit property "initialize" with the proper type (3) +PASS SVGStringList interface: a.requiredExtensions must inherit property "length" with the proper type +PASS SVGStringList interface: a.requiredExtensions must inherit property "numberOfItems" with the proper type +PASS SVGStringList interface: a.requiredExtensions must inherit property "clear()" with the proper type +PASS SVGStringList interface: a.requiredExtensions must inherit property "initialize(DOMString)" with the proper type PASS SVGStringList interface: calling initialize(DOMString) on a.requiredExtensions with too few arguments must throw TypeError -PASS SVGStringList interface: a.requiredExtensions must inherit property "getItem" with the proper type (4) +PASS SVGStringList interface: a.requiredExtensions must inherit property "getItem(unsigned long)" with the proper type PASS SVGStringList interface: calling getItem(unsigned long) on a.requiredExtensions with too few arguments must throw TypeError -PASS SVGStringList interface: a.requiredExtensions must inherit property "insertItemBefore" with the proper type (5) -PASS SVGStringList interface: calling insertItemBefore(DOMString,unsigned long) on a.requiredExtensions with too few arguments must throw TypeError -PASS SVGStringList interface: a.requiredExtensions must inherit property "replaceItem" with the proper type (6) -PASS SVGStringList interface: calling replaceItem(DOMString,unsigned long) on a.requiredExtensions with too few arguments must throw TypeError -PASS SVGStringList interface: a.requiredExtensions must inherit property "removeItem" with the proper type (7) +PASS SVGStringList interface: a.requiredExtensions must inherit property "insertItemBefore(DOMString, unsigned long)" with the proper type +PASS SVGStringList interface: calling insertItemBefore(DOMString, unsigned long) on a.requiredExtensions with too few arguments must throw TypeError +PASS SVGStringList interface: a.requiredExtensions must inherit property "replaceItem(DOMString, unsigned long)" with the proper type +PASS SVGStringList interface: calling replaceItem(DOMString, unsigned long) on a.requiredExtensions with too few arguments must throw TypeError +PASS SVGStringList interface: a.requiredExtensions must inherit property "removeItem(unsigned long)" with the proper type PASS SVGStringList interface: calling removeItem(unsigned long) on a.requiredExtensions with too few arguments must throw TypeError -PASS SVGStringList interface: a.requiredExtensions must inherit property "appendItem" with the proper type (8) +PASS SVGStringList interface: a.requiredExtensions must inherit property "appendItem(DOMString)" with the proper type PASS SVGStringList interface: calling appendItem(DOMString) on a.requiredExtensions with too few arguments must throw TypeError PASS SVGUnitTypes interface: existence and properties of interface object PASS SVGUnitTypes interface object length @@ -341,10 +341,10 @@ PASS SVGSVGElement interface: attribute height PASS SVGSVGElement interface: attribute currentScale PASS SVGSVGElement interface: attribute currentTranslate -PASS SVGSVGElement interface: operation getIntersectionList(DOMRectReadOnly,SVGElement) -PASS SVGSVGElement interface: operation getEnclosureList(DOMRectReadOnly,SVGElement) -PASS SVGSVGElement interface: operation checkIntersection(SVGElement,DOMRectReadOnly) -PASS SVGSVGElement interface: operation checkEnclosure(SVGElement,DOMRectReadOnly) +PASS SVGSVGElement interface: operation getIntersectionList(DOMRectReadOnly, SVGElement) +PASS SVGSVGElement interface: operation getEnclosureList(DOMRectReadOnly, SVGElement) +PASS SVGSVGElement interface: operation checkIntersection(SVGElement, DOMRectReadOnly) +PASS SVGSVGElement interface: operation checkEnclosure(SVGElement, DOMRectReadOnly) PASS SVGSVGElement interface: operation deselectAll() PASS SVGSVGElement interface: operation createSVGNumber() PASS SVGSVGElement interface: operation createSVGLength() @@ -369,56 +369,56 @@ PASS SVGSVGElement interface: attribute zoomAndPan PASS SVGSVGElement must be primary interface of svg PASS Stringification of svg -PASS SVGSVGElement interface: svg must inherit property "x" with the proper type (0) -PASS SVGSVGElement interface: svg must inherit property "y" with the proper type (1) -PASS SVGSVGElement interface: svg must inherit property "width" with the proper type (2) -PASS SVGSVGElement interface: svg must inherit property "height" with the proper type (3) -PASS SVGSVGElement interface: svg must inherit property "currentScale" with the proper type (4) -FAIL SVGSVGElement interface: svg must inherit property "currentTranslate" with the proper type (5) assert_true: instanceof DOMPointReadOnly expected true got false -PASS SVGSVGElement interface: svg must inherit property "getIntersectionList" with the proper type (6) -PASS SVGSVGElement interface: calling getIntersectionList(DOMRectReadOnly,SVGElement) on svg with too few arguments must throw TypeError -PASS SVGSVGElement interface: svg must inherit property "getEnclosureList" with the proper type (7) -PASS SVGSVGElement interface: calling getEnclosureList(DOMRectReadOnly,SVGElement) on svg with too few arguments must throw TypeError -PASS SVGSVGElement interface: svg must inherit property "checkIntersection" with the proper type (8) -PASS SVGSVGElement interface: calling checkIntersection(SVGElement,DOMRectReadOnly) on svg with too few arguments must throw TypeError -PASS SVGSVGElement interface: svg must inherit property "checkEnclosure" with the proper type (9) -PASS SVGSVGElement interface: calling checkEnclosure(SVGElement,DOMRectReadOnly) on svg with too few arguments must throw TypeError -PASS SVGSVGElement interface: svg must inherit property "deselectAll" with the proper type (10) -PASS SVGSVGElement interface: svg must inherit property "createSVGNumber" with the proper type (11) -PASS SVGSVGElement interface: svg must inherit property "createSVGLength" with the proper type (12) -PASS SVGSVGElement interface: svg must inherit property "createSVGAngle" with the proper type (13) -PASS SVGSVGElement interface: svg must inherit property "createSVGPoint" with the proper type (14) -PASS SVGSVGElement interface: svg must inherit property "createSVGMatrix" with the proper type (15) -PASS SVGSVGElement interface: svg must inherit property "createSVGRect" with the proper type (16) -PASS SVGSVGElement interface: svg must inherit property "createSVGTransform" with the proper type (17) -PASS SVGSVGElement interface: svg must inherit property "createSVGTransformFromMatrix" with the proper type (18) +PASS SVGSVGElement interface: svg must inherit property "x" with the proper type +PASS SVGSVGElement interface: svg must inherit property "y" with the proper type +PASS SVGSVGElement interface: svg must inherit property "width" with the proper type +PASS SVGSVGElement interface: svg must inherit property "height" with the proper type +PASS SVGSVGElement interface: svg must inherit property "currentScale" with the proper type +FAIL SVGSVGElement interface: svg must inherit property "currentTranslate" with the proper type assert_true: instanceof DOMPointReadOnly expected true got false +PASS SVGSVGElement interface: svg must inherit property "getIntersectionList(DOMRectReadOnly, SVGElement)" with the proper type +PASS SVGSVGElement interface: calling getIntersectionList(DOMRectReadOnly, SVGElement) on svg with too few arguments must throw TypeError +PASS SVGSVGElement interface: svg must inherit property "getEnclosureList(DOMRectReadOnly, SVGElement)" with the proper type +PASS SVGSVGElement interface: calling getEnclosureList(DOMRectReadOnly, SVGElement) on svg with too few arguments must throw TypeError +PASS SVGSVGElement interface: svg must inherit property "checkIntersection(SVGElement, DOMRectReadOnly)" with the proper type +PASS SVGSVGElement interface: calling checkIntersection(SVGElement, DOMRectReadOnly) on svg with too few arguments must throw TypeError +PASS SVGSVGElement interface: svg must inherit property "checkEnclosure(SVGElement, DOMRectReadOnly)" with the proper type +PASS SVGSVGElement interface: calling checkEnclosure(SVGElement, DOMRectReadOnly) on svg with too few arguments must throw TypeError +PASS SVGSVGElement interface: svg must inherit property "deselectAll()" with the proper type +PASS SVGSVGElement interface: svg must inherit property "createSVGNumber()" with the proper type +PASS SVGSVGElement interface: svg must inherit property "createSVGLength()" with the proper type +PASS SVGSVGElement interface: svg must inherit property "createSVGAngle()" with the proper type +PASS SVGSVGElement interface: svg must inherit property "createSVGPoint()" with the proper type +PASS SVGSVGElement interface: svg must inherit property "createSVGMatrix()" with the proper type +PASS SVGSVGElement interface: svg must inherit property "createSVGRect()" with the proper type +PASS SVGSVGElement interface: svg must inherit property "createSVGTransform()" with the proper type +PASS SVGSVGElement interface: svg must inherit property "createSVGTransformFromMatrix(DOMMatrixReadOnly)" with the proper type PASS SVGSVGElement interface: calling createSVGTransformFromMatrix(DOMMatrixReadOnly) on svg with too few arguments must throw TypeError -PASS SVGSVGElement interface: svg must inherit property "suspendRedraw" with the proper type (19) +PASS SVGSVGElement interface: svg must inherit property "suspendRedraw(unsigned long)" with the proper type PASS SVGSVGElement interface: calling suspendRedraw(unsigned long) on svg with too few arguments must throw TypeError -PASS SVGSVGElement interface: svg must inherit property "unsuspendRedraw" with the proper type (20) +PASS SVGSVGElement interface: svg must inherit property "unsuspendRedraw(unsigned long)" with the proper type PASS SVGSVGElement interface: calling unsuspendRedraw(unsigned long) on svg with too few arguments must throw TypeError -PASS SVGSVGElement interface: svg must inherit property "unsuspendRedrawAll" with the proper type (21) -PASS SVGSVGElement interface: svg must inherit property "forceRedraw" with the proper type (22) -PASS SVGSVGElement interface: svg must inherit property "viewBox" with the proper type (23) -PASS SVGSVGElement interface: svg must inherit property "preserveAspectRatio" with the proper type (24) -PASS SVGSVGElement interface: svg must inherit property "SVG_ZOOMANDPAN_UNKNOWN" with the proper type (25) -PASS SVGSVGElement interface: svg must inherit property "SVG_ZOOMANDPAN_DISABLE" with the proper type (26) -PASS SVGSVGElement interface: svg must inherit property "SVG_ZOOMANDPAN_MAGNIFY" with the proper type (27) -PASS SVGSVGElement interface: svg must inherit property "zoomAndPan" with the proper type (28) -PASS SVGGraphicsElement interface: svg must inherit property "transform" with the proper type (0) -PASS SVGGraphicsElement interface: svg must inherit property "getBBox" with the proper type (1) +PASS SVGSVGElement interface: svg must inherit property "unsuspendRedrawAll()" with the proper type +PASS SVGSVGElement interface: svg must inherit property "forceRedraw()" with the proper type +PASS SVGSVGElement interface: svg must inherit property "viewBox" with the proper type +PASS SVGSVGElement interface: svg must inherit property "preserveAspectRatio" with the proper type +PASS SVGSVGElement interface: svg must inherit property "SVG_ZOOMANDPAN_UNKNOWN" with the proper type +PASS SVGSVGElement interface: svg must inherit property "SVG_ZOOMANDPAN_DISABLE" with the proper type +PASS SVGSVGElement interface: svg must inherit property "SVG_ZOOMANDPAN_MAGNIFY" with the proper type +PASS SVGSVGElement interface: svg must inherit property "zoomAndPan" with the proper type +PASS SVGGraphicsElement interface: svg must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: svg must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on svg with too few arguments must throw TypeError -PASS SVGGraphicsElement interface: svg must inherit property "getCTM" with the proper type (2) -PASS SVGGraphicsElement interface: svg must inherit property "getScreenCTM" with the proper type (3) -PASS SVGGraphicsElement interface: svg must inherit property "requiredExtensions" with the proper type (4) -PASS SVGGraphicsElement interface: svg must inherit property "systemLanguage" with the proper type (5) -PASS SVGElement interface: svg must inherit property "className" with the proper type (0) -PASS SVGElement interface: svg must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: svg must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: svg must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: svg must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: svg must inherit property "focus" with the proper type (5) -PASS SVGElement interface: svg must inherit property "blur" with the proper type (6) +PASS SVGGraphicsElement interface: svg must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: svg must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: svg must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: svg must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: svg must inherit property "className" with the proper type +PASS SVGElement interface: svg must inherit property "dataset" with the proper type +PASS SVGElement interface: svg must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: svg must inherit property "viewportElement" with the proper type +PASS SVGElement interface: svg must inherit property "tabIndex" with the proper type +PASS SVGElement interface: svg must inherit property "focus()" with the proper type +PASS SVGElement interface: svg must inherit property "blur()" with the proper type PASS SVGGElement interface: existence and properties of interface object PASS SVGGElement interface object length PASS SVGGElement interface object name @@ -426,20 +426,20 @@ PASS SVGGElement interface: existence and properties of interface prototype object's "constructor" property PASS SVGGElement must be primary interface of g PASS Stringification of g -PASS SVGGraphicsElement interface: g must inherit property "transform" with the proper type (0) -PASS SVGGraphicsElement interface: g must inherit property "getBBox" with the proper type (1) +PASS SVGGraphicsElement interface: g must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: g must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on g with too few arguments must throw TypeError -PASS SVGGraphicsElement interface: g must inherit property "getCTM" with the proper type (2) -PASS SVGGraphicsElement interface: g must inherit property "getScreenCTM" with the proper type (3) -PASS SVGGraphicsElement interface: g must inherit property "requiredExtensions" with the proper type (4) -PASS SVGGraphicsElement interface: g must inherit property "systemLanguage" with the proper type (5) -PASS SVGElement interface: g must inherit property "className" with the proper type (0) -PASS SVGElement interface: g must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: g must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: g must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: g must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: g must inherit property "focus" with the proper type (5) -PASS SVGElement interface: g must inherit property "blur" with the proper type (6) +PASS SVGGraphicsElement interface: g must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: g must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: g must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: g must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: g must inherit property "className" with the proper type +PASS SVGElement interface: g must inherit property "dataset" with the proper type +PASS SVGElement interface: g must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: g must inherit property "viewportElement" with the proper type +PASS SVGElement interface: g must inherit property "tabIndex" with the proper type +PASS SVGElement interface: g must inherit property "focus()" with the proper type +PASS SVGElement interface: g must inherit property "blur()" with the proper type FAIL SVGUnknownElement interface: existence and properties of interface object assert_own_property: self does not have own property "SVGUnknownElement" expected property "SVGUnknownElement" missing FAIL SVGUnknownElement interface object length assert_own_property: self does not have own property "SVGUnknownElement" expected property "SVGUnknownElement" missing FAIL SVGUnknownElement interface object name assert_own_property: self does not have own property "SVGUnknownElement" expected property "SVGUnknownElement" missing @@ -452,20 +452,20 @@ PASS SVGDefsElement interface: existence and properties of interface prototype object's "constructor" property PASS SVGDefsElement must be primary interface of defs PASS Stringification of defs -PASS SVGGraphicsElement interface: defs must inherit property "transform" with the proper type (0) -PASS SVGGraphicsElement interface: defs must inherit property "getBBox" with the proper type (1) +PASS SVGGraphicsElement interface: defs must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: defs must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on defs with too few arguments must throw TypeError -PASS SVGGraphicsElement interface: defs must inherit property "getCTM" with the proper type (2) -PASS SVGGraphicsElement interface: defs must inherit property "getScreenCTM" with the proper type (3) -PASS SVGGraphicsElement interface: defs must inherit property "requiredExtensions" with the proper type (4) -PASS SVGGraphicsElement interface: defs must inherit property "systemLanguage" with the proper type (5) -PASS SVGElement interface: defs must inherit property "className" with the proper type (0) -PASS SVGElement interface: defs must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: defs must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: defs must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: defs must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: defs must inherit property "focus" with the proper type (5) -PASS SVGElement interface: defs must inherit property "blur" with the proper type (6) +PASS SVGGraphicsElement interface: defs must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: defs must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: defs must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: defs must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: defs must inherit property "className" with the proper type +PASS SVGElement interface: defs must inherit property "dataset" with the proper type +PASS SVGElement interface: defs must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: defs must inherit property "viewportElement" with the proper type +PASS SVGElement interface: defs must inherit property "tabIndex" with the proper type +PASS SVGElement interface: defs must inherit property "focus()" with the proper type +PASS SVGElement interface: defs must inherit property "blur()" with the proper type PASS SVGDescElement interface: existence and properties of interface object PASS SVGDescElement interface object length PASS SVGDescElement interface object name @@ -473,13 +473,13 @@ PASS SVGDescElement interface: existence and properties of interface prototype object's "constructor" property PASS SVGDescElement must be primary interface of Desc PASS Stringification of Desc -PASS SVGElement interface: Desc must inherit property "className" with the proper type (0) -PASS SVGElement interface: Desc must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: Desc must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: Desc must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: Desc must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: Desc must inherit property "focus" with the proper type (5) -PASS SVGElement interface: Desc must inherit property "blur" with the proper type (6) +PASS SVGElement interface: Desc must inherit property "className" with the proper type +PASS SVGElement interface: Desc must inherit property "dataset" with the proper type +PASS SVGElement interface: Desc must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: Desc must inherit property "viewportElement" with the proper type +PASS SVGElement interface: Desc must inherit property "tabIndex" with the proper type +PASS SVGElement interface: Desc must inherit property "focus()" with the proper type +PASS SVGElement interface: Desc must inherit property "blur()" with the proper type PASS SVGMetadataElement interface: existence and properties of interface object PASS SVGMetadataElement interface object length PASS SVGMetadataElement interface object name @@ -487,13 +487,13 @@ PASS SVGMetadataElement interface: existence and properties of interface prototype object's "constructor" property PASS SVGMetadataElement must be primary interface of metadata PASS Stringification of metadata -PASS SVGElement interface: metadata must inherit property "className" with the proper type (0) -PASS SVGElement interface: metadata must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: metadata must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: metadata must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: metadata must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: metadata must inherit property "focus" with the proper type (5) -PASS SVGElement interface: metadata must inherit property "blur" with the proper type (6) +PASS SVGElement interface: metadata must inherit property "className" with the proper type +PASS SVGElement interface: metadata must inherit property "dataset" with the proper type +PASS SVGElement interface: metadata must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: metadata must inherit property "viewportElement" with the proper type +PASS SVGElement interface: metadata must inherit property "tabIndex" with the proper type +PASS SVGElement interface: metadata must inherit property "focus()" with the proper type +PASS SVGElement interface: metadata must inherit property "blur()" with the proper type PASS SVGTitleElement interface: existence and properties of interface object PASS SVGTitleElement interface object length PASS SVGTitleElement interface object name @@ -501,13 +501,13 @@ PASS SVGTitleElement interface: existence and properties of interface prototype object's "constructor" property PASS SVGTitleElement must be primary interface of title PASS Stringification of title -PASS SVGElement interface: title must inherit property "className" with the proper type (0) -PASS SVGElement interface: title must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: title must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: title must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: title must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: title must inherit property "focus" with the proper type (5) -PASS SVGElement interface: title must inherit property "blur" with the proper type (6) +PASS SVGElement interface: title must inherit property "className" with the proper type +PASS SVGElement interface: title must inherit property "dataset" with the proper type +PASS SVGElement interface: title must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: title must inherit property "viewportElement" with the proper type +PASS SVGElement interface: title must inherit property "tabIndex" with the proper type +PASS SVGElement interface: title must inherit property "focus()" with the proper type +PASS SVGElement interface: title must inherit property "blur()" with the proper type PASS SVGSymbolElement interface: existence and properties of interface object PASS SVGSymbolElement interface object length PASS SVGSymbolElement interface object name @@ -517,15 +517,15 @@ PASS SVGSymbolElement interface: attribute preserveAspectRatio PASS SVGSymbolElement must be primary interface of symbol PASS Stringification of symbol -PASS SVGSymbolElement interface: symbol must inherit property "viewBox" with the proper type (0) -PASS SVGSymbolElement interface: symbol must inherit property "preserveAspectRatio" with the proper type (1) -PASS SVGElement interface: symbol must inherit property "className" with the proper type (0) -PASS SVGElement interface: symbol must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: symbol must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: symbol must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: symbol must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: symbol must inherit property "focus" with the proper type (5) -PASS SVGElement interface: symbol must inherit property "blur" with the proper type (6) +PASS SVGSymbolElement interface: symbol must inherit property "viewBox" with the proper type +PASS SVGSymbolElement interface: symbol must inherit property "preserveAspectRatio" with the proper type +PASS SVGElement interface: symbol must inherit property "className" with the proper type +PASS SVGElement interface: symbol must inherit property "dataset" with the proper type +PASS SVGElement interface: symbol must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: symbol must inherit property "viewportElement" with the proper type +PASS SVGElement interface: symbol must inherit property "tabIndex" with the proper type +PASS SVGElement interface: symbol must inherit property "focus()" with the proper type +PASS SVGElement interface: symbol must inherit property "blur()" with the proper type PASS SVGUseElement interface: existence and properties of interface object PASS SVGUseElement interface object length PASS SVGUseElement interface object name @@ -538,25 +538,25 @@ PASS SVGUseElement interface: attribute href PASS SVGUseElement must be primary interface of use PASS Stringification of use -PASS SVGUseElement interface: use must inherit property "x" with the proper type (0) -PASS SVGUseElement interface: use must inherit property "y" with the proper type (1) -PASS SVGUseElement interface: use must inherit property "width" with the proper type (2) -PASS SVGUseElement interface: use must inherit property "height" with the proper type (3) -PASS SVGUseElement interface: use must inherit property "href" with the proper type (4) -PASS SVGGraphicsElement interface: use must inherit property "transform" with the proper type (0) -PASS SVGGraphicsElement interface: use must inherit property "getBBox" with the proper type (1) +PASS SVGUseElement interface: use must inherit property "x" with the proper type +PASS SVGUseElement interface: use must inherit property "y" with the proper type +PASS SVGUseElement interface: use must inherit property "width" with the proper type +PASS SVGUseElement interface: use must inherit property "height" with the proper type +PASS SVGUseElement interface: use must inherit property "href" with the proper type +PASS SVGGraphicsElement interface: use must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: use must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on use with too few arguments must throw TypeError -PASS SVGGraphicsElement interface: use must inherit property "getCTM" with the proper type (2) -PASS SVGGraphicsElement interface: use must inherit property "getScreenCTM" with the proper type (3) -PASS SVGGraphicsElement interface: use must inherit property "requiredExtensions" with the proper type (4) -PASS SVGGraphicsElement interface: use must inherit property "systemLanguage" with the proper type (5) -PASS SVGElement interface: use must inherit property "className" with the proper type (0) -PASS SVGElement interface: use must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: use must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: use must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: use must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: use must inherit property "focus" with the proper type (5) -PASS SVGElement interface: use must inherit property "blur" with the proper type (6) +PASS SVGGraphicsElement interface: use must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: use must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: use must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: use must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: use must inherit property "className" with the proper type +PASS SVGElement interface: use must inherit property "dataset" with the proper type +PASS SVGElement interface: use must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: use must inherit property "viewportElement" with the proper type +PASS SVGElement interface: use must inherit property "tabIndex" with the proper type +PASS SVGElement interface: use must inherit property "focus()" with the proper type +PASS SVGElement interface: use must inherit property "blur()" with the proper type PASS SVGSwitchElement interface: existence and properties of interface object PASS SVGSwitchElement interface object length PASS SVGSwitchElement interface object name @@ -564,20 +564,20 @@ PASS SVGSwitchElement interface: existence and properties of interface prototype object's "constructor" property PASS SVGSwitchElement must be primary interface of Switch PASS Stringification of Switch -PASS SVGGraphicsElement interface: Switch must inherit property "transform" with the proper type (0) -PASS SVGGraphicsElement interface: Switch must inherit property "getBBox" with the proper type (1) +PASS SVGGraphicsElement interface: Switch must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: Switch must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on Switch with too few arguments must throw TypeError -PASS SVGGraphicsElement interface: Switch must inherit property "getCTM" with the proper type (2) -PASS SVGGraphicsElement interface: Switch must inherit property "getScreenCTM" with the proper type (3) -PASS SVGGraphicsElement interface: Switch must inherit property "requiredExtensions" with the proper type (4) -PASS SVGGraphicsElement interface: Switch must inherit property "systemLanguage" with the proper type (5) -PASS SVGElement interface: Switch must inherit property "className" with the proper type (0) -PASS SVGElement interface: Switch must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: Switch must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: Switch must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: Switch must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: Switch must inherit property "focus" with the proper type (5) -PASS SVGElement interface: Switch must inherit property "blur" with the proper type (6) +PASS SVGGraphicsElement interface: Switch must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: Switch must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: Switch must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: Switch must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: Switch must inherit property "className" with the proper type +PASS SVGElement interface: Switch must inherit property "dataset" with the proper type +PASS SVGElement interface: Switch must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: Switch must inherit property "viewportElement" with the proper type +PASS SVGElement interface: Switch must inherit property "tabIndex" with the proper type +PASS SVGElement interface: Switch must inherit property "focus()" with the proper type +PASS SVGElement interface: Switch must inherit property "blur()" with the proper type PASS SVGStyleElement interface: existence and properties of interface object PASS SVGStyleElement interface object length PASS SVGStyleElement interface object name @@ -588,16 +588,16 @@ PASS SVGStyleElement interface: attribute title PASS SVGStyleElement must be primary interface of style PASS Stringification of style -PASS SVGStyleElement interface: style must inherit property "type" with the proper type (0) -PASS SVGStyleElement interface: style must inherit property "media" with the proper type (1) -PASS SVGStyleElement interface: style must inherit property "title" with the proper type (2) -PASS SVGElement interface: style must inherit property "className" with the proper type (0) -PASS SVGElement interface: style must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: style must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: style must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: style must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: style must inherit property "focus" with the proper type (5) -PASS SVGElement interface: style must inherit property "blur" with the proper type (6) +PASS SVGStyleElement interface: style must inherit property "type" with the proper type +PASS SVGStyleElement interface: style must inherit property "media" with the proper type +PASS SVGStyleElement interface: style must inherit property "title" with the proper type +PASS SVGElement interface: style must inherit property "className" with the proper type +PASS SVGElement interface: style must inherit property "dataset" with the proper type +PASS SVGElement interface: style must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: style must inherit property "viewportElement" with the proper type +PASS SVGElement interface: style must inherit property "tabIndex" with the proper type +PASS SVGElement interface: style must inherit property "focus()" with the proper type +PASS SVGElement interface: style must inherit property "blur()" with the proper type PASS SVGTransform interface: existence and properties of interface object PASS SVGTransform interface object length PASS SVGTransform interface object name @@ -621,34 +621,34 @@ PASS SVGTransform interface: attribute matrix PASS SVGTransform interface: attribute angle PASS SVGTransform interface: operation setMatrix(DOMMatrixReadOnly) -PASS SVGTransform interface: operation setTranslate(float,float) -PASS SVGTransform interface: operation setScale(float,float) -PASS SVGTransform interface: operation setRotate(float,float,float) +PASS SVGTransform interface: operation setTranslate(float, float) +PASS SVGTransform interface: operation setScale(float, float) +PASS SVGTransform interface: operation setRotate(float, float, float) PASS SVGTransform interface: operation setSkewX(float) PASS SVGTransform interface: operation setSkewY(float) PASS SVGTransform must be primary interface of svg.createSVGTransform() PASS Stringification of svg.createSVGTransform() -PASS SVGTransform interface: svg.createSVGTransform() must inherit property "SVG_TRANSFORM_UNKNOWN" with the proper type (0) -PASS SVGTransform interface: svg.createSVGTransform() must inherit property "SVG_TRANSFORM_MATRIX" with the proper type (1) -PASS SVGTransform interface: svg.createSVGTransform() must inherit property "SVG_TRANSFORM_TRANSLATE" with the proper type (2) -PASS SVGTransform interface: svg.createSVGTransform() must inherit property "SVG_TRANSFORM_SCALE" with the proper type (3) -PASS SVGTransform interface: svg.createSVGTransform() must inherit property "SVG_TRANSFORM_ROTATE" with the proper type (4) -PASS SVGTransform interface: svg.createSVGTransform() must inherit property "SVG_TRANSFORM_SKEWX" with the proper type (5) -PASS SVGTransform interface: svg.createSVGTransform() must inherit property "SVG_TRANSFORM_SKEWY" with the proper type (6) -PASS SVGTransform interface: svg.createSVGTransform() must inherit property "type" with the proper type (7) -FAIL SVGTransform interface: svg.createSVGTransform() must inherit property "matrix" with the proper type (8) assert_true: instanceof DOMMatrix expected true got false -PASS SVGTransform interface: svg.createSVGTransform() must inherit property "angle" with the proper type (9) -PASS SVGTransform interface: svg.createSVGTransform() must inherit property "setMatrix" with the proper type (10) +PASS SVGTransform interface: svg.createSVGTransform() must inherit property "SVG_TRANSFORM_UNKNOWN" with the proper type +PASS SVGTransform interface: svg.createSVGTransform() must inherit property "SVG_TRANSFORM_MATRIX" with the proper type +PASS SVGTransform interface: svg.createSVGTransform() must inherit property "SVG_TRANSFORM_TRANSLATE" with the proper type +PASS SVGTransform interface: svg.createSVGTransform() must inherit property "SVG_TRANSFORM_SCALE" with the proper type +PASS SVGTransform interface: svg.createSVGTransform() must inherit property "SVG_TRANSFORM_ROTATE" with the proper type +PASS SVGTransform interface: svg.createSVGTransform() must inherit property "SVG_TRANSFORM_SKEWX" with the proper type +PASS SVGTransform interface: svg.createSVGTransform() must inherit property "SVG_TRANSFORM_SKEWY" with the proper type +PASS SVGTransform interface: svg.createSVGTransform() must inherit property "type" with the proper type +FAIL SVGTransform interface: svg.createSVGTransform() must inherit property "matrix" with the proper type assert_true: instanceof DOMMatrix expected true got false +PASS SVGTransform interface: svg.createSVGTransform() must inherit property "angle" with the proper type +PASS SVGTransform interface: svg.createSVGTransform() must inherit property "setMatrix(DOMMatrixReadOnly)" with the proper type PASS SVGTransform interface: calling setMatrix(DOMMatrixReadOnly) on svg.createSVGTransform() with too few arguments must throw TypeError -PASS SVGTransform interface: svg.createSVGTransform() must inherit property "setTranslate" with the proper type (11) -PASS SVGTransform interface: calling setTranslate(float,float) on svg.createSVGTransform() with too few arguments must throw TypeError -PASS SVGTransform interface: svg.createSVGTransform() must inherit property "setScale" with the proper type (12) -PASS SVGTransform interface: calling setScale(float,float) on svg.createSVGTransform() with too few arguments must throw TypeError -PASS SVGTransform interface: svg.createSVGTransform() must inherit property "setRotate" with the proper type (13) -PASS SVGTransform interface: calling setRotate(float,float,float) on svg.createSVGTransform() with too few arguments must throw TypeError -PASS SVGTransform interface: svg.createSVGTransform() must inherit property "setSkewX" with the proper type (14) +PASS SVGTransform interface: svg.createSVGTransform() must inherit property "setTranslate(float, float)" with the proper type +PASS SVGTransform interface: calling setTranslate(float, float) on svg.createSVGTransform() with too few arguments must throw TypeError +PASS SVGTransform interface: svg.createSVGTransform() must inherit property "setScale(float, float)" with the proper type +PASS SVGTransform interface: calling setScale(float, float) on svg.createSVGTransform() with too few arguments must throw TypeError +PASS SVGTransform interface: svg.createSVGTransform() must inherit property "setRotate(float, float, float)" with the proper type +PASS SVGTransform interface: calling setRotate(float, float, float) on svg.createSVGTransform() with too few arguments must throw TypeError +PASS SVGTransform interface: svg.createSVGTransform() must inherit property "setSkewX(float)" with the proper type PASS SVGTransform interface: calling setSkewX(float) on svg.createSVGTransform() with too few arguments must throw TypeError -PASS SVGTransform interface: svg.createSVGTransform() must inherit property "setSkewY" with the proper type (15) +PASS SVGTransform interface: svg.createSVGTransform() must inherit property "setSkewY(float)" with the proper type PASS SVGTransform interface: calling setSkewY(float) on svg.createSVGTransform() with too few arguments must throw TypeError PASS SVGTransformList interface: existence and properties of interface object PASS SVGTransformList interface object length @@ -660,32 +660,32 @@ PASS SVGTransformList interface: operation clear() PASS SVGTransformList interface: operation initialize(SVGTransform) PASS SVGTransformList interface: operation getItem(unsigned long) -PASS SVGTransformList interface: operation insertItemBefore(SVGTransform,unsigned long) -PASS SVGTransformList interface: operation replaceItem(SVGTransform,unsigned long) +PASS SVGTransformList interface: operation insertItemBefore(SVGTransform, unsigned long) +PASS SVGTransformList interface: operation replaceItem(SVGTransform, unsigned long) PASS SVGTransformList interface: operation removeItem(unsigned long) PASS SVGTransformList interface: operation appendItem(SVGTransform) PASS SVGTransformList interface: operation createSVGTransformFromMatrix(DOMMatrixReadOnly) PASS SVGTransformList interface: operation consolidate() PASS SVGTransformList must be primary interface of pattern.patternTransform.baseVal PASS Stringification of pattern.patternTransform.baseVal -PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "length" with the proper type (0) -PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "numberOfItems" with the proper type (1) -PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "clear" with the proper type (2) -PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "initialize" with the proper type (3) +PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "length" with the proper type +PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "numberOfItems" with the proper type +PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "clear()" with the proper type +PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "initialize(SVGTransform)" with the proper type PASS SVGTransformList interface: calling initialize(SVGTransform) on pattern.patternTransform.baseVal with too few arguments must throw TypeError -PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "getItem" with the proper type (4) +PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "getItem(unsigned long)" with the proper type PASS SVGTransformList interface: calling getItem(unsigned long) on pattern.patternTransform.baseVal with too few arguments must throw TypeError -PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "insertItemBefore" with the proper type (5) -PASS SVGTransformList interface: calling insertItemBefore(SVGTransform,unsigned long) on pattern.patternTransform.baseVal with too few arguments must throw TypeError -PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "replaceItem" with the proper type (6) -PASS SVGTransformList interface: calling replaceItem(SVGTransform,unsigned long) on pattern.patternTransform.baseVal with too few arguments must throw TypeError -PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "removeItem" with the proper type (7) +PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "insertItemBefore(SVGTransform, unsigned long)" with the proper type +PASS SVGTransformList interface: calling insertItemBefore(SVGTransform, unsigned long) on pattern.patternTransform.baseVal with too few arguments must throw TypeError +PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "replaceItem(SVGTransform, unsigned long)" with the proper type +PASS SVGTransformList interface: calling replaceItem(SVGTransform, unsigned long) on pattern.patternTransform.baseVal with too few arguments must throw TypeError +PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "removeItem(unsigned long)" with the proper type PASS SVGTransformList interface: calling removeItem(unsigned long) on pattern.patternTransform.baseVal with too few arguments must throw TypeError -PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "appendItem" with the proper type (8) +PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "appendItem(SVGTransform)" with the proper type PASS SVGTransformList interface: calling appendItem(SVGTransform) on pattern.patternTransform.baseVal with too few arguments must throw TypeError -PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "createSVGTransformFromMatrix" with the proper type (10) +PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "createSVGTransformFromMatrix(DOMMatrixReadOnly)" with the proper type PASS SVGTransformList interface: calling createSVGTransformFromMatrix(DOMMatrixReadOnly) on pattern.patternTransform.baseVal with too few arguments must throw TypeError -PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "consolidate" with the proper type (11) +PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "consolidate()" with the proper type PASS SVGAnimatedTransformList interface: existence and properties of interface object PASS SVGAnimatedTransformList interface object length PASS SVGAnimatedTransformList interface object name @@ -695,8 +695,8 @@ PASS SVGAnimatedTransformList interface: attribute animVal PASS SVGAnimatedTransformList must be primary interface of pattern.patternTransform PASS Stringification of pattern.patternTransform -PASS SVGAnimatedTransformList interface: pattern.patternTransform must inherit property "baseVal" with the proper type (0) -PASS SVGAnimatedTransformList interface: pattern.patternTransform must inherit property "animVal" with the proper type (1) +PASS SVGAnimatedTransformList interface: pattern.patternTransform must inherit property "baseVal" with the proper type +PASS SVGAnimatedTransformList interface: pattern.patternTransform must inherit property "animVal" with the proper type PASS SVGPreserveAspectRatio interface: existence and properties of interface object PASS SVGPreserveAspectRatio interface object length PASS SVGPreserveAspectRatio interface object name @@ -734,22 +734,22 @@ PASS SVGPreserveAspectRatio interface: attribute meetOrSlice PASS SVGPreserveAspectRatio must be primary interface of image.preserveAspectRatio.baseVal PASS Stringification of image.preserveAspectRatio.baseVal -PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_UNKNOWN" with the proper type (0) -PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_NONE" with the proper type (1) -PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMINYMIN" with the proper type (2) -PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMIDYMIN" with the proper type (3) -PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMAXYMIN" with the proper type (4) -PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMINYMID" with the proper type (5) -PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMIDYMID" with the proper type (6) -PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMAXYMID" with the proper type (7) -PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMINYMAX" with the proper type (8) -PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMIDYMAX" with the proper type (9) -PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMAXYMAX" with the proper type (10) -PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_MEETORSLICE_UNKNOWN" with the proper type (11) -PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_MEETORSLICE_MEET" with the proper type (12) -PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_MEETORSLICE_SLICE" with the proper type (13) -PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "align" with the proper type (14) -PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "meetOrSlice" with the proper type (15) +PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_UNKNOWN" with the proper type +PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_NONE" with the proper type +PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMINYMIN" with the proper type +PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMIDYMIN" with the proper type +PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMAXYMIN" with the proper type +PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMINYMID" with the proper type +PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMIDYMID" with the proper type +PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMAXYMID" with the proper type +PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMINYMAX" with the proper type +PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMIDYMAX" with the proper type +PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMAXYMAX" with the proper type +PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_MEETORSLICE_UNKNOWN" with the proper type +PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_MEETORSLICE_MEET" with the proper type +PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_MEETORSLICE_SLICE" with the proper type +PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "align" with the proper type +PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "meetOrSlice" with the proper type PASS SVGAnimatedPreserveAspectRatio interface: existence and properties of interface object PASS SVGAnimatedPreserveAspectRatio interface object length PASS SVGAnimatedPreserveAspectRatio interface object name @@ -759,8 +759,8 @@ PASS SVGAnimatedPreserveAspectRatio interface: attribute animVal PASS SVGAnimatedPreserveAspectRatio must be primary interface of image.preserveAspectRatio PASS Stringification of image.preserveAspectRatio -PASS SVGAnimatedPreserveAspectRatio interface: image.preserveAspectRatio must inherit property "baseVal" with the proper type (0) -PASS SVGAnimatedPreserveAspectRatio interface: image.preserveAspectRatio must inherit property "animVal" with the proper type (1) +PASS SVGAnimatedPreserveAspectRatio interface: image.preserveAspectRatio must inherit property "baseVal" with the proper type +PASS SVGAnimatedPreserveAspectRatio interface: image.preserveAspectRatio must inherit property "animVal" with the proper type PASS SVGPathElement interface: existence and properties of interface object PASS SVGPathElement interface object length PASS SVGPathElement interface object name @@ -768,28 +768,28 @@ PASS SVGPathElement interface: existence and properties of interface prototype object's "constructor" property PASS SVGPathElement must be primary interface of path PASS Stringification of path -PASS SVGGeometryElement interface: path must inherit property "pathLength" with the proper type (0) -PASS SVGGeometryElement interface: path must inherit property "isPointInFill" with the proper type (1) +PASS SVGGeometryElement interface: path must inherit property "pathLength" with the proper type +PASS SVGGeometryElement interface: path must inherit property "isPointInFill(DOMPoint)" with the proper type PASS SVGGeometryElement interface: calling isPointInFill(DOMPoint) on path with too few arguments must throw TypeError -PASS SVGGeometryElement interface: path must inherit property "isPointInStroke" with the proper type (2) +PASS SVGGeometryElement interface: path must inherit property "isPointInStroke(DOMPoint)" with the proper type PASS SVGGeometryElement interface: calling isPointInStroke(DOMPoint) on path with too few arguments must throw TypeError -PASS SVGGeometryElement interface: path must inherit property "getTotalLength" with the proper type (3) -PASS SVGGeometryElement interface: path must inherit property "getPointAtLength" with the proper type (4) +PASS SVGGeometryElement interface: path must inherit property "getTotalLength()" with the proper type +PASS SVGGeometryElement interface: path must inherit property "getPointAtLength(float)" with the proper type PASS SVGGeometryElement interface: calling getPointAtLength(float) on path with too few arguments must throw TypeError -PASS SVGGraphicsElement interface: path must inherit property "transform" with the proper type (0) -PASS SVGGraphicsElement interface: path must inherit property "getBBox" with the proper type (1) +PASS SVGGraphicsElement interface: path must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: path must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on path with too few arguments must throw TypeError -PASS SVGGraphicsElement interface: path must inherit property "getCTM" with the proper type (2) -PASS SVGGraphicsElement interface: path must inherit property "getScreenCTM" with the proper type (3) -PASS SVGGraphicsElement interface: path must inherit property "requiredExtensions" with the proper type (4) -PASS SVGGraphicsElement interface: path must inherit property "systemLanguage" with the proper type (5) -PASS SVGElement interface: path must inherit property "className" with the proper type (0) -PASS SVGElement interface: path must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: path must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: path must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: path must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: path must inherit property "focus" with the proper type (5) -PASS SVGElement interface: path must inherit property "blur" with the proper type (6) +PASS SVGGraphicsElement interface: path must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: path must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: path must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: path must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: path must inherit property "className" with the proper type +PASS SVGElement interface: path must inherit property "dataset" with the proper type +PASS SVGElement interface: path must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: path must inherit property "viewportElement" with the proper type +PASS SVGElement interface: path must inherit property "tabIndex" with the proper type +PASS SVGElement interface: path must inherit property "focus()" with the proper type +PASS SVGElement interface: path must inherit property "blur()" with the proper type PASS SVGRectElement interface: existence and properties of interface object PASS SVGRectElement interface object length PASS SVGRectElement interface object name @@ -803,34 +803,34 @@ PASS SVGRectElement interface: attribute ry PASS SVGRectElement must be primary interface of rect PASS Stringification of rect -PASS SVGRectElement interface: rect must inherit property "x" with the proper type (0) -PASS SVGRectElement interface: rect must inherit property "y" with the proper type (1) -PASS SVGRectElement interface: rect must inherit property "width" with the proper type (2) -PASS SVGRectElement interface: rect must inherit property "height" with the proper type (3) -PASS SVGRectElement interface: rect must inherit property "rx" with the proper type (4) -PASS SVGRectElement interface: rect must inherit property "ry" with the proper type (5) -PASS SVGGeometryElement interface: rect must inherit property "pathLength" with the proper type (0) -PASS SVGGeometryElement interface: rect must inherit property "isPointInFill" with the proper type (1) +PASS SVGRectElement interface: rect must inherit property "x" with the proper type +PASS SVGRectElement interface: rect must inherit property "y" with the proper type +PASS SVGRectElement interface: rect must inherit property "width" with the proper type +PASS SVGRectElement interface: rect must inherit property "height" with the proper type +PASS SVGRectElement interface: rect must inherit property "rx" with the proper type +PASS SVGRectElement interface: rect must inherit property "ry" with the proper type +PASS SVGGeometryElement interface: rect must inherit property "pathLength" with the proper type +PASS SVGGeometryElement interface: rect must inherit property "isPointInFill(DOMPoint)" with the proper type PASS SVGGeometryElement interface: calling isPointInFill(DOMPoint) on rect with too few arguments must throw TypeError -PASS SVGGeometryElement interface: rect must inherit property "isPointInStroke" with the proper type (2) +PASS SVGGeometryElement interface: rect must inherit property "isPointInStroke(DOMPoint)" with the proper type PASS SVGGeometryElement interface: calling isPointInStroke(DOMPoint) on rect with too few arguments must throw TypeError -PASS SVGGeometryElement interface: rect must inherit property "getTotalLength" with the proper type (3) -PASS SVGGeometryElement interface: rect must inherit property "getPointAtLength" with the proper type (4) +PASS SVGGeometryElement interface: rect must inherit property "getTotalLength()" with the proper type +PASS SVGGeometryElement interface: rect must inherit property "getPointAtLength(float)" with the proper type PASS SVGGeometryElement interface: calling getPointAtLength(float) on rect with too few arguments must throw TypeError -PASS SVGGraphicsElement interface: rect must inherit property "transform" with the proper type (0) -PASS SVGGraphicsElement interface: rect must inherit property "getBBox" with the proper type (1) +PASS SVGGraphicsElement interface: rect must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: rect must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on rect with too few arguments must throw TypeError -PASS SVGGraphicsElement interface: rect must inherit property "getCTM" with the proper type (2) -PASS SVGGraphicsElement interface: rect must inherit property "getScreenCTM" with the proper type (3) -PASS SVGGraphicsElement interface: rect must inherit property "requiredExtensions" with the proper type (4) -PASS SVGGraphicsElement interface: rect must inherit property "systemLanguage" with the proper type (5) -PASS SVGElement interface: rect must inherit property "className" with the proper type (0) -PASS SVGElement interface: rect must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: rect must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: rect must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: rect must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: rect must inherit property "focus" with the proper type (5) -PASS SVGElement interface: rect must inherit property "blur" with the proper type (6) +PASS SVGGraphicsElement interface: rect must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: rect must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: rect must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: rect must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: rect must inherit property "className" with the proper type +PASS SVGElement interface: rect must inherit property "dataset" with the proper type +PASS SVGElement interface: rect must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: rect must inherit property "viewportElement" with the proper type +PASS SVGElement interface: rect must inherit property "tabIndex" with the proper type +PASS SVGElement interface: rect must inherit property "focus()" with the proper type +PASS SVGElement interface: rect must inherit property "blur()" with the proper type PASS SVGCircleElement interface: existence and properties of interface object PASS SVGCircleElement interface object length PASS SVGCircleElement interface object name @@ -841,31 +841,31 @@ PASS SVGCircleElement interface: attribute r PASS SVGCircleElement must be primary interface of circle PASS Stringification of circle -PASS SVGCircleElement interface: circle must inherit property "cx" with the proper type (0) -PASS SVGCircleElement interface: circle must inherit property "cy" with the proper type (1) -PASS SVGCircleElement interface: circle must inherit property "r" with the proper type (2) -PASS SVGGeometryElement interface: circle must inherit property "pathLength" with the proper type (0) -PASS SVGGeometryElement interface: circle must inherit property "isPointInFill" with the proper type (1) +PASS SVGCircleElement interface: circle must inherit property "cx" with the proper type +PASS SVGCircleElement interface: circle must inherit property "cy" with the proper type +PASS SVGCircleElement interface: circle must inherit property "r" with the proper type +PASS SVGGeometryElement interface: circle must inherit property "pathLength" with the proper type +PASS SVGGeometryElement interface: circle must inherit property "isPointInFill(DOMPoint)" with the proper type PASS SVGGeometryElement interface: calling isPointInFill(DOMPoint) on circle with too few arguments must throw TypeError -PASS SVGGeometryElement interface: circle must inherit property "isPointInStroke" with the proper type (2) +PASS SVGGeometryElement interface: circle must inherit property "isPointInStroke(DOMPoint)" with the proper type PASS SVGGeometryElement interface: calling isPointInStroke(DOMPoint) on circle with too few arguments must throw TypeError -PASS SVGGeometryElement interface: circle must inherit property "getTotalLength" with the proper type (3) -PASS SVGGeometryElement interface: circle must inherit property "getPointAtLength" with the proper type (4) +PASS SVGGeometryElement interface: circle must inherit property "getTotalLength()" with the proper type +PASS SVGGeometryElement interface: circle must inherit property "getPointAtLength(float)" with the proper type PASS SVGGeometryElement interface: calling getPointAtLength(float) on circle with too few arguments must throw TypeError -PASS SVGGraphicsElement interface: circle must inherit property "transform" with the proper type (0) -PASS SVGGraphicsElement interface: circle must inherit property "getBBox" with the proper type (1) +PASS SVGGraphicsElement interface: circle must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: circle must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on circle with too few arguments must throw TypeError -PASS SVGGraphicsElement interface: circle must inherit property "getCTM" with the proper type (2) -PASS SVGGraphicsElement interface: circle must inherit property "getScreenCTM" with the proper type (3) -PASS SVGGraphicsElement interface: circle must inherit property "requiredExtensions" with the proper type (4) -PASS SVGGraphicsElement interface: circle must inherit property "systemLanguage" with the proper type (5) -PASS SVGElement interface: circle must inherit property "className" with the proper type (0) -PASS SVGElement interface: circle must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: circle must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: circle must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: circle must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: circle must inherit property "focus" with the proper type (5) -PASS SVGElement interface: circle must inherit property "blur" with the proper type (6) +PASS SVGGraphicsElement interface: circle must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: circle must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: circle must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: circle must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: circle must inherit property "className" with the proper type +PASS SVGElement interface: circle must inherit property "dataset" with the proper type +PASS SVGElement interface: circle must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: circle must inherit property "viewportElement" with the proper type +PASS SVGElement interface: circle must inherit property "tabIndex" with the proper type +PASS SVGElement interface: circle must inherit property "focus()" with the proper type +PASS SVGElement interface: circle must inherit property "blur()" with the proper type PASS SVGEllipseElement interface: existence and properties of interface object PASS SVGEllipseElement interface object length PASS SVGEllipseElement interface object name @@ -877,32 +877,32 @@ PASS SVGEllipseElement interface: attribute ry PASS SVGEllipseElement must be primary interface of ellipse PASS Stringification of ellipse -PASS SVGEllipseElement interface: ellipse must inherit property "cx" with the proper type (0) -PASS SVGEllipseElement interface: ellipse must inherit property "cy" with the proper type (1) -PASS SVGEllipseElement interface: ellipse must inherit property "rx" with the proper type (2) -PASS SVGEllipseElement interface: ellipse must inherit property "ry" with the proper type (3) -PASS SVGGeometryElement interface: ellipse must inherit property "pathLength" with the proper type (0) -PASS SVGGeometryElement interface: ellipse must inherit property "isPointInFill" with the proper type (1) +PASS SVGEllipseElement interface: ellipse must inherit property "cx" with the proper type +PASS SVGEllipseElement interface: ellipse must inherit property "cy" with the proper type +PASS SVGEllipseElement interface: ellipse must inherit property "rx" with the proper type +PASS SVGEllipseElement interface: ellipse must inherit property "ry" with the proper type +PASS SVGGeometryElement interface: ellipse must inherit property "pathLength" with the proper type +PASS SVGGeometryElement interface: ellipse must inherit property "isPointInFill(DOMPoint)" with the proper type PASS SVGGeometryElement interface: calling isPointInFill(DOMPoint) on ellipse with too few arguments must throw TypeError -PASS SVGGeometryElement interface: ellipse must inherit property "isPointInStroke" with the proper type (2) +PASS SVGGeometryElement interface: ellipse must inherit property "isPointInStroke(DOMPoint)" with the proper type PASS SVGGeometryElement interface: calling isPointInStroke(DOMPoint) on ellipse with too few arguments must throw TypeError -PASS SVGGeometryElement interface: ellipse must inherit property "getTotalLength" with the proper type (3) -PASS SVGGeometryElement interface: ellipse must inherit property "getPointAtLength" with the proper type (4) +PASS SVGGeometryElement interface: ellipse must inherit property "getTotalLength()" with the proper type +PASS SVGGeometryElement interface: ellipse must inherit property "getPointAtLength(float)" with the proper type PASS SVGGeometryElement interface: calling getPointAtLength(float) on ellipse with too few arguments must throw TypeError -PASS SVGGraphicsElement interface: ellipse must inherit property "transform" with the proper type (0) -PASS SVGGraphicsElement interface: ellipse must inherit property "getBBox" with the proper type (1) +PASS SVGGraphicsElement interface: ellipse must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: ellipse must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on ellipse with too few arguments must throw TypeError -PASS SVGGraphicsElement interface: ellipse must inherit property "getCTM" with the proper type (2) -PASS SVGGraphicsElement interface: ellipse must inherit property "getScreenCTM" with the proper type (3) -PASS SVGGraphicsElement interface: ellipse must inherit property "requiredExtensions" with the proper type (4) -PASS SVGGraphicsElement interface: ellipse must inherit property "systemLanguage" with the proper type (5) -PASS SVGElement interface: ellipse must inherit property "className" with the proper type (0) -PASS SVGElement interface: ellipse must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: ellipse must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: ellipse must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: ellipse must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: ellipse must inherit property "focus" with the proper type (5) -PASS SVGElement interface: ellipse must inherit property "blur" with the proper type (6) +PASS SVGGraphicsElement interface: ellipse must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: ellipse must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: ellipse must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: ellipse must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: ellipse must inherit property "className" with the proper type +PASS SVGElement interface: ellipse must inherit property "dataset" with the proper type +PASS SVGElement interface: ellipse must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: ellipse must inherit property "viewportElement" with the proper type +PASS SVGElement interface: ellipse must inherit property "tabIndex" with the proper type +PASS SVGElement interface: ellipse must inherit property "focus()" with the proper type +PASS SVGElement interface: ellipse must inherit property "blur()" with the proper type PASS SVGLineElement interface: existence and properties of interface object PASS SVGLineElement interface object length PASS SVGLineElement interface object name @@ -914,32 +914,32 @@ PASS SVGLineElement interface: attribute y2 PASS SVGLineElement must be primary interface of line PASS Stringification of line -PASS SVGLineElement interface: line must inherit property "x1" with the proper type (0) -PASS SVGLineElement interface: line must inherit property "y1" with the proper type (1) -PASS SVGLineElement interface: line must inherit property "x2" with the proper type (2) -PASS SVGLineElement interface: line must inherit property "y2" with the proper type (3) -PASS SVGGeometryElement interface: line must inherit property "pathLength" with the proper type (0) -PASS SVGGeometryElement interface: line must inherit property "isPointInFill" with the proper type (1) +PASS SVGLineElement interface: line must inherit property "x1" with the proper type +PASS SVGLineElement interface: line must inherit property "y1" with the proper type +PASS SVGLineElement interface: line must inherit property "x2" with the proper type +PASS SVGLineElement interface: line must inherit property "y2" with the proper type +PASS SVGGeometryElement interface: line must inherit property "pathLength" with the proper type +PASS SVGGeometryElement interface: line must inherit property "isPointInFill(DOMPoint)" with the proper type PASS SVGGeometryElement interface: calling isPointInFill(DOMPoint) on line with too few arguments must throw TypeError -PASS SVGGeometryElement interface: line must inherit property "isPointInStroke" with the proper type (2) +PASS SVGGeometryElement interface: line must inherit property "isPointInStroke(DOMPoint)" with the proper type PASS SVGGeometryElement interface: calling isPointInStroke(DOMPoint) on line with too few arguments must throw TypeError -PASS SVGGeometryElement interface: line must inherit property "getTotalLength" with the proper type (3) -PASS SVGGeometryElement interface: line must inherit property "getPointAtLength" with the proper type (4) +PASS SVGGeometryElement interface: line must inherit property "getTotalLength()" with the proper type +PASS SVGGeometryElement interface: line must inherit property "getPointAtLength(float)" with the proper type PASS SVGGeometryElement interface: calling getPointAtLength(float) on line with too few arguments must throw TypeError -PASS SVGGraphicsElement interface: line must inherit property "transform" with the proper type (0) -PASS SVGGraphicsElement interface: line must inherit property "getBBox" with the proper type (1) +PASS SVGGraphicsElement interface: line must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: line must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on line with too few arguments must throw TypeError -PASS SVGGraphicsElement interface: line must inherit property "getCTM" with the proper type (2) -PASS SVGGraphicsElement interface: line must inherit property "getScreenCTM" with the proper type (3) -PASS SVGGraphicsElement interface: line must inherit property "requiredExtensions" with the proper type (4) -PASS SVGGraphicsElement interface: line must inherit property "systemLanguage" with the proper type (5) -PASS SVGElement interface: line must inherit property "className" with the proper type (0) -PASS SVGElement interface: line must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: line must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: line must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: line must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: line must inherit property "focus" with the proper type (5) -PASS SVGElement interface: line must inherit property "blur" with the proper type (6) +PASS SVGGraphicsElement interface: line must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: line must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: line must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: line must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: line must inherit property "className" with the proper type +PASS SVGElement interface: line must inherit property "dataset" with the proper type +PASS SVGElement interface: line must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: line must inherit property "viewportElement" with the proper type +PASS SVGElement interface: line must inherit property "tabIndex" with the proper type +PASS SVGElement interface: line must inherit property "focus()" with the proper type +PASS SVGElement interface: line must inherit property "blur()" with the proper type PASS SVGPointList interface: existence and properties of interface object PASS SVGPointList interface object length PASS SVGPointList interface object name @@ -950,26 +950,26 @@ PASS SVGPointList interface: operation clear() PASS SVGPointList interface: operation initialize(DOMPoint) PASS SVGPointList interface: operation getItem(unsigned long) -PASS SVGPointList interface: operation insertItemBefore(DOMPoint,unsigned long) -PASS SVGPointList interface: operation replaceItem(DOMPoint,unsigned long) +PASS SVGPointList interface: operation insertItemBefore(DOMPoint, unsigned long) +PASS SVGPointList interface: operation replaceItem(DOMPoint, unsigned long) PASS SVGPointList interface: operation removeItem(unsigned long) PASS SVGPointList interface: operation appendItem(DOMPoint) PASS SVGPointList must be primary interface of polygon.points PASS Stringification of polygon.points -PASS SVGPointList interface: polygon.points must inherit property "length" with the proper type (0) -PASS SVGPointList interface: polygon.points must inherit property "numberOfItems" with the proper type (1) -PASS SVGPointList interface: polygon.points must inherit property "clear" with the proper type (2) -PASS SVGPointList interface: polygon.points must inherit property "initialize" with the proper type (3) +PASS SVGPointList interface: polygon.points must inherit property "length" with the proper type +PASS SVGPointList interface: polygon.points must inherit property "numberOfItems" with the proper type +PASS SVGPointList interface: polygon.points must inherit property "clear()" with the proper type +PASS SVGPointList interface: polygon.points must inherit property "initialize(DOMPoint)" with the proper type PASS SVGPointList interface: calling initialize(DOMPoint) on polygon.points with too few arguments must throw TypeError -PASS SVGPointList interface: polygon.points must inherit property "getItem" with the proper type (4) +PASS SVGPointList interface: polygon.points must inherit property "getItem(unsigned long)" with the proper type PASS SVGPointList interface: calling getItem(unsigned long) on polygon.points with too few arguments must throw TypeError -PASS SVGPointList interface: polygon.points must inherit property "insertItemBefore" with the proper type (5) -PASS SVGPointList interface: calling insertItemBefore(DOMPoint,unsigned long) on polygon.points with too few arguments must throw TypeError -PASS SVGPointList interface: polygon.points must inherit property "replaceItem" with the proper type (6) -PASS SVGPointList interface: calling replaceItem(DOMPoint,unsigned long) on polygon.points with too few arguments must throw TypeError -PASS SVGPointList interface: polygon.points must inherit property "removeItem" with the proper type (7) +PASS SVGPointList interface: polygon.points must inherit property "insertItemBefore(DOMPoint, unsigned long)" with the proper type +PASS SVGPointList interface: calling insertItemBefore(DOMPoint, unsigned long) on polygon.points with too few arguments must throw TypeError +PASS SVGPointList interface: polygon.points must inherit property "replaceItem(DOMPoint, unsigned long)" with the proper type +PASS SVGPointList interface: calling replaceItem(DOMPoint, unsigned long) on polygon.points with too few arguments must throw TypeError +PASS SVGPointList interface: polygon.points must inherit property "removeItem(unsigned long)" with the proper type PASS SVGPointList interface: calling removeItem(unsigned long) on polygon.points with too few arguments must throw TypeError -PASS SVGPointList interface: polygon.points must inherit property "appendItem" with the proper type (8) +PASS SVGPointList interface: polygon.points must inherit property "appendItem(DOMPoint)" with the proper type PASS SVGPointList interface: calling appendItem(DOMPoint) on polygon.points with too few arguments must throw TypeError PASS SVGPolylineElement interface: existence and properties of interface object PASS SVGPolylineElement interface object length @@ -980,30 +980,30 @@ PASS SVGPolylineElement interface: attribute animatedPoints PASS SVGPolylineElement must be primary interface of polyline PASS Stringification of polyline -PASS SVGPolylineElement interface: polyline must inherit property "points" with the proper type (0) -PASS SVGPolylineElement interface: polyline must inherit property "animatedPoints" with the proper type (1) -PASS SVGGeometryElement interface: polyline must inherit property "pathLength" with the proper type (0) -PASS SVGGeometryElement interface: polyline must inherit property "isPointInFill" with the proper type (1) +PASS SVGPolylineElement interface: polyline must inherit property "points" with the proper type +PASS SVGPolylineElement interface: polyline must inherit property "animatedPoints" with the proper type +PASS SVGGeometryElement interface: polyline must inherit property "pathLength" with the proper type +PASS SVGGeometryElement interface: polyline must inherit property "isPointInFill(DOMPoint)" with the proper type PASS SVGGeometryElement interface: calling isPointInFill(DOMPoint) on polyline with too few arguments must throw TypeError -PASS SVGGeometryElement interface: polyline must inherit property "isPointInStroke" with the proper type (2) +PASS SVGGeometryElement interface: polyline must inherit property "isPointInStroke(DOMPoint)" with the proper type PASS SVGGeometryElement interface: calling isPointInStroke(DOMPoint) on polyline with too few arguments must throw TypeError -PASS SVGGeometryElement interface: polyline must inherit property "getTotalLength" with the proper type (3) -PASS SVGGeometryElement interface: polyline must inherit property "getPointAtLength" with the proper type (4) +PASS SVGGeometryElement interface: polyline must inherit property "getTotalLength()" with the proper type +PASS SVGGeometryElement interface: polyline must inherit property "getPointAtLength(float)" with the proper type PASS SVGGeometryElement interface: calling getPointAtLength(float) on polyline with too few arguments must throw TypeError -PASS SVGGraphicsElement interface: polyline must inherit property "transform" with the proper type (0) -PASS SVGGraphicsElement interface: polyline must inherit property "getBBox" with the proper type (1) +PASS SVGGraphicsElement interface: polyline must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: polyline must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on polyline with too few arguments must throw TypeError -PASS SVGGraphicsElement interface: polyline must inherit property "getCTM" with the proper type (2) -PASS SVGGraphicsElement interface: polyline must inherit property "getScreenCTM" with the proper type (3) -PASS SVGGraphicsElement interface: polyline must inherit property "requiredExtensions" with the proper type (4) -PASS SVGGraphicsElement interface: polyline must inherit property "systemLanguage" with the proper type (5) -PASS SVGElement interface: polyline must inherit property "className" with the proper type (0) -PASS SVGElement interface: polyline must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: polyline must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: polyline must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: polyline must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: polyline must inherit property "focus" with the proper type (5) -PASS SVGElement interface: polyline must inherit property "blur" with the proper type (6) +PASS SVGGraphicsElement interface: polyline must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: polyline must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: polyline must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: polyline must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: polyline must inherit property "className" with the proper type +PASS SVGElement interface: polyline must inherit property "dataset" with the proper type +PASS SVGElement interface: polyline must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: polyline must inherit property "viewportElement" with the proper type +PASS SVGElement interface: polyline must inherit property "tabIndex" with the proper type +PASS SVGElement interface: polyline must inherit property "focus()" with the proper type +PASS SVGElement interface: polyline must inherit property "blur()" with the proper type PASS SVGPolygonElement interface: existence and properties of interface object PASS SVGPolygonElement interface object length PASS SVGPolygonElement interface object name @@ -1013,30 +1013,30 @@ PASS SVGPolygonElement interface: attribute animatedPoints PASS SVGPolygonElement must be primary interface of polygon PASS Stringification of polygon -PASS SVGPolygonElement interface: polygon must inherit property "points" with the proper type (0) -PASS SVGPolygonElement interface: polygon must inherit property "animatedPoints" with the proper type (1) -PASS SVGGeometryElement interface: polygon must inherit property "pathLength" with the proper type (0) -PASS SVGGeometryElement interface: polygon must inherit property "isPointInFill" with the proper type (1) +PASS SVGPolygonElement interface: polygon must inherit property "points" with the proper type +PASS SVGPolygonElement interface: polygon must inherit property "animatedPoints" with the proper type +PASS SVGGeometryElement interface: polygon must inherit property "pathLength" with the proper type +PASS SVGGeometryElement interface: polygon must inherit property "isPointInFill(DOMPoint)" with the proper type PASS SVGGeometryElement interface: calling isPointInFill(DOMPoint) on polygon with too few arguments must throw TypeError -PASS SVGGeometryElement interface: polygon must inherit property "isPointInStroke" with the proper type (2) +PASS SVGGeometryElement interface: polygon must inherit property "isPointInStroke(DOMPoint)" with the proper type PASS SVGGeometryElement interface: calling isPointInStroke(DOMPoint) on polygon with too few arguments must throw TypeError -PASS SVGGeometryElement interface: polygon must inherit property "getTotalLength" with the proper type (3) -PASS SVGGeometryElement interface: polygon must inherit property "getPointAtLength" with the proper type (4) +PASS SVGGeometryElement interface: polygon must inherit property "getTotalLength()" with the proper type +PASS SVGGeometryElement interface: polygon must inherit property "getPointAtLength(float)" with the proper type PASS SVGGeometryElement interface: calling getPointAtLength(float) on polygon with too few arguments must throw TypeError -PASS SVGGraphicsElement interface: polygon must inherit property "transform" with the proper type (0) -PASS SVGGraphicsElement interface: polygon must inherit property "getBBox" with the proper type (1) +PASS SVGGraphicsElement interface: polygon must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: polygon must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on polygon with too few arguments must throw TypeError -PASS SVGGraphicsElement interface: polygon must inherit property "getCTM" with the proper type (2) -PASS SVGGraphicsElement interface: polygon must inherit property "getScreenCTM" with the proper type (3) -PASS SVGGraphicsElement interface: polygon must inherit property "requiredExtensions" with the proper type (4) -PASS SVGGraphicsElement interface: polygon must inherit property "systemLanguage" with the proper type (5) -PASS SVGElement interface: polygon must inherit property "className" with the proper type (0) -PASS SVGElement interface: polygon must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: polygon must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: polygon must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: polygon must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: polygon must inherit property "focus" with the proper type (5) -PASS SVGElement interface: polygon must inherit property "blur" with the proper type (6) +PASS SVGGraphicsElement interface: polygon must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: polygon must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: polygon must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: polygon must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: polygon must inherit property "className" with the proper type +PASS SVGElement interface: polygon must inherit property "dataset" with the proper type +PASS SVGElement interface: polygon must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: polygon must inherit property "viewportElement" with the proper type +PASS SVGElement interface: polygon must inherit property "tabIndex" with the proper type +PASS SVGElement interface: polygon must inherit property "focus()" with the proper type +PASS SVGElement interface: polygon must inherit property "blur()" with the proper type PASS SVGTextContentElement interface: existence and properties of interface object PASS SVGTextContentElement interface object length PASS SVGTextContentElement interface object name @@ -1052,50 +1052,50 @@ PASS SVGTextContentElement interface: attribute lengthAdjust PASS SVGTextContentElement interface: operation getNumberOfChars() PASS SVGTextContentElement interface: operation getComputedTextLength() -PASS SVGTextContentElement interface: operation getSubStringLength(unsigned long,unsigned long) +PASS SVGTextContentElement interface: operation getSubStringLength(unsigned long, unsigned long) PASS SVGTextContentElement interface: operation getStartPositionOfChar(unsigned long) PASS SVGTextContentElement interface: operation getEndPositionOfChar(unsigned long) PASS SVGTextContentElement interface: operation getExtentOfChar(unsigned long) PASS SVGTextContentElement interface: operation getRotationOfChar(unsigned long) PASS SVGTextContentElement interface: operation getCharNumAtPosition(DOMPoint) -PASS SVGTextContentElement interface: operation selectSubString(unsigned long,unsigned long) +PASS SVGTextContentElement interface: operation selectSubString(unsigned long, unsigned long) FAIL SVGTextContentElement must be primary interface of textContent assert_equals: textContent's prototype is not SVGTextContentElement.prototype expected object "[object SVGTextContentElement]" but got object "[object SVGElement]" FAIL Stringification of textContent assert_equals: class string of textContent expected "[object SVGTextContentElement]" but got "[object SVGElement]" -FAIL SVGTextContentElement interface: textContent must inherit property "LENGTHADJUST_UNKNOWN" with the proper type (0) assert_inherits: property "LENGTHADJUST_UNKNOWN" not found in prototype chain -FAIL SVGTextContentElement interface: textContent must inherit property "LENGTHADJUST_SPACING" with the proper type (1) assert_inherits: property "LENGTHADJUST_SPACING" not found in prototype chain -FAIL SVGTextContentElement interface: textContent must inherit property "LENGTHADJUST_SPACINGANDGLYPHS" with the proper type (2) assert_inherits: property "LENGTHADJUST_SPACINGANDGLYPHS" not found in prototype chain -FAIL SVGTextContentElement interface: textContent must inherit property "textLength" with the proper type (3) assert_inherits: property "textLength" not found in prototype chain -FAIL SVGTextContentElement interface: textContent must inherit property "lengthAdjust" with the proper type (4) assert_inherits: property "lengthAdjust" not found in prototype chain -FAIL SVGTextContentElement interface: textContent must inherit property "getNumberOfChars" with the proper type (5) assert_inherits: property "getNumberOfChars" not found in prototype chain -FAIL SVGTextContentElement interface: textContent must inherit property "getComputedTextLength" with the proper type (6) assert_inherits: property "getComputedTextLength" not found in prototype chain -FAIL SVGTextContentElement interface: textContent must inherit property "getSubStringLength" with the proper type (7) assert_inherits: property "getSubStringLength" not found in prototype chain -FAIL SVGTextContentElement interface: calling getSubStringLength(unsigned long,unsigned long) on textContent with too few arguments must throw TypeError assert_inherits: property "getSubStringLength" not found in prototype chain -FAIL SVGTextContentElement interface: textContent must inherit property "getStartPositionOfChar" with the proper type (8) assert_inherits: property "getStartPositionOfChar" not found in prototype chain +FAIL SVGTextContentElement interface: textContent must inherit property "LENGTHADJUST_UNKNOWN" with the proper type assert_inherits: property "LENGTHADJUST_UNKNOWN" not found in prototype chain +FAIL SVGTextContentElement interface: textContent must inherit property "LENGTHADJUST_SPACING" with the proper type assert_inherits: property "LENGTHADJUST_SPACING" not found in prototype chain +FAIL SVGTextContentElement interface: textContent must inherit property "LENGTHADJUST_SPACINGANDGLYPHS" with the proper type assert_inherits: property "LENGTHADJUST_SPACINGANDGLYPHS" not found in prototype chain +FAIL SVGTextContentElement interface: textContent must inherit property "textLength" with the proper type assert_inherits: property "textLength" not found in prototype chain +FAIL SVGTextContentElement interface: textContent must inherit property "lengthAdjust" with the proper type assert_inherits: property "lengthAdjust" not found in prototype chain +FAIL SVGTextContentElement interface: textContent must inherit property "getNumberOfChars()" with the proper type assert_inherits: property "getNumberOfChars" not found in prototype chain +FAIL SVGTextContentElement interface: textContent must inherit property "getComputedTextLength()" with the proper type assert_inherits: property "getComputedTextLength" not found in prototype chain +FAIL SVGTextContentElement interface: textContent must inherit property "getSubStringLength(unsigned long, unsigned long)" with the proper type assert_inherits: property "getSubStringLength" not found in prototype chain +FAIL SVGTextContentElement interface: calling getSubStringLength(unsigned long, unsigned long) on textContent with too few arguments must throw TypeError assert_inherits: property "getSubStringLength" not found in prototype chain +FAIL SVGTextContentElement interface: textContent must inherit property "getStartPositionOfChar(unsigned long)" with the proper type assert_inherits: property "getStartPositionOfChar" not found in prototype chain FAIL SVGTextContentElement interface: calling getStartPositionOfChar(unsigned long) on textContent with too few arguments must throw TypeError assert_inherits: property "getStartPositionOfChar" not found in prototype chain -FAIL SVGTextContentElement interface: textContent must inherit property "getEndPositionOfChar" with the proper type (9) assert_inherits: property "getEndPositionOfChar" not found in prototype chain +FAIL SVGTextContentElement interface: textContent must inherit property "getEndPositionOfChar(unsigned long)" with the proper type assert_inherits: property "getEndPositionOfChar" not found in prototype chain FAIL SVGTextContentElement interface: calling getEndPositionOfChar(unsigned long) on textContent with too few arguments must throw TypeError assert_inherits: property "getEndPositionOfChar" not found in prototype chain -FAIL SVGTextContentElement interface: textContent must inherit property "getExtentOfChar" with the proper type (10) assert_inherits: property "getExtentOfChar" not found in prototype chain +FAIL SVGTextContentElement interface: textContent must inherit property "getExtentOfChar(unsigned long)" with the proper type assert_inherits: property "getExtentOfChar" not found in prototype chain FAIL SVGTextContentElement interface: calling getExtentOfChar(unsigned long) on textContent with too few arguments must throw TypeError assert_inherits: property "getExtentOfChar" not found in prototype chain -FAIL SVGTextContentElement interface: textContent must inherit property "getRotationOfChar" with the proper type (11) assert_inherits: property "getRotationOfChar" not found in prototype chain +FAIL SVGTextContentElement interface: textContent must inherit property "getRotationOfChar(unsigned long)" with the proper type assert_inherits: property "getRotationOfChar" not found in prototype chain FAIL SVGTextContentElement interface: calling getRotationOfChar(unsigned long) on textContent with too few arguments must throw TypeError assert_inherits: property "getRotationOfChar" not found in prototype chain -FAIL SVGTextContentElement interface: textContent must inherit property "getCharNumAtPosition" with the proper type (12) assert_inherits: property "getCharNumAtPosition" not found in prototype chain +FAIL SVGTextContentElement interface: textContent must inherit property "getCharNumAtPosition(DOMPoint)" with the proper type assert_inherits: property "getCharNumAtPosition" not found in prototype chain FAIL SVGTextContentElement interface: calling getCharNumAtPosition(DOMPoint) on textContent with too few arguments must throw TypeError assert_inherits: property "getCharNumAtPosition" not found in prototype chain -FAIL SVGTextContentElement interface: textContent must inherit property "selectSubString" with the proper type (13) assert_inherits: property "selectSubString" not found in prototype chain -FAIL SVGTextContentElement interface: calling selectSubString(unsigned long,unsigned long) on textContent with too few arguments must throw TypeError assert_inherits: property "selectSubString" not found in prototype chain -FAIL SVGGraphicsElement interface: textContent must inherit property "transform" with the proper type (0) assert_inherits: property "transform" not found in prototype chain -FAIL SVGGraphicsElement interface: textContent must inherit property "getBBox" with the proper type (1) assert_inherits: property "getBBox" not found in prototype chain +FAIL SVGTextContentElement interface: textContent must inherit property "selectSubString(unsigned long, unsigned long)" with the proper type assert_inherits: property "selectSubString" not found in prototype chain +FAIL SVGTextContentElement interface: calling selectSubString(unsigned long, unsigned long) on textContent with too few arguments must throw TypeError assert_inherits: property "selectSubString" not found in prototype chain +FAIL SVGGraphicsElement interface: textContent must inherit property "transform" with the proper type assert_inherits: property "transform" not found in prototype chain +FAIL SVGGraphicsElement interface: textContent must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type assert_inherits: property "getBBox" not found in prototype chain FAIL SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on textContent with too few arguments must throw TypeError assert_inherits: property "getBBox" not found in prototype chain -FAIL SVGGraphicsElement interface: textContent must inherit property "getCTM" with the proper type (2) assert_inherits: property "getCTM" not found in prototype chain -FAIL SVGGraphicsElement interface: textContent must inherit property "getScreenCTM" with the proper type (3) assert_inherits: property "getScreenCTM" not found in prototype chain -FAIL SVGGraphicsElement interface: textContent must inherit property "requiredExtensions" with the proper type (4) assert_inherits: property "requiredExtensions" not found in prototype chain -FAIL SVGGraphicsElement interface: textContent must inherit property "systemLanguage" with the proper type (5) assert_inherits: property "systemLanguage" not found in prototype chain -PASS SVGElement interface: textContent must inherit property "className" with the proper type (0) -PASS SVGElement interface: textContent must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: textContent must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: textContent must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: textContent must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: textContent must inherit property "focus" with the proper type (5) -PASS SVGElement interface: textContent must inherit property "blur" with the proper type (6) +FAIL SVGGraphicsElement interface: textContent must inherit property "getCTM()" with the proper type assert_inherits: property "getCTM" not found in prototype chain +FAIL SVGGraphicsElement interface: textContent must inherit property "getScreenCTM()" with the proper type assert_inherits: property "getScreenCTM" not found in prototype chain +FAIL SVGGraphicsElement interface: textContent must inherit property "requiredExtensions" with the proper type assert_inherits: property "requiredExtensions" not found in prototype chain +FAIL SVGGraphicsElement interface: textContent must inherit property "systemLanguage" with the proper type assert_inherits: property "systemLanguage" not found in prototype chain +PASS SVGElement interface: textContent must inherit property "className" with the proper type +PASS SVGElement interface: textContent must inherit property "dataset" with the proper type +PASS SVGElement interface: textContent must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: textContent must inherit property "viewportElement" with the proper type +PASS SVGElement interface: textContent must inherit property "tabIndex" with the proper type +PASS SVGElement interface: textContent must inherit property "focus()" with the proper type +PASS SVGElement interface: textContent must inherit property "blur()" with the proper type PASS SVGTextPositioningElement interface: existence and properties of interface object PASS SVGTextPositioningElement interface object length PASS SVGTextPositioningElement interface object name @@ -1113,46 +1113,46 @@ PASS SVGTextElement interface: existence and properties of interface prototype object's "constructor" property PASS SVGTextElement must be primary interface of text PASS Stringification of text -PASS SVGTextPositioningElement interface: text must inherit property "x" with the proper type (0) -PASS SVGTextPositioningElement interface: text must inherit property "y" with the proper type (1) -PASS SVGTextPositioningElement interface: text must inherit property "dx" with the proper type (2) -PASS SVGTextPositioningElement interface: text must inherit property "dy" with the proper type (3) -PASS SVGTextPositioningElement interface: text must inherit property "rotate" with the proper type (4) -PASS SVGTextContentElement interface: text must inherit property "LENGTHADJUST_UNKNOWN" with the proper type (0) -PASS SVGTextContentElement interface: text must inherit property "LENGTHADJUST_SPACING" with the proper type (1) -PASS SVGTextContentElement interface: text must inherit property "LENGTHADJUST_SPACINGANDGLYPHS" with the proper type (2) -PASS SVGTextContentElement interface: text must inherit property "textLength" with the proper type (3) -PASS SVGTextContentElement interface: text must inherit property "lengthAdjust" with the proper type (4) -PASS SVGTextContentElement interface: text must inherit property "getNumberOfChars" with the proper type (5) -PASS SVGTextContentElement interface: text must inherit property "getComputedTextLength" with the proper type (6) -PASS SVGTextContentElement interface: text must inherit property "getSubStringLength" with the proper type (7) -PASS SVGTextContentElement interface: calling getSubStringLength(unsigned long,unsigned long) on text with too few arguments must throw TypeError -PASS SVGTextContentElement interface: text must inherit property "getStartPositionOfChar" with the proper type (8) +PASS SVGTextPositioningElement interface: text must inherit property "x" with the proper type +PASS SVGTextPositioningElement interface: text must inherit property "y" with the proper type +PASS SVGTextPositioningElement interface: text must inherit property "dx" with the proper type +PASS SVGTextPositioningElement interface: text must inherit property "dy" with the proper type +PASS SVGTextPositioningElement interface: text must inherit property "rotate" with the proper type +PASS SVGTextContentElement interface: text must inherit property "LENGTHADJUST_UNKNOWN" with the proper type +PASS SVGTextContentElement interface: text must inherit property "LENGTHADJUST_SPACING" with the proper type +PASS SVGTextContentElement interface: text must inherit property "LENGTHADJUST_SPACINGANDGLYPHS" with the proper type +PASS SVGTextContentElement interface: text must inherit property "textLength" with the proper type +PASS SVGTextContentElement interface: text must inherit property "lengthAdjust" with the proper type +PASS SVGTextContentElement interface: text must inherit property "getNumberOfChars()" with the proper type +PASS SVGTextContentElement interface: text must inherit property "getComputedTextLength()" with the proper type +PASS SVGTextContentElement interface: text must inherit property "getSubStringLength(unsigned long, unsigned long)" with the proper type +PASS SVGTextContentElement interface: calling getSubStringLength(unsigned long, unsigned long) on text with too few arguments must throw TypeError +PASS SVGTextContentElement interface: text must inherit property "getStartPositionOfChar(unsigned long)" with the proper type PASS SVGTextContentElement interface: calling getStartPositionOfChar(unsigned long) on text with too few arguments must throw TypeError -PASS SVGTextContentElement interface: text must inherit property "getEndPositionOfChar" with the proper type (9) +PASS SVGTextContentElement interface: text must inherit property "getEndPositionOfChar(unsigned long)" with the proper type PASS SVGTextContentElement interface: calling getEndPositionOfChar(unsigned long) on text with too few arguments must throw TypeError -PASS SVGTextContentElement interface: text must inherit property "getExtentOfChar" with the proper type (10) +PASS SVGTextContentElement interface: text must inherit property "getExtentOfChar(unsigned long)" with the proper type PASS SVGTextContentElement interface: calling getExtentOfChar(unsigned long) on text with too few arguments must throw TypeError -PASS SVGTextContentElement interface: text must inherit property "getRotationOfChar" with the proper type (11) +PASS SVGTextContentElement interface: text must inherit property "getRotationOfChar(unsigned long)" with the proper type PASS SVGTextContentElement interface: calling getRotationOfChar(unsigned long) on text with too few arguments must throw TypeError -PASS SVGTextContentElement interface: text must inherit property "getCharNumAtPosition" with the proper type (12) +PASS SVGTextContentElement interface: text must inherit property "getCharNumAtPosition(DOMPoint)" with the proper type PASS SVGTextContentElement interface: calling getCharNumAtPosition(DOMPoint) on text with too few arguments must throw TypeError -PASS SVGTextContentElement interface: text must inherit property "selectSubString" with the proper type (13) -PASS SVGTextContentElement interface: calling selectSubString(unsigned long,unsigned long) on text with too few arguments must throw TypeError -PASS SVGGraphicsElement interface: text must inherit property "transform" with the proper type (0) -PASS SVGGraphicsElement interface: text must inherit property "getBBox" with the proper type (1) +PASS SVGTextContentElement interface: text must inherit property "selectSubString(unsigned long, unsigned long)" with the proper type +PASS SVGTextContentElement interface: calling selectSubString(unsigned long, unsigned long) on text with too few arguments must throw TypeError +PASS SVGGraphicsElement interface: text must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: text must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on text with too few arguments must throw TypeError -PASS SVGGraphicsElement interface: text must inherit property "getCTM" with the proper type (2) -PASS SVGGraphicsElement interface: text must inherit property "getScreenCTM" with the proper type (3) -PASS SVGGraphicsElement interface: text must inherit property "requiredExtensions" with the proper type (4) -PASS SVGGraphicsElement interface: text must inherit property "systemLanguage" with the proper type (5) -PASS SVGElement interface: text must inherit property "className" with the proper type (0) -PASS SVGElement interface: text must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: text must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: text must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: text must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: text must inherit property "focus" with the proper type (5) -PASS SVGElement interface: text must inherit property "blur" with the proper type (6) +PASS SVGGraphicsElement interface: text must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: text must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: text must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: text must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: text must inherit property "className" with the proper type +PASS SVGElement interface: text must inherit property "dataset" with the proper type +PASS SVGElement interface: text must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: text must inherit property "viewportElement" with the proper type +PASS SVGElement interface: text must inherit property "tabIndex" with the proper type +PASS SVGElement interface: text must inherit property "focus()" with the proper type +PASS SVGElement interface: text must inherit property "blur()" with the proper type PASS SVGTSpanElement interface: existence and properties of interface object PASS SVGTSpanElement interface object length PASS SVGTSpanElement interface object name @@ -1160,46 +1160,46 @@ PASS SVGTSpanElement interface: existence and properties of interface prototype object's "constructor" property PASS SVGTSpanElement must be primary interface of tspan PASS Stringification of tspan -PASS SVGTextPositioningElement interface: tspan must inherit property "x" with the proper type (0) -PASS SVGTextPositioningElement interface: tspan must inherit property "y" with the proper type (1) -PASS SVGTextPositioningElement interface: tspan must inherit property "dx" with the proper type (2) -PASS SVGTextPositioningElement interface: tspan must inherit property "dy" with the proper type (3) -PASS SVGTextPositioningElement interface: tspan must inherit property "rotate" with the proper type (4) -PASS SVGTextContentElement interface: tspan must inherit property "LENGTHADJUST_UNKNOWN" with the proper type (0) -PASS SVGTextContentElement interface: tspan must inherit property "LENGTHADJUST_SPACING" with the proper type (1) -PASS SVGTextContentElement interface: tspan must inherit property "LENGTHADJUST_SPACINGANDGLYPHS" with the proper type (2) -PASS SVGTextContentElement interface: tspan must inherit property "textLength" with the proper type (3) -PASS SVGTextContentElement interface: tspan must inherit property "lengthAdjust" with the proper type (4) -PASS SVGTextContentElement interface: tspan must inherit property "getNumberOfChars" with the proper type (5) -PASS SVGTextContentElement interface: tspan must inherit property "getComputedTextLength" with the proper type (6) -PASS SVGTextContentElement interface: tspan must inherit property "getSubStringLength" with the proper type (7) -PASS SVGTextContentElement interface: calling getSubStringLength(unsigned long,unsigned long) on tspan with too few arguments must throw TypeError -PASS SVGTextContentElement interface: tspan must inherit property "getStartPositionOfChar" with the proper type (8) +PASS SVGTextPositioningElement interface: tspan must inherit property "x" with the proper type +PASS SVGTextPositioningElement interface: tspan must inherit property "y" with the proper type +PASS SVGTextPositioningElement interface: tspan must inherit property "dx" with the proper type +PASS SVGTextPositioningElement interface: tspan must inherit property "dy" with the proper type +PASS SVGTextPositioningElement interface: tspan must inherit property "rotate" with the proper type +PASS SVGTextContentElement interface: tspan must inherit property "LENGTHADJUST_UNKNOWN" with the proper type +PASS SVGTextContentElement interface: tspan must inherit property "LENGTHADJUST_SPACING" with the proper type +PASS SVGTextContentElement interface: tspan must inherit property "LENGTHADJUST_SPACINGANDGLYPHS" with the proper type +PASS SVGTextContentElement interface: tspan must inherit property "textLength" with the proper type +PASS SVGTextContentElement interface: tspan must inherit property "lengthAdjust" with the proper type +PASS SVGTextContentElement interface: tspan must inherit property "getNumberOfChars()" with the proper type +PASS SVGTextContentElement interface: tspan must inherit property "getComputedTextLength()" with the proper type +PASS SVGTextContentElement interface: tspan must inherit property "getSubStringLength(unsigned long, unsigned long)" with the proper type +PASS SVGTextContentElement interface: calling getSubStringLength(unsigned long, unsigned long) on tspan with too few arguments must throw TypeError +PASS SVGTextContentElement interface: tspan must inherit property "getStartPositionOfChar(unsigned long)" with the proper type PASS SVGTextContentElement interface: calling getStartPositionOfChar(unsigned long) on tspan with too few arguments must throw TypeError -PASS SVGTextContentElement interface: tspan must inherit property "getEndPositionOfChar" with the proper type (9) +PASS SVGTextContentElement interface: tspan must inherit property "getEndPositionOfChar(unsigned long)" with the proper type PASS SVGTextContentElement interface: calling getEndPositionOfChar(unsigned long) on tspan with too few arguments must throw TypeError -PASS SVGTextContentElement interface: tspan must inherit property "getExtentOfChar" with the proper type (10) +PASS SVGTextContentElement interface: tspan must inherit property "getExtentOfChar(unsigned long)" with the proper type PASS SVGTextContentElement interface: calling getExtentOfChar(unsigned long) on tspan with too few arguments must throw TypeError -PASS SVGTextContentElement interface: tspan must inherit property "getRotationOfChar" with the proper type (11) +PASS SVGTextContentElement interface: tspan must inherit property "getRotationOfChar(unsigned long)" with the proper type PASS SVGTextContentElement interface: calling getRotationOfChar(unsigned long) on tspan with too few arguments must throw TypeError -PASS SVGTextContentElement interface: tspan must inherit property "getCharNumAtPosition" with the proper type (12) +PASS SVGTextContentElement interface: tspan must inherit property "getCharNumAtPosition(DOMPoint)" with the proper type PASS SVGTextContentElement interface: calling getCharNumAtPosition(DOMPoint) on tspan with too few arguments must throw TypeError -PASS SVGTextContentElement interface: tspan must inherit property "selectSubString" with the proper type (13) -PASS SVGTextContentElement interface: calling selectSubString(unsigned long,unsigned long) on tspan with too few arguments must throw TypeError -PASS SVGGraphicsElement interface: tspan must inherit property "transform" with the proper type (0) -PASS SVGGraphicsElement interface: tspan must inherit property "getBBox" with the proper type (1) +PASS SVGTextContentElement interface: tspan must inherit property "selectSubString(unsigned long, unsigned long)" with the proper type +PASS SVGTextContentElement interface: calling selectSubString(unsigned long, unsigned long) on tspan with too few arguments must throw TypeError +PASS SVGGraphicsElement interface: tspan must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: tspan must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on tspan with too few arguments must throw TypeError -PASS SVGGraphicsElement interface: tspan must inherit property "getCTM" with the proper type (2) -PASS SVGGraphicsElement interface: tspan must inherit property "getScreenCTM" with the proper type (3) -PASS SVGGraphicsElement interface: tspan must inherit property "requiredExtensions" with the proper type (4) -PASS SVGGraphicsElement interface: tspan must inherit property "systemLanguage" with the proper type (5) -PASS SVGElement interface: tspan must inherit property "className" with the proper type (0) -PASS SVGElement interface: tspan must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: tspan must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: tspan must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: tspan must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: tspan must inherit property "focus" with the proper type (5) -PASS SVGElement interface: tspan must inherit property "blur" with the proper type (6) +PASS SVGGraphicsElement interface: tspan must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: tspan must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: tspan must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: tspan must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: tspan must inherit property "className" with the proper type +PASS SVGElement interface: tspan must inherit property "dataset" with the proper type +PASS SVGElement interface: tspan must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: tspan must inherit property "viewportElement" with the proper type +PASS SVGElement interface: tspan must inherit property "tabIndex" with the proper type +PASS SVGElement interface: tspan must inherit property "focus()" with the proper type +PASS SVGElement interface: tspan must inherit property "blur()" with the proper type PASS SVGTextPathElement interface: existence and properties of interface object PASS SVGTextPathElement interface object length PASS SVGTextPathElement interface object name @@ -1223,51 +1223,51 @@ PASS SVGTextPathElement interface: attribute href PASS SVGTextPathElement must be primary interface of textPath PASS Stringification of textPath -PASS SVGTextPathElement interface: textPath must inherit property "TEXTPATH_METHODTYPE_UNKNOWN" with the proper type (0) -PASS SVGTextPathElement interface: textPath must inherit property "TEXTPATH_METHODTYPE_ALIGN" with the proper type (1) -PASS SVGTextPathElement interface: textPath must inherit property "TEXTPATH_METHODTYPE_STRETCH" with the proper type (2) -PASS SVGTextPathElement interface: textPath must inherit property "TEXTPATH_SPACINGTYPE_UNKNOWN" with the proper type (3) -PASS SVGTextPathElement interface: textPath must inherit property "TEXTPATH_SPACINGTYPE_AUTO" with the proper type (4) -PASS SVGTextPathElement interface: textPath must inherit property "TEXTPATH_SPACINGTYPE_EXACT" with the proper type (5) -PASS SVGTextPathElement interface: textPath must inherit property "startOffset" with the proper type (6) -PASS SVGTextPathElement interface: textPath must inherit property "method" with the proper type (7) -PASS SVGTextPathElement interface: textPath must inherit property "spacing" with the proper type (8) -PASS SVGTextPathElement interface: textPath must inherit property "href" with the proper type (9) -PASS SVGTextContentElement interface: textPath must inherit property "LENGTHADJUST_UNKNOWN" with the proper type (0) -PASS SVGTextContentElement interface: textPath must inherit property "LENGTHADJUST_SPACING" with the proper type (1) -PASS SVGTextContentElement interface: textPath must inherit property "LENGTHADJUST_SPACINGANDGLYPHS" with the proper type (2) -PASS SVGTextContentElement interface: textPath must inherit property "textLength" with the proper type (3) -PASS SVGTextContentElement interface: textPath must inherit property "lengthAdjust" with the proper type (4) -PASS SVGTextContentElement interface: textPath must inherit property "getNumberOfChars" with the proper type (5) -PASS SVGTextContentElement interface: textPath must inherit property "getComputedTextLength" with the proper type (6) -PASS SVGTextContentElement interface: textPath must inherit property "getSubStringLength" with the proper type (7) -PASS SVGTextContentElement interface: calling getSubStringLength(unsigned long,unsigned long) on textPath with too few arguments must throw TypeError -PASS SVGTextContentElement interface: textPath must inherit property "getStartPositionOfChar" with the proper type (8) +PASS SVGTextPathElement interface: textPath must inherit property "TEXTPATH_METHODTYPE_UNKNOWN" with the proper type +PASS SVGTextPathElement interface: textPath must inherit property "TEXTPATH_METHODTYPE_ALIGN" with the proper type +PASS SVGTextPathElement interface: textPath must inherit property "TEXTPATH_METHODTYPE_STRETCH" with the proper type +PASS SVGTextPathElement interface: textPath must inherit property "TEXTPATH_SPACINGTYPE_UNKNOWN" with the proper type +PASS SVGTextPathElement interface: textPath must inherit property "TEXTPATH_SPACINGTYPE_AUTO" with the proper type +PASS SVGTextPathElement interface: textPath must inherit property "TEXTPATH_SPACINGTYPE_EXACT" with the proper type +PASS SVGTextPathElement interface: textPath must inherit property "startOffset" with the proper type +PASS SVGTextPathElement interface: textPath must inherit property "method" with the proper type +PASS SVGTextPathElement interface: textPath must inherit property "spacing" with the proper type +PASS SVGTextPathElement interface: textPath must inherit property "href" with the proper type +PASS SVGTextContentElement interface: textPath must inherit property "LENGTHADJUST_UNKNOWN" with the proper type +PASS SVGTextContentElement interface: textPath must inherit property "LENGTHADJUST_SPACING" with the proper type +PASS SVGTextContentElement interface: textPath must inherit property "LENGTHADJUST_SPACINGANDGLYPHS" with the proper type +PASS SVGTextContentElement interface: textPath must inherit property "textLength" with the proper type +PASS SVGTextContentElement interface: textPath must inherit property "lengthAdjust" with the proper type +PASS SVGTextContentElement interface: textPath must inherit property "getNumberOfChars()" with the proper type +PASS SVGTextContentElement interface: textPath must inherit property "getComputedTextLength()" with the proper type +PASS SVGTextContentElement interface: textPath must inherit property "getSubStringLength(unsigned long, unsigned long)" with the proper type +PASS SVGTextContentElement interface: calling getSubStringLength(unsigned long, unsigned long) on textPath with too few arguments must throw TypeError +PASS SVGTextContentElement interface: textPath must inherit property "getStartPositionOfChar(unsigned long)" with the proper type PASS SVGTextContentElement interface: calling getStartPositionOfChar(unsigned long) on textPath with too few arguments must throw TypeError -PASS SVGTextContentElement interface: textPath must inherit property "getEndPositionOfChar" with the proper type (9) +PASS SVGTextContentElement interface: textPath must inherit property "getEndPositionOfChar(unsigned long)" with the proper type PASS SVGTextContentElement interface: calling getEndPositionOfChar(unsigned long) on textPath with too few arguments must throw TypeError -PASS SVGTextContentElement interface: textPath must inherit property "getExtentOfChar" with the proper type (10) +PASS SVGTextContentElement interface: textPath must inherit property "getExtentOfChar(unsigned long)" with the proper type PASS SVGTextContentElement interface: calling getExtentOfChar(unsigned long) on textPath with too few arguments must throw TypeError -PASS SVGTextContentElement interface: textPath must inherit property "getRotationOfChar" with the proper type (11) +PASS SVGTextContentElement interface: textPath must inherit property "getRotationOfChar(unsigned long)" with the proper type PASS SVGTextContentElement interface: calling getRotationOfChar(unsigned long) on textPath with too few arguments must throw TypeError -PASS SVGTextContentElement interface: textPath must inherit property "getCharNumAtPosition" with the proper type (12) +PASS SVGTextContentElement interface: textPath must inherit property "getCharNumAtPosition(DOMPoint)" with the proper type PASS SVGTextContentElement interface: calling getCharNumAtPosition(DOMPoint) on textPath with too few arguments must throw TypeError -PASS SVGTextContentElement interface: textPath must inherit property "selectSubString" with the proper type (13) -PASS SVGTextContentElement interface: calling selectSubString(unsigned long,unsigned long) on textPath with too few arguments must throw TypeError -PASS SVGGraphicsElement interface: textPath must inherit property "transform" with the proper type (0) -PASS SVGGraphicsElement interface: textPath must inherit property "getBBox" with the proper type (1) +PASS SVGTextContentElement interface: textPath must inherit property "selectSubString(unsigned long, unsigned long)" with the proper type +PASS SVGTextContentElement interface: calling selectSubString(unsigned long, unsigned long) on textPath with too few arguments must throw TypeError +PASS SVGGraphicsElement interface: textPath must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: textPath must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on textPath with too few arguments must throw TypeError -PASS SVGGraphicsElement interface: textPath must inherit property "getCTM" with the proper type (2) -PASS SVGGraphicsElement interface: textPath must inherit property "getScreenCTM" with the proper type (3) -PASS SVGGraphicsElement interface: textPath must inherit property "requiredExtensions" with the proper type (4) -PASS SVGGraphicsElement interface: textPath must inherit property "systemLanguage" with the proper type (5) -PASS SVGElement interface: textPath must inherit property "className" with the proper type (0) -PASS SVGElement interface: textPath must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: textPath must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: textPath must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: textPath must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: textPath must inherit property "focus" with the proper type (5) -PASS SVGElement interface: textPath must inherit property "blur" with the proper type (6) +PASS SVGGraphicsElement interface: textPath must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: textPath must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: textPath must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: textPath must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: textPath must inherit property "className" with the proper type +PASS SVGElement interface: textPath must inherit property "dataset" with the proper type +PASS SVGElement interface: textPath must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: textPath must inherit property "viewportElement" with the proper type +PASS SVGElement interface: textPath must inherit property "tabIndex" with the proper type +PASS SVGElement interface: textPath must inherit property "focus()" with the proper type +PASS SVGElement interface: textPath must inherit property "blur()" with the proper type PASS SVGImageElement interface: existence and properties of interface object PASS SVGImageElement interface object length PASS SVGImageElement interface object name @@ -1282,27 +1282,27 @@ PASS SVGImageElement interface: attribute href PASS SVGImageElement must be primary interface of image PASS Stringification of image -PASS SVGImageElement interface: image must inherit property "x" with the proper type (0) -PASS SVGImageElement interface: image must inherit property "y" with the proper type (1) -PASS SVGImageElement interface: image must inherit property "width" with the proper type (2) -PASS SVGImageElement interface: image must inherit property "height" with the proper type (3) -PASS SVGImageElement interface: image must inherit property "preserveAspectRatio" with the proper type (4) -FAIL SVGImageElement interface: image must inherit property "crossOrigin" with the proper type (5) assert_inherits: property "crossOrigin" not found in prototype chain -PASS SVGImageElement interface: image must inherit property "href" with the proper type (6) -PASS SVGGraphicsElement interface: image must inherit property "transform" with the proper type (0) -PASS SVGGraphicsElement interface: image must inherit property "getBBox" with the proper type (1) +PASS SVGImageElement interface: image must inherit property "x" with the proper type +PASS SVGImageElement interface: image must inherit property "y" with the proper type +PASS SVGImageElement interface: image must inherit property "width" with the proper type +PASS SVGImageElement interface: image must inherit property "height" with the proper type +PASS SVGImageElement interface: image must inherit property "preserveAspectRatio" with the proper type +FAIL SVGImageElement interface: image must inherit property "crossOrigin" with the proper type assert_inherits: property "crossOrigin" not found in prototype chain +PASS SVGImageElement interface: image must inherit property "href" with the proper type +PASS SVGGraphicsElement interface: image must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: image must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on image with too few arguments must throw TypeError -PASS SVGGraphicsElement interface: image must inherit property "getCTM" with the proper type (2) -PASS SVGGraphicsElement interface: image must inherit property "getScreenCTM" with the proper type (3) -PASS SVGGraphicsElement interface: image must inherit property "requiredExtensions" with the proper type (4) -PASS SVGGraphicsElement interface: image must inherit property "systemLanguage" with the proper type (5) -PASS SVGElement interface: image must inherit property "className" with the proper type (0) -PASS SVGElement interface: image must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: image must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: image must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: image must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: image must inherit property "focus" with the proper type (5) -PASS SVGElement interface: image must inherit property "blur" with the proper type (6) +PASS SVGGraphicsElement interface: image must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: image must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: image must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: image must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: image must inherit property "className" with the proper type +PASS SVGElement interface: image must inherit property "dataset" with the proper type +PASS SVGElement interface: image must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: image must inherit property "viewportElement" with the proper type +PASS SVGElement interface: image must inherit property "tabIndex" with the proper type +PASS SVGElement interface: image must inherit property "focus()" with the proper type +PASS SVGElement interface: image must inherit property "blur()" with the proper type PASS SVGForeignObjectElement interface: existence and properties of interface object PASS SVGForeignObjectElement interface object length PASS SVGForeignObjectElement interface object name @@ -1314,24 +1314,24 @@ PASS SVGForeignObjectElement interface: attribute height PASS SVGForeignObjectElement must be primary interface of foreignObject PASS Stringification of foreignObject -PASS SVGForeignObjectElement interface: foreignObject must inherit property "x" with the proper type (0) -PASS SVGForeignObjectElement interface: foreignObject must inherit property "y" with the proper type (1) -PASS SVGForeignObjectElement interface: foreignObject must inherit property "width" with the proper type (2) -PASS SVGForeignObjectElement interface: foreignObject must inherit property "height" with the proper type (3) -PASS SVGGraphicsElement interface: foreignObject must inherit property "transform" with the proper type (0) -PASS SVGGraphicsElement interface: foreignObject must inherit property "getBBox" with the proper type (1) +PASS SVGForeignObjectElement interface: foreignObject must inherit property "x" with the proper type +PASS SVGForeignObjectElement interface: foreignObject must inherit property "y" with the proper type +PASS SVGForeignObjectElement interface: foreignObject must inherit property "width" with the proper type +PASS SVGForeignObjectElement interface: foreignObject must inherit property "height" with the proper type +PASS SVGGraphicsElement interface: foreignObject must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: foreignObject must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on foreignObject with too few arguments must throw TypeError -PASS SVGGraphicsElement interface: foreignObject must inherit property "getCTM" with the proper type (2) -PASS SVGGraphicsElement interface: foreignObject must inherit property "getScreenCTM" with the proper type (3) -PASS SVGGraphicsElement interface: foreignObject must inherit property "requiredExtensions" with the proper type (4) -PASS SVGGraphicsElement interface: foreignObject must inherit property "systemLanguage" with the proper type (5) -PASS SVGElement interface: foreignObject must inherit property "className" with the proper type (0) -PASS SVGElement interface: foreignObject must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: foreignObject must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: foreignObject must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: foreignObject must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: foreignObject must inherit property "focus" with the proper type (5) -PASS SVGElement interface: foreignObject must inherit property "blur" with the proper type (6) +PASS SVGGraphicsElement interface: foreignObject must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: foreignObject must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: foreignObject must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: foreignObject must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: foreignObject must inherit property "className" with the proper type +PASS SVGElement interface: foreignObject must inherit property "dataset" with the proper type +PASS SVGElement interface: foreignObject must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: foreignObject must inherit property "viewportElement" with the proper type +PASS SVGElement interface: foreignObject must inherit property "tabIndex" with the proper type +PASS SVGElement interface: foreignObject must inherit property "focus()" with the proper type +PASS SVGElement interface: foreignObject must inherit property "blur()" with the proper type PASS SVGMarkerElement interface: existence and properties of interface object PASS SVGMarkerElement interface object length PASS SVGMarkerElement interface object name @@ -1363,32 +1363,32 @@ PASS SVGMarkerElement interface: attribute preserveAspectRatio PASS SVGMarkerElement must be primary interface of marker PASS Stringification of marker -PASS SVGMarkerElement interface: marker must inherit property "SVG_MARKERUNITS_UNKNOWN" with the proper type (0) -PASS SVGMarkerElement interface: marker must inherit property "SVG_MARKERUNITS_USERSPACEONUSE" with the proper type (1) -PASS SVGMarkerElement interface: marker must inherit property "SVG_MARKERUNITS_STROKEWIDTH" with the proper type (2) -PASS SVGMarkerElement interface: marker must inherit property "SVG_MARKER_ORIENT_UNKNOWN" with the proper type (3) -PASS SVGMarkerElement interface: marker must inherit property "SVG_MARKER_ORIENT_AUTO" with the proper type (4) -PASS SVGMarkerElement interface: marker must inherit property "SVG_MARKER_ORIENT_ANGLE" with the proper type (5) -PASS SVGMarkerElement interface: marker must inherit property "refX" with the proper type (6) -PASS SVGMarkerElement interface: marker must inherit property "refY" with the proper type (7) -PASS SVGMarkerElement interface: marker must inherit property "markerUnits" with the proper type (8) -PASS SVGMarkerElement interface: marker must inherit property "markerWidth" with the proper type (9) -PASS SVGMarkerElement interface: marker must inherit property "markerHeight" with the proper type (10) -PASS SVGMarkerElement interface: marker must inherit property "orientType" with the proper type (11) -PASS SVGMarkerElement interface: marker must inherit property "orientAngle" with the proper type (12) -FAIL SVGMarkerElement interface: marker must inherit property "orient" with the proper type (13) assert_inherits: property "orient" not found in prototype chain -PASS SVGMarkerElement interface: marker must inherit property "setOrientToAuto" with the proper type (14) -PASS SVGMarkerElement interface: marker must inherit property "setOrientToAngle" with the proper type (15) +PASS SVGMarkerElement interface: marker must inherit property "SVG_MARKERUNITS_UNKNOWN" with the proper type +PASS SVGMarkerElement interface: marker must inherit property "SVG_MARKERUNITS_USERSPACEONUSE" with the proper type +PASS SVGMarkerElement interface: marker must inherit property "SVG_MARKERUNITS_STROKEWIDTH" with the proper type +PASS SVGMarkerElement interface: marker must inherit property "SVG_MARKER_ORIENT_UNKNOWN" with the proper type +PASS SVGMarkerElement interface: marker must inherit property "SVG_MARKER_ORIENT_AUTO" with the proper type +PASS SVGMarkerElement interface: marker must inherit property "SVG_MARKER_ORIENT_ANGLE" with the proper type +PASS SVGMarkerElement interface: marker must inherit property "refX" with the proper type +PASS SVGMarkerElement interface: marker must inherit property "refY" with the proper type +PASS SVGMarkerElement interface: marker must inherit property "markerUnits" with the proper type +PASS SVGMarkerElement interface: marker must inherit property "markerWidth" with the proper type +PASS SVGMarkerElement interface: marker must inherit property "markerHeight" with the proper type +PASS SVGMarkerElement interface: marker must inherit property "orientType" with the proper type +PASS SVGMarkerElement interface: marker must inherit property "orientAngle" with the proper type +FAIL SVGMarkerElement interface: marker must inherit property "orient" with the proper type assert_inherits: property "orient" not found in prototype chain +PASS SVGMarkerElement interface: marker must inherit property "setOrientToAuto()" with the proper type +PASS SVGMarkerElement interface: marker must inherit property "setOrientToAngle(SVGAngle)" with the proper type PASS SVGMarkerElement interface: calling setOrientToAngle(SVGAngle) on marker with too few arguments must throw TypeError -PASS SVGMarkerElement interface: marker must inherit property "viewBox" with the proper type (16) -PASS SVGMarkerElement interface: marker must inherit property "preserveAspectRatio" with the proper type (17) -PASS SVGElement interface: marker must inherit property "className" with the proper type (0) -PASS SVGElement interface: marker must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: marker must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: marker must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: marker must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: marker must inherit property "focus" with the proper type (5) -PASS SVGElement interface: marker must inherit property "blur" with the proper type (6) +PASS SVGMarkerElement interface: marker must inherit property "viewBox" with the proper type +PASS SVGMarkerElement interface: marker must inherit property "preserveAspectRatio" with the proper type +PASS SVGElement interface: marker must inherit property "className" with the proper type +PASS SVGElement interface: marker must inherit property "dataset" with the proper type +PASS SVGElement interface: marker must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: marker must inherit property "viewportElement" with the proper type +PASS SVGElement interface: marker must inherit property "tabIndex" with the proper type +PASS SVGElement interface: marker must inherit property "focus()" with the proper type +PASS SVGElement interface: marker must inherit property "blur()" with the proper type FAIL SVGSolidcolorElement interface: existence and properties of interface object assert_own_property: self does not have own property "SVGSolidcolorElement" expected property "SVGSolidcolorElement" missing FAIL SVGSolidcolorElement interface object length assert_own_property: self does not have own property "SVGSolidcolorElement" expected property "SVGSolidcolorElement" missing FAIL SVGSolidcolorElement interface object name assert_own_property: self does not have own property "SVGSolidcolorElement" expected property "SVGSolidcolorElement" missing @@ -1422,25 +1422,25 @@ PASS SVGLinearGradientElement interface: attribute y2 PASS SVGLinearGradientElement must be primary interface of linearGradient PASS Stringification of linearGradient -PASS SVGLinearGradientElement interface: linearGradient must inherit property "x1" with the proper type (0) -PASS SVGLinearGradientElement interface: linearGradient must inherit property "y1" with the proper type (1) -PASS SVGLinearGradientElement interface: linearGradient must inherit property "x2" with the proper type (2) -PASS SVGLinearGradientElement interface: linearGradient must inherit property "y2" with the proper type (3) -PASS SVGGradientElement interface: linearGradient must inherit property "SVG_SPREADMETHOD_UNKNOWN" with the proper type (0) -PASS SVGGradientElement interface: linearGradient must inherit property "SVG_SPREADMETHOD_PAD" with the proper type (1) -PASS SVGGradientElement interface: linearGradient must inherit property "SVG_SPREADMETHOD_REFLECT" with the proper type (2) -PASS SVGGradientElement interface: linearGradient must inherit property "SVG_SPREADMETHOD_REPEAT" with the proper type (3) -PASS SVGGradientElement interface: linearGradient must inherit property "gradientUnits" with the proper type (4) -PASS SVGGradientElement interface: linearGradient must inherit property "gradientTransform" with the proper type (5) -PASS SVGGradientElement interface: linearGradient must inherit property "spreadMethod" with the proper type (6) -PASS SVGGradientElement interface: linearGradient must inherit property "href" with the proper type (7) -PASS SVGElement interface: linearGradient must inherit property "className" with the proper type (0) -PASS SVGElement interface: linearGradient must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: linearGradient must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: linearGradient must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: linearGradient must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: linearGradient must inherit property "focus" with the proper type (5) -PASS SVGElement interface: linearGradient must inherit property "blur" with the proper type (6) +PASS SVGLinearGradientElement interface: linearGradient must inherit property "x1" with the proper type +PASS SVGLinearGradientElement interface: linearGradient must inherit property "y1" with the proper type +PASS SVGLinearGradientElement interface: linearGradient must inherit property "x2" with the proper type +PASS SVGLinearGradientElement interface: linearGradient must inherit property "y2" with the proper type +PASS SVGGradientElement interface: linearGradient must inherit property "SVG_SPREADMETHOD_UNKNOWN" with the proper type +PASS SVGGradientElement interface: linearGradient must inherit property "SVG_SPREADMETHOD_PAD" with the proper type +PASS SVGGradientElement interface: linearGradient must inherit property "SVG_SPREADMETHOD_REFLECT" with the proper type +PASS SVGGradientElement interface: linearGradient must inherit property "SVG_SPREADMETHOD_REPEAT" with the proper type +PASS SVGGradientElement interface: linearGradient must inherit property "gradientUnits" with the proper type +PASS SVGGradientElement interface: linearGradient must inherit property "gradientTransform" with the proper type +PASS SVGGradientElement interface: linearGradient must inherit property "spreadMethod" with the proper type +PASS SVGGradientElement interface: linearGradient must inherit property "href" with the proper type +PASS SVGElement interface: linearGradient must inherit property "className" with the proper type +PASS SVGElement interface: linearGradient must inherit property "dataset" with the proper type +PASS SVGElement interface: linearGradient must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: linearGradient must inherit property "viewportElement" with the proper type +PASS SVGElement interface: linearGradient must inherit property "tabIndex" with the proper type +PASS SVGElement interface: linearGradient must inherit property "focus()" with the proper type +PASS SVGElement interface: linearGradient must inherit property "blur()" with the proper type PASS SVGRadialGradientElement interface: existence and properties of interface object PASS SVGRadialGradientElement interface object length PASS SVGRadialGradientElement interface object name @@ -1454,27 +1454,27 @@ PASS SVGRadialGradientElement interface: attribute fr PASS SVGRadialGradientElement must be primary interface of radialGradient PASS Stringification of radialGradient -PASS SVGRadialGradientElement interface: radialGradient must inherit property "cx" with the proper type (0) -PASS SVGRadialGradientElement interface: radialGradient must inherit property "cy" with the proper type (1) -PASS SVGRadialGradientElement interface: radialGradient must inherit property "r" with the proper type (2) -PASS SVGRadialGradientElement interface: radialGradient must inherit property "fx" with the proper type (3) -PASS SVGRadialGradientElement interface: radialGradient must inherit property "fy" with the proper type (4) -PASS SVGRadialGradientElement interface: radialGradient must inherit property "fr" with the proper type (5) -PASS SVGGradientElement interface: radialGradient must inherit property "SVG_SPREADMETHOD_UNKNOWN" with the proper type (0) -PASS SVGGradientElement interface: radialGradient must inherit property "SVG_SPREADMETHOD_PAD" with the proper type (1) -PASS SVGGradientElement interface: radialGradient must inherit property "SVG_SPREADMETHOD_REFLECT" with the proper type (2) -PASS SVGGradientElement interface: radialGradient must inherit property "SVG_SPREADMETHOD_REPEAT" with the proper type (3) -PASS SVGGradientElement interface: radialGradient must inherit property "gradientUnits" with the proper type (4) -PASS SVGGradientElement interface: radialGradient must inherit property "gradientTransform" with the proper type (5) -PASS SVGGradientElement interface: radialGradient must inherit property "spreadMethod" with the proper type (6) -PASS SVGGradientElement interface: radialGradient must inherit property "href" with the proper type (7) -PASS SVGElement interface: radialGradient must inherit property "className" with the proper type (0) -PASS SVGElement interface: radialGradient must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: radialGradient must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: radialGradient must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: radialGradient must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: radialGradient must inherit property "focus" with the proper type (5) -PASS SVGElement interface: radialGradient must inherit property "blur" with the proper type (6) +PASS SVGRadialGradientElement interface: radialGradient must inherit property "cx" with the proper type +PASS SVGRadialGradientElement interface: radialGradient must inherit property "cy" with the proper type +PASS SVGRadialGradientElement interface: radialGradient must inherit property "r" with the proper type +PASS SVGRadialGradientElement interface: radialGradient must inherit property "fx" with the proper type +PASS SVGRadialGradientElement interface: radialGradient must inherit property "fy" with the proper type +PASS SVGRadialGradientElement interface: radialGradient must inherit property "fr" with the proper type +PASS SVGGradientElement interface: radialGradient must inherit property "SVG_SPREADMETHOD_UNKNOWN" with the proper type +PASS SVGGradientElement interface: radialGradient must inherit property "SVG_SPREADMETHOD_PAD" with the proper type +PASS SVGGradientElement interface: radialGradient must inherit property "SVG_SPREADMETHOD_REFLECT" with the proper type +PASS SVGGradientElement interface: radialGradient must inherit property "SVG_SPREADMETHOD_REPEAT" with the proper type +PASS SVGGradientElement interface: radialGradient must inherit property "gradientUnits" with the proper type +PASS SVGGradientElement interface: radialGradient must inherit property "gradientTransform" with the proper type +PASS SVGGradientElement interface: radialGradient must inherit property "spreadMethod" with the proper type +PASS SVGGradientElement interface: radialGradient must inherit property "href" with the proper type +PASS SVGElement interface: radialGradient must inherit property "className" with the proper type +PASS SVGElement interface: radialGradient must inherit property "dataset" with the proper type +PASS SVGElement interface: radialGradient must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: radialGradient must inherit property "viewportElement" with the proper type +PASS SVGElement interface: radialGradient must inherit property "tabIndex" with the proper type +PASS SVGElement interface: radialGradient must inherit property "focus()" with the proper type +PASS SVGElement interface: radialGradient must inherit property "blur()" with the proper type FAIL SVGMeshElement interface: existence and properties of interface object assert_own_property: self does not have own property "SVGMeshElement" expected property "SVGMeshElement" missing FAIL SVGMeshElement interface object length assert_own_property: self does not have own property "SVGMeshElement" expected property "SVGMeshElement" missing FAIL SVGMeshElement interface object name assert_own_property: self does not have own property "SVGMeshElement" expected property "SVGMeshElement" missing @@ -1498,14 +1498,14 @@ PASS SVGStopElement interface: attribute offset PASS SVGStopElement must be primary interface of stop PASS Stringification of stop -PASS SVGStopElement interface: stop must inherit property "offset" with the proper type (0) -PASS SVGElement interface: stop must inherit property "className" with the proper type (0) -PASS SVGElement interface: stop must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: stop must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: stop must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: stop must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: stop must inherit property "focus" with the proper type (5) -PASS SVGElement interface: stop must inherit property "blur" with the proper type (6) +PASS SVGStopElement interface: stop must inherit property "offset" with the proper type +PASS SVGElement interface: stop must inherit property "className" with the proper type +PASS SVGElement interface: stop must inherit property "dataset" with the proper type +PASS SVGElement interface: stop must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: stop must inherit property "viewportElement" with the proper type +PASS SVGElement interface: stop must inherit property "tabIndex" with the proper type +PASS SVGElement interface: stop must inherit property "focus()" with the proper type +PASS SVGElement interface: stop must inherit property "blur()" with the proper type PASS SVGPatternElement interface: existence and properties of interface object PASS SVGPatternElement interface object length PASS SVGPatternElement interface object name @@ -1523,23 +1523,23 @@ PASS SVGPatternElement interface: attribute href PASS SVGPatternElement must be primary interface of pattern PASS Stringification of pattern -PASS SVGPatternElement interface: pattern must inherit property "patternUnits" with the proper type (0) -PASS SVGPatternElement interface: pattern must inherit property "patternContentUnits" with the proper type (1) -PASS SVGPatternElement interface: pattern must inherit property "patternTransform" with the proper type (2) -PASS SVGPatternElement interface: pattern must inherit property "x" with the proper type (3) -PASS SVGPatternElement interface: pattern must inherit property "y" with the proper type (4) -PASS SVGPatternElement interface: pattern must inherit property "width" with the proper type (5) -PASS SVGPatternElement interface: pattern must inherit property "height" with the proper type (6) -PASS SVGPatternElement interface: pattern must inherit property "viewBox" with the proper type (7) -PASS SVGPatternElement interface: pattern must inherit property "preserveAspectRatio" with the proper type (8) -PASS SVGPatternElement interface: pattern must inherit property "href" with the proper type (9) -PASS SVGElement interface: pattern must inherit property "className" with the proper type (0) -PASS SVGElement interface: pattern must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: pattern must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: pattern must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: pattern must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: pattern must inherit property "focus" with the proper type (5) -PASS SVGElement interface: pattern must inherit property "blur" with the proper type (6) +PASS SVGPatternElement interface: pattern must inherit property "patternUnits" with the proper type +PASS SVGPatternElement interface: pattern must inherit property "patternContentUnits" with the proper type +PASS SVGPatternElement interface: pattern must inherit property "patternTransform" with the proper type +PASS SVGPatternElement interface: pattern must inherit property "x" with the proper type +PASS SVGPatternElement interface: pattern must inherit property "y" with the proper type +PASS SVGPatternElement interface: pattern must inherit property "width" with the proper type +PASS SVGPatternElement interface: pattern must inherit property "height" with the proper type +PASS SVGPatternElement interface: pattern must inherit property "viewBox" with the proper type +PASS SVGPatternElement interface: pattern must inherit property "preserveAspectRatio" with the proper type +PASS SVGPatternElement interface: pattern must inherit property "href" with the proper type +PASS SVGElement interface: pattern must inherit property "className" with the proper type +PASS SVGElement interface: pattern must inherit property "dataset" with the proper type +PASS SVGElement interface: pattern must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: pattern must inherit property "viewportElement" with the proper type +PASS SVGElement interface: pattern must inherit property "tabIndex" with the proper type +PASS SVGElement interface: pattern must inherit property "focus()" with the proper type +PASS SVGElement interface: pattern must inherit property "blur()" with the proper type FAIL SVGHatchElement interface: existence and properties of interface object assert_own_property: self does not have own property "SVGHatchElement" expected property "SVGHatchElement" missing FAIL SVGHatchElement interface object length assert_own_property: self does not have own property "SVGHatchElement" expected property "SVGHatchElement" missing FAIL SVGHatchElement interface object name assert_own_property: self does not have own property "SVGHatchElement" expected property "SVGHatchElement" missing @@ -1560,16 +1560,16 @@ FAIL SVGCursorElement interface: attribute href assert_own_property: self does not have own property "SVGCursorElement" expected property "SVGCursorElement" missing FAIL SVGCursorElement must be primary interface of cursor assert_own_property: self does not have own property "SVGCursorElement" expected property "SVGCursorElement" missing FAIL Stringification of cursor assert_equals: class string of cursor expected "[object SVGCursorElement]" but got "[object SVGElement]" -FAIL SVGCursorElement interface: cursor must inherit property "x" with the proper type (0) assert_inherits: property "x" not found in prototype chain -FAIL SVGCursorElement interface: cursor must inherit property "y" with the proper type (1) assert_inherits: property "y" not found in prototype chain -FAIL SVGCursorElement interface: cursor must inherit property "href" with the proper type (2) assert_inherits: property "href" not found in prototype chain -PASS SVGElement interface: cursor must inherit property "className" with the proper type (0) -PASS SVGElement interface: cursor must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: cursor must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: cursor must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: cursor must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: cursor must inherit property "focus" with the proper type (5) -PASS SVGElement interface: cursor must inherit property "blur" with the proper type (6) +FAIL SVGCursorElement interface: cursor must inherit property "x" with the proper type assert_inherits: property "x" not found in prototype chain +FAIL SVGCursorElement interface: cursor must inherit property "y" with the proper type assert_inherits: property "y" not found in prototype chain +FAIL SVGCursorElement interface: cursor must inherit property "href" with the proper type assert_inherits: property "href" not found in prototype chain +PASS SVGElement interface: cursor must inherit property "className" with the proper type +PASS SVGElement interface: cursor must inherit property "dataset" with the proper type +PASS SVGElement interface: cursor must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: cursor must inherit property "viewportElement" with the proper type +PASS SVGElement interface: cursor must inherit property "tabIndex" with the proper type +PASS SVGElement interface: cursor must inherit property "focus()" with the proper type +PASS SVGElement interface: cursor must inherit property "blur()" with the proper type PASS SVGScriptElement interface: existence and properties of interface object PASS SVGScriptElement interface object length PASS SVGScriptElement interface object name @@ -1580,16 +1580,16 @@ PASS SVGScriptElement interface: attribute href PASS SVGScriptElement must be primary interface of script PASS Stringification of script -PASS SVGScriptElement interface: script must inherit property "type" with the proper type (0) -FAIL SVGScriptElement interface: script must inherit property "crossOrigin" with the proper type (1) assert_inherits: property "crossOrigin" not found in prototype chain -PASS SVGScriptElement interface: script must inherit property "href" with the proper type (2) -PASS SVGElement interface: script must inherit property "className" with the proper type (0) -PASS SVGElement interface: script must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: script must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: script must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: script must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: script must inherit property "focus" with the proper type (5) -PASS SVGElement interface: script must inherit property "blur" with the proper type (6) +PASS SVGScriptElement interface: script must inherit property "type" with the proper type +FAIL SVGScriptElement interface: script must inherit property "crossOrigin" with the proper type assert_inherits: property "crossOrigin" not found in prototype chain +PASS SVGScriptElement interface: script must inherit property "href" with the proper type +PASS SVGElement interface: script must inherit property "className" with the proper type +PASS SVGElement interface: script must inherit property "dataset" with the proper type +PASS SVGElement interface: script must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: script must inherit property "viewportElement" with the proper type +PASS SVGElement interface: script must inherit property "tabIndex" with the proper type +PASS SVGElement interface: script must inherit property "focus()" with the proper type +PASS SVGElement interface: script must inherit property "blur()" with the proper type PASS SVGAElement interface: existence and properties of interface object PASS SVGAElement interface object length PASS SVGAElement interface object name @@ -1599,22 +1599,22 @@ PASS SVGAElement interface: attribute href PASS SVGAElement must be primary interface of a PASS Stringification of a -PASS SVGAElement interface: a must inherit property "target" with the proper type (0) -PASS SVGAElement interface: a must inherit property "href" with the proper type (1) -PASS SVGGraphicsElement interface: a must inherit property "transform" with the proper type (0) -PASS SVGGraphicsElement interface: a must inherit property "getBBox" with the proper type (1) +PASS SVGAElement interface: a must inherit property "target" with the proper type +PASS SVGAElement interface: a must inherit property "href" with the proper type +PASS SVGGraphicsElement interface: a must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: a must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on a with too few arguments must throw TypeError -PASS SVGGraphicsElement interface: a must inherit property "getCTM" with the proper type (2) -PASS SVGGraphicsElement interface: a must inherit property "getScreenCTM" with the proper type (3) -PASS SVGGraphicsElement interface: a must inherit property "requiredExtensions" with the proper type (4) -PASS SVGGraphicsElement interface: a must inherit property "systemLanguage" with the proper type (5) -PASS SVGElement interface: a must inherit property "className" with the proper type (0) -PASS SVGElement interface: a must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: a must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: a must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: a must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: a must inherit property "focus" with the proper type (5) -PASS SVGElement interface: a must inherit property "blur" with the proper type (6) +PASS SVGGraphicsElement interface: a must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: a must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: a must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: a must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: a must inherit property "className" with the proper type +PASS SVGElement interface: a must inherit property "dataset" with the proper type +PASS SVGElement interface: a must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: a must inherit property "viewportElement" with the proper type +PASS SVGElement interface: a must inherit property "tabIndex" with the proper type +PASS SVGElement interface: a must inherit property "focus()" with the proper type +PASS SVGElement interface: a must inherit property "blur()" with the proper type PASS SVGViewElement interface: existence and properties of interface object PASS SVGViewElement interface object length PASS SVGViewElement interface object name @@ -1631,19 +1631,19 @@ PASS SVGViewElement interface: attribute zoomAndPan PASS SVGViewElement must be primary interface of view PASS Stringification of view -PASS SVGViewElement interface: view must inherit property "viewBox" with the proper type (0) -PASS SVGViewElement interface: view must inherit property "preserveAspectRatio" with the proper type (1) -PASS SVGViewElement interface: view must inherit property "SVG_ZOOMANDPAN_UNKNOWN" with the proper type (2) -PASS SVGViewElement interface: view must inherit property "SVG_ZOOMANDPAN_DISABLE" with the proper type (3) -PASS SVGViewElement interface: view must inherit property "SVG_ZOOMANDPAN_MAGNIFY" with the proper type (4) -PASS SVGViewElement interface: view must inherit property "zoomAndPan" with the proper type (5) -PASS SVGElement interface: view must inherit property "className" with the proper type (0) -PASS SVGElement interface: view must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: view must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: view must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: view must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: view must inherit property "focus" with the proper type (5) -PASS SVGElement interface: view must inherit property "blur" with the proper type (6) +PASS SVGViewElement interface: view must inherit property "viewBox" with the proper type +PASS SVGViewElement interface: view must inherit property "preserveAspectRatio" with the proper type +PASS SVGViewElement interface: view must inherit property "SVG_ZOOMANDPAN_UNKNOWN" with the proper type +PASS SVGViewElement interface: view must inherit property "SVG_ZOOMANDPAN_DISABLE" with the proper type +PASS SVGViewElement interface: view must inherit property "SVG_ZOOMANDPAN_MAGNIFY" with the proper type +PASS SVGViewElement interface: view must inherit property "zoomAndPan" with the proper type +PASS SVGElement interface: view must inherit property "className" with the proper type +PASS SVGElement interface: view must inherit property "dataset" with the proper type +PASS SVGElement interface: view must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: view must inherit property "viewportElement" with the proper type +PASS SVGElement interface: view must inherit property "tabIndex" with the proper type +PASS SVGElement interface: view must inherit property "focus()" with the proper type +PASS SVGElement interface: view must inherit property "blur()" with the proper type PASS SVGFilterElement interface: existence and properties of interface object PASS SVGFilterElement interface object length PASS SVGFilterElement interface object name @@ -1658,20 +1658,20 @@ PASS SVGFilterElement interface: attribute href PASS SVGFilterElement must be primary interface of filter PASS Stringification of filter -PASS SVGFilterElement interface: filter must inherit property "filterUnits" with the proper type (0) -PASS SVGFilterElement interface: filter must inherit property "primitiveUnits" with the proper type (1) -PASS SVGFilterElement interface: filter must inherit property "x" with the proper type (2) -PASS SVGFilterElement interface: filter must inherit property "y" with the proper type (3) -PASS SVGFilterElement interface: filter must inherit property "width" with the proper type (4) -PASS SVGFilterElement interface: filter must inherit property "height" with the proper type (5) -PASS SVGFilterElement interface: filter must inherit property "href" with the proper type (6) -PASS SVGElement interface: filter must inherit property "className" with the proper type (0) -PASS SVGElement interface: filter must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: filter must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: filter must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: filter must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: filter must inherit property "focus" with the proper type (5) -PASS SVGElement interface: filter must inherit property "blur" with the proper type (6) +PASS SVGFilterElement interface: filter must inherit property "filterUnits" with the proper type +PASS SVGFilterElement interface: filter must inherit property "primitiveUnits" with the proper type +PASS SVGFilterElement interface: filter must inherit property "x" with the proper type +PASS SVGFilterElement interface: filter must inherit property "y" with the proper type +PASS SVGFilterElement interface: filter must inherit property "width" with the proper type +PASS SVGFilterElement interface: filter must inherit property "height" with the proper type +PASS SVGFilterElement interface: filter must inherit property "href" with the proper type +PASS SVGElement interface: filter must inherit property "className" with the proper type +PASS SVGElement interface: filter must inherit property "dataset" with the proper type +PASS SVGElement interface: filter must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: filter must inherit property "viewportElement" with the proper type +PASS SVGElement interface: filter must inherit property "tabIndex" with the proper type +PASS SVGElement interface: filter must inherit property "focus()" with the proper type +PASS SVGElement interface: filter must inherit property "blur()" with the proper type PASS SVGFEBlendElement interface: existence and properties of interface object PASS SVGFEBlendElement interface object length PASS SVGFEBlendElement interface object name @@ -1699,27 +1699,27 @@ PASS SVGFEBlendElement interface: attribute result PASS SVGFEBlendElement must be primary interface of feBlend PASS Stringification of feBlend -PASS SVGFEBlendElement interface: feBlend must inherit property "SVG_FEBLEND_MODE_UNKNOWN" with the proper type (0) -PASS SVGFEBlendElement interface: feBlend must inherit property "SVG_FEBLEND_MODE_NORMAL" with the proper type (1) -PASS SVGFEBlendElement interface: feBlend must inherit property "SVG_FEBLEND_MODE_MULTIPLY" with the proper type (2) -PASS SVGFEBlendElement interface: feBlend must inherit property "SVG_FEBLEND_MODE_SCREEN" with the proper type (3) -PASS SVGFEBlendElement interface: feBlend must inherit property "SVG_FEBLEND_MODE_DARKEN" with the proper type (4) -PASS SVGFEBlendElement interface: feBlend must inherit property "SVG_FEBLEND_MODE_LIGHTEN" with the proper type (5) -PASS SVGFEBlendElement interface: feBlend must inherit property "in1" with the proper type (6) -PASS SVGFEBlendElement interface: feBlend must inherit property "in2" with the proper type (7) -PASS SVGFEBlendElement interface: feBlend must inherit property "mode" with the proper type (8) -PASS SVGFEBlendElement interface: feBlend must inherit property "x" with the proper type (9) -PASS SVGFEBlendElement interface: feBlend must inherit property "y" with the proper type (10) -PASS SVGFEBlendElement interface: feBlend must inherit property "width" with the proper type (11) -PASS SVGFEBlendElement interface: feBlend must inherit property "height" with the proper type (12) -PASS SVGFEBlendElement interface: feBlend must inherit property "result" with the proper type (13) -PASS SVGElement interface: feBlend must inherit property "className" with the proper type (0) -PASS SVGElement interface: feBlend must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: feBlend must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: feBlend must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: feBlend must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: feBlend must inherit property "focus" with the proper type (5) -PASS SVGElement interface: feBlend must inherit property "blur" with the proper type (6) +PASS SVGFEBlendElement interface: feBlend must inherit property "SVG_FEBLEND_MODE_UNKNOWN" with the proper type +PASS SVGFEBlendElement interface: feBlend must inherit property "SVG_FEBLEND_MODE_NORMAL" with the proper type +PASS SVGFEBlendElement interface: feBlend must inherit property "SVG_FEBLEND_MODE_MULTIPLY" with the proper type +PASS SVGFEBlendElement interface: feBlend must inherit property "SVG_FEBLEND_MODE_SCREEN" with the proper type +PASS SVGFEBlendElement interface: feBlend must inherit property "SVG_FEBLEND_MODE_DARKEN" with the proper type +PASS SVGFEBlendElement interface: feBlend must inherit property "SVG_FEBLEND_MODE_LIGHTEN" with the proper type +PASS SVGFEBlendElement interface: feBlend must inherit property "in1" with the proper type +PASS SVGFEBlendElement interface: feBlend must inherit property "in2" with the proper type +PASS SVGFEBlendElement interface: feBlend must inherit property "mode" with the proper type +PASS SVGFEBlendElement interface: feBlend must inherit property "x" with the proper type +PASS SVGFEBlendElement interface: feBlend must inherit property "y" with the proper type +PASS SVGFEBlendElement interface: feBlend must inherit property "width" with the proper type +PASS SVGFEBlendElement interface: feBlend must inherit property "height" with the proper type +PASS SVGFEBlendElement interface: feBlend must inherit property "result" with the proper type +PASS SVGElement interface: feBlend must inherit property "className" with the proper type +PASS SVGElement interface: feBlend must inherit property "dataset" with the proper type +PASS SVGElement interface: feBlend must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: feBlend must inherit property "viewportElement" with the proper type +PASS SVGElement interface: feBlend must inherit property "tabIndex" with the proper type +PASS SVGElement interface: feBlend must inherit property "focus()" with the proper type +PASS SVGElement interface: feBlend must inherit property "blur()" with the proper type PASS SVGFEColorMatrixElement interface: existence and properties of interface object PASS SVGFEColorMatrixElement interface object length PASS SVGFEColorMatrixElement interface object name @@ -1745,26 +1745,26 @@ PASS SVGFEColorMatrixElement interface: attribute result PASS SVGFEColorMatrixElement must be primary interface of feColorMatrix PASS Stringification of feColorMatrix -PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "SVG_FECOLORMATRIX_TYPE_UNKNOWN" with the proper type (0) -PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "SVG_FECOLORMATRIX_TYPE_MATRIX" with the proper type (1) -PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "SVG_FECOLORMATRIX_TYPE_SATURATE" with the proper type (2) -PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "SVG_FECOLORMATRIX_TYPE_HUEROTATE" with the proper type (3) -PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA" with the proper type (4) -PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "in1" with the proper type (5) -PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "type" with the proper type (6) -PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "values" with the proper type (7) -PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "x" with the proper type (8) -PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "y" with the proper type (9) -PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "width" with the proper type (10) -PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "height" with the proper type (11) -PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "result" with the proper type (12) -PASS SVGElement interface: feColorMatrix must inherit property "className" with the proper type (0) -PASS SVGElement interface: feColorMatrix must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: feColorMatrix must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: feColorMatrix must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: feColorMatrix must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: feColorMatrix must inherit property "focus" with the proper type (5) -PASS SVGElement interface: feColorMatrix must inherit property "blur" with the proper type (6) +PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "SVG_FECOLORMATRIX_TYPE_UNKNOWN" with the proper type +PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "SVG_FECOLORMATRIX_TYPE_MATRIX" with the proper type +PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "SVG_FECOLORMATRIX_TYPE_SATURATE" with the proper type +PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "SVG_FECOLORMATRIX_TYPE_HUEROTATE" with the proper type +PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA" with the proper type +PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "in1" with the proper type +PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "type" with the proper type +PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "values" with the proper type +PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "x" with the proper type +PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "y" with the proper type +PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "width" with the proper type +PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "height" with the proper type +PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "result" with the proper type +PASS SVGElement interface: feColorMatrix must inherit property "className" with the proper type +PASS SVGElement interface: feColorMatrix must inherit property "dataset" with the proper type +PASS SVGElement interface: feColorMatrix must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: feColorMatrix must inherit property "viewportElement" with the proper type +PASS SVGElement interface: feColorMatrix must inherit property "tabIndex" with the proper type +PASS SVGElement interface: feColorMatrix must inherit property "focus()" with the proper type +PASS SVGElement interface: feColorMatrix must inherit property "blur()" with the proper type PASS SVGFEComponentTransferElement interface: existence and properties of interface object PASS SVGFEComponentTransferElement interface object length PASS SVGFEComponentTransferElement interface object name @@ -1778,19 +1778,19 @@ PASS SVGFEComponentTransferElement interface: attribute result PASS SVGFEComponentTransferElement must be primary interface of feComponentTransfer PASS Stringification of feComponentTransfer -PASS SVGFEComponentTransferElement interface: feComponentTransfer must inherit property "in1" with the proper type (0) -PASS SVGFEComponentTransferElement interface: feComponentTransfer must inherit property "x" with the proper type (1) -PASS SVGFEComponentTransferElement interface: feComponentTransfer must inherit property "y" with the proper type (2) -PASS SVGFEComponentTransferElement interface: feComponentTransfer must inherit property "width" with the proper type (3) -PASS SVGFEComponentTransferElement interface: feComponentTransfer must inherit property "height" with the proper type (4) -PASS SVGFEComponentTransferElement interface: feComponentTransfer must inherit property "result" with the proper type (5) -PASS SVGElement interface: feComponentTransfer must inherit property "className" with the proper type (0) -PASS SVGElement interface: feComponentTransfer must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: feComponentTransfer must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: feComponentTransfer must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: feComponentTransfer must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: feComponentTransfer must inherit property "focus" with the proper type (5) -PASS SVGElement interface: feComponentTransfer must inherit property "blur" with the proper type (6) +PASS SVGFEComponentTransferElement interface: feComponentTransfer must inherit property "in1" with the proper type +PASS SVGFEComponentTransferElement interface: feComponentTransfer must inherit property "x" with the proper type +PASS SVGFEComponentTransferElement interface: feComponentTransfer must inherit property "y" with the proper type +PASS SVGFEComponentTransferElement interface: feComponentTransfer must inherit property "width" with the proper type +PASS SVGFEComponentTransferElement interface: feComponentTransfer must inherit property "height" with the proper type +PASS SVGFEComponentTransferElement interface: feComponentTransfer must inherit property "result" with the proper type +PASS SVGElement interface: feComponentTransfer must inherit property "className" with the proper type +PASS SVGElement interface: feComponentTransfer must inherit property "dataset" with the proper type +PASS SVGElement interface: feComponentTransfer must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: feComponentTransfer must inherit property "viewportElement" with the proper type +PASS SVGElement interface: feComponentTransfer must inherit property "tabIndex" with the proper type +PASS SVGElement interface: feComponentTransfer must inherit property "focus()" with the proper type +PASS SVGElement interface: feComponentTransfer must inherit property "blur()" with the proper type PASS SVGComponentTransferFunctionElement interface: existence and properties of interface object PASS SVGComponentTransferFunctionElement interface object length PASS SVGComponentTransferFunctionElement interface object name @@ -1822,26 +1822,26 @@ PASS SVGFEFuncRElement interface: existence and properties of interface prototype object's "constructor" property PASS SVGFEFuncRElement must be primary interface of feFuncR PASS Stringification of feFuncR -PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN" with the proper type (0) -PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY" with the proper type (1) -PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_TABLE" with the proper type (2) -PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE" with the proper type (3) -PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_LINEAR" with the proper type (4) -PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_GAMMA" with the proper type (5) -PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "type" with the proper type (6) -PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "tableValues" with the proper type (7) -PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "slope" with the proper type (8) -PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "intercept" with the proper type (9) -PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "amplitude" with the proper type (10) -PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "exponent" with the proper type (11) -PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "offset" with the proper type (12) -PASS SVGElement interface: feFuncR must inherit property "className" with the proper type (0) -PASS SVGElement interface: feFuncR must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: feFuncR must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: feFuncR must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: feFuncR must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: feFuncR must inherit property "focus" with the proper type (5) -PASS SVGElement interface: feFuncR must inherit property "blur" with the proper type (6) +PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_TABLE" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_LINEAR" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_GAMMA" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "type" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "tableValues" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "slope" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "intercept" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "amplitude" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "exponent" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "offset" with the proper type +PASS SVGElement interface: feFuncR must inherit property "className" with the proper type +PASS SVGElement interface: feFuncR must inherit property "dataset" with the proper type +PASS SVGElement interface: feFuncR must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: feFuncR must inherit property "viewportElement" with the proper type +PASS SVGElement interface: feFuncR must inherit property "tabIndex" with the proper type +PASS SVGElement interface: feFuncR must inherit property "focus()" with the proper type +PASS SVGElement interface: feFuncR must inherit property "blur()" with the proper type PASS SVGFEFuncGElement interface: existence and properties of interface object PASS SVGFEFuncGElement interface object length PASS SVGFEFuncGElement interface object name @@ -1849,26 +1849,26 @@ PASS SVGFEFuncGElement interface: existence and properties of interface prototype object's "constructor" property PASS SVGFEFuncGElement must be primary interface of feFuncG PASS Stringification of feFuncG -PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN" with the proper type (0) -PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY" with the proper type (1) -PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_TABLE" with the proper type (2) -PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE" with the proper type (3) -PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_LINEAR" with the proper type (4) -PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_GAMMA" with the proper type (5) -PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "type" with the proper type (6) -PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "tableValues" with the proper type (7) -PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "slope" with the proper type (8) -PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "intercept" with the proper type (9) -PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "amplitude" with the proper type (10) -PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "exponent" with the proper type (11) -PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "offset" with the proper type (12) -PASS SVGElement interface: feFuncG must inherit property "className" with the proper type (0) -PASS SVGElement interface: feFuncG must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: feFuncG must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: feFuncG must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: feFuncG must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: feFuncG must inherit property "focus" with the proper type (5) -PASS SVGElement interface: feFuncG must inherit property "blur" with the proper type (6) +PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_TABLE" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_LINEAR" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_GAMMA" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "type" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "tableValues" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "slope" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "intercept" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "amplitude" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "exponent" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "offset" with the proper type +PASS SVGElement interface: feFuncG must inherit property "className" with the proper type +PASS SVGElement interface: feFuncG must inherit property "dataset" with the proper type +PASS SVGElement interface: feFuncG must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: feFuncG must inherit property "viewportElement" with the proper type +PASS SVGElement interface: feFuncG must inherit property "tabIndex" with the proper type +PASS SVGElement interface: feFuncG must inherit property "focus()" with the proper type +PASS SVGElement interface: feFuncG must inherit property "blur()" with the proper type PASS SVGFEFuncBElement interface: existence and properties of interface object PASS SVGFEFuncBElement interface object length PASS SVGFEFuncBElement interface object name @@ -1876,26 +1876,26 @@ PASS SVGFEFuncBElement interface: existence and properties of interface prototype object's "constructor" property PASS SVGFEFuncBElement must be primary interface of feFuncB PASS Stringification of feFuncB -PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN" with the proper type (0) -PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY" with the proper type (1) -PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_TABLE" with the proper type (2) -PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE" with the proper type (3) -PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_LINEAR" with the proper type (4) -PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_GAMMA" with the proper type (5) -PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "type" with the proper type (6) -PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "tableValues" with the proper type (7) -PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "slope" with the proper type (8) -PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "intercept" with the proper type (9) -PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "amplitude" with the proper type (10) -PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "exponent" with the proper type (11) -PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "offset" with the proper type (12) -PASS SVGElement interface: feFuncB must inherit property "className" with the proper type (0) -PASS SVGElement interface: feFuncB must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: feFuncB must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: feFuncB must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: feFuncB must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: feFuncB must inherit property "focus" with the proper type (5) -PASS SVGElement interface: feFuncB must inherit property "blur" with the proper type (6) +PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_TABLE" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_LINEAR" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_GAMMA" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "type" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "tableValues" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "slope" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "intercept" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "amplitude" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "exponent" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "offset" with the proper type +PASS SVGElement interface: feFuncB must inherit property "className" with the proper type +PASS SVGElement interface: feFuncB must inherit property "dataset" with the proper type +PASS SVGElement interface: feFuncB must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: feFuncB must inherit property "viewportElement" with the proper type +PASS SVGElement interface: feFuncB must inherit property "tabIndex" with the proper type +PASS SVGElement interface: feFuncB must inherit property "focus()" with the proper type +PASS SVGElement interface: feFuncB must inherit property "blur()" with the proper type PASS SVGFEFuncAElement interface: existence and properties of interface object PASS SVGFEFuncAElement interface object length PASS SVGFEFuncAElement interface object name @@ -1903,26 +1903,26 @@ PASS SVGFEFuncAElement interface: existence and properties of interface prototype object's "constructor" property PASS SVGFEFuncAElement must be primary interface of feFuncA PASS Stringification of feFuncA -PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN" with the proper type (0) -PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY" with the proper type (1) -PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_TABLE" with the proper type (2) -PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE" with the proper type (3) -PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_LINEAR" with the proper type (4) -PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_GAMMA" with the proper type (5) -PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "type" with the proper type (6) -PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "tableValues" with the proper type (7) -PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "slope" with the proper type (8) -PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "intercept" with the proper type (9) -PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "amplitude" with the proper type (10) -PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "exponent" with the proper type (11) -PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "offset" with the proper type (12) -PASS SVGElement interface: feFuncA must inherit property "className" with the proper type (0) -PASS SVGElement interface: feFuncA must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: feFuncA must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: feFuncA must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: feFuncA must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: feFuncA must inherit property "focus" with the proper type (5) -PASS SVGElement interface: feFuncA must inherit property "blur" with the proper type (6) +PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_TABLE" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_LINEAR" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_GAMMA" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "type" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "tableValues" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "slope" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "intercept" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "amplitude" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "exponent" with the proper type +PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "offset" with the proper type +PASS SVGElement interface: feFuncA must inherit property "className" with the proper type +PASS SVGElement interface: feFuncA must inherit property "dataset" with the proper type +PASS SVGElement interface: feFuncA must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: feFuncA must inherit property "viewportElement" with the proper type +PASS SVGElement interface: feFuncA must inherit property "tabIndex" with the proper type +PASS SVGElement interface: feFuncA must inherit property "focus()" with the proper type +PASS SVGElement interface: feFuncA must inherit property "blur()" with the proper type PASS SVGFECompositeElement interface: existence and properties of interface object PASS SVGFECompositeElement interface object length PASS SVGFECompositeElement interface object name @@ -1956,32 +1956,32 @@ PASS SVGFECompositeElement interface: attribute result PASS SVGFECompositeElement must be primary interface of feComposite PASS Stringification of feComposite -PASS SVGFECompositeElement interface: feComposite must inherit property "SVG_FECOMPOSITE_OPERATOR_UNKNOWN" with the proper type (0) -PASS SVGFECompositeElement interface: feComposite must inherit property "SVG_FECOMPOSITE_OPERATOR_OVER" with the proper type (1) -PASS SVGFECompositeElement interface: feComposite must inherit property "SVG_FECOMPOSITE_OPERATOR_IN" with the proper type (2) -PASS SVGFECompositeElement interface: feComposite must inherit property "SVG_FECOMPOSITE_OPERATOR_OUT" with the proper type (3) -PASS SVGFECompositeElement interface: feComposite must inherit property "SVG_FECOMPOSITE_OPERATOR_ATOP" with the proper type (4) -PASS SVGFECompositeElement interface: feComposite must inherit property "SVG_FECOMPOSITE_OPERATOR_XOR" with the proper type (5) -PASS SVGFECompositeElement interface: feComposite must inherit property "SVG_FECOMPOSITE_OPERATOR_ARITHMETIC" with the proper type (6) -PASS SVGFECompositeElement interface: feComposite must inherit property "in1" with the proper type (7) -PASS SVGFECompositeElement interface: feComposite must inherit property "in2" with the proper type (8) -PASS SVGFECompositeElement interface: feComposite must inherit property "operator" with the proper type (9) -PASS SVGFECompositeElement interface: feComposite must inherit property "k1" with the proper type (10) -PASS SVGFECompositeElement interface: feComposite must inherit property "k2" with the proper type (11) -PASS SVGFECompositeElement interface: feComposite must inherit property "k3" with the proper type (12) -PASS SVGFECompositeElement interface: feComposite must inherit property "k4" with the proper type (13) -PASS SVGFECompositeElement interface: feComposite must inherit property "x" with the proper type (14) -PASS SVGFECompositeElement interface: feComposite must inherit property "y" with the proper type (15) -PASS SVGFECompositeElement interface: feComposite must inherit property "width" with the proper type (16) -PASS SVGFECompositeElement interface: feComposite must inherit property "height" with the proper type (17) -PASS SVGFECompositeElement interface: feComposite must inherit property "result" with the proper type (18) -PASS SVGElement interface: feComposite must inherit property "className" with the proper type (0) -PASS SVGElement interface: feComposite must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: feComposite must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: feComposite must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: feComposite must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: feComposite must inherit property "focus" with the proper type (5) -PASS SVGElement interface: feComposite must inherit property "blur" with the proper type (6) +PASS SVGFECompositeElement interface: feComposite must inherit property "SVG_FECOMPOSITE_OPERATOR_UNKNOWN" with the proper type +PASS SVGFECompositeElement interface: feComposite must inherit property "SVG_FECOMPOSITE_OPERATOR_OVER" with the proper type +PASS SVGFECompositeElement interface: feComposite must inherit property "SVG_FECOMPOSITE_OPERATOR_IN" with the proper type +PASS SVGFECompositeElement interface: feComposite must inherit property "SVG_FECOMPOSITE_OPERATOR_OUT" with the proper type +PASS SVGFECompositeElement interface: feComposite must inherit property "SVG_FECOMPOSITE_OPERATOR_ATOP" with the proper type +PASS SVGFECompositeElement interface: feComposite must inherit property "SVG_FECOMPOSITE_OPERATOR_XOR" with the proper type +PASS SVGFECompositeElement interface: feComposite must inherit property "SVG_FECOMPOSITE_OPERATOR_ARITHMETIC" with the proper type +PASS SVGFECompositeElement interface: feComposite must inherit property "in1" with the proper type +PASS SVGFECompositeElement interface: feComposite must inherit property "in2" with the proper type +PASS SVGFECompositeElement interface: feComposite must inherit property "operator" with the proper type +PASS SVGFECompositeElement interface: feComposite must inherit property "k1" with the proper type +PASS SVGFECompositeElement interface: feComposite must inherit property "k2" with the proper type +PASS SVGFECompositeElement interface: feComposite must inherit property "k3" with the proper type +PASS SVGFECompositeElement interface: feComposite must inherit property "k4" with the proper type +PASS SVGFECompositeElement interface: feComposite must inherit property "x" with the proper type +PASS SVGFECompositeElement interface: feComposite must inherit property "y" with the proper type +PASS SVGFECompositeElement interface: feComposite must inherit property "width" with the proper type +PASS SVGFECompositeElement interface: feComposite must inherit property "height" with the proper type +PASS SVGFECompositeElement interface: feComposite must inherit property "result" with the proper type +PASS SVGElement interface: feComposite must inherit property "className" with the proper type +PASS SVGElement interface: feComposite must inherit property "dataset" with the proper type +PASS SVGElement interface: feComposite must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: feComposite must inherit property "viewportElement" with the proper type +PASS SVGElement interface: feComposite must inherit property "tabIndex" with the proper type +PASS SVGElement interface: feComposite must inherit property "focus()" with the proper type +PASS SVGElement interface: feComposite must inherit property "blur()" with the proper type PASS SVGFEConvolveMatrixElement interface: existence and properties of interface object PASS SVGFEConvolveMatrixElement interface object length PASS SVGFEConvolveMatrixElement interface object name @@ -2013,33 +2013,33 @@ PASS SVGFEConvolveMatrixElement interface: attribute result PASS SVGFEConvolveMatrixElement must be primary interface of feConvolveMatrix PASS Stringification of feConvolveMatrix -PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "SVG_EDGEMODE_UNKNOWN" with the proper type (0) -PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "SVG_EDGEMODE_DUPLICATE" with the proper type (1) -PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "SVG_EDGEMODE_WRAP" with the proper type (2) -PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "SVG_EDGEMODE_NONE" with the proper type (3) -PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "in1" with the proper type (4) -PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "orderX" with the proper type (5) -PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "orderY" with the proper type (6) -PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "kernelMatrix" with the proper type (7) -PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "divisor" with the proper type (8) -PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "bias" with the proper type (9) -PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "targetX" with the proper type (10) -PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "targetY" with the proper type (11) -PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "edgeMode" with the proper type (12) -PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "kernelUnitLengthX" with the proper type (13) -PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "kernelUnitLengthY" with the proper type (14) -PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "x" with the proper type (15) -PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "y" with the proper type (16) -PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "width" with the proper type (17) -PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "height" with the proper type (18) -PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "result" with the proper type (19) -PASS SVGElement interface: feConvolveMatrix must inherit property "className" with the proper type (0) -PASS SVGElement interface: feConvolveMatrix must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: feConvolveMatrix must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: feConvolveMatrix must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: feConvolveMatrix must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: feConvolveMatrix must inherit property "focus" with the proper type (5) -PASS SVGElement interface: feConvolveMatrix must inherit property "blur" with the proper type (6) +PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "SVG_EDGEMODE_UNKNOWN" with the proper type +PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "SVG_EDGEMODE_DUPLICATE" with the proper type +PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "SVG_EDGEMODE_WRAP" with the proper type +PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "SVG_EDGEMODE_NONE" with the proper type +PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "in1" with the proper type +PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "orderX" with the proper type +PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "orderY" with the proper type +PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "kernelMatrix" with the proper type +PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "divisor" with the proper type +PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "bias" with the proper type +PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "targetX" with the proper type +PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "targetY" with the proper type +PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "edgeMode" with the proper type +PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "kernelUnitLengthX" with the proper type +PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "kernelUnitLengthY" with the proper type +PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "x" with the proper type +PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "y" with the proper type +PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "width" with the proper type +PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "height" with the proper type +PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "result" with the proper type +PASS SVGElement interface: feConvolveMatrix must inherit property "className" with the proper type +PASS SVGElement interface: feConvolveMatrix must inherit property "dataset" with the proper type +PASS SVGElement interface: feConvolveMatrix must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: feConvolveMatrix must inherit property "viewportElement" with the proper type +PASS SVGElement interface: feConvolveMatrix must inherit property "tabIndex" with the proper type +PASS SVGElement interface: feConvolveMatrix must inherit property "focus()" with the proper type +PASS SVGElement interface: feConvolveMatrix must inherit property "blur()" with the proper type PASS SVGFEDiffuseLightingElement interface: existence and properties of interface object PASS SVGFEDiffuseLightingElement interface object length PASS SVGFEDiffuseLightingElement interface object name @@ -2057,23 +2057,23 @@ PASS SVGFEDiffuseLightingElement interface: attribute result PASS SVGFEDiffuseLightingElement must be primary interface of feDiffuseLighting PASS Stringification of feDiffuseLighting -PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "in1" with the proper type (0) -PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "surfaceScale" with the proper type (1) -PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "diffuseConstant" with the proper type (2) -PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "kernelUnitLengthX" with the proper type (3) -PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "kernelUnitLengthY" with the proper type (4) -PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "x" with the proper type (5) -PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "y" with the proper type (6) -PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "width" with the proper type (7) -PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "height" with the proper type (8) -PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "result" with the proper type (9) -PASS SVGElement interface: feDiffuseLighting must inherit property "className" with the proper type (0) -PASS SVGElement interface: feDiffuseLighting must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: feDiffuseLighting must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: feDiffuseLighting must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: feDiffuseLighting must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: feDiffuseLighting must inherit property "focus" with the proper type (5) -PASS SVGElement interface: feDiffuseLighting must inherit property "blur" with the proper type (6) +PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "in1" with the proper type +PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "surfaceScale" with the proper type +PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "diffuseConstant" with the proper type +PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "kernelUnitLengthX" with the proper type +PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "kernelUnitLengthY" with the proper type +PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "x" with the proper type +PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "y" with the proper type +PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "width" with the proper type +PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "height" with the proper type +PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "result" with the proper type +PASS SVGElement interface: feDiffuseLighting must inherit property "className" with the proper type +PASS SVGElement interface: feDiffuseLighting must inherit property "dataset" with the proper type +PASS SVGElement interface: feDiffuseLighting must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: feDiffuseLighting must inherit property "viewportElement" with the proper type +PASS SVGElement interface: feDiffuseLighting must inherit property "tabIndex" with the proper type +PASS SVGElement interface: feDiffuseLighting must inherit property "focus()" with the proper type +PASS SVGElement interface: feDiffuseLighting must inherit property "blur()" with the proper type PASS SVGFEDistantLightElement interface: existence and properties of interface object PASS SVGFEDistantLightElement interface object length PASS SVGFEDistantLightElement interface object name @@ -2091,16 +2091,16 @@ PASS SVGFEPointLightElement interface: attribute z PASS SVGFEPointLightElement must be primary interface of fePointLight PASS Stringification of fePointLight -PASS SVGFEPointLightElement interface: fePointLight must inherit property "x" with the proper type (0) -PASS SVGFEPointLightElement interface: fePointLight must inherit property "y" with the proper type (1) -PASS SVGFEPointLightElement interface: fePointLight must inherit property "z" with the proper type (2) -PASS SVGElement interface: fePointLight must inherit property "className" with the proper type (0) -PASS SVGElement interface: fePointLight must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: fePointLight must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: fePointLight must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: fePointLight must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: fePointLight must inherit property "focus" with the proper type (5) -PASS SVGElement interface: fePointLight must inherit property "blur" with the proper type (6) +PASS SVGFEPointLightElement interface: fePointLight must inherit property "x" with the proper type +PASS SVGFEPointLightElement interface: fePointLight must inherit property "y" with the proper type +PASS SVGFEPointLightElement interface: fePointLight must inherit property "z" with the proper type +PASS SVGElement interface: fePointLight must inherit property "className" with the proper type +PASS SVGElement interface: fePointLight must inherit property "dataset" with the proper type +PASS SVGElement interface: fePointLight must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: fePointLight must inherit property "viewportElement" with the proper type +PASS SVGElement interface: fePointLight must inherit property "tabIndex" with the proper type +PASS SVGElement interface: fePointLight must inherit property "focus()" with the proper type +PASS SVGElement interface: fePointLight must inherit property "blur()" with the proper type PASS SVGFESpotLightElement interface: existence and properties of interface object PASS SVGFESpotLightElement interface object length PASS SVGFESpotLightElement interface object name @@ -2116,21 +2116,21 @@ PASS SVGFESpotLightElement interface: attribute limitingConeAngle PASS SVGFESpotLightElement must be primary interface of feSpotLight PASS Stringification of feSpotLight -PASS SVGFESpotLightElement interface: feSpotLight must inherit property "x" with the proper type (0) -PASS SVGFESpotLightElement interface: feSpotLight must inherit property "y" with the proper type (1) -PASS SVGFESpotLightElement interface: feSpotLight must inherit property "z" with the proper type (2) -PASS SVGFESpotLightElement interface: feSpotLight must inherit property "pointsAtX" with the proper type (3) -PASS SVGFESpotLightElement interface: feSpotLight must inherit property "pointsAtY" with the proper type (4) -PASS SVGFESpotLightElement interface: feSpotLight must inherit property "pointsAtZ" with the proper type (5) -PASS SVGFESpotLightElement interface: feSpotLight must inherit property "specularExponent" with the proper type (6) -PASS SVGFESpotLightElement interface: feSpotLight must inherit property "limitingConeAngle" with the proper type (7) -PASS SVGElement interface: feSpotLight must inherit property "className" with the proper type (0) -PASS SVGElement interface: feSpotLight must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: feSpotLight must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: feSpotLight must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: feSpotLight must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: feSpotLight must inherit property "focus" with the proper type (5) -PASS SVGElement interface: feSpotLight must inherit property "blur" with the proper type (6) +PASS SVGFESpotLightElement interface: feSpotLight must inherit property "x" with the proper type +PASS SVGFESpotLightElement interface: feSpotLight must inherit property "y" with the proper type +PASS SVGFESpotLightElement interface: feSpotLight must inherit property "z" with the proper type +PASS SVGFESpotLightElement interface: feSpotLight must inherit property "pointsAtX" with the proper type +PASS SVGFESpotLightElement interface: feSpotLight must inherit property "pointsAtY" with the proper type +PASS SVGFESpotLightElement interface: feSpotLight must inherit property "pointsAtZ" with the proper type +PASS SVGFESpotLightElement interface: feSpotLight must inherit property "specularExponent" with the proper type +PASS SVGFESpotLightElement interface: feSpotLight must inherit property "limitingConeAngle" with the proper type +PASS SVGElement interface: feSpotLight must inherit property "className" with the proper type +PASS SVGElement interface: feSpotLight must inherit property "dataset" with the proper type +PASS SVGElement interface: feSpotLight must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: feSpotLight must inherit property "viewportElement" with the proper type +PASS SVGElement interface: feSpotLight must inherit property "tabIndex" with the proper type +PASS SVGElement interface: feSpotLight must inherit property "focus()" with the proper type +PASS SVGElement interface: feSpotLight must inherit property "blur()" with the proper type PASS SVGFEDisplacementMapElement interface: existence and properties of interface object PASS SVGFEDisplacementMapElement interface object length PASS SVGFEDisplacementMapElement interface object name @@ -2158,28 +2158,28 @@ PASS SVGFEDisplacementMapElement interface: attribute result PASS SVGFEDisplacementMapElement must be primary interface of feDisplacementMap PASS Stringification of feDisplacementMap -PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "SVG_CHANNEL_UNKNOWN" with the proper type (0) -PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "SVG_CHANNEL_R" with the proper type (1) -PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "SVG_CHANNEL_G" with the proper type (2) -PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "SVG_CHANNEL_B" with the proper type (3) -PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "SVG_CHANNEL_A" with the proper type (4) -PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "in1" with the proper type (5) -PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "in2" with the proper type (6) -PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "scale" with the proper type (7) -PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "xChannelSelector" with the proper type (8) -PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "yChannelSelector" with the proper type (9) -PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "x" with the proper type (10) -PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "y" with the proper type (11) -PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "width" with the proper type (12) -PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "height" with the proper type (13) -PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "result" with the proper type (14) -PASS SVGElement interface: feDisplacementMap must inherit property "className" with the proper type (0) -PASS SVGElement interface: feDisplacementMap must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: feDisplacementMap must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: feDisplacementMap must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: feDisplacementMap must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: feDisplacementMap must inherit property "focus" with the proper type (5) -PASS SVGElement interface: feDisplacementMap must inherit property "blur" with the proper type (6) +PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "SVG_CHANNEL_UNKNOWN" with the proper type +PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "SVG_CHANNEL_R" with the proper type +PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "SVG_CHANNEL_G" with the proper type +PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "SVG_CHANNEL_B" with the proper type +PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "SVG_CHANNEL_A" with the proper type +PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "in1" with the proper type +PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "in2" with the proper type +PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "scale" with the proper type +PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "xChannelSelector" with the proper type +PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "yChannelSelector" with the proper type +PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "x" with the proper type +PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "y" with the proper type +PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "width" with the proper type +PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "height" with the proper type +PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "result" with the proper type +PASS SVGElement interface: feDisplacementMap must inherit property "className" with the proper type +PASS SVGElement interface: feDisplacementMap must inherit property "dataset" with the proper type +PASS SVGElement interface: feDisplacementMap must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: feDisplacementMap must inherit property "viewportElement" with the proper type +PASS SVGElement interface: feDisplacementMap must inherit property "tabIndex" with the proper type +PASS SVGElement interface: feDisplacementMap must inherit property "focus()" with the proper type +PASS SVGElement interface: feDisplacementMap must inherit property "blur()" with the proper type PASS SVGFEDropShadowElement interface: existence and properties of interface object PASS SVGFEDropShadowElement interface object length PASS SVGFEDropShadowElement interface object name @@ -2190,7 +2190,7 @@ PASS SVGFEDropShadowElement interface: attribute dy PASS SVGFEDropShadowElement interface: attribute stdDeviationX PASS SVGFEDropShadowElement interface: attribute stdDeviationY -PASS SVGFEDropShadowElement interface: operation setStdDeviation(float,float) +PASS SVGFEDropShadowElement interface: operation setStdDeviation(float, float) PASS SVGFEDropShadowElement interface: attribute x PASS SVGFEDropShadowElement interface: attribute y PASS SVGFEDropShadowElement interface: attribute width @@ -2198,25 +2198,25 @@ PASS SVGFEDropShadowElement interface: attribute result PASS SVGFEDropShadowElement must be primary interface of feDropShadow PASS Stringification of feDropShadow -PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "in1" with the proper type (0) -PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "dx" with the proper type (1) -PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "dy" with the proper type (2) -PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "stdDeviationX" with the proper type (3) -PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "stdDeviationY" with the proper type (4) -PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "setStdDeviation" with the proper type (5) -PASS SVGFEDropShadowElement interface: calling setStdDeviation(float,float) on feDropShadow with too few arguments must throw TypeError -PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "x" with the proper type (6) -PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "y" with the proper type (7) -PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "width" with the proper type (8) -PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "height" with the proper type (9) -PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "result" with the proper type (10) -PASS SVGElement interface: feDropShadow must inherit property "className" with the proper type (0) -PASS SVGElement interface: feDropShadow must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: feDropShadow must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: feDropShadow must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: feDropShadow must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: feDropShadow must inherit property "focus" with the proper type (5) -PASS SVGElement interface: feDropShadow must inherit property "blur" with the proper type (6) +PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "in1" with the proper type +PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "dx" with the proper type +PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "dy" with the proper type +PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "stdDeviationX" with the proper type +PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "stdDeviationY" with the proper type +PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "setStdDeviation(float, float)" with the proper type +PASS SVGFEDropShadowElement interface: calling setStdDeviation(float, float) on feDropShadow with too few arguments must throw TypeError +PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "x" with the proper type +PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "y" with the proper type +PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "width" with the proper type +PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "height" with the proper type +PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "result" with the proper type +PASS SVGElement interface: feDropShadow must inherit property "className" with the proper type +PASS SVGElement interface: feDropShadow must inherit property "dataset" with the proper type +PASS SVGElement interface: feDropShadow must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: feDropShadow must inherit property "viewportElement" with the proper type +PASS SVGElement interface: feDropShadow must inherit property "tabIndex" with the proper type +PASS SVGElement interface: feDropShadow must inherit property "focus()" with the proper type +PASS SVGElement interface: feDropShadow must inherit property "blur()" with the proper type PASS SVGFEFloodElement interface: existence and properties of interface object PASS SVGFEFloodElement interface object length PASS SVGFEFloodElement interface object name @@ -2229,18 +2229,18 @@ PASS SVGFEFloodElement interface: attribute result PASS SVGFEFloodElement must be primary interface of feFlood PASS Stringification of feFlood -PASS SVGFEFloodElement interface: feFlood must inherit property "x" with the proper type (0) -PASS SVGFEFloodElement interface: feFlood must inherit property "y" with the proper type (1) -PASS SVGFEFloodElement interface: feFlood must inherit property "width" with the proper type (2) -PASS SVGFEFloodElement interface: feFlood must inherit property "height" with the proper type (3) -PASS SVGFEFloodElement interface: feFlood must inherit property "result" with the proper type (4) -PASS SVGElement interface: feFlood must inherit property "className" with the proper type (0) -PASS SVGElement interface: feFlood must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: feFlood must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: feFlood must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: feFlood must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: feFlood must inherit property "focus" with the proper type (5) -PASS SVGElement interface: feFlood must inherit property "blur" with the proper type (6) +PASS SVGFEFloodElement interface: feFlood must inherit property "x" with the proper type +PASS SVGFEFloodElement interface: feFlood must inherit property "y" with the proper type +PASS SVGFEFloodElement interface: feFlood must inherit property "width" with the proper type +PASS SVGFEFloodElement interface: feFlood must inherit property "height" with the proper type +PASS SVGFEFloodElement interface: feFlood must inherit property "result" with the proper type +PASS SVGElement interface: feFlood must inherit property "className" with the proper type +PASS SVGElement interface: feFlood must inherit property "dataset" with the proper type +PASS SVGElement interface: feFlood must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: feFlood must inherit property "viewportElement" with the proper type +PASS SVGElement interface: feFlood must inherit property "tabIndex" with the proper type +PASS SVGElement interface: feFlood must inherit property "focus()" with the proper type +PASS SVGElement interface: feFlood must inherit property "blur()" with the proper type PASS SVGFEGaussianBlurElement interface: existence and properties of interface object PASS SVGFEGaussianBlurElement interface object length PASS SVGFEGaussianBlurElement interface object name @@ -2258,7 +2258,7 @@ PASS SVGFEGaussianBlurElement interface: attribute stdDeviationX PASS SVGFEGaussianBlurElement interface: attribute stdDeviationY FAIL SVGFEGaussianBlurElement interface: attribute edgeMode assert_true: The prototype object must have a property "edgeMode" expected true got false -PASS SVGFEGaussianBlurElement interface: operation setStdDeviation(float,float) +PASS SVGFEGaussianBlurElement interface: operation setStdDeviation(float, float) PASS SVGFEGaussianBlurElement interface: attribute x PASS SVGFEGaussianBlurElement interface: attribute y PASS SVGFEGaussianBlurElement interface: attribute width @@ -2266,28 +2266,28 @@ PASS SVGFEGaussianBlurElement interface: attribute result PASS SVGFEGaussianBlurElement must be primary interface of feGaussianBlur PASS Stringification of feGaussianBlur -FAIL SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "SVG_EDGEMODE_UNKNOWN" with the proper type (0) assert_inherits: property "SVG_EDGEMODE_UNKNOWN" not found in prototype chain -FAIL SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "SVG_EDGEMODE_DUPLICATE" with the proper type (1) assert_inherits: property "SVG_EDGEMODE_DUPLICATE" not found in prototype chain -FAIL SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "SVG_EDGEMODE_WRAP" with the proper type (2) assert_inherits: property "SVG_EDGEMODE_WRAP" not found in prototype chain -FAIL SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "SVG_EDGEMODE_NONE" with the proper type (3) assert_inherits: property "SVG_EDGEMODE_NONE" not found in prototype chain -PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "in1" with the proper type (4) -PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "stdDeviationX" with the proper type (5) -PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "stdDeviationY" with the proper type (6) -FAIL SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "edgeMode" with the proper type (7) assert_inherits: property "edgeMode" not found in prototype chain -PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "setStdDeviation" with the proper type (8) -PASS SVGFEGaussianBlurElement interface: calling setStdDeviation(float,float) on feGaussianBlur with too few arguments must throw TypeError -PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "x" with the proper type (9) -PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "y" with the proper type (10) -PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "width" with the proper type (11) -PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "height" with the proper type (12) -PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "result" with the proper type (13) -PASS SVGElement interface: feGaussianBlur must inherit property "className" with the proper type (0) -PASS SVGElement interface: feGaussianBlur must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: feGaussianBlur must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: feGaussianBlur must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: feGaussianBlur must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: feGaussianBlur must inherit property "focus" with the proper type (5) -PASS SVGElement interface: feGaussianBlur must inherit property "blur" with the proper type (6) +FAIL SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "SVG_EDGEMODE_UNKNOWN" with the proper type assert_inherits: property "SVG_EDGEMODE_UNKNOWN" not found in prototype chain +FAIL SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "SVG_EDGEMODE_DUPLICATE" with the proper type assert_inherits: property "SVG_EDGEMODE_DUPLICATE" not found in prototype chain +FAIL SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "SVG_EDGEMODE_WRAP" with the proper type assert_inherits: property "SVG_EDGEMODE_WRAP" not found in prototype chain +FAIL SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "SVG_EDGEMODE_NONE" with the proper type assert_inherits: property "SVG_EDGEMODE_NONE" not found in prototype chain +PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "in1" with the proper type +PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "stdDeviationX" with the proper type +PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "stdDeviationY" with the proper type +FAIL SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "edgeMode" with the proper type assert_inherits: property "edgeMode" not found in prototype chain +PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "setStdDeviation(float, float)" with the proper type +PASS SVGFEGaussianBlurElement interface: calling setStdDeviation(float, float) on feGaussianBlur with too few arguments must throw TypeError +PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "x" with the proper type +PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "y" with the proper type +PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "width" with the proper type +PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "height" with the proper type +PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "result" with the proper type +PASS SVGElement interface: feGaussianBlur must inherit property "className" with the proper type +PASS SVGElement interface: feGaussianBlur must inherit property "dataset" with the proper type +PASS SVGElement interface: feGaussianBlur must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: feGaussianBlur must inherit property "viewportElement" with the proper type +PASS SVGElement interface: feGaussianBlur must inherit property "tabIndex" with the proper type +PASS SVGElement interface: feGaussianBlur must inherit property "focus()" with the proper type +PASS SVGElement interface: feGaussianBlur must inherit property "blur()" with the proper type PASS SVGFEImageElement interface: existence and properties of interface object PASS SVGFEImageElement interface object length PASS SVGFEImageElement interface object name @@ -2303,21 +2303,21 @@ PASS SVGFEImageElement interface: attribute href PASS SVGFEImageElement must be primary interface of feImage PASS Stringification of feImage -PASS SVGFEImageElement interface: feImage must inherit property "preserveAspectRatio" with the proper type (0) -FAIL SVGFEImageElement interface: feImage must inherit property "crossOrigin" with the proper type (1) assert_inherits: property "crossOrigin" not found in prototype chain -PASS SVGFEImageElement interface: feImage must inherit property "x" with the proper type (2) -PASS SVGFEImageElement interface: feImage must inherit property "y" with the proper type (3) -PASS SVGFEImageElement interface: feImage must inherit property "width" with the proper type (4) -PASS SVGFEImageElement interface: feImage must inherit property "height" with the proper type (5) -PASS SVGFEImageElement interface: feImage must inherit property "result" with the proper type (6) -PASS SVGFEImageElement interface: feImage must inherit property "href" with the proper type (7) -PASS SVGElement interface: feImage must inherit property "className" with the proper type (0) -PASS SVGElement interface: feImage must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: feImage must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: feImage must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: feImage must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: feImage must inherit property "focus" with the proper type (5) -PASS SVGElement interface: feImage must inherit property "blur" with the proper type (6) +PASS SVGFEImageElement interface: feImage must inherit property "preserveAspectRatio" with the proper type +FAIL SVGFEImageElement interface: feImage must inherit property "crossOrigin" with the proper type assert_inherits: property "crossOrigin" not found in prototype chain +PASS SVGFEImageElement interface: feImage must inherit property "x" with the proper type +PASS SVGFEImageElement interface: feImage must inherit property "y" with the proper type +PASS SVGFEImageElement interface: feImage must inherit property "width" with the proper type +PASS SVGFEImageElement interface: feImage must inherit property "height" with the proper type +PASS SVGFEImageElement interface: feImage must inherit property "result" with the proper type +PASS SVGFEImageElement interface: feImage must inherit property "href" with the proper type +PASS SVGElement interface: feImage must inherit property "className" with the proper type +PASS SVGElement interface: feImage must inherit property "dataset" with the proper type +PASS SVGElement interface: feImage must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: feImage must inherit property "viewportElement" with the proper type +PASS SVGElement interface: feImage must inherit property "tabIndex" with the proper type +PASS SVGElement interface: feImage must inherit property "focus()" with the proper type +PASS SVGElement interface: feImage must inherit property "blur()" with the proper type PASS SVGFEMergeElement interface: existence and properties of interface object PASS SVGFEMergeElement interface object length PASS SVGFEMergeElement interface object name @@ -2330,18 +2330,18 @@ PASS SVGFEMergeElement interface: attribute result PASS SVGFEMergeElement must be primary interface of feMerge PASS Stringification of feMerge -PASS SVGFEMergeElement interface: feMerge must inherit property "x" with the proper type (0) -PASS SVGFEMergeElement interface: feMerge must inherit property "y" with the proper type (1) -PASS SVGFEMergeElement interface: feMerge must inherit property "width" with the proper type (2) -PASS SVGFEMergeElement interface: feMerge must inherit property "height" with the proper type (3) -PASS SVGFEMergeElement interface: feMerge must inherit property "result" with the proper type (4) -PASS SVGElement interface: feMerge must inherit property "className" with the proper type (0) -PASS SVGElement interface: feMerge must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: feMerge must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: feMerge must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: feMerge must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: feMerge must inherit property "focus" with the proper type (5) -PASS SVGElement interface: feMerge must inherit property "blur" with the proper type (6) +PASS SVGFEMergeElement interface: feMerge must inherit property "x" with the proper type +PASS SVGFEMergeElement interface: feMerge must inherit property "y" with the proper type +PASS SVGFEMergeElement interface: feMerge must inherit property "width" with the proper type +PASS SVGFEMergeElement interface: feMerge must inherit property "height" with the proper type +PASS SVGFEMergeElement interface: feMerge must inherit property "result" with the proper type +PASS SVGElement interface: feMerge must inherit property "className" with the proper type +PASS SVGElement interface: feMerge must inherit property "dataset" with the proper type +PASS SVGElement interface: feMerge must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: feMerge must inherit property "viewportElement" with the proper type +PASS SVGElement interface: feMerge must inherit property "tabIndex" with the proper type +PASS SVGElement interface: feMerge must inherit property "focus()" with the proper type +PASS SVGElement interface: feMerge must inherit property "blur()" with the proper type PASS SVGFEMergeNodeElement interface: existence and properties of interface object PASS SVGFEMergeNodeElement interface object length PASS SVGFEMergeNodeElement interface object name @@ -2350,14 +2350,14 @@ PASS SVGFEMergeNodeElement interface: attribute in1 PASS SVGFEMergeNodeElement must be primary interface of feMergeNode PASS Stringification of feMergeNode -PASS SVGFEMergeNodeElement interface: feMergeNode must inherit property "in1" with the proper type (0) -PASS SVGElement interface: feMergeNode must inherit property "className" with the proper type (0) -PASS SVGElement interface: feMergeNode must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: feMergeNode must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: feMergeNode must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: feMergeNode must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: feMergeNode must inherit property "focus" with the proper type (5) -PASS SVGElement interface: feMergeNode must inherit property "blur" with the proper type (6) +PASS SVGFEMergeNodeElement interface: feMergeNode must inherit property "in1" with the proper type +PASS SVGElement interface: feMergeNode must inherit property "className" with the proper type +PASS SVGElement interface: feMergeNode must inherit property "dataset" with the proper type +PASS SVGElement interface: feMergeNode must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: feMergeNode must inherit property "viewportElement" with the proper type +PASS SVGElement interface: feMergeNode must inherit property "tabIndex" with the proper type +PASS SVGElement interface: feMergeNode must inherit property "focus()" with the proper type +PASS SVGElement interface: feMergeNode must inherit property "blur()" with the proper type PASS SVGFEMorphologyElement interface: existence and properties of interface object PASS SVGFEMorphologyElement interface object length PASS SVGFEMorphologyElement interface object name @@ -2380,25 +2380,25 @@ PASS SVGFEMorphologyElement interface: attribute result PASS SVGFEMorphologyElement must be primary interface of feMorphology PASS Stringification of feMorphology -PASS SVGFEMorphologyElement interface: feMorphology must inherit property "SVG_MORPHOLOGY_OPERATOR_UNKNOWN" with the proper type (0) -PASS SVGFEMorphologyElement interface: feMorphology must inherit property "SVG_MORPHOLOGY_OPERATOR_ERODE" with the proper type (1) -PASS SVGFEMorphologyElement interface: feMorphology must inherit property "SVG_MORPHOLOGY_OPERATOR_DILATE" with the proper type (2) -PASS SVGFEMorphologyElement interface: feMorphology must inherit property "in1" with the proper type (3) -PASS SVGFEMorphologyElement interface: feMorphology must inherit property "operator" with the proper type (4) -PASS SVGFEMorphologyElement interface: feMorphology must inherit property "radiusX" with the proper type (5) -PASS SVGFEMorphologyElement interface: feMorphology must inherit property "radiusY" with the proper type (6) -PASS SVGFEMorphologyElement interface: feMorphology must inherit property "x" with the proper type (7) -PASS SVGFEMorphologyElement interface: feMorphology must inherit property "y" with the proper type (8) -PASS SVGFEMorphologyElement interface: feMorphology must inherit property "width" with the proper type (9) -PASS SVGFEMorphologyElement interface: feMorphology must inherit property "height" with the proper type (10) -PASS SVGFEMorphologyElement interface: feMorphology must inherit property "result" with the proper type (11) -PASS SVGElement interface: feMorphology must inherit property "className" with the proper type (0) -PASS SVGElement interface: feMorphology must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: feMorphology must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: feMorphology must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: feMorphology must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: feMorphology must inherit property "focus" with the proper type (5) -PASS SVGElement interface: feMorphology must inherit property "blur" with the proper type (6) +PASS SVGFEMorphologyElement interface: feMorphology must inherit property "SVG_MORPHOLOGY_OPERATOR_UNKNOWN" with the proper type +PASS SVGFEMorphologyElement interface: feMorphology must inherit property "SVG_MORPHOLOGY_OPERATOR_ERODE" with the proper type +PASS SVGFEMorphologyElement interface: feMorphology must inherit property "SVG_MORPHOLOGY_OPERATOR_DILATE" with the proper type +PASS SVGFEMorphologyElement interface: feMorphology must inherit property "in1" with the proper type +PASS SVGFEMorphologyElement interface: feMorphology must inherit property "operator" with the proper type +PASS SVGFEMorphologyElement interface: feMorphology must inherit property "radiusX" with the proper type +PASS SVGFEMorphologyElement interface: feMorphology must inherit property "radiusY" with the proper type +PASS SVGFEMorphologyElement interface: feMorphology must inherit property "x" with the proper type +PASS SVGFEMorphologyElement interface: feMorphology must inherit property "y" with the proper type +PASS SVGFEMorphologyElement interface: feMorphology must inherit property "width" with the proper type +PASS SVGFEMorphologyElement interface: feMorphology must inherit property "height" with the proper type +PASS SVGFEMorphologyElement interface: feMorphology must inherit property "result" with the proper type +PASS SVGElement interface: feMorphology must inherit property "className" with the proper type +PASS SVGElement interface: feMorphology must inherit property "dataset" with the proper type +PASS SVGElement interface: feMorphology must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: feMorphology must inherit property "viewportElement" with the proper type +PASS SVGElement interface: feMorphology must inherit property "tabIndex" with the proper type +PASS SVGElement interface: feMorphology must inherit property "focus()" with the proper type +PASS SVGElement interface: feMorphology must inherit property "blur()" with the proper type PASS SVGFEOffsetElement interface: existence and properties of interface object PASS SVGFEOffsetElement interface object length PASS SVGFEOffsetElement interface object name @@ -2430,24 +2430,24 @@ PASS SVGFESpecularLightingElement interface: attribute result PASS SVGFESpecularLightingElement must be primary interface of feSpecularLighting PASS Stringification of feSpecularLighting -PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "in1" with the proper type (0) -PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "surfaceScale" with the proper type (1) -PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "specularConstant" with the proper type (2) -PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "specularExponent" with the proper type (3) -PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "kernelUnitLengthX" with the proper type (4) -PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "kernelUnitLengthY" with the proper type (5) -PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "x" with the proper type (6) -PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "y" with the proper type (7) -PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "width" with the proper type (8) -PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "height" with the proper type (9) -PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "result" with the proper type (10) -PASS SVGElement interface: feSpecularLighting must inherit property "className" with the proper type (0) -PASS SVGElement interface: feSpecularLighting must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: feSpecularLighting must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: feSpecularLighting must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: feSpecularLighting must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: feSpecularLighting must inherit property "focus" with the proper type (5) -PASS SVGElement interface: feSpecularLighting must inherit property "blur" with the proper type (6) +PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "in1" with the proper type +PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "surfaceScale" with the proper type +PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "specularConstant" with the proper type +PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "specularExponent" with the proper type +PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "kernelUnitLengthX" with the proper type +PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "kernelUnitLengthY" with the proper type +PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "x" with the proper type +PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "y" with the proper type +PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "width" with the proper type +PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "height" with the proper type +PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "result" with the proper type +PASS SVGElement interface: feSpecularLighting must inherit property "className" with the proper type +PASS SVGElement interface: feSpecularLighting must inherit property "dataset" with the proper type +PASS SVGElement interface: feSpecularLighting must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: feSpecularLighting must inherit property "viewportElement" with the proper type +PASS SVGElement interface: feSpecularLighting must inherit property "tabIndex" with the proper type +PASS SVGElement interface: feSpecularLighting must inherit property "focus()" with the proper type +PASS SVGElement interface: feSpecularLighting must inherit property "blur()" with the proper type PASS SVGFETileElement interface: existence and properties of interface object PASS SVGFETileElement interface object length PASS SVGFETileElement interface object name @@ -2461,19 +2461,19 @@ PASS SVGFETileElement interface: attribute result PASS SVGFETileElement must be primary interface of feTile PASS Stringification of feTile -PASS SVGFETileElement interface: feTile must inherit property "in1" with the proper type (0) -PASS SVGFETileElement interface: feTile must inherit property "x" with the proper type (1) -PASS SVGFETileElement interface: feTile must inherit property "y" with the proper type (2) -PASS SVGFETileElement interface: feTile must inherit property "width" with the proper type (3) -PASS SVGFETileElement interface: feTile must inherit property "height" with the proper type (4) -PASS SVGFETileElement interface: feTile must inherit property "result" with the proper type (5) -PASS SVGElement interface: feTile must inherit property "className" with the proper type (0) -PASS SVGElement interface: feTile must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: feTile must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: feTile must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: feTile must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: feTile must inherit property "focus" with the proper type (5) -PASS SVGElement interface: feTile must inherit property "blur" with the proper type (6) +PASS SVGFETileElement interface: feTile must inherit property "in1" with the proper type +PASS SVGFETileElement interface: feTile must inherit property "x" with the proper type +PASS SVGFETileElement interface: feTile must inherit property "y" with the proper type +PASS SVGFETileElement interface: feTile must inherit property "width" with the proper type +PASS SVGFETileElement interface: feTile must inherit property "height" with the proper type +PASS SVGFETileElement interface: feTile must inherit property "result" with the proper type +PASS SVGElement interface: feTile must inherit property "className" with the proper type +PASS SVGElement interface: feTile must inherit property "dataset" with the proper type +PASS SVGElement interface: feTile must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: feTile must inherit property "viewportElement" with the proper type +PASS SVGElement interface: feTile must inherit property "tabIndex" with the proper type +PASS SVGElement interface: feTile must inherit property "focus()" with the proper type +PASS SVGElement interface: feTile must inherit property "blur()" with the proper type PASS SVGFETurbulenceElement interface: existence and properties of interface object PASS SVGFETurbulenceElement interface object length PASS SVGFETurbulenceElement interface object name @@ -2504,29 +2504,29 @@ PASS SVGFETurbulenceElement interface: attribute result PASS SVGFETurbulenceElement must be primary interface of feTurbulence PASS Stringification of feTurbulence -PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "SVG_TURBULENCE_TYPE_UNKNOWN" with the proper type (0) -PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "SVG_TURBULENCE_TYPE_FRACTALNOISE" with the proper type (1) -PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "SVG_TURBULENCE_TYPE_TURBULENCE" with the proper type (2) -PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "SVG_STITCHTYPE_UNKNOWN" with the proper type (3) -PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "SVG_STITCHTYPE_STITCH" with the proper type (4) -PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "SVG_STITCHTYPE_NOSTITCH" with the proper type (5) -PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "baseFrequencyX" with the proper type (6) -PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "baseFrequencyY" with the proper type (7) -PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "numOctaves" with the proper type (8) -PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "seed" with the proper type (9) -PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "stitchTiles" with the proper type (10) -PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "type" with the proper type (11) -PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "x" with the proper type (12) -PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "y" with the proper type (13) -PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "width" with the proper type (14) -PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "height" with the proper type (15) -PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "result" with the proper type (16) -PASS SVGElement interface: feTurbulence must inherit property "className" with the proper type (0) -PASS SVGElement interface: feTurbulence must inherit property "dataset" with the proper type (1) -PASS SVGElement interface: feTurbulence must inherit property "ownerSVGElement" with the proper type (2) -PASS SVGElement interface: feTurbulence must inherit property "viewportElement" with the proper type (3) -PASS SVGElement interface: feTurbulence must inherit property "tabIndex" with the proper type (4) -PASS SVGElement interface: feTurbulence must inherit property "focus" with the proper type (5) -PASS SVGElement interface: feTurbulence must inherit property "blur" with the proper type (6) +PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "SVG_TURBULENCE_TYPE_UNKNOWN" with the proper type +PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "SVG_TURBULENCE_TYPE_FRACTALNOISE" with the proper type +PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "SVG_TURBULENCE_TYPE_TURBULENCE" with the proper type +PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "SVG_STITCHTYPE_UNKNOWN" with the proper type +PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "SVG_STITCHTYPE_STITCH" with the proper type +PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "SVG_STITCHTYPE_NOSTITCH" with the proper type +PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "baseFrequencyX" with the proper type +PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "baseFrequencyY" with the proper type +PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "numOctaves" with the proper type +PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "seed" with the proper type +PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "stitchTiles" with the proper type +PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "type" with the proper type +PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "x" with the proper type +PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "y" with the proper type +PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "width" with the proper type +PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "height" with the proper type +PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "result" with the proper type +PASS SVGElement interface: feTurbulence must inherit property "className" with the proper type +PASS SVGElement interface: feTurbulence must inherit property "dataset" with the proper type +PASS SVGElement interface: feTurbulence must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: feTurbulence must inherit property "viewportElement" with the proper type +PASS SVGElement interface: feTurbulence must inherit property "tabIndex" with the proper type +PASS SVGElement interface: feTurbulence must inherit property "focus()" with the proper type +PASS SVGElement interface: feTurbulence must inherit property "blur()" with the proper type Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/url/interfaces.any-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/url/interfaces.any-expected.txt index 4c167d6..979aeda 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/url/interfaces.any-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/url/interfaces.any-expected.txt
@@ -22,30 +22,30 @@ FAIL URL interface: operation toJSON() assert_own_property: interface prototype object missing non-static operation expected property "toJSON" missing PASS URL must be primary interface of new URL("http://foo") PASS Stringification of new URL("http://foo") -PASS URL interface: new URL("http://foo") must inherit property "href" with the proper type (0) -PASS URL interface: new URL("http://foo") must inherit property "origin" with the proper type (1) -PASS URL interface: new URL("http://foo") must inherit property "protocol" with the proper type (2) -PASS URL interface: new URL("http://foo") must inherit property "username" with the proper type (3) -PASS URL interface: new URL("http://foo") must inherit property "password" with the proper type (4) -PASS URL interface: new URL("http://foo") must inherit property "host" with the proper type (5) -PASS URL interface: new URL("http://foo") must inherit property "hostname" with the proper type (6) -PASS URL interface: new URL("http://foo") must inherit property "port" with the proper type (7) -PASS URL interface: new URL("http://foo") must inherit property "pathname" with the proper type (8) -PASS URL interface: new URL("http://foo") must inherit property "search" with the proper type (9) -PASS URL interface: new URL("http://foo") must inherit property "searchParams" with the proper type (10) -PASS URL interface: new URL("http://foo") must inherit property "hash" with the proper type (11) -FAIL URL interface: new URL("http://foo") must inherit property "toJSON" with the proper type (12) assert_inherits: property "toJSON" not found in prototype chain +PASS URL interface: new URL("http://foo") must inherit property "href" with the proper type +PASS URL interface: new URL("http://foo") must inherit property "origin" with the proper type +PASS URL interface: new URL("http://foo") must inherit property "protocol" with the proper type +PASS URL interface: new URL("http://foo") must inherit property "username" with the proper type +PASS URL interface: new URL("http://foo") must inherit property "password" with the proper type +PASS URL interface: new URL("http://foo") must inherit property "host" with the proper type +PASS URL interface: new URL("http://foo") must inherit property "hostname" with the proper type +PASS URL interface: new URL("http://foo") must inherit property "port" with the proper type +PASS URL interface: new URL("http://foo") must inherit property "pathname" with the proper type +PASS URL interface: new URL("http://foo") must inherit property "search" with the proper type +PASS URL interface: new URL("http://foo") must inherit property "searchParams" with the proper type +PASS URL interface: new URL("http://foo") must inherit property "hash" with the proper type +FAIL URL interface: new URL("http://foo") must inherit property "toJSON()" with the proper type assert_inherits: property "toJSON" not found in prototype chain PASS URLSearchParams interface: existence and properties of interface object PASS URLSearchParams interface object length PASS URLSearchParams interface object name PASS URLSearchParams interface: existence and properties of interface prototype object PASS URLSearchParams interface: existence and properties of interface prototype object's "constructor" property -PASS URLSearchParams interface: operation append(USVString,USVString) +PASS URLSearchParams interface: operation append(USVString, USVString) PASS URLSearchParams interface: operation delete(USVString) PASS URLSearchParams interface: operation get(USVString) PASS URLSearchParams interface: operation getAll(USVString) PASS URLSearchParams interface: operation has(USVString) -PASS URLSearchParams interface: operation set(USVString,USVString) +PASS URLSearchParams interface: operation set(USVString, USVString) PASS URLSearchParams interface: operation sort() PASS Testing Symbol.iterator property of iterable interface URLSearchParams PASS Testing pair iterable interface URLSearchParams @@ -53,26 +53,26 @@ PASS URLSearchParams interface: operation entries() PASS URLSearchParams interface: operation keys() PASS URLSearchParams interface: operation values() -PASS URLSearchParams interface: operation forEach(function,any) +PASS URLSearchParams interface: operation forEach(function, any) PASS URLSearchParams must be primary interface of new URLSearchParams("hi=there&thank=you") PASS Stringification of new URLSearchParams("hi=there&thank=you") -PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "append" with the proper type (0) -PASS URLSearchParams interface: calling append(USVString,USVString) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError -PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "delete" with the proper type (1) +PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "append(USVString, USVString)" with the proper type +PASS URLSearchParams interface: calling append(USVString, USVString) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError +PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "delete(USVString)" with the proper type PASS URLSearchParams interface: calling delete(USVString) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError -PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "get" with the proper type (2) +PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "get(USVString)" with the proper type PASS URLSearchParams interface: calling get(USVString) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError -PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "getAll" with the proper type (3) +PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "getAll(USVString)" with the proper type PASS URLSearchParams interface: calling getAll(USVString) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError -PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "has" with the proper type (4) +PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "has(USVString)" with the proper type PASS URLSearchParams interface: calling has(USVString) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError -PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "set" with the proper type (5) -PASS URLSearchParams interface: calling set(USVString,USVString) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError -PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "sort" with the proper type (6) -PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "entries" with the proper type (9) -PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "keys" with the proper type (10) -PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "values" with the proper type (11) -PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "forEach" with the proper type (12) -PASS URLSearchParams interface: calling forEach(function,any) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError +PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "set(USVString, USVString)" with the proper type +PASS URLSearchParams interface: calling set(USVString, USVString) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError +PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "sort()" with the proper type +PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "entries()" with the proper type +PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "keys()" with the proper type +PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "values()" with the proper type +PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "forEach(function, any)" with the proper type +PASS URLSearchParams interface: calling forEach(function, any) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/url/interfaces.any.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/url/interfaces.any.worker-expected.txt index 4c167d6..979aeda 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/url/interfaces.any.worker-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/url/interfaces.any.worker-expected.txt
@@ -22,30 +22,30 @@ FAIL URL interface: operation toJSON() assert_own_property: interface prototype object missing non-static operation expected property "toJSON" missing PASS URL must be primary interface of new URL("http://foo") PASS Stringification of new URL("http://foo") -PASS URL interface: new URL("http://foo") must inherit property "href" with the proper type (0) -PASS URL interface: new URL("http://foo") must inherit property "origin" with the proper type (1) -PASS URL interface: new URL("http://foo") must inherit property "protocol" with the proper type (2) -PASS URL interface: new URL("http://foo") must inherit property "username" with the proper type (3) -PASS URL interface: new URL("http://foo") must inherit property "password" with the proper type (4) -PASS URL interface: new URL("http://foo") must inherit property "host" with the proper type (5) -PASS URL interface: new URL("http://foo") must inherit property "hostname" with the proper type (6) -PASS URL interface: new URL("http://foo") must inherit property "port" with the proper type (7) -PASS URL interface: new URL("http://foo") must inherit property "pathname" with the proper type (8) -PASS URL interface: new URL("http://foo") must inherit property "search" with the proper type (9) -PASS URL interface: new URL("http://foo") must inherit property "searchParams" with the proper type (10) -PASS URL interface: new URL("http://foo") must inherit property "hash" with the proper type (11) -FAIL URL interface: new URL("http://foo") must inherit property "toJSON" with the proper type (12) assert_inherits: property "toJSON" not found in prototype chain +PASS URL interface: new URL("http://foo") must inherit property "href" with the proper type +PASS URL interface: new URL("http://foo") must inherit property "origin" with the proper type +PASS URL interface: new URL("http://foo") must inherit property "protocol" with the proper type +PASS URL interface: new URL("http://foo") must inherit property "username" with the proper type +PASS URL interface: new URL("http://foo") must inherit property "password" with the proper type +PASS URL interface: new URL("http://foo") must inherit property "host" with the proper type +PASS URL interface: new URL("http://foo") must inherit property "hostname" with the proper type +PASS URL interface: new URL("http://foo") must inherit property "port" with the proper type +PASS URL interface: new URL("http://foo") must inherit property "pathname" with the proper type +PASS URL interface: new URL("http://foo") must inherit property "search" with the proper type +PASS URL interface: new URL("http://foo") must inherit property "searchParams" with the proper type +PASS URL interface: new URL("http://foo") must inherit property "hash" with the proper type +FAIL URL interface: new URL("http://foo") must inherit property "toJSON()" with the proper type assert_inherits: property "toJSON" not found in prototype chain PASS URLSearchParams interface: existence and properties of interface object PASS URLSearchParams interface object length PASS URLSearchParams interface object name PASS URLSearchParams interface: existence and properties of interface prototype object PASS URLSearchParams interface: existence and properties of interface prototype object's "constructor" property -PASS URLSearchParams interface: operation append(USVString,USVString) +PASS URLSearchParams interface: operation append(USVString, USVString) PASS URLSearchParams interface: operation delete(USVString) PASS URLSearchParams interface: operation get(USVString) PASS URLSearchParams interface: operation getAll(USVString) PASS URLSearchParams interface: operation has(USVString) -PASS URLSearchParams interface: operation set(USVString,USVString) +PASS URLSearchParams interface: operation set(USVString, USVString) PASS URLSearchParams interface: operation sort() PASS Testing Symbol.iterator property of iterable interface URLSearchParams PASS Testing pair iterable interface URLSearchParams @@ -53,26 +53,26 @@ PASS URLSearchParams interface: operation entries() PASS URLSearchParams interface: operation keys() PASS URLSearchParams interface: operation values() -PASS URLSearchParams interface: operation forEach(function,any) +PASS URLSearchParams interface: operation forEach(function, any) PASS URLSearchParams must be primary interface of new URLSearchParams("hi=there&thank=you") PASS Stringification of new URLSearchParams("hi=there&thank=you") -PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "append" with the proper type (0) -PASS URLSearchParams interface: calling append(USVString,USVString) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError -PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "delete" with the proper type (1) +PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "append(USVString, USVString)" with the proper type +PASS URLSearchParams interface: calling append(USVString, USVString) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError +PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "delete(USVString)" with the proper type PASS URLSearchParams interface: calling delete(USVString) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError -PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "get" with the proper type (2) +PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "get(USVString)" with the proper type PASS URLSearchParams interface: calling get(USVString) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError -PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "getAll" with the proper type (3) +PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "getAll(USVString)" with the proper type PASS URLSearchParams interface: calling getAll(USVString) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError -PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "has" with the proper type (4) +PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "has(USVString)" with the proper type PASS URLSearchParams interface: calling has(USVString) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError -PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "set" with the proper type (5) -PASS URLSearchParams interface: calling set(USVString,USVString) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError -PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "sort" with the proper type (6) -PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "entries" with the proper type (9) -PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "keys" with the proper type (10) -PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "values" with the proper type (11) -PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "forEach" with the proper type (12) -PASS URLSearchParams interface: calling forEach(function,any) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError +PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "set(USVString, USVString)" with the proper type +PASS URLSearchParams interface: calling set(USVString, USVString) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError +PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "sort()" with the proper type +PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "entries()" with the proper type +PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "keys()" with the proper type +PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "values()" with the proper type +PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "forEach(function, any)" with the proper type +PASS URLSearchParams interface: calling forEach(function, any) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/Animation/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/Animation/idlharness-expected.txt index bf19b27..6406a33 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/Animation/idlharness-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/Animation/idlharness-expected.txt
@@ -23,21 +23,21 @@ PASS Animation interface: operation reverse() PASS Animation must be primary interface of new Animation() PASS Stringification of new Animation() -PASS Animation interface: new Animation() must inherit property "id" with the proper type (0) -PASS Animation interface: new Animation() must inherit property "effect" with the proper type (1) -PASS Animation interface: new Animation() must inherit property "timeline" with the proper type (2) -PASS Animation interface: new Animation() must inherit property "startTime" with the proper type (3) -PASS Animation interface: new Animation() must inherit property "currentTime" with the proper type (4) -PASS Animation interface: new Animation() must inherit property "playbackRate" with the proper type (5) -PASS Animation interface: new Animation() must inherit property "playState" with the proper type (6) -PASS Animation interface: new Animation() must inherit property "ready" with the proper type (7) -PASS Animation interface: new Animation() must inherit property "finished" with the proper type (8) -PASS Animation interface: new Animation() must inherit property "onfinish" with the proper type (9) -PASS Animation interface: new Animation() must inherit property "oncancel" with the proper type (10) -PASS Animation interface: new Animation() must inherit property "cancel" with the proper type (11) -PASS Animation interface: new Animation() must inherit property "finish" with the proper type (12) -PASS Animation interface: new Animation() must inherit property "play" with the proper type (13) -PASS Animation interface: new Animation() must inherit property "pause" with the proper type (14) -PASS Animation interface: new Animation() must inherit property "reverse" with the proper type (15) +PASS Animation interface: new Animation() must inherit property "id" with the proper type +PASS Animation interface: new Animation() must inherit property "effect" with the proper type +PASS Animation interface: new Animation() must inherit property "timeline" with the proper type +PASS Animation interface: new Animation() must inherit property "startTime" with the proper type +PASS Animation interface: new Animation() must inherit property "currentTime" with the proper type +PASS Animation interface: new Animation() must inherit property "playbackRate" with the proper type +PASS Animation interface: new Animation() must inherit property "playState" with the proper type +PASS Animation interface: new Animation() must inherit property "ready" with the proper type +PASS Animation interface: new Animation() must inherit property "finished" with the proper type +PASS Animation interface: new Animation() must inherit property "onfinish" with the proper type +PASS Animation interface: new Animation() must inherit property "oncancel" with the proper type +PASS Animation interface: new Animation() must inherit property "cancel()" with the proper type +PASS Animation interface: new Animation() must inherit property "finish()" with the proper type +PASS Animation interface: new Animation() must inherit property "play()" with the proper type +PASS Animation interface: new Animation() must inherit property "pause()" with the proper type +PASS Animation interface: new Animation() must inherit property "reverse()" with the proper type Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-idl-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-idl-expected.txt index 9627ae4..fdf8b29 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-idl-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-idl-expected.txt
@@ -33,106 +33,106 @@ PASS RTCPeerConnection interface: attribute onsignalingstatechange PASS RTCPeerConnection interface: attribute oniceconnectionstatechange PASS RTCPeerConnection interface: attribute onicegatheringstatechange -FAIL RTCPeerConnection interface: operation createOffer(RTCSessionDescriptionCallback,RTCPeerConnectionErrorCallback,RTCOfferOptions) assert_throws: calling operation with this = null didn't throw TypeError function "function () { +FAIL RTCPeerConnection interface: operation createOffer(RTCSessionDescriptionCallback, RTCPeerConnectionErrorCallback, RTCOfferOptions) assert_throws: calling operation with this = null didn't throw TypeError function "function () { fn.apply(obj, args); }" did not throw -FAIL RTCPeerConnection interface: operation setLocalDescription(RTCSessionDescription,VoidFunction,RTCPeerConnectionErrorCallback) assert_throws: calling operation with this = null didn't throw TypeError function "function () { +FAIL RTCPeerConnection interface: operation setLocalDescription(RTCSessionDescription, VoidFunction, RTCPeerConnectionErrorCallback) assert_throws: calling operation with this = null didn't throw TypeError function "function () { fn.apply(obj, args); }" did not throw -FAIL RTCPeerConnection interface: operation createAnswer(RTCSessionDescriptionCallback,RTCPeerConnectionErrorCallback) assert_throws: calling operation with this = null didn't throw TypeError function "function () { +FAIL RTCPeerConnection interface: operation createAnswer(RTCSessionDescriptionCallback, RTCPeerConnectionErrorCallback) assert_throws: calling operation with this = null didn't throw TypeError function "function () { fn.apply(obj, args); }" did not throw -FAIL RTCPeerConnection interface: operation setRemoteDescription(RTCSessionDescription,VoidFunction,RTCPeerConnectionErrorCallback) assert_throws: calling operation with this = null didn't throw TypeError function "function () { +FAIL RTCPeerConnection interface: operation setRemoteDescription(RTCSessionDescription, VoidFunction, RTCPeerConnectionErrorCallback) assert_throws: calling operation with this = null didn't throw TypeError function "function () { fn.apply(obj, args); }" did not throw -FAIL RTCPeerConnection interface: operation addIceCandidate(RTCIceCandidate,VoidFunction,RTCPeerConnectionErrorCallback) assert_throws: calling operation with this = null didn't throw TypeError function "function () { +FAIL RTCPeerConnection interface: operation addIceCandidate(RTCIceCandidate, VoidFunction, RTCPeerConnectionErrorCallback) assert_throws: calling operation with this = null didn't throw TypeError function "function () { fn.apply(obj, args); }" did not throw -FAIL RTCPeerConnection interface: operation getStats(MediaStreamTrack,RTCStatsCallback,RTCPeerConnectionErrorCallback) assert_throws: calling operation with this = null didn't throw TypeError function "function () { +FAIL RTCPeerConnection interface: operation getStats(MediaStreamTrack, RTCStatsCallback, RTCPeerConnectionErrorCallback) assert_throws: calling operation with this = null didn't throw TypeError function "function () { fn.apply(obj, args); }" did not throw PASS RTCPeerConnection interface: operation generateCertificate(AlgorithmIdentifier) PASS RTCPeerConnection interface: operation getSenders() PASS RTCPeerConnection interface: operation getReceivers() -PASS RTCPeerConnection interface: operation addTrack(MediaStreamTrack,MediaStream) +PASS RTCPeerConnection interface: operation addTrack(MediaStreamTrack, MediaStream) PASS RTCPeerConnection interface: operation removeTrack(RTCRtpSender) FAIL RTCPeerConnection interface: attribute ontrack assert_true: The prototype object must have a property "ontrack" expected true got false -PASS RTCPeerConnection interface: operation createDataChannel(DOMString,RTCDataChannelInit) +PASS RTCPeerConnection interface: operation createDataChannel(DOMString, RTCDataChannelInit) PASS RTCPeerConnection interface: attribute ondatachannel FAIL RTCPeerConnection interface: attribute dtmf assert_true: The prototype object must have a property "dtmf" expected true got false PASS RTCPeerConnection interface: operation getStats(MediaStreamTrack) -FAIL RTCPeerConnection interface: operation setIdentityProvider(DOMString,DOMString,DOMString) assert_own_property: interface prototype object missing non-static operation expected property "setIdentityProvider" missing +FAIL RTCPeerConnection interface: operation setIdentityProvider(DOMString, DOMString, DOMString) assert_own_property: interface prototype object missing non-static operation expected property "setIdentityProvider" missing FAIL RTCPeerConnection interface: operation getIdentityAssertion() assert_own_property: interface prototype object missing non-static operation expected property "getIdentityAssertion" missing FAIL RTCPeerConnection interface: attribute peerIdentity assert_true: The prototype object must have a property "peerIdentity" expected true got false FAIL RTCPeerConnection interface: attribute idpLoginUrl assert_true: The prototype object must have a property "idpLoginUrl" expected true got false PASS RTCPeerConnection must be primary interface of pc PASS Stringification of pc -PASS RTCPeerConnection interface: pc must inherit property "createOffer" with the proper type (0) +PASS RTCPeerConnection interface: pc must inherit property "createOffer(RTCOfferOptions)" with the proper type PASS RTCPeerConnection interface: calling createOffer(RTCOfferOptions) on pc with too few arguments must throw TypeError -PASS RTCPeerConnection interface: pc must inherit property "createAnswer" with the proper type (1) +PASS RTCPeerConnection interface: pc must inherit property "createAnswer(RTCAnswerOptions)" with the proper type PASS RTCPeerConnection interface: calling createAnswer(RTCAnswerOptions) on pc with too few arguments must throw TypeError -PASS RTCPeerConnection interface: pc must inherit property "setLocalDescription" with the proper type (2) +PASS RTCPeerConnection interface: pc must inherit property "setLocalDescription(RTCSessionDescription)" with the proper type PASS RTCPeerConnection interface: calling setLocalDescription(RTCSessionDescription) on pc with too few arguments must throw TypeError -PASS RTCPeerConnection interface: pc must inherit property "localDescription" with the proper type (3) -FAIL RTCPeerConnection interface: pc must inherit property "currentLocalDescription" with the proper type (4) assert_inherits: property "currentLocalDescription" not found in prototype chain -FAIL RTCPeerConnection interface: pc must inherit property "pendingLocalDescription" with the proper type (5) assert_inherits: property "pendingLocalDescription" not found in prototype chain -PASS RTCPeerConnection interface: pc must inherit property "setRemoteDescription" with the proper type (6) +PASS RTCPeerConnection interface: pc must inherit property "localDescription" with the proper type +FAIL RTCPeerConnection interface: pc must inherit property "currentLocalDescription" with the proper type assert_inherits: property "currentLocalDescription" not found in prototype chain +FAIL RTCPeerConnection interface: pc must inherit property "pendingLocalDescription" with the proper type assert_inherits: property "pendingLocalDescription" not found in prototype chain +PASS RTCPeerConnection interface: pc must inherit property "setRemoteDescription(RTCSessionDescription)" with the proper type PASS RTCPeerConnection interface: calling setRemoteDescription(RTCSessionDescription) on pc with too few arguments must throw TypeError -PASS RTCPeerConnection interface: pc must inherit property "remoteDescription" with the proper type (7) -FAIL RTCPeerConnection interface: pc must inherit property "currentRemoteDescription" with the proper type (8) assert_inherits: property "currentRemoteDescription" not found in prototype chain -FAIL RTCPeerConnection interface: pc must inherit property "pendingRemoteDescription" with the proper type (9) assert_inherits: property "pendingRemoteDescription" not found in prototype chain -PASS RTCPeerConnection interface: pc must inherit property "addIceCandidate" with the proper type (10) +PASS RTCPeerConnection interface: pc must inherit property "remoteDescription" with the proper type +FAIL RTCPeerConnection interface: pc must inherit property "currentRemoteDescription" with the proper type assert_inherits: property "currentRemoteDescription" not found in prototype chain +FAIL RTCPeerConnection interface: pc must inherit property "pendingRemoteDescription" with the proper type assert_inherits: property "pendingRemoteDescription" not found in prototype chain +PASS RTCPeerConnection interface: pc must inherit property "addIceCandidate(RTCIceCandidate)" with the proper type PASS RTCPeerConnection interface: calling addIceCandidate(RTCIceCandidate) on pc with too few arguments must throw TypeError -FAIL RTCPeerConnection interface: pc must inherit property "signalingState" with the proper type (11) Unrecognized type RTCSignalingState -FAIL RTCPeerConnection interface: pc must inherit property "iceGatheringState" with the proper type (12) Unrecognized type RTCIceGatheringState -FAIL RTCPeerConnection interface: pc must inherit property "iceConnectionState" with the proper type (13) Unrecognized type RTCIceConnectionState -FAIL RTCPeerConnection interface: pc must inherit property "canTrickleIceCandidates" with the proper type (14) assert_inherits: property "canTrickleIceCandidates" not found in prototype chain -FAIL RTCPeerConnection interface: pc must inherit property "getConfiguration" with the proper type (15) assert_inherits: property "getConfiguration" not found in prototype chain -PASS RTCPeerConnection interface: pc must inherit property "setConfiguration" with the proper type (16) +FAIL RTCPeerConnection interface: pc must inherit property "signalingState" with the proper type Unrecognized type RTCSignalingState +FAIL RTCPeerConnection interface: pc must inherit property "iceGatheringState" with the proper type Unrecognized type RTCIceGatheringState +FAIL RTCPeerConnection interface: pc must inherit property "iceConnectionState" with the proper type Unrecognized type RTCIceConnectionState +FAIL RTCPeerConnection interface: pc must inherit property "canTrickleIceCandidates" with the proper type assert_inherits: property "canTrickleIceCandidates" not found in prototype chain +FAIL RTCPeerConnection interface: pc must inherit property "getConfiguration()" with the proper type assert_inherits: property "getConfiguration" not found in prototype chain +PASS RTCPeerConnection interface: pc must inherit property "setConfiguration(RTCConfiguration)" with the proper type PASS RTCPeerConnection interface: calling setConfiguration(RTCConfiguration) on pc with too few arguments must throw TypeError -PASS RTCPeerConnection interface: pc must inherit property "close" with the proper type (17) -FAIL RTCPeerConnection interface: pc must inherit property "onnegotiationneeded" with the proper type (18) Unrecognized type EventHandler -FAIL RTCPeerConnection interface: pc must inherit property "onicecandidate" with the proper type (19) Unrecognized type EventHandler -FAIL RTCPeerConnection interface: pc must inherit property "onsignalingstatechange" with the proper type (20) Unrecognized type EventHandler -FAIL RTCPeerConnection interface: pc must inherit property "oniceconnectionstatechange" with the proper type (21) Unrecognized type EventHandler -FAIL RTCPeerConnection interface: pc must inherit property "onicegatheringstatechange" with the proper type (22) Unrecognized type EventHandler -PASS RTCPeerConnection interface: pc must inherit property "createOffer" with the proper type (23) -PASS RTCPeerConnection interface: calling createOffer(RTCSessionDescriptionCallback,RTCPeerConnectionErrorCallback,RTCOfferOptions) on pc with too few arguments must throw TypeError -PASS RTCPeerConnection interface: pc must inherit property "setLocalDescription" with the proper type (24) -FAIL RTCPeerConnection interface: calling setLocalDescription(RTCSessionDescription,VoidFunction,RTCPeerConnectionErrorCallback) on pc with too few arguments must throw TypeError assert_throws: Called with 0 arguments function "function () { +PASS RTCPeerConnection interface: pc must inherit property "close()" with the proper type +FAIL RTCPeerConnection interface: pc must inherit property "onnegotiationneeded" with the proper type Unrecognized type EventHandler +FAIL RTCPeerConnection interface: pc must inherit property "onicecandidate" with the proper type Unrecognized type EventHandler +FAIL RTCPeerConnection interface: pc must inherit property "onsignalingstatechange" with the proper type Unrecognized type EventHandler +FAIL RTCPeerConnection interface: pc must inherit property "oniceconnectionstatechange" with the proper type Unrecognized type EventHandler +FAIL RTCPeerConnection interface: pc must inherit property "onicegatheringstatechange" with the proper type Unrecognized type EventHandler +PASS RTCPeerConnection interface: pc must inherit property "createOffer(RTCSessionDescriptionCallback, RTCPeerConnectionErrorCallback, RTCOfferOptions)" with the proper type +PASS RTCPeerConnection interface: calling createOffer(RTCSessionDescriptionCallback, RTCPeerConnectionErrorCallback, RTCOfferOptions) on pc with too few arguments must throw TypeError +PASS RTCPeerConnection interface: pc must inherit property "setLocalDescription(RTCSessionDescription, VoidFunction, RTCPeerConnectionErrorCallback)" with the proper type +FAIL RTCPeerConnection interface: calling setLocalDescription(RTCSessionDescription, VoidFunction, RTCPeerConnectionErrorCallback) on pc with too few arguments must throw TypeError assert_throws: Called with 0 arguments function "function () { fn.apply(obj, args); }" did not throw -PASS RTCPeerConnection interface: pc must inherit property "createAnswer" with the proper type (25) -PASS RTCPeerConnection interface: calling createAnswer(RTCSessionDescriptionCallback,RTCPeerConnectionErrorCallback) on pc with too few arguments must throw TypeError -PASS RTCPeerConnection interface: pc must inherit property "setRemoteDescription" with the proper type (26) -FAIL RTCPeerConnection interface: calling setRemoteDescription(RTCSessionDescription,VoidFunction,RTCPeerConnectionErrorCallback) on pc with too few arguments must throw TypeError assert_throws: Called with 0 arguments function "function () { +PASS RTCPeerConnection interface: pc must inherit property "createAnswer(RTCSessionDescriptionCallback, RTCPeerConnectionErrorCallback)" with the proper type +PASS RTCPeerConnection interface: calling createAnswer(RTCSessionDescriptionCallback, RTCPeerConnectionErrorCallback) on pc with too few arguments must throw TypeError +PASS RTCPeerConnection interface: pc must inherit property "setRemoteDescription(RTCSessionDescription, VoidFunction, RTCPeerConnectionErrorCallback)" with the proper type +FAIL RTCPeerConnection interface: calling setRemoteDescription(RTCSessionDescription, VoidFunction, RTCPeerConnectionErrorCallback) on pc with too few arguments must throw TypeError assert_throws: Called with 0 arguments function "function () { fn.apply(obj, args); }" did not throw -PASS RTCPeerConnection interface: pc must inherit property "addIceCandidate" with the proper type (27) -FAIL RTCPeerConnection interface: calling addIceCandidate(RTCIceCandidate,VoidFunction,RTCPeerConnectionErrorCallback) on pc with too few arguments must throw TypeError assert_throws: Called with 0 arguments function "function () { +PASS RTCPeerConnection interface: pc must inherit property "addIceCandidate(RTCIceCandidate, VoidFunction, RTCPeerConnectionErrorCallback)" with the proper type +FAIL RTCPeerConnection interface: calling addIceCandidate(RTCIceCandidate, VoidFunction, RTCPeerConnectionErrorCallback) on pc with too few arguments must throw TypeError assert_throws: Called with 0 arguments function "function () { fn.apply(obj, args); }" did not throw -PASS RTCPeerConnection interface: pc must inherit property "getStats" with the proper type (28) -PASS RTCPeerConnection interface: calling getStats(MediaStreamTrack,RTCStatsCallback,RTCPeerConnectionErrorCallback) on pc with too few arguments must throw TypeError -PASS RTCPeerConnection interface: pc must inherit property "generateCertificate" with the proper type (29) +PASS RTCPeerConnection interface: pc must inherit property "getStats(MediaStreamTrack, RTCStatsCallback, RTCPeerConnectionErrorCallback)" with the proper type +PASS RTCPeerConnection interface: calling getStats(MediaStreamTrack, RTCStatsCallback, RTCPeerConnectionErrorCallback) on pc with too few arguments must throw TypeError +PASS RTCPeerConnection interface: pc must inherit property "generateCertificate(AlgorithmIdentifier)" with the proper type FAIL RTCPeerConnection interface: calling generateCertificate(AlgorithmIdentifier) on pc with too few arguments must throw TypeError assert_unreached: Throws "TypeError: Cannot read property 'apply' of undefined" instead of rejecting promise Reached unreachable code -PASS RTCPeerConnection interface: pc must inherit property "getSenders" with the proper type (30) -PASS RTCPeerConnection interface: pc must inherit property "getReceivers" with the proper type (31) -PASS RTCPeerConnection interface: pc must inherit property "addTrack" with the proper type (32) -PASS RTCPeerConnection interface: calling addTrack(MediaStreamTrack,MediaStream) on pc with too few arguments must throw TypeError -PASS RTCPeerConnection interface: pc must inherit property "removeTrack" with the proper type (33) +PASS RTCPeerConnection interface: pc must inherit property "getSenders()" with the proper type +PASS RTCPeerConnection interface: pc must inherit property "getReceivers()" with the proper type +PASS RTCPeerConnection interface: pc must inherit property "addTrack(MediaStreamTrack, MediaStream)" with the proper type +PASS RTCPeerConnection interface: calling addTrack(MediaStreamTrack, MediaStream) on pc with too few arguments must throw TypeError +PASS RTCPeerConnection interface: pc must inherit property "removeTrack(RTCRtpSender)" with the proper type PASS RTCPeerConnection interface: calling removeTrack(RTCRtpSender) on pc with too few arguments must throw TypeError -FAIL RTCPeerConnection interface: pc must inherit property "ontrack" with the proper type (34) assert_inherits: property "ontrack" not found in prototype chain -PASS RTCPeerConnection interface: pc must inherit property "createDataChannel" with the proper type (35) -PASS RTCPeerConnection interface: calling createDataChannel(DOMString,RTCDataChannelInit) on pc with too few arguments must throw TypeError -FAIL RTCPeerConnection interface: pc must inherit property "ondatachannel" with the proper type (36) Unrecognized type EventHandler -FAIL RTCPeerConnection interface: pc must inherit property "dtmf" with the proper type (37) assert_inherits: property "dtmf" not found in prototype chain -PASS RTCPeerConnection interface: pc must inherit property "getStats" with the proper type (38) +FAIL RTCPeerConnection interface: pc must inherit property "ontrack" with the proper type assert_inherits: property "ontrack" not found in prototype chain +PASS RTCPeerConnection interface: pc must inherit property "createDataChannel(DOMString, RTCDataChannelInit)" with the proper type +PASS RTCPeerConnection interface: calling createDataChannel(DOMString, RTCDataChannelInit) on pc with too few arguments must throw TypeError +FAIL RTCPeerConnection interface: pc must inherit property "ondatachannel" with the proper type Unrecognized type EventHandler +FAIL RTCPeerConnection interface: pc must inherit property "dtmf" with the proper type assert_inherits: property "dtmf" not found in prototype chain +PASS RTCPeerConnection interface: pc must inherit property "getStats(MediaStreamTrack)" with the proper type PASS RTCPeerConnection interface: calling getStats(MediaStreamTrack) on pc with too few arguments must throw TypeError -FAIL RTCPeerConnection interface: pc must inherit property "setIdentityProvider" with the proper type (39) assert_inherits: property "setIdentityProvider" not found in prototype chain -FAIL RTCPeerConnection interface: calling setIdentityProvider(DOMString,DOMString,DOMString) on pc with too few arguments must throw TypeError assert_inherits: property "setIdentityProvider" not found in prototype chain -FAIL RTCPeerConnection interface: pc must inherit property "getIdentityAssertion" with the proper type (40) assert_inherits: property "getIdentityAssertion" not found in prototype chain -FAIL RTCPeerConnection interface: pc must inherit property "peerIdentity" with the proper type (41) assert_inherits: property "peerIdentity" not found in prototype chain -FAIL RTCPeerConnection interface: pc must inherit property "idpLoginUrl" with the proper type (42) assert_inherits: property "idpLoginUrl" not found in prototype chain +FAIL RTCPeerConnection interface: pc must inherit property "setIdentityProvider(DOMString, DOMString, DOMString)" with the proper type assert_inherits: property "setIdentityProvider" not found in prototype chain +FAIL RTCPeerConnection interface: calling setIdentityProvider(DOMString, DOMString, DOMString) on pc with too few arguments must throw TypeError assert_inherits: property "setIdentityProvider" not found in prototype chain +FAIL RTCPeerConnection interface: pc must inherit property "getIdentityAssertion()" with the proper type assert_inherits: property "getIdentityAssertion" not found in prototype chain +FAIL RTCPeerConnection interface: pc must inherit property "peerIdentity" with the proper type assert_inherits: property "peerIdentity" not found in prototype chain +FAIL RTCPeerConnection interface: pc must inherit property "idpLoginUrl" with the proper type assert_inherits: property "idpLoginUrl" not found in prototype chain Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webrtc/datachannel-idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webrtc/datachannel-idlharness-expected.txt index 88311a83..dbfec9f 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webrtc/datachannel-idlharness-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/webrtc/datachannel-idlharness-expected.txt
@@ -29,31 +29,31 @@ PASS RTCDataChannel interface: operation send(ArrayBufferView) PASS RTCDataChannel must be primary interface of channel FAIL Stringification of channel Cannot read property 'has_stringifier' of undefined -PASS RTCDataChannel interface: channel must inherit property "label" with the proper type (0) -PASS RTCDataChannel interface: channel must inherit property "ordered" with the proper type (1) -FAIL RTCDataChannel interface: channel must inherit property "maxPacketLifeTime" with the proper type (2) assert_inherits: property "maxPacketLifeTime" not found in prototype chain -PASS RTCDataChannel interface: channel must inherit property "maxRetransmits" with the proper type (3) -PASS RTCDataChannel interface: channel must inherit property "protocol" with the proper type (4) -PASS RTCDataChannel interface: channel must inherit property "negotiated" with the proper type (5) -PASS RTCDataChannel interface: channel must inherit property "id" with the proper type (6) -FAIL RTCDataChannel interface: channel must inherit property "priority" with the proper type (7) assert_inherits: property "priority" not found in prototype chain -PASS RTCDataChannel interface: channel must inherit property "readyState" with the proper type (8) -PASS RTCDataChannel interface: channel must inherit property "bufferedAmount" with the proper type (9) -PASS RTCDataChannel interface: channel must inherit property "bufferedAmountLowThreshold" with the proper type (10) -FAIL RTCDataChannel interface: channel must inherit property "onopen" with the proper type (11) Unrecognized type EventHandler -FAIL RTCDataChannel interface: channel must inherit property "onbufferedamountlow" with the proper type (12) Unrecognized type EventHandler -FAIL RTCDataChannel interface: channel must inherit property "onerror" with the proper type (13) Unrecognized type EventHandler -FAIL RTCDataChannel interface: channel must inherit property "onclose" with the proper type (14) Unrecognized type EventHandler -PASS RTCDataChannel interface: channel must inherit property "close" with the proper type (15) -FAIL RTCDataChannel interface: channel must inherit property "onmessage" with the proper type (16) Unrecognized type EventHandler -PASS RTCDataChannel interface: channel must inherit property "binaryType" with the proper type (17) -PASS RTCDataChannel interface: channel must inherit property "send" with the proper type (18) +PASS RTCDataChannel interface: channel must inherit property "label" with the proper type +PASS RTCDataChannel interface: channel must inherit property "ordered" with the proper type +FAIL RTCDataChannel interface: channel must inherit property "maxPacketLifeTime" with the proper type assert_inherits: property "maxPacketLifeTime" not found in prototype chain +PASS RTCDataChannel interface: channel must inherit property "maxRetransmits" with the proper type +PASS RTCDataChannel interface: channel must inherit property "protocol" with the proper type +PASS RTCDataChannel interface: channel must inherit property "negotiated" with the proper type +PASS RTCDataChannel interface: channel must inherit property "id" with the proper type +FAIL RTCDataChannel interface: channel must inherit property "priority" with the proper type assert_inherits: property "priority" not found in prototype chain +PASS RTCDataChannel interface: channel must inherit property "readyState" with the proper type +PASS RTCDataChannel interface: channel must inherit property "bufferedAmount" with the proper type +PASS RTCDataChannel interface: channel must inherit property "bufferedAmountLowThreshold" with the proper type +FAIL RTCDataChannel interface: channel must inherit property "onopen" with the proper type Unrecognized type EventHandler +FAIL RTCDataChannel interface: channel must inherit property "onbufferedamountlow" with the proper type Unrecognized type EventHandler +FAIL RTCDataChannel interface: channel must inherit property "onerror" with the proper type Unrecognized type EventHandler +FAIL RTCDataChannel interface: channel must inherit property "onclose" with the proper type Unrecognized type EventHandler +PASS RTCDataChannel interface: channel must inherit property "close()" with the proper type +FAIL RTCDataChannel interface: channel must inherit property "onmessage" with the proper type Unrecognized type EventHandler +PASS RTCDataChannel interface: channel must inherit property "binaryType" with the proper type +PASS RTCDataChannel interface: channel must inherit property "send(USVString)" with the proper type PASS RTCDataChannel interface: calling send(USVString) on channel with too few arguments must throw TypeError -PASS RTCDataChannel interface: channel must inherit property "send" with the proper type (19) +PASS RTCDataChannel interface: channel must inherit property "send(Blob)" with the proper type PASS RTCDataChannel interface: calling send(Blob) on channel with too few arguments must throw TypeError -PASS RTCDataChannel interface: channel must inherit property "send" with the proper type (20) +PASS RTCDataChannel interface: channel must inherit property "send(ArrayBuffer)" with the proper type PASS RTCDataChannel interface: calling send(ArrayBuffer) on channel with too few arguments must throw TypeError -PASS RTCDataChannel interface: channel must inherit property "send" with the proper type (21) +PASS RTCDataChannel interface: channel must inherit property "send(ArrayBufferView)" with the proper type PASS RTCDataChannel interface: calling send(ArrayBufferView) on channel with too few arguments must throw TypeError Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webrtc/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webrtc/interfaces-expected.txt index 4d429cd7..d4eeb2fa 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webrtc/interfaces-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/webrtc/interfaces-expected.txt
@@ -13,12 +13,12 @@ FAIL MediaStreamTrack interface: attribute onisolationchange assert_true: The prototype object must have a property "onisolationchange" expected true got false FAIL MediaStreamTrack must be primary interface of idlTestObjects.mediaStreamTrack assert_equals: wrong typeof object expected "object" but got "undefined" FAIL Stringification of idlTestObjects.mediaStreamTrack assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL MediaStreamTrack interface: idlTestObjects.mediaStreamTrack must inherit property "isolated" with the proper type (0) assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL MediaStreamTrack interface: idlTestObjects.mediaStreamTrack must inherit property "onisolationchange" with the proper type (1) assert_equals: wrong typeof object expected "object" but got "undefined" +FAIL MediaStreamTrack interface: idlTestObjects.mediaStreamTrack must inherit property "isolated" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" +FAIL MediaStreamTrack interface: idlTestObjects.mediaStreamTrack must inherit property "onisolationchange" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" FAIL MediaStreamTrack must be primary interface of generateMediaStreamTrack('audio') assert_equals: Unexpected exception when evaluating object expected null but got object "Error: assert_own_property: Expect pc to have addTransceiver() method expected property "addTransceiver" missing" FAIL Stringification of generateMediaStreamTrack('audio') assert_equals: Unexpected exception when evaluating object expected null but got object "Error: assert_own_property: Expect pc to have addTransceiver() method expected property "addTransceiver" missing" -FAIL MediaStreamTrack interface: generateMediaStreamTrack('audio') must inherit property "isolated" with the proper type (0) assert_equals: Unexpected exception when evaluating object expected null but got object "Error: assert_own_property: Expect pc to have addTransceiver() method expected property "addTransceiver" missing" -FAIL MediaStreamTrack interface: generateMediaStreamTrack('audio') must inherit property "onisolationchange" with the proper type (1) assert_equals: Unexpected exception when evaluating object expected null but got object "Error: assert_own_property: Expect pc to have addTransceiver() method expected property "addTransceiver" missing" +FAIL MediaStreamTrack interface: generateMediaStreamTrack('audio') must inherit property "isolated" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "Error: assert_own_property: Expect pc to have addTransceiver() method expected property "addTransceiver" missing" +FAIL MediaStreamTrack interface: generateMediaStreamTrack('audio') must inherit property "onisolationchange" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "Error: assert_own_property: Expect pc to have addTransceiver() method expected property "addTransceiver" missing" FAIL RTCPeerConnection interface: existence and properties of interface object Cannot read property 'has_extended_attribute' of undefined PASS RTCPeerConnection interface object length PASS RTCPeerConnection interface object name @@ -52,98 +52,98 @@ PASS RTCPeerConnection interface: attribute onicegatheringstatechange FAIL RTCPeerConnection interface: attribute onconnectionstatechange assert_true: The prototype object must have a property "onconnectionstatechange" expected true got false FAIL RTCPeerConnection interface: attribute onfingerprintfailure assert_true: The prototype object must have a property "onfingerprintfailure" expected true got false -PASS RTCPeerConnection interface: operation createOffer(RTCSessionDescriptionCallback,RTCPeerConnectionErrorCallback,RTCOfferOptions) -PASS RTCPeerConnection interface: operation setLocalDescription(RTCSessionDescriptionInit,VoidFunction,RTCPeerConnectionErrorCallback) -PASS RTCPeerConnection interface: operation createAnswer(RTCSessionDescriptionCallback,RTCPeerConnectionErrorCallback) -PASS RTCPeerConnection interface: operation setRemoteDescription(RTCSessionDescriptionInit,VoidFunction,RTCPeerConnectionErrorCallback) -PASS RTCPeerConnection interface: operation addIceCandidate([object Object],[object Object],VoidFunction,RTCPeerConnectionErrorCallback) +PASS RTCPeerConnection interface: operation createOffer(RTCSessionDescriptionCallback, RTCPeerConnectionErrorCallback, RTCOfferOptions) +PASS RTCPeerConnection interface: operation setLocalDescription(RTCSessionDescriptionInit, VoidFunction, RTCPeerConnectionErrorCallback) +PASS RTCPeerConnection interface: operation createAnswer(RTCSessionDescriptionCallback, RTCPeerConnectionErrorCallback) +PASS RTCPeerConnection interface: operation setRemoteDescription(RTCSessionDescriptionInit, VoidFunction, RTCPeerConnectionErrorCallback) +PASS RTCPeerConnection interface: operation addIceCandidate([object Object],[object Object], VoidFunction, RTCPeerConnectionErrorCallback) PASS RTCPeerConnection interface: operation generateCertificate(AlgorithmIdentifier) PASS RTCPeerConnection interface: operation getSenders() PASS RTCPeerConnection interface: operation getReceivers() FAIL RTCPeerConnection interface: operation getTransceivers() assert_own_property: interface prototype object missing non-static operation expected property "getTransceivers" missing -PASS RTCPeerConnection interface: operation addTrack(MediaStreamTrack,MediaStream) +PASS RTCPeerConnection interface: operation addTrack(MediaStreamTrack, MediaStream) PASS RTCPeerConnection interface: operation removeTrack(RTCRtpSender) -FAIL RTCPeerConnection interface: operation addTransceiver([object Object],[object Object],RTCRtpTransceiverInit) assert_own_property: interface prototype object missing non-static operation expected property "addTransceiver" missing +FAIL RTCPeerConnection interface: operation addTransceiver([object Object],[object Object], RTCRtpTransceiverInit) assert_own_property: interface prototype object missing non-static operation expected property "addTransceiver" missing FAIL RTCPeerConnection interface: attribute ontrack assert_true: The prototype object must have a property "ontrack" expected true got false FAIL RTCPeerConnection interface: attribute sctp assert_true: The prototype object must have a property "sctp" expected true got false -PASS RTCPeerConnection interface: operation createDataChannel(USVString,RTCDataChannelInit) +PASS RTCPeerConnection interface: operation createDataChannel(USVString, RTCDataChannelInit) PASS RTCPeerConnection interface: attribute ondatachannel PASS RTCPeerConnection interface: operation getStats(MediaStreamTrack) -FAIL RTCPeerConnection interface: operation setIdentityProvider(DOMString,RTCIdentityProviderOptions) assert_own_property: interface prototype object missing non-static operation expected property "setIdentityProvider" missing +FAIL RTCPeerConnection interface: operation setIdentityProvider(DOMString, RTCIdentityProviderOptions) assert_own_property: interface prototype object missing non-static operation expected property "setIdentityProvider" missing FAIL RTCPeerConnection interface: operation getIdentityAssertion() assert_own_property: interface prototype object missing non-static operation expected property "getIdentityAssertion" missing FAIL RTCPeerConnection interface: attribute peerIdentity assert_true: The prototype object must have a property "peerIdentity" expected true got false FAIL RTCPeerConnection interface: attribute idpLoginUrl assert_true: The prototype object must have a property "idpLoginUrl" expected true got false FAIL RTCPeerConnection interface: attribute idpErrorInfo assert_true: The prototype object must have a property "idpErrorInfo" expected true got false PASS RTCPeerConnection must be primary interface of new RTCPeerConnection() FAIL Stringification of new RTCPeerConnection() Cannot read property 'has_stringifier' of undefined -PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "createOffer" with the proper type (0) +PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "createOffer(RTCOfferOptions)" with the proper type PASS RTCPeerConnection interface: calling createOffer(RTCOfferOptions) on new RTCPeerConnection() with too few arguments must throw TypeError -PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "createAnswer" with the proper type (1) +PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "createAnswer(RTCAnswerOptions)" with the proper type PASS RTCPeerConnection interface: calling createAnswer(RTCAnswerOptions) on new RTCPeerConnection() with too few arguments must throw TypeError -PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "setLocalDescription" with the proper type (2) +PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "setLocalDescription(RTCSessionDescriptionInit)" with the proper type PASS RTCPeerConnection interface: calling setLocalDescription(RTCSessionDescriptionInit) on new RTCPeerConnection() with too few arguments must throw TypeError -PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "localDescription" with the proper type (3) -FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "currentLocalDescription" with the proper type (4) assert_inherits: property "currentLocalDescription" not found in prototype chain -FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "pendingLocalDescription" with the proper type (5) assert_inherits: property "pendingLocalDescription" not found in prototype chain -PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "setRemoteDescription" with the proper type (6) +PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "localDescription" with the proper type +FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "currentLocalDescription" with the proper type assert_inherits: property "currentLocalDescription" not found in prototype chain +FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "pendingLocalDescription" with the proper type assert_inherits: property "pendingLocalDescription" not found in prototype chain +PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "setRemoteDescription(RTCSessionDescriptionInit)" with the proper type PASS RTCPeerConnection interface: calling setRemoteDescription(RTCSessionDescriptionInit) on new RTCPeerConnection() with too few arguments must throw TypeError -PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "remoteDescription" with the proper type (7) -FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "currentRemoteDescription" with the proper type (8) assert_inherits: property "currentRemoteDescription" not found in prototype chain -FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "pendingRemoteDescription" with the proper type (9) assert_inherits: property "pendingRemoteDescription" not found in prototype chain -PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "addIceCandidate" with the proper type (10) +PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "remoteDescription" with the proper type +FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "currentRemoteDescription" with the proper type assert_inherits: property "currentRemoteDescription" not found in prototype chain +FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "pendingRemoteDescription" with the proper type assert_inherits: property "pendingRemoteDescription" not found in prototype chain +PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "addIceCandidate([object Object],[object Object])" with the proper type PASS RTCPeerConnection interface: calling addIceCandidate([object Object],[object Object]) on new RTCPeerConnection() with too few arguments must throw TypeError -PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "signalingState" with the proper type (11) -PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "iceGatheringState" with the proper type (12) -PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "iceConnectionState" with the proper type (13) -FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "connectionState" with the proper type (14) assert_inherits: property "connectionState" not found in prototype chain -FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "canTrickleIceCandidates" with the proper type (15) assert_inherits: property "canTrickleIceCandidates" not found in prototype chain -PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getDefaultIceServers" with the proper type (16) -FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getConfiguration" with the proper type (17) assert_inherits: property "getConfiguration" not found in prototype chain -PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "setConfiguration" with the proper type (18) +PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "signalingState" with the proper type +PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "iceGatheringState" with the proper type +PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "iceConnectionState" with the proper type +FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "connectionState" with the proper type assert_inherits: property "connectionState" not found in prototype chain +FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "canTrickleIceCandidates" with the proper type assert_inherits: property "canTrickleIceCandidates" not found in prototype chain +PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getDefaultIceServers()" with the proper type +FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getConfiguration()" with the proper type assert_inherits: property "getConfiguration" not found in prototype chain +PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "setConfiguration(RTCConfiguration)" with the proper type PASS RTCPeerConnection interface: calling setConfiguration(RTCConfiguration) on new RTCPeerConnection() with too few arguments must throw TypeError -PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "close" with the proper type (19) -PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onnegotiationneeded" with the proper type (20) -PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onicecandidate" with the proper type (21) -FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onicecandidateerror" with the proper type (22) assert_inherits: property "onicecandidateerror" not found in prototype chain -PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onsignalingstatechange" with the proper type (23) -PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "oniceconnectionstatechange" with the proper type (24) -PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onicegatheringstatechange" with the proper type (25) -FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onconnectionstatechange" with the proper type (26) assert_inherits: property "onconnectionstatechange" not found in prototype chain -FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onfingerprintfailure" with the proper type (27) assert_inherits: property "onfingerprintfailure" not found in prototype chain -PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "createOffer" with the proper type (28) -PASS RTCPeerConnection interface: calling createOffer(RTCSessionDescriptionCallback,RTCPeerConnectionErrorCallback,RTCOfferOptions) on new RTCPeerConnection() with too few arguments must throw TypeError -PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "setLocalDescription" with the proper type (29) -PASS RTCPeerConnection interface: calling setLocalDescription(RTCSessionDescriptionInit,VoidFunction,RTCPeerConnectionErrorCallback) on new RTCPeerConnection() with too few arguments must throw TypeError -PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "createAnswer" with the proper type (30) -PASS RTCPeerConnection interface: calling createAnswer(RTCSessionDescriptionCallback,RTCPeerConnectionErrorCallback) on new RTCPeerConnection() with too few arguments must throw TypeError -PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "setRemoteDescription" with the proper type (31) -PASS RTCPeerConnection interface: calling setRemoteDescription(RTCSessionDescriptionInit,VoidFunction,RTCPeerConnectionErrorCallback) on new RTCPeerConnection() with too few arguments must throw TypeError -PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "addIceCandidate" with the proper type (32) -PASS RTCPeerConnection interface: calling addIceCandidate([object Object],[object Object],VoidFunction,RTCPeerConnectionErrorCallback) on new RTCPeerConnection() with too few arguments must throw TypeError -PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "generateCertificate" with the proper type (33) +PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "close()" with the proper type +PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onnegotiationneeded" with the proper type +PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onicecandidate" with the proper type +FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onicecandidateerror" with the proper type assert_inherits: property "onicecandidateerror" not found in prototype chain +PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onsignalingstatechange" with the proper type +PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "oniceconnectionstatechange" with the proper type +PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onicegatheringstatechange" with the proper type +FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onconnectionstatechange" with the proper type assert_inherits: property "onconnectionstatechange" not found in prototype chain +FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onfingerprintfailure" with the proper type assert_inherits: property "onfingerprintfailure" not found in prototype chain +PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "createOffer(RTCSessionDescriptionCallback, RTCPeerConnectionErrorCallback, RTCOfferOptions)" with the proper type +PASS RTCPeerConnection interface: calling createOffer(RTCSessionDescriptionCallback, RTCPeerConnectionErrorCallback, RTCOfferOptions) on new RTCPeerConnection() with too few arguments must throw TypeError +PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "setLocalDescription(RTCSessionDescriptionInit, VoidFunction, RTCPeerConnectionErrorCallback)" with the proper type +PASS RTCPeerConnection interface: calling setLocalDescription(RTCSessionDescriptionInit, VoidFunction, RTCPeerConnectionErrorCallback) on new RTCPeerConnection() with too few arguments must throw TypeError +PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "createAnswer(RTCSessionDescriptionCallback, RTCPeerConnectionErrorCallback)" with the proper type +PASS RTCPeerConnection interface: calling createAnswer(RTCSessionDescriptionCallback, RTCPeerConnectionErrorCallback) on new RTCPeerConnection() with too few arguments must throw TypeError +PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "setRemoteDescription(RTCSessionDescriptionInit, VoidFunction, RTCPeerConnectionErrorCallback)" with the proper type +PASS RTCPeerConnection interface: calling setRemoteDescription(RTCSessionDescriptionInit, VoidFunction, RTCPeerConnectionErrorCallback) on new RTCPeerConnection() with too few arguments must throw TypeError +PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "addIceCandidate([object Object],[object Object], VoidFunction, RTCPeerConnectionErrorCallback)" with the proper type +PASS RTCPeerConnection interface: calling addIceCandidate([object Object],[object Object], VoidFunction, RTCPeerConnectionErrorCallback) on new RTCPeerConnection() with too few arguments must throw TypeError +PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "generateCertificate(AlgorithmIdentifier)" with the proper type FAIL RTCPeerConnection interface: calling generateCertificate(AlgorithmIdentifier) on new RTCPeerConnection() with too few arguments must throw TypeError assert_unreached: Throws "TypeError: Cannot read property 'apply' of undefined" instead of rejecting promise Reached unreachable code -PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getSenders" with the proper type (34) -PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getReceivers" with the proper type (35) -FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getTransceivers" with the proper type (36) assert_inherits: property "getTransceivers" not found in prototype chain -PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "addTrack" with the proper type (37) -PASS RTCPeerConnection interface: calling addTrack(MediaStreamTrack,MediaStream) on new RTCPeerConnection() with too few arguments must throw TypeError -PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "removeTrack" with the proper type (38) +PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getSenders()" with the proper type +PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getReceivers()" with the proper type +FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getTransceivers()" with the proper type assert_inherits: property "getTransceivers" not found in prototype chain +PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "addTrack(MediaStreamTrack, MediaStream)" with the proper type +PASS RTCPeerConnection interface: calling addTrack(MediaStreamTrack, MediaStream) on new RTCPeerConnection() with too few arguments must throw TypeError +PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "removeTrack(RTCRtpSender)" with the proper type PASS RTCPeerConnection interface: calling removeTrack(RTCRtpSender) on new RTCPeerConnection() with too few arguments must throw TypeError -FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "addTransceiver" with the proper type (39) assert_inherits: property "addTransceiver" not found in prototype chain -FAIL RTCPeerConnection interface: calling addTransceiver([object Object],[object Object],RTCRtpTransceiverInit) on new RTCPeerConnection() with too few arguments must throw TypeError assert_inherits: property "addTransceiver" not found in prototype chain -FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "ontrack" with the proper type (40) assert_inherits: property "ontrack" not found in prototype chain -FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "sctp" with the proper type (41) assert_inherits: property "sctp" not found in prototype chain -PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "createDataChannel" with the proper type (42) -PASS RTCPeerConnection interface: calling createDataChannel(USVString,RTCDataChannelInit) on new RTCPeerConnection() with too few arguments must throw TypeError -PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "ondatachannel" with the proper type (43) -PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getStats" with the proper type (44) +FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "addTransceiver([object Object],[object Object], RTCRtpTransceiverInit)" with the proper type assert_inherits: property "addTransceiver" not found in prototype chain +FAIL RTCPeerConnection interface: calling addTransceiver([object Object],[object Object], RTCRtpTransceiverInit) on new RTCPeerConnection() with too few arguments must throw TypeError assert_inherits: property "addTransceiver" not found in prototype chain +FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "ontrack" with the proper type assert_inherits: property "ontrack" not found in prototype chain +FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "sctp" with the proper type assert_inherits: property "sctp" not found in prototype chain +PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "createDataChannel(USVString, RTCDataChannelInit)" with the proper type +PASS RTCPeerConnection interface: calling createDataChannel(USVString, RTCDataChannelInit) on new RTCPeerConnection() with too few arguments must throw TypeError +PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "ondatachannel" with the proper type +PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getStats(MediaStreamTrack)" with the proper type PASS RTCPeerConnection interface: calling getStats(MediaStreamTrack) on new RTCPeerConnection() with too few arguments must throw TypeError -FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "setIdentityProvider" with the proper type (45) assert_inherits: property "setIdentityProvider" not found in prototype chain -FAIL RTCPeerConnection interface: calling setIdentityProvider(DOMString,RTCIdentityProviderOptions) on new RTCPeerConnection() with too few arguments must throw TypeError assert_inherits: property "setIdentityProvider" not found in prototype chain -FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getIdentityAssertion" with the proper type (46) assert_inherits: property "getIdentityAssertion" not found in prototype chain -FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "peerIdentity" with the proper type (47) assert_inherits: property "peerIdentity" not found in prototype chain -FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "idpLoginUrl" with the proper type (48) assert_inherits: property "idpLoginUrl" not found in prototype chain -FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "idpErrorInfo" with the proper type (49) assert_inherits: property "idpErrorInfo" not found in prototype chain +FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "setIdentityProvider(DOMString, RTCIdentityProviderOptions)" with the proper type assert_inherits: property "setIdentityProvider" not found in prototype chain +FAIL RTCPeerConnection interface: calling setIdentityProvider(DOMString, RTCIdentityProviderOptions) on new RTCPeerConnection() with too few arguments must throw TypeError assert_inherits: property "setIdentityProvider" not found in prototype chain +FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getIdentityAssertion()" with the proper type assert_inherits: property "getIdentityAssertion" not found in prototype chain +FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "peerIdentity" with the proper type assert_inherits: property "peerIdentity" not found in prototype chain +FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "idpLoginUrl" with the proper type assert_inherits: property "idpLoginUrl" not found in prototype chain +FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "idpErrorInfo" with the proper type assert_inherits: property "idpErrorInfo" not found in prototype chain PASS RTCSessionDescription interface: existence and properties of interface object FAIL RTCSessionDescription interface object length assert_equals: wrong value for RTCSessionDescription.length expected 1 but got 0 PASS RTCSessionDescription interface object name @@ -153,8 +153,8 @@ FAIL RTCSessionDescription interface: attribute sdp assert_equals: setter must be undefined for readonly attributes expected (undefined) undefined but got (function) function "function () { [native code] }" PASS RTCSessionDescription must be primary interface of new RTCSessionDescription({ type: 'offer' }) PASS Stringification of new RTCSessionDescription({ type: 'offer' }) -PASS RTCSessionDescription interface: new RTCSessionDescription({ type: 'offer' }) must inherit property "type" with the proper type (0) -FAIL RTCSessionDescription interface: new RTCSessionDescription({ type: 'offer' }) must inherit property "sdp" with the proper type (1) assert_equals: expected "string" but got "object" +PASS RTCSessionDescription interface: new RTCSessionDescription({ type: 'offer' }) must inherit property "type" with the proper type +FAIL RTCSessionDescription interface: new RTCSessionDescription({ type: 'offer' }) must inherit property "sdp" with the proper type assert_equals: expected "string" but got "object" PASS RTCIceCandidate interface: existence and properties of interface object FAIL RTCIceCandidate interface object length assert_equals: wrong value for RTCIceCandidate.length expected 0 but got 1 PASS RTCIceCandidate interface object name @@ -176,20 +176,20 @@ FAIL RTCIceCandidate interface: attribute ufrag assert_true: The prototype object must have a property "ufrag" expected true got false FAIL RTCIceCandidate must be primary interface of new RTCIceCandidate({ sdpMid: 1 }) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty." FAIL Stringification of new RTCIceCandidate({ sdpMid: 1 }) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty." -FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "candidate" with the proper type (0) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty." -FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "sdpMid" with the proper type (1) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty." -FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "sdpMLineIndex" with the proper type (2) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty." -FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "foundation" with the proper type (3) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty." -FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "component" with the proper type (4) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty." -FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "priority" with the proper type (5) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty." -FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "ip" with the proper type (6) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty." -FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "protocol" with the proper type (7) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty." -FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "port" with the proper type (8) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty." -FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "type" with the proper type (9) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty." -FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "tcpType" with the proper type (10) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty." -FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "relatedAddress" with the proper type (11) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty." -FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "relatedPort" with the proper type (12) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty." -FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "ufrag" with the proper type (13) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty." +FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "candidate" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty." +FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "sdpMid" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty." +FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "sdpMLineIndex" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty." +FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "foundation" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty." +FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "component" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty." +FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "priority" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty." +FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "ip" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty." +FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "protocol" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty." +FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "port" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty." +FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "type" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty." +FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "tcpType" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty." +FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "relatedAddress" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty." +FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "relatedPort" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty." +FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "ufrag" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty." FAIL RTCPeerConnectionIceEvent interface: existence and properties of interface object Cannot read property 'has_extended_attribute' of undefined PASS RTCPeerConnectionIceEvent interface object length PASS RTCPeerConnectionIceEvent interface object name @@ -199,8 +199,8 @@ FAIL RTCPeerConnectionIceEvent interface: attribute url assert_true: The prototype object must have a property "url" expected true got false PASS RTCPeerConnectionIceEvent must be primary interface of new RTCPeerConnectionIceEvent('ice') FAIL Stringification of new RTCPeerConnectionIceEvent('ice') Cannot read property 'has_stringifier' of undefined -PASS RTCPeerConnectionIceEvent interface: new RTCPeerConnectionIceEvent('ice') must inherit property "candidate" with the proper type (0) -FAIL RTCPeerConnectionIceEvent interface: new RTCPeerConnectionIceEvent('ice') must inherit property "url" with the proper type (1) assert_inherits: property "url" not found in prototype chain +PASS RTCPeerConnectionIceEvent interface: new RTCPeerConnectionIceEvent('ice') must inherit property "candidate" with the proper type +FAIL RTCPeerConnectionIceEvent interface: new RTCPeerConnectionIceEvent('ice') must inherit property "url" with the proper type assert_inherits: property "url" not found in prototype chain FAIL RTCPeerConnectionIceErrorEvent interface: existence and properties of interface object assert_own_property: self does not have own property "RTCPeerConnectionIceErrorEvent" expected property "RTCPeerConnectionIceErrorEvent" missing FAIL RTCPeerConnectionIceErrorEvent interface object length assert_own_property: self does not have own property "RTCPeerConnectionIceErrorEvent" expected property "RTCPeerConnectionIceErrorEvent" missing FAIL RTCPeerConnectionIceErrorEvent interface object name assert_own_property: self does not have own property "RTCPeerConnectionIceErrorEvent" expected property "RTCPeerConnectionIceErrorEvent" missing @@ -212,10 +212,10 @@ FAIL RTCPeerConnectionIceErrorEvent interface: attribute errorText assert_own_property: self does not have own property "RTCPeerConnectionIceErrorEvent" expected property "RTCPeerConnectionIceErrorEvent" missing FAIL RTCPeerConnectionIceErrorEvent must be primary interface of new RTCPeerConnectionIceErrorEvent('ice-error', { errorCode: 701 }); assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: RTCPeerConnectionIceErrorEvent is not defined" FAIL Stringification of new RTCPeerConnectionIceErrorEvent('ice-error', { errorCode: 701 }); assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: RTCPeerConnectionIceErrorEvent is not defined" -FAIL RTCPeerConnectionIceErrorEvent interface: new RTCPeerConnectionIceErrorEvent('ice-error', { errorCode: 701 }); must inherit property "hostCandidate" with the proper type (0) assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: RTCPeerConnectionIceErrorEvent is not defined" -FAIL RTCPeerConnectionIceErrorEvent interface: new RTCPeerConnectionIceErrorEvent('ice-error', { errorCode: 701 }); must inherit property "url" with the proper type (1) assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: RTCPeerConnectionIceErrorEvent is not defined" -FAIL RTCPeerConnectionIceErrorEvent interface: new RTCPeerConnectionIceErrorEvent('ice-error', { errorCode: 701 }); must inherit property "errorCode" with the proper type (2) assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: RTCPeerConnectionIceErrorEvent is not defined" -FAIL RTCPeerConnectionIceErrorEvent interface: new RTCPeerConnectionIceErrorEvent('ice-error', { errorCode: 701 }); must inherit property "errorText" with the proper type (3) assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: RTCPeerConnectionIceErrorEvent is not defined" +FAIL RTCPeerConnectionIceErrorEvent interface: new RTCPeerConnectionIceErrorEvent('ice-error', { errorCode: 701 }); must inherit property "hostCandidate" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: RTCPeerConnectionIceErrorEvent is not defined" +FAIL RTCPeerConnectionIceErrorEvent interface: new RTCPeerConnectionIceErrorEvent('ice-error', { errorCode: 701 }); must inherit property "url" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: RTCPeerConnectionIceErrorEvent is not defined" +FAIL RTCPeerConnectionIceErrorEvent interface: new RTCPeerConnectionIceErrorEvent('ice-error', { errorCode: 701 }); must inherit property "errorCode" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: RTCPeerConnectionIceErrorEvent is not defined" +FAIL RTCPeerConnectionIceErrorEvent interface: new RTCPeerConnectionIceErrorEvent('ice-error', { errorCode: 701 }); must inherit property "errorText" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: RTCPeerConnectionIceErrorEvent is not defined" PASS RTCCertificate interface: existence and properties of interface object PASS RTCCertificate interface object length PASS RTCCertificate interface object name @@ -226,9 +226,9 @@ FAIL RTCCertificate interface: operation getAlgorithm() assert_own_property: interface prototype object missing non-static operation expected property "getAlgorithm" missing PASS RTCCertificate must be primary interface of idlTestObjects.certificate PASS Stringification of idlTestObjects.certificate -PASS RTCCertificate interface: idlTestObjects.certificate must inherit property "expires" with the proper type (0) -PASS RTCCertificate interface: idlTestObjects.certificate must inherit property "getFingerprints" with the proper type (1) -FAIL RTCCertificate interface: idlTestObjects.certificate must inherit property "getAlgorithm" with the proper type (2) assert_inherits: property "getAlgorithm" not found in prototype chain +PASS RTCCertificate interface: idlTestObjects.certificate must inherit property "expires" with the proper type +PASS RTCCertificate interface: idlTestObjects.certificate must inherit property "getFingerprints()" with the proper type +FAIL RTCCertificate interface: idlTestObjects.certificate must inherit property "getAlgorithm()" with the proper type assert_inherits: property "getAlgorithm" not found in prototype chain PASS RTCRtpSender interface: existence and properties of interface object PASS RTCRtpSender interface object length PASS RTCRtpSender interface object name @@ -245,18 +245,18 @@ FAIL RTCRtpSender interface: attribute dtmf assert_true: The prototype object must have a property "dtmf" expected true got false FAIL RTCRtpSender must be primary interface of new RTCPeerConnection().addTransceiver('audio').sender assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" FAIL Stringification of new RTCPeerConnection().addTransceiver('audio').sender assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" -FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "track" with the proper type (0) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" -FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "transport" with the proper type (1) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" -FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "rtcpTransport" with the proper type (2) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" -FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "getCapabilities" with the proper type (3) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" +FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "track" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" +FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "transport" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" +FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "rtcpTransport" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" +FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "getCapabilities(DOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" FAIL RTCRtpSender interface: calling getCapabilities(DOMString) on new RTCPeerConnection().addTransceiver('audio').sender with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" -FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "setParameters" with the proper type (4) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" +FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "setParameters(RTCRtpParameters)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" FAIL RTCRtpSender interface: calling setParameters(RTCRtpParameters) on new RTCPeerConnection().addTransceiver('audio').sender with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" -FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "getParameters" with the proper type (5) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" -FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "replaceTrack" with the proper type (6) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" +FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "getParameters()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" +FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "replaceTrack(MediaStreamTrack)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" FAIL RTCRtpSender interface: calling replaceTrack(MediaStreamTrack) on new RTCPeerConnection().addTransceiver('audio').sender with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" -FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "getStats" with the proper type (7) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" -FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "dtmf" with the proper type (8) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" +FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "getStats()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" +FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "dtmf" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" PASS RTCRtpReceiver interface: existence and properties of interface object PASS RTCRtpReceiver interface object length PASS RTCRtpReceiver interface object name @@ -272,15 +272,15 @@ FAIL RTCRtpReceiver interface: operation getStats() assert_own_property: interface prototype object missing non-static operation expected property "getStats" missing FAIL RTCRtpReceiver must be primary interface of new RTCPeerConnection().addTransceiver('audio').receiver assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" FAIL Stringification of new RTCPeerConnection().addTransceiver('audio').receiver assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" -FAIL RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "track" with the proper type (0) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" -FAIL RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "transport" with the proper type (1) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" -FAIL RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "rtcpTransport" with the proper type (2) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" -FAIL RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "getCapabilities" with the proper type (3) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" +FAIL RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "track" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" +FAIL RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "transport" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" +FAIL RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "rtcpTransport" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" +FAIL RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "getCapabilities(DOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" FAIL RTCRtpReceiver interface: calling getCapabilities(DOMString) on new RTCPeerConnection().addTransceiver('audio').receiver with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" -FAIL RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "getParameters" with the proper type (4) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" -FAIL RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "getContributingSources" with the proper type (5) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" -FAIL RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "getSynchronizationSources" with the proper type (6) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" -FAIL RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "getStats" with the proper type (7) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" +FAIL RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "getParameters()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" +FAIL RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "getContributingSources()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" +FAIL RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "getSynchronizationSources()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" +FAIL RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "getStats()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" PASS RTCRtpContributingSource interface: existence and properties of interface object PASS RTCRtpContributingSource interface object length PASS RTCRtpContributingSource interface object name @@ -314,16 +314,16 @@ FAIL RTCRtpTransceiver interface: operation setCodecPreferences([object Object]) assert_own_property: self does not have own property "RTCRtpTransceiver" expected property "RTCRtpTransceiver" missing FAIL RTCRtpTransceiver must be primary interface of new RTCPeerConnection().addTransceiver('audio') assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" FAIL Stringification of new RTCPeerConnection().addTransceiver('audio') assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" -FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "mid" with the proper type (0) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" -FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "sender" with the proper type (1) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" -FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "receiver" with the proper type (2) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" -FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "stopped" with the proper type (3) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" -FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "direction" with the proper type (4) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" -FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "currentDirection" with the proper type (5) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" -FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "setDirection" with the proper type (6) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" +FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "mid" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" +FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "sender" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" +FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "receiver" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" +FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "stopped" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" +FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "direction" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" +FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "currentDirection" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" +FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "setDirection(RTCRtpTransceiverDirection)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" FAIL RTCRtpTransceiver interface: calling setDirection(RTCRtpTransceiverDirection) on new RTCPeerConnection().addTransceiver('audio') with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" -FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "stop" with the proper type (7) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" -FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "setCodecPreferences" with the proper type (8) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" +FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "stop()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" +FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "setCodecPreferences([object Object])" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" FAIL RTCRtpTransceiver interface: calling setCodecPreferences([object Object]) on new RTCPeerConnection().addTransceiver('audio') with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function" FAIL RTCDtlsTransport interface: existence and properties of interface object assert_own_property: self does not have own property "RTCDtlsTransport" expected property "RTCDtlsTransport" missing FAIL RTCDtlsTransport interface object length assert_own_property: self does not have own property "RTCDtlsTransport" expected property "RTCDtlsTransport" missing @@ -336,10 +336,10 @@ FAIL RTCDtlsTransport interface: attribute onstatechange assert_own_property: self does not have own property "RTCDtlsTransport" expected property "RTCDtlsTransport" missing FAIL RTCDtlsTransport must be primary interface of idlTestObjects.dtlsTransport assert_equals: wrong typeof object expected "object" but got "undefined" FAIL Stringification of idlTestObjects.dtlsTransport assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL RTCDtlsTransport interface: idlTestObjects.dtlsTransport must inherit property "transport" with the proper type (0) assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL RTCDtlsTransport interface: idlTestObjects.dtlsTransport must inherit property "state" with the proper type (1) assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL RTCDtlsTransport interface: idlTestObjects.dtlsTransport must inherit property "getRemoteCertificates" with the proper type (2) assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL RTCDtlsTransport interface: idlTestObjects.dtlsTransport must inherit property "onstatechange" with the proper type (3) assert_equals: wrong typeof object expected "object" but got "undefined" +FAIL RTCDtlsTransport interface: idlTestObjects.dtlsTransport must inherit property "transport" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" +FAIL RTCDtlsTransport interface: idlTestObjects.dtlsTransport must inherit property "state" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" +FAIL RTCDtlsTransport interface: idlTestObjects.dtlsTransport must inherit property "getRemoteCertificates()" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" +FAIL RTCDtlsTransport interface: idlTestObjects.dtlsTransport must inherit property "onstatechange" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" FAIL RTCIceTransport interface: existence and properties of interface object assert_own_property: self does not have own property "RTCIceTransport" expected property "RTCIceTransport" missing FAIL RTCIceTransport interface object length assert_own_property: self does not have own property "RTCIceTransport" expected property "RTCIceTransport" missing FAIL RTCIceTransport interface object name assert_own_property: self does not have own property "RTCIceTransport" expected property "RTCIceTransport" missing @@ -359,18 +359,18 @@ FAIL RTCIceTransport interface: attribute onselectedcandidatepairchange assert_own_property: self does not have own property "RTCIceTransport" expected property "RTCIceTransport" missing FAIL RTCIceTransport must be primary interface of idlTestObjects.iceTransport assert_equals: wrong typeof object expected "object" but got "undefined" FAIL Stringification of idlTestObjects.iceTransport assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "role" with the proper type (0) assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "component" with the proper type (1) assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "state" with the proper type (2) assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "gatheringState" with the proper type (3) assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "getLocalCandidates" with the proper type (4) assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "getRemoteCandidates" with the proper type (5) assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "getSelectedCandidatePair" with the proper type (6) assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "getLocalParameters" with the proper type (7) assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "getRemoteParameters" with the proper type (8) assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "onstatechange" with the proper type (9) assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "ongatheringstatechange" with the proper type (10) assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "onselectedcandidatepairchange" with the proper type (11) assert_equals: wrong typeof object expected "object" but got "undefined" +FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "role" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" +FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "component" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" +FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "state" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" +FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "gatheringState" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" +FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "getLocalCandidates()" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" +FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "getRemoteCandidates()" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" +FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "getSelectedCandidatePair()" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" +FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "getLocalParameters()" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" +FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "getRemoteParameters()" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" +FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "onstatechange" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" +FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "ongatheringstatechange" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" +FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "onselectedcandidatepairchange" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" FAIL RTCTrackEvent interface: existence and properties of interface object assert_own_property: self does not have own property "RTCTrackEvent" expected property "RTCTrackEvent" missing FAIL RTCTrackEvent interface object length assert_own_property: self does not have own property "RTCTrackEvent" expected property "RTCTrackEvent" missing FAIL RTCTrackEvent interface object name assert_own_property: self does not have own property "RTCTrackEvent" expected property "RTCTrackEvent" missing @@ -382,10 +382,10 @@ FAIL RTCTrackEvent interface: attribute transceiver assert_own_property: self does not have own property "RTCTrackEvent" expected property "RTCTrackEvent" missing FAIL RTCTrackEvent must be primary interface of initTrackEvent() assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: pc.addTransceiver is not a function" FAIL Stringification of initTrackEvent() assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: pc.addTransceiver is not a function" -FAIL RTCTrackEvent interface: initTrackEvent() must inherit property "receiver" with the proper type (0) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: pc.addTransceiver is not a function" -FAIL RTCTrackEvent interface: initTrackEvent() must inherit property "track" with the proper type (1) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: pc.addTransceiver is not a function" -FAIL RTCTrackEvent interface: initTrackEvent() must inherit property "streams" with the proper type (2) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: pc.addTransceiver is not a function" -FAIL RTCTrackEvent interface: initTrackEvent() must inherit property "transceiver" with the proper type (3) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: pc.addTransceiver is not a function" +FAIL RTCTrackEvent interface: initTrackEvent() must inherit property "receiver" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: pc.addTransceiver is not a function" +FAIL RTCTrackEvent interface: initTrackEvent() must inherit property "track" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: pc.addTransceiver is not a function" +FAIL RTCTrackEvent interface: initTrackEvent() must inherit property "streams" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: pc.addTransceiver is not a function" +FAIL RTCTrackEvent interface: initTrackEvent() must inherit property "transceiver" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: pc.addTransceiver is not a function" FAIL RTCSctpTransport interface: existence and properties of interface object assert_own_property: self does not have own property "RTCSctpTransport" expected property "RTCSctpTransport" missing FAIL RTCSctpTransport interface object length assert_own_property: self does not have own property "RTCSctpTransport" expected property "RTCSctpTransport" missing FAIL RTCSctpTransport interface object name assert_own_property: self does not have own property "RTCSctpTransport" expected property "RTCSctpTransport" missing @@ -395,8 +395,8 @@ FAIL RTCSctpTransport interface: attribute maxMessageSize assert_own_property: self does not have own property "RTCSctpTransport" expected property "RTCSctpTransport" missing FAIL RTCSctpTransport must be primary interface of idlTestObjects.sctpTransport assert_equals: wrong typeof object expected "object" but got "undefined" FAIL Stringification of idlTestObjects.sctpTransport assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL RTCSctpTransport interface: idlTestObjects.sctpTransport must inherit property "transport" with the proper type (0) assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL RTCSctpTransport interface: idlTestObjects.sctpTransport must inherit property "maxMessageSize" with the proper type (1) assert_equals: wrong typeof object expected "object" but got "undefined" +FAIL RTCSctpTransport interface: idlTestObjects.sctpTransport must inherit property "transport" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" +FAIL RTCSctpTransport interface: idlTestObjects.sctpTransport must inherit property "maxMessageSize" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" FAIL RTCDataChannel interface: existence and properties of interface object Cannot read property 'has_extended_attribute' of undefined PASS RTCDataChannel interface object length PASS RTCDataChannel interface object name @@ -426,31 +426,31 @@ PASS RTCDataChannel interface: operation send(ArrayBufferView) PASS RTCDataChannel must be primary interface of new RTCPeerConnection().createDataChannel('') FAIL Stringification of new RTCPeerConnection().createDataChannel('') Cannot read property 'has_stringifier' of undefined -PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "label" with the proper type (0) -PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "ordered" with the proper type (1) -FAIL RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "maxPacketLifeTime" with the proper type (2) assert_inherits: property "maxPacketLifeTime" not found in prototype chain -PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "maxRetransmits" with the proper type (3) -PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "protocol" with the proper type (4) -PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "negotiated" with the proper type (5) -PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "id" with the proper type (6) -FAIL RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "priority" with the proper type (7) assert_inherits: property "priority" not found in prototype chain -PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "readyState" with the proper type (8) -PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "bufferedAmount" with the proper type (9) -PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "bufferedAmountLowThreshold" with the proper type (10) -PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "onopen" with the proper type (11) -PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "onbufferedamountlow" with the proper type (12) -PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "onerror" with the proper type (13) -PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "onclose" with the proper type (14) -PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "close" with the proper type (15) -PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "onmessage" with the proper type (16) -PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "binaryType" with the proper type (17) -PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "send" with the proper type (18) +PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "label" with the proper type +PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "ordered" with the proper type +FAIL RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "maxPacketLifeTime" with the proper type assert_inherits: property "maxPacketLifeTime" not found in prototype chain +PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "maxRetransmits" with the proper type +PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "protocol" with the proper type +PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "negotiated" with the proper type +PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "id" with the proper type +FAIL RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "priority" with the proper type assert_inherits: property "priority" not found in prototype chain +PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "readyState" with the proper type +PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "bufferedAmount" with the proper type +PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "bufferedAmountLowThreshold" with the proper type +PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "onopen" with the proper type +PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "onbufferedamountlow" with the proper type +PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "onerror" with the proper type +PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "onclose" with the proper type +PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "close()" with the proper type +PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "onmessage" with the proper type +PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "binaryType" with the proper type +PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "send(USVString)" with the proper type PASS RTCDataChannel interface: calling send(USVString) on new RTCPeerConnection().createDataChannel('') with too few arguments must throw TypeError -PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "send" with the proper type (19) +PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "send(Blob)" with the proper type PASS RTCDataChannel interface: calling send(Blob) on new RTCPeerConnection().createDataChannel('') with too few arguments must throw TypeError -PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "send" with the proper type (20) +PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "send(ArrayBuffer)" with the proper type PASS RTCDataChannel interface: calling send(ArrayBuffer) on new RTCPeerConnection().createDataChannel('') with too few arguments must throw TypeError -PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "send" with the proper type (21) +PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "send(ArrayBufferView)" with the proper type PASS RTCDataChannel interface: calling send(ArrayBufferView) on new RTCPeerConnection().createDataChannel('') with too few arguments must throw TypeError FAIL RTCDataChannelEvent interface: existence and properties of interface object Cannot read property 'has_extended_attribute' of undefined PASS RTCDataChannelEvent interface object length @@ -463,13 +463,13 @@ FAIL Stringification of new RTCDataChannelEvent('channel', { channel: new RTCPeerConnection().createDataChannel('') }) Cannot read property 'has_stringifier' of undefined PASS RTCDataChannelEvent interface: new RTCDataChannelEvent('channel', - { channel: new RTCPeerConnection().createDataChannel('') }) must inherit property "channel" with the proper type (0) + { channel: new RTCPeerConnection().createDataChannel('') }) must inherit property "channel" with the proper type FAIL RTCDTMFSender interface: existence and properties of interface object assert_own_property: self does not have own property "RTCDTMFSender" expected property "RTCDTMFSender" missing FAIL RTCDTMFSender interface object length assert_own_property: self does not have own property "RTCDTMFSender" expected property "RTCDTMFSender" missing FAIL RTCDTMFSender interface object name assert_own_property: self does not have own property "RTCDTMFSender" expected property "RTCDTMFSender" missing FAIL RTCDTMFSender interface: existence and properties of interface prototype object assert_own_property: self does not have own property "RTCDTMFSender" expected property "RTCDTMFSender" missing FAIL RTCDTMFSender interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "RTCDTMFSender" expected property "RTCDTMFSender" missing -FAIL RTCDTMFSender interface: operation insertDTMF(DOMString,unsigned long,unsigned long) assert_own_property: self does not have own property "RTCDTMFSender" expected property "RTCDTMFSender" missing +FAIL RTCDTMFSender interface: operation insertDTMF(DOMString, unsigned long, unsigned long) assert_own_property: self does not have own property "RTCDTMFSender" expected property "RTCDTMFSender" missing FAIL RTCDTMFSender interface: attribute ontonechange assert_own_property: self does not have own property "RTCDTMFSender" expected property "RTCDTMFSender" missing FAIL RTCDTMFSender interface: attribute toneBuffer assert_own_property: self does not have own property "RTCDTMFSender" expected property "RTCDTMFSender" missing FAIL RTCDTMFToneChangeEvent interface: existence and properties of interface object assert_own_property: self does not have own property "RTCDTMFToneChangeEvent" expected property "RTCDTMFToneChangeEvent" missing @@ -500,6 +500,6 @@ FAIL RTCErrorEvent interface: attribute error assert_own_property: self does not have own property "RTCErrorEvent" expected property "RTCErrorEvent" missing FAIL RTCErrorEvent must be primary interface of new RTCErrorEvent('error') assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: RTCErrorEvent is not defined" FAIL Stringification of new RTCErrorEvent('error') assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: RTCErrorEvent is not defined" -FAIL RTCErrorEvent interface: new RTCErrorEvent('error') must inherit property "error" with the proper type (0) assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: RTCErrorEvent is not defined" +FAIL RTCErrorEvent interface: new RTCErrorEvent('error') must inherit property "error" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: RTCErrorEvent is not defined" Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webstorage/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webstorage/idlharness-expected.txt index bb44350..4b5ce02 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webstorage/idlharness-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/webstorage/idlharness-expected.txt
@@ -9,21 +9,21 @@ FAIL Storage interface: attribute length assert_true: property should be enumerable expected true got false FAIL Storage interface: operation key(unsigned long) assert_true: property should be enumerable expected true got false FAIL Storage interface: operation getItem(DOMString) assert_true: property should be enumerable expected true got false -FAIL Storage interface: operation setItem(DOMString,DOMString) assert_true: property should be enumerable expected true got false +FAIL Storage interface: operation setItem(DOMString, DOMString) assert_true: property should be enumerable expected true got false FAIL Storage interface: operation removeItem(DOMString) assert_true: property should be enumerable expected true got false FAIL Storage interface: operation clear() assert_true: property should be enumerable expected true got false PASS Storage must be primary interface of window.localStorage PASS Stringification of window.localStorage -PASS Storage interface: window.localStorage must inherit property "length" with the proper type (0) -PASS Storage interface: window.localStorage must inherit property "key" with the proper type (1) +PASS Storage interface: window.localStorage must inherit property "length" with the proper type +PASS Storage interface: window.localStorage must inherit property "key(unsigned long)" with the proper type PASS Storage interface: calling key(unsigned long) on window.localStorage with too few arguments must throw TypeError -PASS Storage interface: window.localStorage must inherit property "getItem" with the proper type (2) +PASS Storage interface: window.localStorage must inherit property "getItem(DOMString)" with the proper type PASS Storage interface: calling getItem(DOMString) on window.localStorage with too few arguments must throw TypeError -PASS Storage interface: window.localStorage must inherit property "setItem" with the proper type (3) -PASS Storage interface: calling setItem(DOMString,DOMString) on window.localStorage with too few arguments must throw TypeError -PASS Storage interface: window.localStorage must inherit property "removeItem" with the proper type (4) +PASS Storage interface: window.localStorage must inherit property "setItem(DOMString, DOMString)" with the proper type +PASS Storage interface: calling setItem(DOMString, DOMString) on window.localStorage with too few arguments must throw TypeError +PASS Storage interface: window.localStorage must inherit property "removeItem(DOMString)" with the proper type PASS Storage interface: calling removeItem(DOMString) on window.localStorage with too few arguments must throw TypeError -PASS Storage interface: window.localStorage must inherit property "clear" with the proper type (5) +PASS Storage interface: window.localStorage must inherit property "clear()" with the proper type PASS StorageEvent interface: existence and properties of interface object PASS StorageEvent interface object length PASS StorageEvent interface object name
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webvtt/api/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webvtt/api/interfaces-expected.txt index f20b50b9..ab25b95 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webvtt/api/interfaces-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/webvtt/api/interfaces-expected.txt
@@ -18,17 +18,17 @@ PASS VTTCue interface: operation getCueAsHTML() PASS VTTCue must be primary interface of new VTTCue(0, 0, "") PASS Stringification of new VTTCue(0, 0, "") -PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "region" with the proper type (0) -PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "vertical" with the proper type (1) -PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "snapToLines" with the proper type (2) -PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "line" with the proper type (3) -FAIL VTTCue interface: new VTTCue(0, 0, "") must inherit property "lineAlign" with the proper type (4) assert_inherits: property "lineAlign" not found in prototype chain -PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "position" with the proper type (5) -FAIL VTTCue interface: new VTTCue(0, 0, "") must inherit property "positionAlign" with the proper type (6) assert_inherits: property "positionAlign" not found in prototype chain -PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "size" with the proper type (7) -PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "align" with the proper type (8) -PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "text" with the proper type (9) -PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "getCueAsHTML" with the proper type (10) +PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "region" with the proper type +PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "vertical" with the proper type +PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "snapToLines" with the proper type +PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "line" with the proper type +FAIL VTTCue interface: new VTTCue(0, 0, "") must inherit property "lineAlign" with the proper type assert_inherits: property "lineAlign" not found in prototype chain +PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "position" with the proper type +FAIL VTTCue interface: new VTTCue(0, 0, "") must inherit property "positionAlign" with the proper type assert_inherits: property "positionAlign" not found in prototype chain +PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "size" with the proper type +PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "align" with the proper type +PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "text" with the proper type +PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "getCueAsHTML()" with the proper type PASS VTTRegion interface: existence and properties of interface object PASS VTTRegion interface object length PASS VTTRegion interface object name @@ -43,12 +43,12 @@ PASS VTTRegion interface: attribute scroll PASS VTTRegion must be primary interface of new VTTRegion() PASS Stringification of new VTTRegion() -PASS VTTRegion interface: new VTTRegion() must inherit property "width" with the proper type (0) -PASS VTTRegion interface: new VTTRegion() must inherit property "lines" with the proper type (1) -PASS VTTRegion interface: new VTTRegion() must inherit property "regionAnchorX" with the proper type (2) -PASS VTTRegion interface: new VTTRegion() must inherit property "regionAnchorY" with the proper type (3) -PASS VTTRegion interface: new VTTRegion() must inherit property "viewportAnchorX" with the proper type (4) -PASS VTTRegion interface: new VTTRegion() must inherit property "viewportAnchorY" with the proper type (5) -PASS VTTRegion interface: new VTTRegion() must inherit property "scroll" with the proper type (6) +PASS VTTRegion interface: new VTTRegion() must inherit property "width" with the proper type +PASS VTTRegion interface: new VTTRegion() must inherit property "lines" with the proper type +PASS VTTRegion interface: new VTTRegion() must inherit property "regionAnchorX" with the proper type +PASS VTTRegion interface: new VTTRegion() must inherit property "regionAnchorY" with the proper type +PASS VTTRegion interface: new VTTRegion() must inherit property "viewportAnchorX" with the proper type +PASS VTTRegion interface: new VTTRegion() must inherit property "viewportAnchorY" with the proper type +PASS VTTRegion interface: new VTTRegion() must inherit property "scroll" with the proper type Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/workers/Worker_dispatchEvent_ErrorEvent.htm b/third_party/WebKit/LayoutTests/external/wpt/workers/Worker_dispatchEvent_ErrorEvent.htm index aea7e025..11ade605 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/workers/Worker_dispatchEvent_ErrorEvent.htm +++ b/third_party/WebKit/LayoutTests/external/wpt/workers/Worker_dispatchEvent_ErrorEvent.htm
@@ -25,12 +25,6 @@ }); test(function() { - var e = document.createEvent("ErrorEvent"); - var eProto = Object.getPrototypeOf(e); - assert_equals(eProto, ErrorEvent.prototype); -}, "document.createEvent('ErrorEvent')"); - -test(function() { var e = new ErrorEvent("error"); assert_false("initErrorEvent" in e, "should not be supported"); }, "initErrorEvent");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/workers/data-url.html b/third_party/WebKit/LayoutTests/external/wpt/workers/data-url.html index 3a4eb6c..8743490f 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/workers/data-url.html +++ b/third_party/WebKit/LayoutTests/external/wpt/workers/data-url.html
@@ -25,7 +25,8 @@ w.onmessage = t.step_func_done(function(e) { assert_unreached('Should not receive any message back.'); }); - w.onerror = t.step_func_done(function() { + w.onerror = t.step_func_done(function(e) { + assert_true(true, 'Should throw ' + e.message); }); }, test_desc); } @@ -50,8 +51,9 @@ assert_worker_sends_pass('cross-origin worker', '', 'fetch("/").then(() => self.postMessage("FAIL"), () => self.postMessage("PASS"))'); // 'data:' workers have opaque origin -assert_worker_sends_pass('worker has opaque origin', 'application/javascript', 'if (self.location.origin == "null") postMessage("PASS"); else postMessage("FAIL");'); +assert_worker_sends_pass('worker has opaque origin', 'application/javascript', 'if (self.location.origin == "null") {postMessage("PASS");} else {postMessage("FAIL");}'); +setup({allow_uncaught_exception:true}); // invalid javascript will trigger an ErrorEvent assert_worker_construction_fails('invalid javascript produces error', 'application/javascript', '}x=3');
diff --git a/third_party/WebKit/LayoutTests/external/wpt/workers/interfaces.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/workers/interfaces.worker-expected.txt index 4cbda0d..e8cf991 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/workers/interfaces.worker-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/workers/interfaces.worker-expected.txt
@@ -5,8 +5,8 @@ PASS EventTarget interface object name PASS EventTarget interface: existence and properties of interface prototype object PASS EventTarget interface: existence and properties of interface prototype object's "constructor" property -PASS EventTarget interface: operation addEventListener(DOMString,EventListener,[object Object],[object Object]) -PASS EventTarget interface: operation removeEventListener(DOMString,EventListener,[object Object],[object Object]) +PASS EventTarget interface: operation addEventListener(DOMString, EventListener, [object Object],[object Object]) +PASS EventTarget interface: operation removeEventListener(DOMString, EventListener, [object Object],[object Object]) PASS EventTarget interface: operation dispatchEvent(Event) PASS EventListener interface: existence and properties of interface object PASS WorkerGlobalScope interface: existence and properties of interface object @@ -27,12 +27,12 @@ PASS WorkerGlobalScope interface: attribute origin PASS WorkerGlobalScope interface: operation btoa(DOMString) PASS WorkerGlobalScope interface: operation atob(DOMString) -PASS WorkerGlobalScope interface: operation setTimeout(TimerHandler,long,any) +PASS WorkerGlobalScope interface: operation setTimeout(TimerHandler, long, any) PASS WorkerGlobalScope interface: operation clearTimeout(long) -PASS WorkerGlobalScope interface: operation setInterval(TimerHandler,long,any) +PASS WorkerGlobalScope interface: operation setInterval(TimerHandler, long, any) PASS WorkerGlobalScope interface: operation clearInterval(long) -PASS WorkerGlobalScope interface: operation createImageBitmap(ImageBitmapSource,ImageBitmapOptions) -PASS WorkerGlobalScope interface: operation createImageBitmap(ImageBitmapSource,long,long,long,long,ImageBitmapOptions) +PASS WorkerGlobalScope interface: operation createImageBitmap(ImageBitmapSource, ImageBitmapOptions) +PASS WorkerGlobalScope interface: operation createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions) PASS DedicatedWorkerGlobalScope interface: existence and properties of interface object PASS DedicatedWorkerGlobalScope interface object length PASS DedicatedWorkerGlobalScope interface object name @@ -45,7 +45,7 @@ PASS DedicatedWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Reflect.setPrototypeOf should return true PASS DedicatedWorkerGlobalScope interface: existence and properties of interface prototype object's "constructor" property FAIL DedicatedWorkerGlobalScope interface: attribute name assert_own_property: The global object must have a property "name" expected property "name" missing -PASS DedicatedWorkerGlobalScope interface: operation postMessage(any,[object Object]) +PASS DedicatedWorkerGlobalScope interface: operation postMessage(any, [object Object]) PASS DedicatedWorkerGlobalScope interface: operation close() PASS DedicatedWorkerGlobalScope interface: attribute onmessage PASS DedicatedWorkerGlobalScope interface: attribute onmessageerror @@ -57,45 +57,45 @@ PASS DedicatedWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Reflect.setPrototypeOf should return true PASS DedicatedWorkerGlobalScope must be primary interface of self PASS Stringification of self -FAIL DedicatedWorkerGlobalScope interface: self must inherit property "name" with the proper type (0) assert_own_property: expected property "name" missing -PASS DedicatedWorkerGlobalScope interface: self must inherit property "postMessage" with the proper type (1) -PASS DedicatedWorkerGlobalScope interface: calling postMessage(any,[object Object]) on self with too few arguments must throw TypeError -PASS DedicatedWorkerGlobalScope interface: self must inherit property "close" with the proper type (2) -PASS DedicatedWorkerGlobalScope interface: self must inherit property "onmessage" with the proper type (3) -PASS DedicatedWorkerGlobalScope interface: self must inherit property "onmessageerror" with the proper type (4) -PASS WorkerGlobalScope interface: self must inherit property "self" with the proper type (0) -PASS WorkerGlobalScope interface: self must inherit property "location" with the proper type (1) -PASS WorkerGlobalScope interface: self must inherit property "navigator" with the proper type (2) -PASS WorkerGlobalScope interface: self must inherit property "importScripts" with the proper type (3) +FAIL DedicatedWorkerGlobalScope interface: self must inherit property "name" with the proper type assert_own_property: expected property "name" missing +PASS DedicatedWorkerGlobalScope interface: self must inherit property "postMessage(any, [object Object])" with the proper type +PASS DedicatedWorkerGlobalScope interface: calling postMessage(any, [object Object]) on self with too few arguments must throw TypeError +PASS DedicatedWorkerGlobalScope interface: self must inherit property "close()" with the proper type +PASS DedicatedWorkerGlobalScope interface: self must inherit property "onmessage" with the proper type +PASS DedicatedWorkerGlobalScope interface: self must inherit property "onmessageerror" with the proper type +PASS WorkerGlobalScope interface: self must inherit property "self" with the proper type +PASS WorkerGlobalScope interface: self must inherit property "location" with the proper type +PASS WorkerGlobalScope interface: self must inherit property "navigator" with the proper type +PASS WorkerGlobalScope interface: self must inherit property "importScripts(USVString)" with the proper type PASS WorkerGlobalScope interface: calling importScripts(USVString) on self with too few arguments must throw TypeError -PASS WorkerGlobalScope interface: self must inherit property "onerror" with the proper type (4) -FAIL WorkerGlobalScope interface: self must inherit property "onlanguagechange" with the proper type (5) assert_inherits: property "onlanguagechange" not found in prototype chain -FAIL WorkerGlobalScope interface: self must inherit property "onoffline" with the proper type (6) assert_inherits: property "onoffline" not found in prototype chain -FAIL WorkerGlobalScope interface: self must inherit property "ononline" with the proper type (7) assert_inherits: property "ononline" not found in prototype chain -PASS WorkerGlobalScope interface: self must inherit property "onrejectionhandled" with the proper type (8) -PASS WorkerGlobalScope interface: self must inherit property "onunhandledrejection" with the proper type (9) -PASS WorkerGlobalScope interface: self must inherit property "origin" with the proper type (10) -PASS WorkerGlobalScope interface: self must inherit property "btoa" with the proper type (11) +PASS WorkerGlobalScope interface: self must inherit property "onerror" with the proper type +FAIL WorkerGlobalScope interface: self must inherit property "onlanguagechange" with the proper type assert_inherits: property "onlanguagechange" not found in prototype chain +FAIL WorkerGlobalScope interface: self must inherit property "onoffline" with the proper type assert_inherits: property "onoffline" not found in prototype chain +FAIL WorkerGlobalScope interface: self must inherit property "ononline" with the proper type assert_inherits: property "ononline" not found in prototype chain +PASS WorkerGlobalScope interface: self must inherit property "onrejectionhandled" with the proper type +PASS WorkerGlobalScope interface: self must inherit property "onunhandledrejection" with the proper type +PASS WorkerGlobalScope interface: self must inherit property "origin" with the proper type +PASS WorkerGlobalScope interface: self must inherit property "btoa(DOMString)" with the proper type PASS WorkerGlobalScope interface: calling btoa(DOMString) on self with too few arguments must throw TypeError -PASS WorkerGlobalScope interface: self must inherit property "atob" with the proper type (12) +PASS WorkerGlobalScope interface: self must inherit property "atob(DOMString)" with the proper type PASS WorkerGlobalScope interface: calling atob(DOMString) on self with too few arguments must throw TypeError -PASS WorkerGlobalScope interface: self must inherit property "setTimeout" with the proper type (13) -PASS WorkerGlobalScope interface: calling setTimeout(TimerHandler,long,any) on self with too few arguments must throw TypeError -PASS WorkerGlobalScope interface: self must inherit property "clearTimeout" with the proper type (14) +PASS WorkerGlobalScope interface: self must inherit property "setTimeout(TimerHandler, long, any)" with the proper type +PASS WorkerGlobalScope interface: calling setTimeout(TimerHandler, long, any) on self with too few arguments must throw TypeError +PASS WorkerGlobalScope interface: self must inherit property "clearTimeout(long)" with the proper type PASS WorkerGlobalScope interface: calling clearTimeout(long) on self with too few arguments must throw TypeError -PASS WorkerGlobalScope interface: self must inherit property "setInterval" with the proper type (15) -PASS WorkerGlobalScope interface: calling setInterval(TimerHandler,long,any) on self with too few arguments must throw TypeError -PASS WorkerGlobalScope interface: self must inherit property "clearInterval" with the proper type (16) +PASS WorkerGlobalScope interface: self must inherit property "setInterval(TimerHandler, long, any)" with the proper type +PASS WorkerGlobalScope interface: calling setInterval(TimerHandler, long, any) on self with too few arguments must throw TypeError +PASS WorkerGlobalScope interface: self must inherit property "clearInterval(long)" with the proper type PASS WorkerGlobalScope interface: calling clearInterval(long) on self with too few arguments must throw TypeError -PASS WorkerGlobalScope interface: self must inherit property "createImageBitmap" with the proper type (17) -PASS WorkerGlobalScope interface: calling createImageBitmap(ImageBitmapSource,ImageBitmapOptions) on self with too few arguments must throw TypeError -PASS WorkerGlobalScope interface: self must inherit property "createImageBitmap" with the proper type (18) -PASS WorkerGlobalScope interface: calling createImageBitmap(ImageBitmapSource,long,long,long,long,ImageBitmapOptions) on self with too few arguments must throw TypeError -PASS EventTarget interface: self must inherit property "addEventListener" with the proper type (0) -PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on self with too few arguments must throw TypeError -PASS EventTarget interface: self must inherit property "removeEventListener" with the proper type (1) -PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on self with too few arguments must throw TypeError -PASS EventTarget interface: self must inherit property "dispatchEvent" with the proper type (2) +PASS WorkerGlobalScope interface: self must inherit property "createImageBitmap(ImageBitmapSource, ImageBitmapOptions)" with the proper type +PASS WorkerGlobalScope interface: calling createImageBitmap(ImageBitmapSource, ImageBitmapOptions) on self with too few arguments must throw TypeError +PASS WorkerGlobalScope interface: self must inherit property "createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions)" with the proper type +PASS WorkerGlobalScope interface: calling createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions) on self with too few arguments must throw TypeError +PASS EventTarget interface: self must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on self with too few arguments must throw TypeError +PASS EventTarget interface: self must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on self with too few arguments must throw TypeError +PASS EventTarget interface: self must inherit property "dispatchEvent(Event)" with the proper type PASS EventTarget interface: calling dispatchEvent(Event) on self with too few arguments must throw TypeError PASS WorkerNavigator interface: existence and properties of interface object PASS WorkerNavigator interface object length @@ -117,19 +117,19 @@ PASS WorkerNavigator interface: attribute hardwareConcurrency PASS WorkerNavigator must be primary interface of self.navigator PASS Stringification of self.navigator -PASS WorkerNavigator interface: self.navigator must inherit property "appCodeName" with the proper type (0) -PASS WorkerNavigator interface: self.navigator must inherit property "appName" with the proper type (1) -PASS WorkerNavigator interface: self.navigator must inherit property "appVersion" with the proper type (2) -PASS WorkerNavigator interface: self.navigator must inherit property "platform" with the proper type (3) -PASS WorkerNavigator interface: self.navigator must inherit property "product" with the proper type (4) +PASS WorkerNavigator interface: self.navigator must inherit property "appCodeName" with the proper type +PASS WorkerNavigator interface: self.navigator must inherit property "appName" with the proper type +PASS WorkerNavigator interface: self.navigator must inherit property "appVersion" with the proper type +PASS WorkerNavigator interface: self.navigator must inherit property "platform" with the proper type +PASS WorkerNavigator interface: self.navigator must inherit property "product" with the proper type PASS WorkerNavigatorinterface: self.navigatormust not have property "productSub" -PASS WorkerNavigator interface: self.navigator must inherit property "userAgent" with the proper type (6) +PASS WorkerNavigator interface: self.navigator must inherit property "userAgent" with the proper type PASS WorkerNavigatorinterface: self.navigatormust not have property "vendor" PASS WorkerNavigatorinterface: self.navigatormust not have property "vendorSub" -FAIL WorkerNavigator interface: self.navigator must inherit property "language" with the proper type (9) assert_inherits: property "language" not found in prototype chain -FAIL WorkerNavigator interface: self.navigator must inherit property "languages" with the proper type (10) assert_inherits: property "languages" not found in prototype chain -PASS WorkerNavigator interface: self.navigator must inherit property "onLine" with the proper type (11) -PASS WorkerNavigator interface: self.navigator must inherit property "hardwareConcurrency" with the proper type (12) +FAIL WorkerNavigator interface: self.navigator must inherit property "language" with the proper type assert_inherits: property "language" not found in prototype chain +FAIL WorkerNavigator interface: self.navigator must inherit property "languages" with the proper type assert_inherits: property "languages" not found in prototype chain +PASS WorkerNavigator interface: self.navigator must inherit property "onLine" with the proper type +PASS WorkerNavigator interface: self.navigator must inherit property "hardwareConcurrency" with the proper type PASS WorkerLocation interface: existence and properties of interface object PASS WorkerLocation interface object length PASS WorkerLocation interface object name @@ -147,14 +147,14 @@ PASS WorkerLocation interface: attribute hash PASS WorkerLocation must be primary interface of self.location PASS Stringification of self.location -PASS WorkerLocation interface: self.location must inherit property "href" with the proper type (0) -PASS WorkerLocation interface: self.location must inherit property "origin" with the proper type (1) -PASS WorkerLocation interface: self.location must inherit property "protocol" with the proper type (2) -PASS WorkerLocation interface: self.location must inherit property "host" with the proper type (3) -PASS WorkerLocation interface: self.location must inherit property "hostname" with the proper type (4) -PASS WorkerLocation interface: self.location must inherit property "port" with the proper type (5) -PASS WorkerLocation interface: self.location must inherit property "pathname" with the proper type (6) -PASS WorkerLocation interface: self.location must inherit property "search" with the proper type (7) -PASS WorkerLocation interface: self.location must inherit property "hash" with the proper type (8) +PASS WorkerLocation interface: self.location must inherit property "href" with the proper type +PASS WorkerLocation interface: self.location must inherit property "origin" with the proper type +PASS WorkerLocation interface: self.location must inherit property "protocol" with the proper type +PASS WorkerLocation interface: self.location must inherit property "host" with the proper type +PASS WorkerLocation interface: self.location must inherit property "hostname" with the proper type +PASS WorkerLocation interface: self.location must inherit property "port" with the proper type +PASS WorkerLocation interface: self.location must inherit property "pathname" with the proper type +PASS WorkerLocation interface: self.location must inherit property "search" with the proper type +PASS WorkerLocation interface: self.location must inherit property "hash" with the proper type Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/fast/canvas/canvas-getImageData-linear-rgb.html b/third_party/WebKit/LayoutTests/fast/canvas/canvas-getImageData-linear-rgb.html deleted file mode 100644 index 548783c..0000000 --- a/third_party/WebKit/LayoutTests/fast/canvas/canvas-getImageData-linear-rgb.html +++ /dev/null
@@ -1,44 +0,0 @@ -<!DOCTYPE html> -<body> -<script src="../../resources/testharness.js"></script> -<script src="../../resources/testharnessreport.js"></script> -<script> -test(drawThenGetImageData, 'verifies that getImageData works on linear-rgb canvases.'); -test(putThenGetImageData, 'verifies that putImageData works on linear-rgb canvases.'); - -function drawThenGetImageData() { - var canvas = document.createElement('canvas'); - canvas.width = 10; - canvas.height = 10; - var ctx = canvas.getContext('2d', {colorSpace: 'srgb', pixelFormat: 'float16'}) - ctx.fillStyle = 'rgb(50, 100, 150)'; - ctx.fillRect(0, 0, 10, 10); - var pixel = ctx.getImageData(5, 5, 1, 1).data; - // Note: the color specified as as fillStyle is converted from srgb to linear - // when drawn and the the results of getImageData are re-converted to sRGB - assert_equals(pixel[0], 50, "Red component retrieved by getImageData is the color that was drawn." ); - assert_equals(pixel[1], 100, "Green component retrieved by getImageData is the color that was drawn." ); - assert_equals(pixel[2], 150, "Blue component retrieved by getImageData is the color that was drawn." ); - assert_equals(pixel[3], 255, "Alpha component retrieved by getImageData is the color that was drawn." ); -} - -function putThenGetImageData() { - var canvas = document.createElement('canvas'); - canvas.width = 10; - canvas.height = 10; - var ctx = canvas.getContext('2d', {colorSpace: 'srgb', pixelFormat: 'float16'}) - var initialData = ctx.createImageData(1, 1); - initialData.data[0] = 50; - initialData.data[1] = 100; - initialData.data[2] = 150; - initialData.data[3] = 255; - ctx.putImageData(initialData, 5, 5); - var pixel = ctx.getImageData(5, 5, 1, 1).data; - assert_equals(pixel[0], 50, "Red component retrieved by getImageData is the color that was put." ); - assert_equals(pixel[1], 100, "Green component retrieved by getImageData is the color that was put." ); - assert_equals(pixel[2], 150, "Blue component retrieved by getImageData is the color that was put." ); - assert_equals(pixel[3], 255, "Alpha component retrieved by getImageData is the color that was put." ); -} - -</script> -</body>
diff --git a/third_party/WebKit/LayoutTests/fast/canvas/canvas-getImageData-p3.html b/third_party/WebKit/LayoutTests/fast/canvas/canvas-getImageData-p3.html deleted file mode 100644 index 955f989..0000000 --- a/third_party/WebKit/LayoutTests/fast/canvas/canvas-getImageData-p3.html +++ /dev/null
@@ -1,43 +0,0 @@ -<!DOCTYPE html> -<body> -<script src="../../resources/testharness.js"></script> -<script src="../../resources/testharnessreport.js"></script> -<script> -test(drawThenGetImageData, 'verifies that getImageData works on P3 canvases.'); -test(putThenGetImageData, 'verifies that putImageData works on P3 canvases.'); - -function drawThenGetImageData() { - var canvas = document.createElement('canvas'); - canvas.width = 10; - canvas.height = 10; - var ctx = canvas.getContext('2d', {colorSpace: 'p3'}) - ctx.fillStyle = 'rgb(50, 100, 150)'; - ctx.fillRect(0, 0, 10, 10); - var pixel = ctx.getImageData(5, 5, 1, 1).data; - // Note: the color specified as as fillStyle is converted from srgb to linear - // when drawn and the the results of getImageData are re-converted to sRGB - assert_equals(pixel[0], 50, "Red component retrieved by getImageData is the color that was drawn." ); - assert_equals(pixel[1], 100, "Green component retrieved by getImageData is the color that was drawn." ); - assert_equals(pixel[2], 150, "Blue component retrieved by getImageData is the color that was drawn." ); - assert_equals(pixel[3], 255, "Alpha component retrieved by getImageData is the color that was drawn." ); -} - -function putThenGetImageData() { - var canvas = document.createElement('canvas'); - canvas.width = 10; - canvas.height = 10; - var ctx = canvas.getContext('2d', {colorSpace: 'p3'}) - var initialData = ctx.createImageData(1, 1); - initialData.data[0] = 50; - initialData.data[1] = 100; - initialData.data[2] = 150; - initialData.data[3] = 255; - ctx.putImageData(initialData, 5, 5); - var pixel = ctx.getImageData(5, 5, 1, 1).data; - assert_equals(pixel[0], 50, "Red component retrieved by getImageData is the color that was put." ); - assert_equals(pixel[1], 100, "Green component retrieved by getImageData is the color that was put." ); - assert_equals(pixel[2], 150, "Blue component retrieved by getImageData is the color that was put." ); - assert_equals(pixel[3], 255, "Alpha component retrieved by getImageData is the color that was put." ); -} -</script> -</body>
diff --git a/third_party/WebKit/LayoutTests/fast/canvas/canvas-getImageData-rec2020.html b/third_party/WebKit/LayoutTests/fast/canvas/canvas-getImageData-rec2020.html deleted file mode 100644 index 8b6c1b6..0000000 --- a/third_party/WebKit/LayoutTests/fast/canvas/canvas-getImageData-rec2020.html +++ /dev/null
@@ -1,43 +0,0 @@ -<!DOCTYPE html> -<body> -<script src="../../resources/testharness.js"></script> -<script src="../../resources/testharnessreport.js"></script> -<script> -test(drawThenGetImageData, 'verifies that getImageData works on rec2020 canvases.'); -test(putThenGetImageData, 'verifies that putImageData works on rec2020 canvases.'); - -function drawThenGetImageData() { - var canvas = document.createElement('canvas'); - canvas.width = 10; - canvas.height = 10; - var ctx = canvas.getContext('2d', {colorSpace: 'rec2020'}) - ctx.fillStyle = 'rgb(50, 100, 150)'; - ctx.fillRect(0, 0, 10, 10); - var pixel = ctx.getImageData(5, 5, 1, 1).data; - // Note: the color specified as as fillStyle is converted from srgb to linear - // when drawn and the the results of getImageData are re-converted to sRGB - assert_equals(pixel[0], 50, "Red component retrieved by getImageData is the color that was drawn." ); - assert_equals(pixel[1], 100, "Green component retrieved by getImageData is the color that was drawn." ); - assert_equals(pixel[2], 150, "Blue component retrieved by getImageData is the color that was drawn." ); - assert_equals(pixel[3], 255, "Alpha component retrieved by getImageData is the color that was drawn." ); -} - -function putThenGetImageData() { - var canvas = document.createElement('canvas'); - canvas.width = 10; - canvas.height = 10; - var ctx = canvas.getContext('2d', {colorSpace: 'rec2020'}) - var initialData = ctx.createImageData(1, 1); - initialData.data[0] = 50; - initialData.data[1] = 100; - initialData.data[2] = 150; - initialData.data[3] = 255; - ctx.putImageData(initialData, 5, 5); - var pixel = ctx.getImageData(5, 5, 1, 1).data; - assert_equals(pixel[0], 50, "Red component retrieved by getImageData is the color that was put." ); - assert_equals(pixel[1], 100, "Green component retrieved by getImageData is the color that was put." ); - assert_equals(pixel[2], 150, "Blue component retrieved by getImageData is the color that was put." ); - assert_equals(pixel[3], 255, "Alpha component retrieved by getImageData is the color that was put." ); -} -</script> -</body>
diff --git a/third_party/WebKit/LayoutTests/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png b/third_party/WebKit/LayoutTests/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png index ade4312..f46a177a 100644 --- a/third_party/WebKit/LayoutTests/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png +++ b/third_party/WebKit/LayoutTests/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/fast/dom/Range/scale-page-bounding-client-rect.html b/third_party/WebKit/LayoutTests/fast/dom/Range/scale-page-bounding-client-rect.html index 4150018..f2e03d2c 100644 --- a/third_party/WebKit/LayoutTests/fast/dom/Range/scale-page-bounding-client-rect.html +++ b/third_party/WebKit/LayoutTests/fast/dom/Range/scale-page-bounding-client-rect.html
@@ -8,16 +8,17 @@ testRunner.dumpAsText(); var range = document.createRange(); - range.selectNodeContents(document.getElementById('div')); + range.selectNode(document.getElementById('div')); var rect = range.getBoundingClientRect(); window.internals.setPageScaleFactor(2); var scaledRange = document.createRange(); - scaledRange.selectNodeContents(document.getElementById('div')); + scaledRange.selectNode(document.getElementById('div')); var scaledRect = scaledRange.getBoundingClientRect(); var result = document.getElementById("result"); - if (rect.left == scaledRect.left && + if (rect.width && rect.height && + rect.left == scaledRect.left && rect.top == scaledRect.top && rect.right == scaledRect.right && rect.bottom == scaledRect.bottom)
diff --git a/third_party/WebKit/LayoutTests/fast/dom/Range/scale-page-client-rects.html b/third_party/WebKit/LayoutTests/fast/dom/Range/scale-page-client-rects.html index 65529dd..487c0937 100644 --- a/third_party/WebKit/LayoutTests/fast/dom/Range/scale-page-client-rects.html +++ b/third_party/WebKit/LayoutTests/fast/dom/Range/scale-page-client-rects.html
@@ -8,18 +8,19 @@ testRunner.dumpAsText(); var range = document.createRange(); - range.selectNodeContents(document.getElementById('div')); + range.selectNode(document.getElementById('div')); var rectList = range.getClientRects(); var rect = rectList[0]; window.internals.setPageScaleFactor(2); var scaledRange = document.createRange(); - scaledRange.selectNodeContents(document.getElementById('div')); + scaledRange.selectNode(document.getElementById('div')); var scaledRectList = scaledRange.getClientRects(); var scaledRect = scaledRectList[0]; var result = document.getElementById("result"); - if (rect.left == scaledRect.left && + if (rect.width && rect.height && + rect.left == scaledRect.left && rect.top == scaledRect.top && rect.right == scaledRect.right && rect.bottom == scaledRect.bottom)
diff --git a/third_party/WebKit/LayoutTests/fast/forms/password-length-emoji-expected.html b/third_party/WebKit/LayoutTests/fast/forms/password-length-emoji-expected.html deleted file mode 100644 index 4f451de..0000000 --- a/third_party/WebKit/LayoutTests/fast/forms/password-length-emoji-expected.html +++ /dev/null
@@ -1,11 +0,0 @@ -<!doctype html> -<html> -<body> -<p> This tests that the number of bullet points shown in a password -field reflects the number of "grapheme clusters" even if some of the grapheme -clusters are characters outside the Basic Multilingual Plane, or combining -characters. For <a href="https://crbug.com/486880">crbug.com/486880</a>.</p> -<input type="password" value="x"></input> <!-- one ascii character --> -<br><input type="password" value="cafe"></input> <!-- without combining character --> -</body> -</html>
diff --git a/third_party/WebKit/LayoutTests/fast/forms/password-length-emoji.html b/third_party/WebKit/LayoutTests/fast/forms/password-length-emoji.html deleted file mode 100644 index 22258396..0000000 --- a/third_party/WebKit/LayoutTests/fast/forms/password-length-emoji.html +++ /dev/null
@@ -1,11 +0,0 @@ -<!doctype html> -<html> -<body> -<p> This tests that the number of bullet points shown in a password -field reflects the number of "grapheme clusters" even if some of the grapheme -clusters are characters outside the Basic Multilingual Plane, or combining -characters. For <a href="https://crbug.com/486880">crbug.com/486880</a>.</p> -<input type="password" value="😃"></input> <!-- Smiley face (U+1F603) --> -<br><input type="password" value="café"></input> <!-- with combining character --> -</body> -</html>
diff --git a/third_party/WebKit/LayoutTests/fast/gradients/background-clipped-expected.png b/third_party/WebKit/LayoutTests/fast/gradients/background-clipped-expected.png index 3f4bcff..190b298a 100644 --- a/third_party/WebKit/LayoutTests/fast/gradients/background-clipped-expected.png +++ b/third_party/WebKit/LayoutTests/fast/gradients/background-clipped-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/fast/repaint/sub-frame-svg-background-expected.html b/third_party/WebKit/LayoutTests/fast/repaint/sub-frame-svg-background-expected.html new file mode 100644 index 0000000..b0f6008f --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/repaint/sub-frame-svg-background-expected.html
@@ -0,0 +1,3 @@ +<!DOCTYPE html> +<iframe srcdoc="<html style='background:green;'></html>"></iframe> +
diff --git a/third_party/WebKit/LayoutTests/fast/repaint/sub-frame-svg-background.html b/third_party/WebKit/LayoutTests/fast/repaint/sub-frame-svg-background.html new file mode 100644 index 0000000..693e29d --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/repaint/sub-frame-svg-background.html
@@ -0,0 +1,17 @@ +<!DOCTYPE html> +<script src="../../resources/run-after-layout-and-paint.js"></script> +<script> + if (window.testRunner) { + testRunner.overridePreference("WebKitWebSecurityEnabled", false); + testRunner.waitUntilDone(); + } + + function runTest() { + runAfterLayoutAndPaint(function(){ + var frame = document.getElementById("frame"); + frame.contentDocument.documentElement.style.background = "green"; + }, true); + } +</script> +<iframe id="frame" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20style%3D%22background%3Ared%3B%22%3E%3C%2Fsvg%3E" onload="runTest();"></iframe> +
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector-unit/datagrid-editable-longtext-expected.txt b/third_party/WebKit/LayoutTests/http/tests/inspector-unit/datagrid-editable-longtext-expected.txt new file mode 100644 index 0000000..1b4bd59f9 --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/inspector-unit/datagrid-editable-longtext-expected.txt
@@ -0,0 +1,31 @@ +This tests long text in datagrid. +Original lengths +key text length: 1500 +value text length: 1000 + +Test committing a long key +key element is being edited +key text length: 3000 +Blurring the key +Editor value committed. +key text length: 3000 + +Test no-op editing the key +key element is being edited +key text length: 3000 +Blurring the key +key text length: 3000 + +Test committing a long value +value element is being edited +value text length: 3000 +Blurring the value +Editor value committed. +value text length: 1000 + +Test no-op editing the value +value element is being edited +value text length: 3000 +Blurring the value +value text length: 1000 +
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector-unit/datagrid-editable-longtext.js b/third_party/WebKit/LayoutTests/http/tests/inspector-unit/datagrid-editable-longtext.js new file mode 100644 index 0000000..cd25055 --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/inspector-unit/datagrid-editable-longtext.js
@@ -0,0 +1,72 @@ +TestRunner.loadModule('data_grid').then(test); + +function test() { + TestRunner.addResult("This tests long text in datagrid."); + + var columns = [ + {id: "key", title: "Key column", editable: true, longText: false}, + {id: "value", title: "Value column", editable: true, longText: true} + ]; + var dataGrid = new DataGrid.DataGrid(columns, onEdit); + UI.inspectorView.element.appendChild(dataGrid.element); + + var rootNode = dataGrid.rootNode(); + var node = new DataGrid.DataGridNode({key: "k".repeat(1500), value: "v".repeat(1500)}); + rootNode.appendChild(node); + + var keyElement = dataGrid.element.querySelector(".data .key-column"); + var valueElement = dataGrid.element.querySelector(".data .value-column"); + + TestRunner.addResult("Original lengths"); + dumpKeyLength(); + dumpValueLength(); + + TestRunner.addResult("\nTest committing a long key"); + dataGrid._startEditing(keyElement); + keyElement.textContent = "k".repeat(3000); + dumpKeyLength(); + TestRunner.addResult("Blurring the key"); + keyElement.blur(); + dumpKeyLength(); + + TestRunner.addResult("\nTest no-op editing the key"); + dataGrid._startEditing(keyElement); + dumpKeyLength(); + TestRunner.addResult("Blurring the key"); + keyElement.blur(); + dumpKeyLength(); + + TestRunner.addResult("\nTest committing a long value"); + dataGrid._startEditing(valueElement); + valueElement.textContent = "v".repeat(3000); + dumpValueLength(); + TestRunner.addResult("Blurring the value"); + valueElement.blur(); + dumpValueLength(); + + TestRunner.addResult("\nTest no-op editing the value"); + dataGrid._startEditing(valueElement); + dumpValueLength(); + TestRunner.addResult("Blurring the value"); + valueElement.blur(); + dumpValueLength(); + + + TestRunner.completeTest(); + + function dumpKeyLength() { + if (keyElement.classList.contains("being-edited")) + TestRunner.addResult("key element is being edited"); + TestRunner.addResult("key text length: " + keyElement.textContent.length); + } + + function dumpValueLength() { + if (valueElement.classList.contains("being-edited")) + TestRunner.addResult("value element is being edited"); + TestRunner.addResult("value text length: " + valueElement.textContent.length); + } + + function onEdit() { + TestRunner.addResult("Editor value committed."); + } +}
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/security/mixed-content-active-and-passive-reload.html b/third_party/WebKit/LayoutTests/http/tests/inspector/security/mixed-content-active-and-passive-reload.html index c6d6a1b..35a56592 100644 --- a/third_party/WebKit/LayoutTests/http/tests/inspector/security/mixed-content-active-and-passive-reload.html +++ b/third_party/WebKit/LayoutTests/http/tests/inspector/security/mixed-content-active-and-passive-reload.html
@@ -11,8 +11,20 @@ InspectorTest.addResult("\nBefore Refresh --------------"); var mixedExplanations = [ - /** @type {!Protocol.Security.SecurityStateExplanation} */ ({"securityState": Protocol.Security.SecurityState.Neutral, "summary": "Neutral Test Summary", "description": "Neutral Test Description", mixedContentType: Protocol.Security.MixedContentType.OptionallyBlockable}), - /** @type {!Protocol.Security.SecurityStateExplanation} */ ({"securityState": Protocol.Security.SecurityState.Insecure, "summary": "Insecure Test Summary", "description": "Insecure Test Description", mixedContentType: Protocol.Security.MixedContentType.Blockable}) + { + securityState: Protocol.Security.SecurityState.Neutral, + summary: "Neutral Test Summary", + description: "Neutral Test Description", + mixedContentType: Protocol.Security.MixedContentType.OptionallyBlockable, + certificate: [] + }, + { + securityState: Protocol.Security.SecurityState.Insecure, + summary: "Insecure Test Summary", + description: "Insecure Test Description", + mixedContentType: Protocol.Security.MixedContentType.Blockable, + certificate: [] + } ]; InspectorTest.mainTarget.model(Security.SecurityModel).dispatchEventToListeners(Security.SecurityModel.Events.SecurityStateChanged, new Security.PageSecurityState(Protocol.Security.SecurityState.Neutral, true, mixedExplanations, insecureContentStatus, null));
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/security/mixed-content-reload.html b/third_party/WebKit/LayoutTests/http/tests/inspector/security/mixed-content-reload.html index 8200b6e..b8ada9e 100644 --- a/third_party/WebKit/LayoutTests/http/tests/inspector/security/mixed-content-reload.html +++ b/third_party/WebKit/LayoutTests/http/tests/inspector/security/mixed-content-reload.html
@@ -11,7 +11,13 @@ InspectorTest.addResult("\nBefore Refresh --------------"); var mixedExplanations = [ - /** @type {!Protocol.Security.SecurityStateExplanation} */ ({"securityState": Protocol.Security.SecurityState.Neutral, "summary": "Neutral Test Summary", "description": "Neutral Test Description", mixedContentType: Protocol.Security.MixedContentType.OptionallyBlockable}) + { + securityState: Protocol.Security.SecurityState.Neutral, + summary: "Neutral Test Summary", + description: "Neutral Test Description", + mixedContentType: Protocol.Security.MixedContentType.OptionallyBlockable, + certificate: [] + } ]; InspectorTest.mainTarget.model(Security.SecurityModel).dispatchEventToListeners(Security.SecurityModel.Events.SecurityStateChanged, new Security.PageSecurityState(Protocol.Security.SecurityState.Neutral, true, mixedExplanations, insecureContentStatus, null));
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/security/security-explanation-ordering.html b/third_party/WebKit/LayoutTests/http/tests/inspector/security/security-explanation-ordering.html index d6d27070..cf1bcc219f 100644 --- a/third_party/WebKit/LayoutTests/http/tests/inspector/security/security-explanation-ordering.html +++ b/third_party/WebKit/LayoutTests/http/tests/inspector/security/security-explanation-ordering.html
@@ -13,26 +13,28 @@ // first to make sure it gets reordered. var explanations = [ { - "description": "Public-key pinning was bypassed by a local root certificate.", - "securityState": "info", - "summary": "Public-Key Pinning Bypassed" + description: "Public-key pinning was bypassed by a local root certificate.", + securityState: "info", + summary: "Public-Key Pinning Bypassed", + certificate: [] }, { - "hasCertificate": "true", - "description": "The connection to this site is using a valid, trusted server certificate.", - "securityState": "secure", - "summary": "Valid Certificate" + description: "The connection to this site is using a valid, trusted server certificate.", + securityState: "secure", + summary: "Valid Certificate", + certificate: ["BASE64CERTIFICATE"] }, { - "description": "The connection to this site uses a strong protocol (TLS 1.2), a strong key exchange (ECDHE_RSA), and an obsolete cipher (AES_256_CBC with HMAC-SHA1).", - "securityState": "secure", - "summary": "Obsolete Connection Settings" - + description: "The connection to this site uses a strong protocol (TLS 1.2), a strong key exchange (ECDHE_RSA), and an obsolete cipher (AES_256_CBC with HMAC-SHA1).", + securityState: "secure", + summary: "Obsolete Connection Settings", + certificate: [] }, { - "description": "All resources on this page are served securely.", - "securityState": "secure", - "summary": "Secure resources" + description: "All resources on this page are served securely.", + securityState: "secure", + summary: "Secure resources", + certificate: [] } ];
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/xss-DENIED-xsl-external-entity-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/xss-DENIED-xsl-external-entity-expected.txt index 1d2a6fe..4ccb03e 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/xss-DENIED-xsl-external-entity-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/xss-DENIED-xsl-external-entity-expected.txt
@@ -2,7 +2,5 @@ CONSOLE ERROR: Unsafe attempt to load URL http://localhost:8000/security/resources/target.xml from frame with URL http://127.0.0.1:8000/security/xss-DENIED-xsl-external-entity.xml. Domains, protocols and ports must match. -CONSOLE ERROR: Unsafe attempt to load URL http://localhost:8000/security/resources/target.xml from frame with URL http://127.0.0.1:8000/security/xss-DENIED-xsl-external-entity.xml. Domains, protocols and ports must match. - This test includes a cross-origin external entity. It passes if the load fails and thus there is no text below this line.
diff --git a/third_party/WebKit/LayoutTests/http/tests/worklet/chromium/import-filesystem-url.html b/third_party/WebKit/LayoutTests/http/tests/worklet/chromium/import-filesystem-url.html new file mode 100644 index 0000000..468c29d --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/worklet/chromium/import-filesystem-url.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Worklet: addModule() for a filesystem URL</title> +<body> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script> + +// This test should be in chromium/ because Filesystem API is implemented only +// by Chromium. +promise_test(() => { + return new Promise(resolve => { + const kSize = 100; + webkitRequestFileSystem(TEMPORARY, kSize, resolve, assert_unreached); + }).then(fs => { + return new Promise(resolve => { + fs.root.getFile('test.js', {create: true}, resolve, assert_unreached); + }); + }).then(entry => { + return paintWorklet.addModule(entry.toURL()); + }).then(() => { + assert_unreached('addModule should fail.'); + }).catch(error => { + assert_equals(error.name, 'AbortError'); + }); +}, 'Importing a filesystem URL should reject the given promise'); + +</script> +</body>
diff --git a/third_party/WebKit/LayoutTests/http/tests/worklet/resources/import-tests.js b/third_party/WebKit/LayoutTests/http/tests/worklet/resources/import-tests.js index a359d74..c74e7d5 100644 --- a/third_party/WebKit/LayoutTests/http/tests/worklet/resources/import-tests.js +++ b/third_party/WebKit/LayoutTests/http/tests/worklet/resources/import-tests.js
@@ -53,5 +53,37 @@ }).catch(function(error) { assert_equals(error.name, 'SyntaxError', 'error should be a SyntaxError.'); }); - }, 'Attempting to resolve an invalid URL should reject the given promise with a SyntaxError.'); + }, 'Importing an invalid URL should reject the given promise with a SyntaxError.'); + + promise_test(() => { + const kBlob = new Blob([""], {type: 'text/javascript'}); + const kBlobURL = URL.createObjectURL(kBlob); + return worklet.addModule(kBlobURL).then(undefined_arg => { + assert_equals(undefined_arg, undefined); + }); + }, 'Importing a blob URL should resolve the given promise.'); + + promise_test(() => { + const kFileURL = 'file:///empty-worklet-script.js'; + return worklet.addModule(kFileURL).then(undefined_arg => { + assert_unreached('addModule should fail.'); + }).catch(function(error) { + assert_equals(error.name, 'AbortError'); + }); + }, 'Importing a file:// URL should reject the given promise.'); + + promise_test(() => { + const kDataURL = 'data:text/javascript, // Do nothing.'; + return worklet.addModule(kDataURL).then(undefined_arg => { + assert_equals(undefined_arg, undefined); + }); + }, 'Importing a data URL should resolve the given promise.'); + + promise_test(() => { + return worklet.addModule('about:blank').then(undefined_arg => { + assert_unreached('addModule should fail.'); + }).catch(function(error) { + assert_equals(error.name, 'AbortError'); + }); + }, 'Importing about:blank should reject the given promise.'); }
diff --git a/third_party/WebKit/LayoutTests/images/color-profile-image-canvas-expected.png b/third_party/WebKit/LayoutTests/images/color-profile-image-canvas-expected.png index 218f124d..9303471c 100644 --- a/third_party/WebKit/LayoutTests/images/color-profile-image-canvas-expected.png +++ b/third_party/WebKit/LayoutTests/images/color-profile-image-canvas-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/images/color-profile-image-canvas-pattern-expected.png b/third_party/WebKit/LayoutTests/images/color-profile-image-canvas-pattern-expected.png index 6f07c20..74f6743e 100644 --- a/third_party/WebKit/LayoutTests/images/color-profile-image-canvas-pattern-expected.png +++ b/third_party/WebKit/LayoutTests/images/color-profile-image-canvas-pattern-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/images/color-profile-munsell-adobe-to-srgb-expected.txt b/third_party/WebKit/LayoutTests/images/color-profile-munsell-adobe-to-srgb-expected.txt index 44eb3b02..2361439 100644 --- a/third_party/WebKit/LayoutTests/images/color-profile-munsell-adobe-to-srgb-expected.txt +++ b/third_party/WebKit/LayoutTests/images/color-profile-munsell-adobe-to-srgb-expected.txt
@@ -1,36 +1,36 @@ Color Actual Expected dE -------------------------------------------- -Dark Skin 114,80,64 115,80,64 1 -Light Skin 195,150,130 195,151,130 1 -Blue Sky 94,123,156 94,123,156 0 -Foliage 88,108,65 88,108,65 0 -Blue Flower 130,129,177 130,129,177 0 -Bluish Green 100,190,171 100,190,171 0 +Dark Skin 106,81,67 115,80,64 10 +Light Skin 182,149,130 195,151,130 13 +Blue Sky 103,122,154 94,123,156 9 +Foliage 95,108,69 88,108,65 8 +Blue Flower 129,128,174 130,129,177 3 +Bluish Green 133,189,170 100,190,171 33 -------------------------------------------- -Orange 217,121,37 217,122,37 1 -Purplish Blue 72,90,166 72,91,165 1 -Moderate Red 194,84,97 194,84,98 1 -Purple 90,60,106 91,59,107 2 -Yellow Green 160,188,60 160,188,60 0 -Orange Yellow 231,163,42 230,163,42 1 +Orange 194,121,48 217,122,37 26 +Purplish Blue 79,91,162 72,91,165 8 +Moderate Red 170,85,97 194,84,98 24 +Purple 84,62,105 91,59,107 8 +Yellow Green 167,186,73 160,188,60 15 +Orange Yellow 213,162,57 230,163,42 23 -------------------------------------------- -Blue 47,60,153 46,60,153 1 -Green 70,149,69 71,150,69 1 -Red 177,45,56 177,44,56 1 -Yellow 239,200,27 238,200,27 1 -Magenta 187,82,147 187,82,148 1 -Cyan (*) 0,135,166 0,135,166 0 +Blue 54,62,149 46,60,153 9 +Green 101,148,76 71,150,69 31 +Red 152,48,58 177,44,56 25 +Yellow 228,199,55 238,200,27 30 +Magenta 164,83,144 187,82,148 23 +Cyan (*) 63,134,163 0,135,166 63 -------------------------------------------- -White 243,242,236 243,242,237 1 -Neutral 8 202,202,200 201,201,201 2 -Neutral 6.5 160,161,160 161,161,161 1 -Neutral 5 123,121,120 122,122,121 2 -Neutral 3.5 83,83,83 83,83,83 0 -Black 50,50,50 50,49,50 1 +White 242,241,236 243,242,237 2 +Neutral 8 200,200,199 201,201,201 2 +Neutral 6.5 159,160,159 161,161,161 3 +Neutral 5 122,121,120 122,122,121 1 +Neutral 3.5 84,84,84 83,83,83 2 +Black 53,53,53 50,49,50 6 -------------------------------------------- -Result: total RMS color error: 1.04 +Result: total RMS color error: 21.18 * Munsell Cyan is outside 255 sRGB gamut
diff --git a/third_party/WebKit/LayoutTests/images/exif-orientation-height-image-document-expected.png b/third_party/WebKit/LayoutTests/images/exif-orientation-height-image-document-expected.png index cd52fb195..cdb6f4f5 100644 --- a/third_party/WebKit/LayoutTests/images/exif-orientation-height-image-document-expected.png +++ b/third_party/WebKit/LayoutTests/images/exif-orientation-height-image-document-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/browser/browser-version-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/browser/browser-version-expected.txt new file mode 100644 index 0000000..24247d8 --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector-protocol/browser/browser-version-expected.txt
@@ -0,0 +1,6 @@ +Verifies Browser.getVersion method. +version.protocolVersion: OK +version.revision: OK +version.userAgent: OK +version.jsVersion: OK +
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/browser/browser-version.js b/third_party/WebKit/LayoutTests/inspector-protocol/browser/browser-version.js new file mode 100644 index 0000000..4673acb --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector-protocol/browser/browser-version.js
@@ -0,0 +1,14 @@ +(async function(testRunner) { + var {page, session, dp} = await testRunner.startBlank('Verifies Browser.getVersion method.'); + var response = await dp.Browser.getVersion(); + check('protocolVersion', /^\d+\.\d+$/); // e.g. 1.2 + check('revision', /^@[0-9abcdef]+$/); // e.g. @7d9cc1464f836e6d8c1ab9396a48c656df153d58 + check('userAgent', /^.+$/); // e.g. Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.77.34.5 Safari/537.36 + check('jsVersion', /^.+$/); // e.g. 6.2.196 + testRunner.completeTest(); + + function check(fieldName, regex) { + var status = regex.test(response.result[fieldName]) ? 'OK' : 'FAIL'; + testRunner.log(`version.${fieldName}: ${status}`); + } +})
diff --git a/third_party/WebKit/LayoutTests/media/color-profile-munsell-bt601-smpte-to-srgb-expected.txt b/third_party/WebKit/LayoutTests/media/color-profile-munsell-bt601-smpte-to-srgb-expected.txt index 9b66622..1bd2930 100644 --- a/third_party/WebKit/LayoutTests/media/color-profile-munsell-bt601-smpte-to-srgb-expected.txt +++ b/third_party/WebKit/LayoutTests/media/color-profile-munsell-bt601-smpte-to-srgb-expected.txt
@@ -1,41 +1,41 @@ Color Actual Expected dE -------------------------------------------- -Dark Skin 115,80,64 115,80,64 0 -Light Skin 195,151,130 195,151,130 0 -Blue Sky 93,123,156 94,123,156 1 -Foliage 88,108,65 88,108,65 0 -Blue Flower 130,128,177 130,129,177 1 -Bluish Green 100,190,171 100,190,171 0 +Dark Skin 104,64,49 115,80,64 25 +Light Skin 191,139,118 195,151,130 17 +Blue Sky 76,110,145 94,123,156 25 +Foliage 72,95,50 88,108,65 25 +Blue Flower 117,115,168 130,129,177 21 +Bluish Green 76,184,162 100,190,171 26 -------------------------------------------- -Orange 217,122,37 217,122,37 0 -Purplish Blue 71,91,165 72,91,165 1 -Moderate Red 194,83,98 194,84,98 1 -Purple 90,59,107 91,59,107 1 -Yellow Green 160,188,60 160,188,60 0 -Orange Yellow 230,163,42 230,163,42 0 +Orange 218,107,23 217,122,37 21 +Purplish Blue 53,75,155 72,91,165 27 +Moderate Red 192,64,84 194,84,98 24 +Purple 77,41,93 91,59,107 27 +Yellow Green 149,182,46 160,188,60 19 +Orange Yellow 231,153,29 230,163,42 16 -------------------------------------------- -Blue 47,60,153 46,60,153 1 -Green 71,150,69 71,150,69 0 -Red 177,44,56 177,44,56 0 -Yellow 238,200,27 238,200,27 0 -Magenta 187,82,148 187,82,148 0 -Cyan (*) 35,134,166 0,135,166 35 +Blue 27,41,142 46,60,153 29 +Green 47,141,54 71,150,69 30 +Red 174,19,41 177,44,56 29 +Yellow 239,194,17 238,200,27 12 +Magenta 184,61,137 187,82,148 24 +Cyan (*) 0,123,156 0,135,166 16 -------------------------------------------- -White 243,242,237 243,242,237 0 -Neutral 8 201,201,201 201,201,201 0 -Neutral 6.5 161,161,161 161,161,161 0 -Neutral 5 122,122,121 122,122,121 0 -Neutral 3.5 83,83,83 83,83,83 0 -Black 50,49,50 50,49,50 0 +White 242,240,235 243,242,237 3 +Neutral 8 195,195,195 201,201,201 10 +Neutral 6.5 151,151,151 161,161,161 17 +Neutral 5 109,109,108 122,122,121 23 +Neutral 3.5 68,68,68 83,83,83 26 +Black 34,33,34 50,49,50 28 -------------------------------------------- -SG White 237,237,237 237,237,237 0 -SG White 1/2 130,130,130 130,130,130 0 -SG White 1/4 74,74,74 74,74,74 0 -SG Black 4x 79,79,79 79,79,79 0 -SG Black 2x 48,48,48 48,48,48 0 -SG Black 32,32,32 31,31,31 2 +SG White 235,235,235 237,237,237 3 +SG White 1/2 118,118,118 130,130,130 21 +SG White 1/4 59,59,59 74,74,74 26 +SG Black 4x 64,64,64 79,79,79 26 +SG Black 2x 32,32,32 48,48,48 28 +SG Black 16,16,16 31,31,31 26 -------------------------------------------- -Result: total RMS color error: 0.58 +Result: total RMS color error: 22.60
diff --git a/third_party/WebKit/LayoutTests/media/color-profile-munsell-bt709-to-srgb-expected.txt b/third_party/WebKit/LayoutTests/media/color-profile-munsell-bt709-to-srgb-expected.txt index d34b900..54706fa9 100644 --- a/third_party/WebKit/LayoutTests/media/color-profile-munsell-bt709-to-srgb-expected.txt +++ b/third_party/WebKit/LayoutTests/media/color-profile-munsell-bt709-to-srgb-expected.txt
@@ -1,41 +1,41 @@ Color Actual Expected dE -------------------------------------------- -Dark Skin 114,80,64 115,80,64 1 -Light Skin 195,151,129 195,151,130 1 -Blue Sky 93,123,155 94,123,156 1 -Foliage 88,108,65 88,108,65 0 -Blue Flower 129,128,177 130,129,177 1 -Bluish Green 100,190,171 100,190,171 0 +Dark Skin 101,65,48 115,80,64 26 +Light Skin 188,140,117 195,151,130 18 +Blue Sky 79,110,145 94,123,156 23 +Foliage 73,94,49 88,108,65 26 +Blue Flower 117,116,168 130,129,177 20 +Bluish Green 86,183,162 100,190,171 18 -------------------------------------------- -Orange 218,122,37 217,122,37 1 -Purplish Blue 72,90,165 72,91,165 1 -Moderate Red 194,84,98 194,84,98 0 -Purple 90,59,107 91,59,107 1 -Yellow Green 160,188,60 160,188,60 0 -Orange Yellow 230,163,42 230,163,42 0 +Orange 213,109,21 217,122,37 21 +Purplish Blue 57,76,155 72,91,165 23 +Moderate Red 187,69,84 194,84,98 22 +Purple 76,43,93 91,59,107 26 +Yellow Green 150,180,44 160,188,60 20 +Orange Yellow 227,153,26 230,163,42 19 -------------------------------------------- -Blue 46,60,153 46,60,153 0 -Green 71,150,68 71,150,69 1 -Red 177,44,56 177,44,56 0 -Yellow 238,200,28 238,200,27 1 -Magenta 187,82,148 187,82,148 0 -Cyan (*) 0,135,166 0,135,166 0 +Blue 30,44,142 46,60,153 25 +Green 56,139,53 71,150,69 25 +Red 168,28,40 177,44,56 24 +Yellow 236,194,13 238,200,27 15 +Magenta 179,67,137 187,82,148 20 +Cyan (*) 0,123,156 0,135,166 16 -------------------------------------------- -White 244,242,237 243,242,237 1 -Neutral 8 201,201,201 201,201,201 0 -Neutral 6.5 161,161,161 161,161,161 0 -Neutral 5 122,122,121 122,122,121 0 -Neutral 3.5 83,83,83 83,83,83 0 -Black 50,49,50 50,49,50 0 +White 242,240,235 243,242,237 3 +Neutral 8 195,195,195 201,201,201 10 +Neutral 6.5 151,151,151 161,161,161 17 +Neutral 5 109,109,108 122,122,121 23 +Neutral 3.5 68,68,68 83,83,83 26 +Black 34,33,34 50,49,50 28 -------------------------------------------- -SG White 237,237,237 237,237,237 0 -SG White 1/2 130,130,130 130,130,130 0 -SG White 1/4 74,74,74 74,74,74 0 -SG Black 4x 79,79,79 79,79,79 0 -SG Black 2x 48,48,48 48,48,48 0 -SG Black 32,32,32 31,31,31 2 +SG White 235,235,235 237,237,237 3 +SG White 1/2 118,118,118 130,130,130 21 +SG White 1/4 59,59,59 74,74,74 26 +SG Black 4x 64,64,64 79,79,79 26 +SG Black 2x 32,32,32 48,48,48 28 +SG Black 16,16,16 31,31,31 26 -------------------------------------------- -Result: total RMS color error: 0.68 +Result: total RMS color error: 21.74
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/absolute-sized-document-no-scrollbars-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/absolute-sized-document-no-scrollbars-expected.txt index df6f7c4..a01cdd3c 100644 --- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/absolute-sized-document-no-scrollbars-expected.txt +++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/absolute-sized-document-no-scrollbars-expected.txt
@@ -7,6 +7,11 @@ "drawsContent": true, "paintInvalidations": [ { + "object": "LayoutView #document", + "rect": [0, 0, 800, 600], + "reason": "style change" + }, + { "object": "LayoutSVGRect rect", "rect": [0, 0, 576, 432], "reason": "style change" @@ -26,6 +31,10 @@ ], "objectPaintInvalidations": [ { + "object": "LayoutView #document", + "reason": "style change" + }, + { "object": "LayoutSVGRoot svg", "reason": "style change" },
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/relative-sized-document-scrollbars-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/relative-sized-document-scrollbars-expected.txt index d8e84657..93d817a 100644 --- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/relative-sized-document-scrollbars-expected.txt +++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/relative-sized-document-scrollbars-expected.txt
@@ -7,6 +7,11 @@ "drawsContent": true, "paintInvalidations": [ { + "object": "LayoutView #document", + "rect": [0, 0, 800, 600], + "reason": "style change" + }, + { "object": "LayoutSVGRect rect", "rect": [6, 4, 788, 592], "reason": "style change" @@ -21,6 +26,10 @@ ], "objectPaintInvalidations": [ { + "object": "LayoutView #document", + "reason": "style change" + }, + { "object": "LayoutSVGRoot svg", "reason": "style change" },
diff --git a/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/nested-reflection-transformed-expected.png b/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/nested-reflection-transformed-expected.png index d41092cd..e2bde95 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/nested-reflection-transformed-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/nested-reflection-transformed-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/nested-reflection-transformed2-expected.png b/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/nested-reflection-transformed2-expected.png index b4cad73..1b3c400 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/nested-reflection-transformed2-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/nested-reflection-transformed2-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/reflection-in-composited-expected.png b/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/reflection-in-composited-expected.png index 85b3331..d8e4bc4 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/reflection-in-composited-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/reflection-in-composited-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png index a3f2569..028e3c1a 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-antialiasing-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-antialiasing-expected.png index 2ce1d85..023729c 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-antialiasing-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-antialiasing-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-inner-bleed-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-inner-bleed-expected.png index 0eab2bdf..cbb7d12 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-inner-bleed-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-inner-bleed-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/canvas/canvas-composite-video-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/canvas/canvas-composite-video-expected.png index 1795b005..55b60e3 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/canvas/canvas-composite-video-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/canvas/canvas-composite-video-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/canvas/canvas-composite-video-shadow-expected.png index 9b5c937..ebe81ec 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/canvas/canvas-composite-video-shadow-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/canvas/canvas-composite-video-shadow-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png deleted file mode 100644 index 836814b..0000000 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/canvas/image-object-in-canvas-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/canvas/image-object-in-canvas-expected.png index fd50afb..b6a7f6c 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/canvas/image-object-in-canvas-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/canvas/image-object-in-canvas-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/css/transformed-mask-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/css/transformed-mask-expected.png index cf3831d..e3b1a02 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/css/transformed-mask-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/css/transformed-mask-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/reflections/opacity-reflection-transform-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/reflections/opacity-reflection-transform-expected.png index 4cb5bc6..80125af 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/reflections/opacity-reflection-transform-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/reflections/opacity-reflection-transform-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/images/color-profile-munsell-adobe-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/linux/images/color-profile-munsell-adobe-to-srgb-expected.png index 21c130b..2adc82b 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/images/color-profile-munsell-adobe-to-srgb-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/images/color-profile-munsell-adobe-to-srgb-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/media/color-profile-munsell-bt601-smpte-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/linux/media/color-profile-munsell-bt601-smpte-to-srgb-expected.png index e16f4b04..8bb5a6a 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/media/color-profile-munsell-bt601-smpte-to-srgb-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/media/color-profile-munsell-bt601-smpte-to-srgb-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/media/color-profile-munsell-bt709-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/linux/media/color-profile-munsell-bt709-to-srgb-expected.png index 1a26685..4de5fce 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/media/color-profile-munsell-bt709-to-srgb-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/media/color-profile-munsell-bt709-to-srgb-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/animated-path-inside-transformed-html-expected.png b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/animated-path-inside-transformed-html-expected.png index 41911ac..df8d472 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/animated-path-inside-transformed-html-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/animated-path-inside-transformed-html-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/filters/feTile-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/filters/feTile-expected.png index 28a45a3..7f5d1c2 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/filters/feTile-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/filters/feTile-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/smallFonts-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/smallFonts-expected.png index 4a6abd7..9baedf1 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/smallFonts-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/smallFonts-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textFeatures-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textFeatures-expected.png index e7a2fb2..b1c7cef 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textFeatures-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textFeatures-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/custom/focus-ring-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/custom/focus-ring-expected.png index 14da8c6e..b4534f5c 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/custom/focus-ring-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/custom/focus-ring-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/custom/pattern-rotate-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/custom/pattern-rotate-expected.png index ecabe789..ada9f41 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/custom/pattern-rotate-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/custom/pattern-rotate-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/custom/transformed-outlines-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/custom/transformed-outlines-expected.png index 16826b45..43fbe89 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/custom/transformed-outlines-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/custom/transformed-outlines-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/hixie/perf/004-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/hixie/perf/004-expected.png index 4c5450f..0862b5ba7 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/hixie/perf/004-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/hixie/perf/004-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/transforms/text-with-pattern-inside-transformed-html-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/transforms/text-with-pattern-inside-transformed-html-expected.png index 998fed4..988c294e 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/transforms/text-with-pattern-inside-transformed-html-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/transforms/text-with-pattern-inside-transformed-html-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/transforms/text-with-pattern-with-svg-transform-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/transforms/text-with-pattern-with-svg-transform-expected.png index d20544ae..0bdd37bb 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/transforms/text-with-pattern-with-svg-transform-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/transforms/text-with-pattern-with-svg-transform-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/transforms/transformed-document-element-expected.png b/third_party/WebKit/LayoutTests/platform/linux/transforms/transformed-document-element-expected.png index f43c0d24..49c2a80 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/transforms/transformed-document-element-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/transforms/transformed-document-element-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-expected.png index b0427cd..cf3e85646 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png index 1795b005..55b60e3 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-shadow-expected.png index 9b5c937..ebe81ec 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-shadow-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-shadow-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png deleted file mode 100644 index ae68e7d6..0000000 --- a/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-incremental-repaint-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-incremental-repaint-expected.png index d2e9d70bb..fc457708 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-incremental-repaint-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-incremental-repaint-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/fillrect_gradient-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/fillrect_gradient-expected.png index 6cfbbb6..6055a34fa 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/fillrect_gradient-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/fillrect_gradient-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/image-object-in-canvas-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/image-object-in-canvas-expected.png index c93f73f0..fd50afb 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/image-object-in-canvas-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/image-object-in-canvas-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png index 2fe2e5e..b91cd46 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb-expected.png index cf97088..b3bf324 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt index 792f6117..b18b8d79 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt
@@ -1,33 +1,4 @@ This is a testharness.js-based test. -FAIL ServiceWorkerGlobalScope: Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Request objects have a signal property assert_true: Signal member is present & truthy expected true got false -FAIL ServiceWorkerGlobalScope: Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Readable stream synchronously cancels with AbortError if aborted before reading AbortController is not defined +FAIL General fetch abort tests in a service worker Failed to register a ServiceWorker: The script does not have a MIME type. Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/abort/general-sharedworker-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/abort/general-sharedworker-expected.txt new file mode 100644 index 0000000..d9b7c58 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/abort/general-sharedworker-expected.txt
@@ -0,0 +1,52 @@ +This is a testharness.js-based test. +FAIL Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - RequestInit's window is not null +FAIL TypeError from request constructor takes priority - Input URL is not valid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - Input URL has credentials promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is navigate promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's referrer is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's method is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's method is forbidden promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and method is not simple promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and integrity is not empty promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - RequestInit's cache mode is only-if-cached and mode is not same-origin +PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode cors +PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode no-cors +FAIL TypeError from request constructor takes priority - Bad referrerPolicy init parameter value promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - Bad mode init parameter value +PASS TypeError from request constructor takes priority - Bad credentials init parameter value +PASS TypeError from request constructor takes priority - Bad cache init parameter value +PASS TypeError from request constructor takes priority - Bad redirect init parameter value +FAIL Request objects have a signal property assert_true: Signal member is present & truthy expected true got false +FAIL Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Readable stream synchronously cancels with AbortError if aborted before reading promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal state is cloned AbortController is not defined +FAIL Clone aborts with original controller AbortController is not defined +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/abort/general.any-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/abort/general.any-expected.txt new file mode 100644 index 0000000..d9b7c58 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/abort/general.any-expected.txt
@@ -0,0 +1,52 @@ +This is a testharness.js-based test. +FAIL Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - RequestInit's window is not null +FAIL TypeError from request constructor takes priority - Input URL is not valid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - Input URL has credentials promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is navigate promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's referrer is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's method is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's method is forbidden promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and method is not simple promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and integrity is not empty promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - RequestInit's cache mode is only-if-cached and mode is not same-origin +PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode cors +PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode no-cors +FAIL TypeError from request constructor takes priority - Bad referrerPolicy init parameter value promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - Bad mode init parameter value +PASS TypeError from request constructor takes priority - Bad credentials init parameter value +PASS TypeError from request constructor takes priority - Bad cache init parameter value +PASS TypeError from request constructor takes priority - Bad redirect init parameter value +FAIL Request objects have a signal property assert_true: Signal member is present & truthy expected true got false +FAIL Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Readable stream synchronously cancels with AbortError if aborted before reading promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal state is cloned AbortController is not defined +FAIL Clone aborts with original controller AbortController is not defined +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/abort/general.any.worker-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/abort/general.any.worker-expected.txt new file mode 100644 index 0000000..d9b7c58 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/abort/general.any.worker-expected.txt
@@ -0,0 +1,52 @@ +This is a testharness.js-based test. +FAIL Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - RequestInit's window is not null +FAIL TypeError from request constructor takes priority - Input URL is not valid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - Input URL has credentials promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is navigate promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's referrer is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's method is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's method is forbidden promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and method is not simple promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and integrity is not empty promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - RequestInit's cache mode is only-if-cached and mode is not same-origin +PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode cors +PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode no-cors +FAIL TypeError from request constructor takes priority - Bad referrerPolicy init parameter value promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - Bad mode init parameter value +PASS TypeError from request constructor takes priority - Bad credentials init parameter value +PASS TypeError from request constructor takes priority - Bad cache init parameter value +PASS TypeError from request constructor takes priority - Bad redirect init parameter value +FAIL Request objects have a signal property assert_true: Signal member is present & truthy expected true got false +FAIL Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Readable stream synchronously cancels with AbortError if aborted before reading promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal state is cloned AbortController is not defined +FAIL Clone aborts with original controller AbortController is not defined +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/request/request-error-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/request/request-error-expected.txt new file mode 100644 index 0000000..697b78fd0 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/request/request-error-expected.txt
@@ -0,0 +1,25 @@ +This is a testharness.js-based test. +FAIL RequestInit's window is not null assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +PASS Input URL is not valid +PASS Input URL has credentials +PASS RequestInit's mode is navigate +PASS RequestInit's referrer is invalid +PASS RequestInit's method is invalid +PASS RequestInit's method is forbidden +PASS RequestInit's mode is no-cors and method is not simple +PASS RequestInit's mode is no-cors and integrity is not empty +FAIL RequestInit's cache mode is only-if-cached and mode is not same-origin assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +FAIL Request with cache mode: only-if-cached and fetch mode cors assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +FAIL Request with cache mode: only-if-cached and fetch mode no-cors assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +PASS Bad referrerPolicy init parameter value +FAIL Bad mode init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +FAIL Bad credentials init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +FAIL Bad cache init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +FAIL Bad redirect init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +PASS Request should get its content-type from the init request +PASS Request should not get its content-type from the init request if init headers are provided +PASS Request should get its content-type from the body if none is provided +PASS Request should get its content-type from init headers if one is provided +PASS Request with cache mode: only-if-cached and fetch mode: same-origin +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/request/request-idl-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/request/request-idl-expected.txt new file mode 100644 index 0000000..6835e7d --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/request/request-idl-expected.txt
@@ -0,0 +1,50 @@ +This is a testharness.js-based test. +PASS Request interface: existence and properties of interface object +PASS Request interface object length +PASS Request interface object name +PASS Request interface: existence and properties of interface prototype object +PASS Request interface: existence and properties of interface prototype object's "constructor" property +PASS Request interface: attribute method +PASS Request interface: attribute url +PASS Request interface: attribute headers +FAIL Request interface: attribute type assert_true: The prototype object must have a property "type" expected true got false +FAIL Request interface: attribute destination assert_true: The prototype object must have a property "destination" expected true got false +PASS Request interface: attribute referrer +PASS Request interface: attribute referrerPolicy +PASS Request interface: attribute mode +PASS Request interface: attribute credentials +PASS Request interface: attribute cache +PASS Request interface: attribute redirect +PASS Request interface: attribute integrity +PASS Request interface: operation clone() +FAIL Request interface: attribute body assert_true: The prototype object must have a property "body" expected true got false +PASS Request interface: attribute bodyUsed +PASS Request interface: operation arrayBuffer() +PASS Request interface: operation blob() +PASS Request interface: operation formData() +PASS Request interface: operation json() +PASS Request interface: operation text() +PASS Request must be primary interface of new Request("") +PASS Stringification of new Request("") +PASS Request interface: new Request("") must inherit property "method" with the proper type +PASS Request interface: new Request("") must inherit property "url" with the proper type +PASS Request interface: new Request("") must inherit property "headers" with the proper type +FAIL Request interface: new Request("") must inherit property "type" with the proper type assert_inherits: property "type" not found in prototype chain +FAIL Request interface: new Request("") must inherit property "destination" with the proper type assert_inherits: property "destination" not found in prototype chain +PASS Request interface: new Request("") must inherit property "referrer" with the proper type +PASS Request interface: new Request("") must inherit property "referrerPolicy" with the proper type +PASS Request interface: new Request("") must inherit property "mode" with the proper type +PASS Request interface: new Request("") must inherit property "credentials" with the proper type +PASS Request interface: new Request("") must inherit property "cache" with the proper type +PASS Request interface: new Request("") must inherit property "redirect" with the proper type +PASS Request interface: new Request("") must inherit property "integrity" with the proper type +PASS Request interface: new Request("") must inherit property "clone()" with the proper type +FAIL Request interface: new Request("") must inherit property "body" with the proper type assert_inherits: property "body" not found in prototype chain +PASS Request interface: new Request("") must inherit property "bodyUsed" with the proper type +PASS Request interface: new Request("") must inherit property "arrayBuffer()" with the proper type +PASS Request interface: new Request("") must inherit property "blob()" with the proper type +PASS Request interface: new Request("") must inherit property "formData()" with the proper type +PASS Request interface: new Request("") must inherit property "json()" with the proper type +PASS Request interface: new Request("") must inherit property "text()" with the proper type +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/response/response-idl-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/response/response-idl-expected.txt new file mode 100644 index 0000000..db7454c6 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/response/response-idl-expected.txt
@@ -0,0 +1,45 @@ +This is a testharness.js-based test. +PASS Response interface: existence and properties of interface object +PASS Response interface object length +PASS Response interface object name +PASS Response interface: existence and properties of interface prototype object +PASS Response interface: existence and properties of interface prototype object's "constructor" property +PASS Response interface: operation error() +PASS Response interface: operation redirect(USVString, unsigned short) +PASS Response interface: attribute type +PASS Response interface: attribute url +PASS Response interface: attribute status +PASS Response interface: attribute ok +PASS Response interface: attribute statusText +PASS Response interface: attribute headers +FAIL Response interface: attribute trailer assert_true: The prototype object must have a property "trailer" expected true got false +PASS Response interface: operation clone() +PASS Response interface: attribute body +PASS Response interface: attribute bodyUsed +PASS Response interface: operation arrayBuffer() +PASS Response interface: operation blob() +PASS Response interface: operation formData() +PASS Response interface: operation json() +PASS Response interface: operation text() +PASS Response must be primary interface of new Response() +PASS Stringification of new Response() +PASS Response interface: new Response() must inherit property "error()" with the proper type +PASS Response interface: new Response() must inherit property "redirect(USVString, unsigned short)" with the proper type +PASS Response interface: calling redirect(USVString, unsigned short) on new Response() with too few arguments must throw TypeError +PASS Response interface: new Response() must inherit property "type" with the proper type +PASS Response interface: new Response() must inherit property "url" with the proper type +PASS Response interface: new Response() must inherit property "status" with the proper type +PASS Response interface: new Response() must inherit property "ok" with the proper type +PASS Response interface: new Response() must inherit property "statusText" with the proper type +PASS Response interface: new Response() must inherit property "headers" with the proper type +FAIL Response interface: new Response() must inherit property "trailer" with the proper type assert_inherits: property "trailer" not found in prototype chain +PASS Response interface: new Response() must inherit property "clone()" with the proper type +PASS Response interface: new Response() must inherit property "body" with the proper type +PASS Response interface: new Response() must inherit property "bodyUsed" with the proper type +PASS Response interface: new Response() must inherit property "arrayBuffer()" with the proper type +PASS Response interface: new Response() must inherit property "blob()" with the proper type +PASS Response interface: new Response() must inherit property "formData()" with the proper type +PASS Response interface: new Response() must inherit property "json()" with the proper type +PASS Response interface: new Response() must inherit property "text()" with the proper type +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt new file mode 100644 index 0000000..b92d7aa --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
@@ -0,0 +1,187 @@ +This is a testharness.js-based test. +PASS Interfaces and attributes in ServiceWorkerGlobalScope +PASS test setup (cache creation) +PASS Event constructors +PASS ServiceWorkerGlobalScope interface: existence and properties of interface object +PASS ServiceWorkerGlobalScope interface object length +PASS ServiceWorkerGlobalScope interface object name +PASS ServiceWorkerGlobalScope interface: existence and properties of interface prototype object +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Object.setPrototypeOf should throw a TypeError +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via __proto__ should throw a TypeError +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Reflect.setPrototypeOf should return false +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Object.setPrototypeOf should not throw +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via __proto__ should not throw +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Reflect.setPrototypeOf should return true +PASS ServiceWorkerGlobalScope interface: existence and properties of interface prototype object's "constructor" property +PASS ServiceWorkerGlobalScope interface: attribute clients +PASS ServiceWorkerGlobalScope interface: attribute registration +PASS ServiceWorkerGlobalScope interface: operation skipWaiting() +PASS ServiceWorkerGlobalScope interface: attribute oninstall +PASS ServiceWorkerGlobalScope interface: attribute onactivate +PASS ServiceWorkerGlobalScope interface: attribute onfetch +PASS ServiceWorkerGlobalScope interface: attribute onforeignfetch +PASS ServiceWorkerGlobalScope interface: attribute onmessage +FAIL ServiceWorkerGlobalScope interface: attribute onmessageerror assert_own_property: The global object must have a property "onmessageerror" expected property "onmessageerror" missing +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Object.setPrototypeOf should throw a TypeError +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via __proto__ should throw a TypeError +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Reflect.setPrototypeOf should return false +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Object.setPrototypeOf should not throw +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via __proto__ should not throw +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Reflect.setPrototypeOf should return true +PASS ServiceWorkerGlobalScope must be primary interface of self +PASS Stringification of self +PASS ServiceWorkerGlobalScope interface: self must inherit property "clients" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "registration" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "skipWaiting()" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "oninstall" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "onactivate" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "onfetch" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "onforeignfetch" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "onmessage" with the proper type +FAIL ServiceWorkerGlobalScope interface: self must inherit property "onmessageerror" with the proper type assert_own_property: expected property "onmessageerror" missing +PASS Client interface: existence and properties of interface object +PASS Client interface object length +PASS Client interface object name +PASS Client interface: existence and properties of interface prototype object +PASS Client interface: existence and properties of interface prototype object's "constructor" property +PASS Client interface: attribute url +PASS Client interface: attribute id +PASS Client interface: attribute type +FAIL Client interface: attribute reserved assert_true: The prototype object must have a property "reserved" expected true got false +PASS Client interface: operation postMessage(any, [object Object]) +PASS WindowClient interface: existence and properties of interface object +PASS WindowClient interface object length +PASS WindowClient interface object name +PASS WindowClient interface: existence and properties of interface prototype object +PASS WindowClient interface: existence and properties of interface prototype object's "constructor" property +PASS WindowClient interface: attribute visibilityState +PASS WindowClient interface: attribute focused +FAIL WindowClient interface: attribute ancestorOrigins assert_true: The prototype object must have a property "ancestorOrigins" expected true got false +PASS WindowClient interface: operation focus() +PASS WindowClient interface: operation navigate(USVString) +PASS Clients interface: existence and properties of interface object +PASS Clients interface object length +PASS Clients interface object name +PASS Clients interface: existence and properties of interface prototype object +PASS Clients interface: existence and properties of interface prototype object's "constructor" property +PASS Clients interface: operation get(DOMString) +PASS Clients interface: operation matchAll(ClientQueryOptions) +PASS Clients interface: operation openWindow(USVString) +PASS Clients interface: operation claim() +PASS Clients must be primary interface of self.clients +PASS Stringification of self.clients +PASS Clients interface: self.clients must inherit property "get(DOMString)" with the proper type +PASS Clients interface: calling get(DOMString) on self.clients with too few arguments must throw TypeError +PASS Clients interface: self.clients must inherit property "matchAll(ClientQueryOptions)" with the proper type +PASS Clients interface: calling matchAll(ClientQueryOptions) on self.clients with too few arguments must throw TypeError +PASS Clients interface: self.clients must inherit property "openWindow(USVString)" with the proper type +PASS Clients interface: calling openWindow(USVString) on self.clients with too few arguments must throw TypeError +PASS Clients interface: self.clients must inherit property "claim()" with the proper type +FAIL ServiceWorker interface: existence and properties of interface object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface object length assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface object name assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: existence and properties of interface prototype object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: attribute scriptURL assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: attribute state assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: operation postMessage(any, [object Object]) assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: attribute onstatechange assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +PASS ServiceWorkerRegistration interface: existence and properties of interface object +PASS ServiceWorkerRegistration interface object length +PASS ServiceWorkerRegistration interface object name +PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object +PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object's "constructor" property +PASS ServiceWorkerRegistration interface: attribute installing +PASS ServiceWorkerRegistration interface: attribute waiting +PASS ServiceWorkerRegistration interface: attribute active +PASS ServiceWorkerRegistration interface: attribute navigationPreload +PASS ServiceWorkerRegistration interface: attribute scope +FAIL ServiceWorkerRegistration interface: attribute updateViaCache assert_true: The prototype object must have a property "updateViaCache" expected true got false +PASS ServiceWorkerRegistration interface: operation update() +PASS ServiceWorkerRegistration interface: operation unregister() +PASS ServiceWorkerRegistration interface: attribute onupdatefound +PASS ServiceWorkerRegistration must be primary interface of self.registration +PASS Stringification of self.registration +PASS ServiceWorkerRegistration interface: self.registration must inherit property "installing" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "waiting" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "active" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "navigationPreload" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "scope" with the proper type +FAIL ServiceWorkerRegistration interface: self.registration must inherit property "updateViaCache" with the proper type assert_inherits: property "updateViaCache" not found in prototype chain +PASS ServiceWorkerRegistration interface: self.registration must inherit property "update()" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "unregister()" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "onupdatefound" with the proper type +PASS EventTarget interface: self.registration must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on self.registration with too few arguments must throw TypeError +PASS EventTarget interface: self.registration must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on self.registration with too few arguments must throw TypeError +PASS EventTarget interface: self.registration must inherit property "dispatchEvent(Event)" with the proper type +PASS EventTarget interface: calling dispatchEvent(Event) on self.registration with too few arguments must throw TypeError +PASS EventTarget interface: existence and properties of interface object +PASS EventTarget interface object length +PASS EventTarget interface object name +PASS EventTarget interface: existence and properties of interface prototype object +PASS EventTarget interface: existence and properties of interface prototype object's "constructor" property +PASS EventTarget interface: operation addEventListener(DOMString, EventListener, [object Object],[object Object]) +PASS EventTarget interface: operation removeEventListener(DOMString, EventListener, [object Object],[object Object]) +PASS EventTarget interface: operation dispatchEvent(Event) +PASS NavigationPreloadManager interface: existence and properties of interface object +PASS NavigationPreloadManager interface object length +PASS NavigationPreloadManager interface object name +PASS NavigationPreloadManager interface: existence and properties of interface prototype object +PASS NavigationPreloadManager interface: existence and properties of interface prototype object's "constructor" property +PASS NavigationPreloadManager interface: operation enable() +PASS NavigationPreloadManager interface: operation disable() +PASS NavigationPreloadManager interface: operation setHeaderValue(ByteString) +PASS NavigationPreloadManager interface: operation getState() +PASS Cache interface: existence and properties of interface object +PASS Cache interface object length +PASS Cache interface object name +PASS Cache interface: existence and properties of interface prototype object +PASS Cache interface: existence and properties of interface prototype object's "constructor" property +PASS Cache interface: operation match(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation matchAll(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation add(RequestInfo) +PASS Cache interface: operation addAll([object Object]) +PASS Cache interface: operation put(RequestInfo, Response) +PASS Cache interface: operation delete(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation keys(RequestInfo, CacheQueryOptions) +PASS Cache must be primary interface of self.cacheInstance +PASS Stringification of self.cacheInstance +PASS Cache interface: self.cacheInstance must inherit property "match(RequestInfo, CacheQueryOptions)" with the proper type +PASS Cache interface: calling match(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "matchAll(RequestInfo, CacheQueryOptions)" with the proper type +PASS Cache interface: calling matchAll(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "add(RequestInfo)" with the proper type +PASS Cache interface: calling add(RequestInfo) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "addAll([object Object])" with the proper type +PASS Cache interface: calling addAll([object Object]) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "put(RequestInfo, Response)" with the proper type +PASS Cache interface: calling put(RequestInfo, Response) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "delete(RequestInfo, CacheQueryOptions)" with the proper type +PASS Cache interface: calling delete(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "keys(RequestInfo, CacheQueryOptions)" with the proper type +PASS Cache interface: calling keys(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError +PASS CacheStorage interface: existence and properties of interface object +PASS CacheStorage interface object length +PASS CacheStorage interface object name +PASS CacheStorage interface: existence and properties of interface prototype object +PASS CacheStorage interface: existence and properties of interface prototype object's "constructor" property +PASS CacheStorage interface: operation match(RequestInfo, CacheQueryOptions) +PASS CacheStorage interface: operation has(DOMString) +PASS CacheStorage interface: operation open(DOMString) +PASS CacheStorage interface: operation delete(DOMString) +PASS CacheStorage interface: operation keys() +PASS CacheStorage must be primary interface of self.caches +PASS Stringification of self.caches +PASS CacheStorage interface: self.caches must inherit property "match(RequestInfo, CacheQueryOptions)" with the proper type +PASS CacheStorage interface: calling match(RequestInfo, CacheQueryOptions) on self.caches with too few arguments must throw TypeError +PASS CacheStorage interface: self.caches must inherit property "has(DOMString)" with the proper type +PASS CacheStorage interface: calling has(DOMString) on self.caches with too few arguments must throw TypeError +PASS CacheStorage interface: self.caches must inherit property "open(DOMString)" with the proper type +PASS CacheStorage interface: calling open(DOMString) on self.caches with too few arguments must throw TypeError +PASS CacheStorage interface: self.caches must inherit property "delete(DOMString)" with the proper type +PASS CacheStorage interface: calling delete(DOMString) on self.caches with too few arguments must throw TypeError +PASS CacheStorage interface: self.caches must inherit property "keys()" with the proper type +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt new file mode 100644 index 0000000..c9f3ca90 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt
@@ -0,0 +1,101 @@ +This is a testharness.js-based test. +PASS test setup (worker registration) +PASS WorkerGlobalScope interface: existence and properties of interface object +PASS ServiceWorkerGlobalScope interface: existence and properties of interface object +PASS Client interface: existence and properties of interface object +PASS WindowClient interface: existence and properties of interface object +PASS Clients interface: existence and properties of interface object +PASS ServiceWorker interface: existence and properties of interface object +PASS ServiceWorker interface object length +PASS ServiceWorker interface object name +PASS ServiceWorker interface: existence and properties of interface prototype object +PASS ServiceWorker interface: existence and properties of interface prototype object's "constructor" property +PASS ServiceWorker interface: attribute scriptURL +PASS ServiceWorker interface: attribute state +PASS ServiceWorker interface: operation postMessage(any, [object Object]) +PASS ServiceWorker interface: attribute onstatechange +PASS ServiceWorker must be primary interface of window.registrationInstance.installing +PASS Stringification of window.registrationInstance.installing +PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "scriptURL" with the proper type +PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "state" with the proper type +PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "postMessage(any, [object Object])" with the proper type +PASS ServiceWorker interface: calling postMessage(any, [object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError +PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "onstatechange" with the proper type +PASS EventTarget interface: window.registrationInstance.installing must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError +PASS EventTarget interface: window.registrationInstance.installing must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError +PASS EventTarget interface: window.registrationInstance.installing must inherit property "dispatchEvent(Event)" with the proper type +PASS EventTarget interface: calling dispatchEvent(Event) on window.registrationInstance.installing with too few arguments must throw TypeError +PASS ServiceWorkerRegistration interface: existence and properties of interface object +PASS ServiceWorkerRegistration interface object length +PASS ServiceWorkerRegistration interface object name +PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object +PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object's "constructor" property +PASS ServiceWorkerRegistration interface: attribute installing +PASS ServiceWorkerRegistration interface: attribute waiting +PASS ServiceWorkerRegistration interface: attribute active +PASS ServiceWorkerRegistration interface: attribute navigationPreload +PASS ServiceWorkerRegistration interface: attribute scope +FAIL ServiceWorkerRegistration interface: attribute updateViaCache assert_true: The prototype object must have a property "updateViaCache" expected true got false +PASS ServiceWorkerRegistration interface: operation update() +PASS ServiceWorkerRegistration interface: operation unregister() +PASS ServiceWorkerRegistration interface: attribute onupdatefound +PASS ServiceWorkerRegistration must be primary interface of window.registrationInstance +PASS Stringification of window.registrationInstance +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "installing" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "waiting" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "active" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "navigationPreload" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "scope" with the proper type +FAIL ServiceWorkerRegistration interface: window.registrationInstance must inherit property "updateViaCache" with the proper type assert_inherits: property "updateViaCache" not found in prototype chain +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "update()" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "unregister()" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "onupdatefound" with the proper type +PASS EventTarget interface: window.registrationInstance must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance with too few arguments must throw TypeError +PASS EventTarget interface: window.registrationInstance must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance with too few arguments must throw TypeError +PASS EventTarget interface: window.registrationInstance must inherit property "dispatchEvent(Event)" with the proper type +PASS EventTarget interface: calling dispatchEvent(Event) on window.registrationInstance with too few arguments must throw TypeError +PASS EventTarget interface: existence and properties of interface object +PASS EventTarget interface object length +PASS EventTarget interface object name +PASS EventTarget interface: existence and properties of interface prototype object +PASS EventTarget interface: existence and properties of interface prototype object's "constructor" property +PASS EventTarget interface: operation addEventListener(DOMString, EventListener, [object Object],[object Object]) +PASS EventTarget interface: operation removeEventListener(DOMString, EventListener, [object Object],[object Object]) +PASS EventTarget interface: operation dispatchEvent(Event) +PASS NavigationPreloadManager interface: existence and properties of interface object +PASS NavigationPreloadManager interface object length +PASS NavigationPreloadManager interface object name +PASS NavigationPreloadManager interface: existence and properties of interface prototype object +PASS NavigationPreloadManager interface: existence and properties of interface prototype object's "constructor" property +PASS NavigationPreloadManager interface: operation enable() +PASS NavigationPreloadManager interface: operation disable() +PASS NavigationPreloadManager interface: operation setHeaderValue(ByteString) +PASS NavigationPreloadManager interface: operation getState() +PASS Cache interface: existence and properties of interface object +PASS Cache interface object length +PASS Cache interface object name +PASS Cache interface: existence and properties of interface prototype object +PASS Cache interface: existence and properties of interface prototype object's "constructor" property +PASS Cache interface: operation match(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation matchAll(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation add(RequestInfo) +PASS Cache interface: operation addAll([object Object]) +PASS Cache interface: operation put(RequestInfo, Response) +PASS Cache interface: operation delete(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation keys(RequestInfo, CacheQueryOptions) +PASS CacheStorage interface: existence and properties of interface object +PASS CacheStorage interface object length +PASS CacheStorage interface object name +PASS CacheStorage interface: existence and properties of interface prototype object +PASS CacheStorage interface: existence and properties of interface prototype object's "constructor" property +PASS CacheStorage interface: operation match(RequestInfo, CacheQueryOptions) +PASS CacheStorage interface: operation has(DOMString) +PASS CacheStorage interface: operation open(DOMString) +PASS CacheStorage interface: operation delete(DOMString) +PASS CacheStorage interface: operation keys() +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-localstorage/external/wpt/webstorage/idlharness-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-localstorage/external/wpt/webstorage/idlharness-expected.txt new file mode 100644 index 0000000..4b5ce02 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-localstorage/external/wpt/webstorage/idlharness-expected.txt
@@ -0,0 +1,38 @@ +This is a testharness.js-based test. +PASS Window interface: attribute sessionStorage +PASS Window interface: attribute localStorage +PASS Storage interface: existence and properties of interface object +PASS Storage interface object length +PASS Storage interface object name +PASS Storage interface: existence and properties of interface prototype object +PASS Storage interface: existence and properties of interface prototype object's "constructor" property +FAIL Storage interface: attribute length assert_true: property should be enumerable expected true got false +FAIL Storage interface: operation key(unsigned long) assert_true: property should be enumerable expected true got false +FAIL Storage interface: operation getItem(DOMString) assert_true: property should be enumerable expected true got false +FAIL Storage interface: operation setItem(DOMString, DOMString) assert_true: property should be enumerable expected true got false +FAIL Storage interface: operation removeItem(DOMString) assert_true: property should be enumerable expected true got false +FAIL Storage interface: operation clear() assert_true: property should be enumerable expected true got false +PASS Storage must be primary interface of window.localStorage +PASS Stringification of window.localStorage +PASS Storage interface: window.localStorage must inherit property "length" with the proper type +PASS Storage interface: window.localStorage must inherit property "key(unsigned long)" with the proper type +PASS Storage interface: calling key(unsigned long) on window.localStorage with too few arguments must throw TypeError +PASS Storage interface: window.localStorage must inherit property "getItem(DOMString)" with the proper type +PASS Storage interface: calling getItem(DOMString) on window.localStorage with too few arguments must throw TypeError +PASS Storage interface: window.localStorage must inherit property "setItem(DOMString, DOMString)" with the proper type +PASS Storage interface: calling setItem(DOMString, DOMString) on window.localStorage with too few arguments must throw TypeError +PASS Storage interface: window.localStorage must inherit property "removeItem(DOMString)" with the proper type +PASS Storage interface: calling removeItem(DOMString) on window.localStorage with too few arguments must throw TypeError +PASS Storage interface: window.localStorage must inherit property "clear()" with the proper type +PASS StorageEvent interface: existence and properties of interface object +PASS StorageEvent interface object length +PASS StorageEvent interface object name +PASS StorageEvent interface: existence and properties of interface prototype object +PASS StorageEvent interface: existence and properties of interface prototype object's "constructor" property +PASS StorageEvent interface: attribute key +PASS StorageEvent interface: attribute oldValue +PASS StorageEvent interface: attribute newValue +PASS StorageEvent interface: attribute url +PASS StorageEvent interface: attribute storageArea +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt new file mode 100644 index 0000000..b92d7aa --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
@@ -0,0 +1,187 @@ +This is a testharness.js-based test. +PASS Interfaces and attributes in ServiceWorkerGlobalScope +PASS test setup (cache creation) +PASS Event constructors +PASS ServiceWorkerGlobalScope interface: existence and properties of interface object +PASS ServiceWorkerGlobalScope interface object length +PASS ServiceWorkerGlobalScope interface object name +PASS ServiceWorkerGlobalScope interface: existence and properties of interface prototype object +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Object.setPrototypeOf should throw a TypeError +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via __proto__ should throw a TypeError +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Reflect.setPrototypeOf should return false +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Object.setPrototypeOf should not throw +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via __proto__ should not throw +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Reflect.setPrototypeOf should return true +PASS ServiceWorkerGlobalScope interface: existence and properties of interface prototype object's "constructor" property +PASS ServiceWorkerGlobalScope interface: attribute clients +PASS ServiceWorkerGlobalScope interface: attribute registration +PASS ServiceWorkerGlobalScope interface: operation skipWaiting() +PASS ServiceWorkerGlobalScope interface: attribute oninstall +PASS ServiceWorkerGlobalScope interface: attribute onactivate +PASS ServiceWorkerGlobalScope interface: attribute onfetch +PASS ServiceWorkerGlobalScope interface: attribute onforeignfetch +PASS ServiceWorkerGlobalScope interface: attribute onmessage +FAIL ServiceWorkerGlobalScope interface: attribute onmessageerror assert_own_property: The global object must have a property "onmessageerror" expected property "onmessageerror" missing +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Object.setPrototypeOf should throw a TypeError +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via __proto__ should throw a TypeError +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Reflect.setPrototypeOf should return false +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Object.setPrototypeOf should not throw +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via __proto__ should not throw +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Reflect.setPrototypeOf should return true +PASS ServiceWorkerGlobalScope must be primary interface of self +PASS Stringification of self +PASS ServiceWorkerGlobalScope interface: self must inherit property "clients" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "registration" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "skipWaiting()" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "oninstall" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "onactivate" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "onfetch" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "onforeignfetch" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "onmessage" with the proper type +FAIL ServiceWorkerGlobalScope interface: self must inherit property "onmessageerror" with the proper type assert_own_property: expected property "onmessageerror" missing +PASS Client interface: existence and properties of interface object +PASS Client interface object length +PASS Client interface object name +PASS Client interface: existence and properties of interface prototype object +PASS Client interface: existence and properties of interface prototype object's "constructor" property +PASS Client interface: attribute url +PASS Client interface: attribute id +PASS Client interface: attribute type +FAIL Client interface: attribute reserved assert_true: The prototype object must have a property "reserved" expected true got false +PASS Client interface: operation postMessage(any, [object Object]) +PASS WindowClient interface: existence and properties of interface object +PASS WindowClient interface object length +PASS WindowClient interface object name +PASS WindowClient interface: existence and properties of interface prototype object +PASS WindowClient interface: existence and properties of interface prototype object's "constructor" property +PASS WindowClient interface: attribute visibilityState +PASS WindowClient interface: attribute focused +FAIL WindowClient interface: attribute ancestorOrigins assert_true: The prototype object must have a property "ancestorOrigins" expected true got false +PASS WindowClient interface: operation focus() +PASS WindowClient interface: operation navigate(USVString) +PASS Clients interface: existence and properties of interface object +PASS Clients interface object length +PASS Clients interface object name +PASS Clients interface: existence and properties of interface prototype object +PASS Clients interface: existence and properties of interface prototype object's "constructor" property +PASS Clients interface: operation get(DOMString) +PASS Clients interface: operation matchAll(ClientQueryOptions) +PASS Clients interface: operation openWindow(USVString) +PASS Clients interface: operation claim() +PASS Clients must be primary interface of self.clients +PASS Stringification of self.clients +PASS Clients interface: self.clients must inherit property "get(DOMString)" with the proper type +PASS Clients interface: calling get(DOMString) on self.clients with too few arguments must throw TypeError +PASS Clients interface: self.clients must inherit property "matchAll(ClientQueryOptions)" with the proper type +PASS Clients interface: calling matchAll(ClientQueryOptions) on self.clients with too few arguments must throw TypeError +PASS Clients interface: self.clients must inherit property "openWindow(USVString)" with the proper type +PASS Clients interface: calling openWindow(USVString) on self.clients with too few arguments must throw TypeError +PASS Clients interface: self.clients must inherit property "claim()" with the proper type +FAIL ServiceWorker interface: existence and properties of interface object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface object length assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface object name assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: existence and properties of interface prototype object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: attribute scriptURL assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: attribute state assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: operation postMessage(any, [object Object]) assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: attribute onstatechange assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +PASS ServiceWorkerRegistration interface: existence and properties of interface object +PASS ServiceWorkerRegistration interface object length +PASS ServiceWorkerRegistration interface object name +PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object +PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object's "constructor" property +PASS ServiceWorkerRegistration interface: attribute installing +PASS ServiceWorkerRegistration interface: attribute waiting +PASS ServiceWorkerRegistration interface: attribute active +PASS ServiceWorkerRegistration interface: attribute navigationPreload +PASS ServiceWorkerRegistration interface: attribute scope +FAIL ServiceWorkerRegistration interface: attribute updateViaCache assert_true: The prototype object must have a property "updateViaCache" expected true got false +PASS ServiceWorkerRegistration interface: operation update() +PASS ServiceWorkerRegistration interface: operation unregister() +PASS ServiceWorkerRegistration interface: attribute onupdatefound +PASS ServiceWorkerRegistration must be primary interface of self.registration +PASS Stringification of self.registration +PASS ServiceWorkerRegistration interface: self.registration must inherit property "installing" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "waiting" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "active" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "navigationPreload" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "scope" with the proper type +FAIL ServiceWorkerRegistration interface: self.registration must inherit property "updateViaCache" with the proper type assert_inherits: property "updateViaCache" not found in prototype chain +PASS ServiceWorkerRegistration interface: self.registration must inherit property "update()" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "unregister()" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "onupdatefound" with the proper type +PASS EventTarget interface: self.registration must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on self.registration with too few arguments must throw TypeError +PASS EventTarget interface: self.registration must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on self.registration with too few arguments must throw TypeError +PASS EventTarget interface: self.registration must inherit property "dispatchEvent(Event)" with the proper type +PASS EventTarget interface: calling dispatchEvent(Event) on self.registration with too few arguments must throw TypeError +PASS EventTarget interface: existence and properties of interface object +PASS EventTarget interface object length +PASS EventTarget interface object name +PASS EventTarget interface: existence and properties of interface prototype object +PASS EventTarget interface: existence and properties of interface prototype object's "constructor" property +PASS EventTarget interface: operation addEventListener(DOMString, EventListener, [object Object],[object Object]) +PASS EventTarget interface: operation removeEventListener(DOMString, EventListener, [object Object],[object Object]) +PASS EventTarget interface: operation dispatchEvent(Event) +PASS NavigationPreloadManager interface: existence and properties of interface object +PASS NavigationPreloadManager interface object length +PASS NavigationPreloadManager interface object name +PASS NavigationPreloadManager interface: existence and properties of interface prototype object +PASS NavigationPreloadManager interface: existence and properties of interface prototype object's "constructor" property +PASS NavigationPreloadManager interface: operation enable() +PASS NavigationPreloadManager interface: operation disable() +PASS NavigationPreloadManager interface: operation setHeaderValue(ByteString) +PASS NavigationPreloadManager interface: operation getState() +PASS Cache interface: existence and properties of interface object +PASS Cache interface object length +PASS Cache interface object name +PASS Cache interface: existence and properties of interface prototype object +PASS Cache interface: existence and properties of interface prototype object's "constructor" property +PASS Cache interface: operation match(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation matchAll(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation add(RequestInfo) +PASS Cache interface: operation addAll([object Object]) +PASS Cache interface: operation put(RequestInfo, Response) +PASS Cache interface: operation delete(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation keys(RequestInfo, CacheQueryOptions) +PASS Cache must be primary interface of self.cacheInstance +PASS Stringification of self.cacheInstance +PASS Cache interface: self.cacheInstance must inherit property "match(RequestInfo, CacheQueryOptions)" with the proper type +PASS Cache interface: calling match(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "matchAll(RequestInfo, CacheQueryOptions)" with the proper type +PASS Cache interface: calling matchAll(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "add(RequestInfo)" with the proper type +PASS Cache interface: calling add(RequestInfo) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "addAll([object Object])" with the proper type +PASS Cache interface: calling addAll([object Object]) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "put(RequestInfo, Response)" with the proper type +PASS Cache interface: calling put(RequestInfo, Response) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "delete(RequestInfo, CacheQueryOptions)" with the proper type +PASS Cache interface: calling delete(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "keys(RequestInfo, CacheQueryOptions)" with the proper type +PASS Cache interface: calling keys(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError +PASS CacheStorage interface: existence and properties of interface object +PASS CacheStorage interface object length +PASS CacheStorage interface object name +PASS CacheStorage interface: existence and properties of interface prototype object +PASS CacheStorage interface: existence and properties of interface prototype object's "constructor" property +PASS CacheStorage interface: operation match(RequestInfo, CacheQueryOptions) +PASS CacheStorage interface: operation has(DOMString) +PASS CacheStorage interface: operation open(DOMString) +PASS CacheStorage interface: operation delete(DOMString) +PASS CacheStorage interface: operation keys() +PASS CacheStorage must be primary interface of self.caches +PASS Stringification of self.caches +PASS CacheStorage interface: self.caches must inherit property "match(RequestInfo, CacheQueryOptions)" with the proper type +PASS CacheStorage interface: calling match(RequestInfo, CacheQueryOptions) on self.caches with too few arguments must throw TypeError +PASS CacheStorage interface: self.caches must inherit property "has(DOMString)" with the proper type +PASS CacheStorage interface: calling has(DOMString) on self.caches with too few arguments must throw TypeError +PASS CacheStorage interface: self.caches must inherit property "open(DOMString)" with the proper type +PASS CacheStorage interface: calling open(DOMString) on self.caches with too few arguments must throw TypeError +PASS CacheStorage interface: self.caches must inherit property "delete(DOMString)" with the proper type +PASS CacheStorage interface: calling delete(DOMString) on self.caches with too few arguments must throw TypeError +PASS CacheStorage interface: self.caches must inherit property "keys()" with the proper type +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt new file mode 100644 index 0000000..c9f3ca90 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt
@@ -0,0 +1,101 @@ +This is a testharness.js-based test. +PASS test setup (worker registration) +PASS WorkerGlobalScope interface: existence and properties of interface object +PASS ServiceWorkerGlobalScope interface: existence and properties of interface object +PASS Client interface: existence and properties of interface object +PASS WindowClient interface: existence and properties of interface object +PASS Clients interface: existence and properties of interface object +PASS ServiceWorker interface: existence and properties of interface object +PASS ServiceWorker interface object length +PASS ServiceWorker interface object name +PASS ServiceWorker interface: existence and properties of interface prototype object +PASS ServiceWorker interface: existence and properties of interface prototype object's "constructor" property +PASS ServiceWorker interface: attribute scriptURL +PASS ServiceWorker interface: attribute state +PASS ServiceWorker interface: operation postMessage(any, [object Object]) +PASS ServiceWorker interface: attribute onstatechange +PASS ServiceWorker must be primary interface of window.registrationInstance.installing +PASS Stringification of window.registrationInstance.installing +PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "scriptURL" with the proper type +PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "state" with the proper type +PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "postMessage(any, [object Object])" with the proper type +PASS ServiceWorker interface: calling postMessage(any, [object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError +PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "onstatechange" with the proper type +PASS EventTarget interface: window.registrationInstance.installing must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError +PASS EventTarget interface: window.registrationInstance.installing must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError +PASS EventTarget interface: window.registrationInstance.installing must inherit property "dispatchEvent(Event)" with the proper type +PASS EventTarget interface: calling dispatchEvent(Event) on window.registrationInstance.installing with too few arguments must throw TypeError +PASS ServiceWorkerRegistration interface: existence and properties of interface object +PASS ServiceWorkerRegistration interface object length +PASS ServiceWorkerRegistration interface object name +PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object +PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object's "constructor" property +PASS ServiceWorkerRegistration interface: attribute installing +PASS ServiceWorkerRegistration interface: attribute waiting +PASS ServiceWorkerRegistration interface: attribute active +PASS ServiceWorkerRegistration interface: attribute navigationPreload +PASS ServiceWorkerRegistration interface: attribute scope +FAIL ServiceWorkerRegistration interface: attribute updateViaCache assert_true: The prototype object must have a property "updateViaCache" expected true got false +PASS ServiceWorkerRegistration interface: operation update() +PASS ServiceWorkerRegistration interface: operation unregister() +PASS ServiceWorkerRegistration interface: attribute onupdatefound +PASS ServiceWorkerRegistration must be primary interface of window.registrationInstance +PASS Stringification of window.registrationInstance +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "installing" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "waiting" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "active" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "navigationPreload" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "scope" with the proper type +FAIL ServiceWorkerRegistration interface: window.registrationInstance must inherit property "updateViaCache" with the proper type assert_inherits: property "updateViaCache" not found in prototype chain +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "update()" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "unregister()" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "onupdatefound" with the proper type +PASS EventTarget interface: window.registrationInstance must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance with too few arguments must throw TypeError +PASS EventTarget interface: window.registrationInstance must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance with too few arguments must throw TypeError +PASS EventTarget interface: window.registrationInstance must inherit property "dispatchEvent(Event)" with the proper type +PASS EventTarget interface: calling dispatchEvent(Event) on window.registrationInstance with too few arguments must throw TypeError +PASS EventTarget interface: existence and properties of interface object +PASS EventTarget interface object length +PASS EventTarget interface object name +PASS EventTarget interface: existence and properties of interface prototype object +PASS EventTarget interface: existence and properties of interface prototype object's "constructor" property +PASS EventTarget interface: operation addEventListener(DOMString, EventListener, [object Object],[object Object]) +PASS EventTarget interface: operation removeEventListener(DOMString, EventListener, [object Object],[object Object]) +PASS EventTarget interface: operation dispatchEvent(Event) +PASS NavigationPreloadManager interface: existence and properties of interface object +PASS NavigationPreloadManager interface object length +PASS NavigationPreloadManager interface object name +PASS NavigationPreloadManager interface: existence and properties of interface prototype object +PASS NavigationPreloadManager interface: existence and properties of interface prototype object's "constructor" property +PASS NavigationPreloadManager interface: operation enable() +PASS NavigationPreloadManager interface: operation disable() +PASS NavigationPreloadManager interface: operation setHeaderValue(ByteString) +PASS NavigationPreloadManager interface: operation getState() +PASS Cache interface: existence and properties of interface object +PASS Cache interface object length +PASS Cache interface object name +PASS Cache interface: existence and properties of interface prototype object +PASS Cache interface: existence and properties of interface prototype object's "constructor" property +PASS Cache interface: operation match(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation matchAll(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation add(RequestInfo) +PASS Cache interface: operation addAll([object Object]) +PASS Cache interface: operation put(RequestInfo, Response) +PASS Cache interface: operation delete(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation keys(RequestInfo, CacheQueryOptions) +PASS CacheStorage interface: existence and properties of interface object +PASS CacheStorage interface object length +PASS CacheStorage interface object name +PASS CacheStorage interface: existence and properties of interface prototype object +PASS CacheStorage interface: existence and properties of interface prototype object's "constructor" property +PASS CacheStorage interface: operation match(RequestInfo, CacheQueryOptions) +PASS CacheStorage interface: operation has(DOMString) +PASS CacheStorage interface: operation open(DOMString) +PASS CacheStorage interface: operation delete(DOMString) +PASS CacheStorage interface: operation keys() +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt new file mode 100644 index 0000000..b18b8d79 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt
@@ -0,0 +1,4 @@ +This is a testharness.js-based test. +FAIL General fetch abort tests in a service worker Failed to register a ServiceWorker: The script does not have a MIME type. +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/abort/general-sharedworker-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/abort/general-sharedworker-expected.txt new file mode 100644 index 0000000..d9b7c58 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/abort/general-sharedworker-expected.txt
@@ -0,0 +1,52 @@ +This is a testharness.js-based test. +FAIL Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - RequestInit's window is not null +FAIL TypeError from request constructor takes priority - Input URL is not valid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - Input URL has credentials promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is navigate promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's referrer is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's method is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's method is forbidden promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and method is not simple promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and integrity is not empty promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - RequestInit's cache mode is only-if-cached and mode is not same-origin +PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode cors +PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode no-cors +FAIL TypeError from request constructor takes priority - Bad referrerPolicy init parameter value promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - Bad mode init parameter value +PASS TypeError from request constructor takes priority - Bad credentials init parameter value +PASS TypeError from request constructor takes priority - Bad cache init parameter value +PASS TypeError from request constructor takes priority - Bad redirect init parameter value +FAIL Request objects have a signal property assert_true: Signal member is present & truthy expected true got false +FAIL Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Readable stream synchronously cancels with AbortError if aborted before reading promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal state is cloned AbortController is not defined +FAIL Clone aborts with original controller AbortController is not defined +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/abort/general.any-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/abort/general.any-expected.txt new file mode 100644 index 0000000..d9b7c58 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/abort/general.any-expected.txt
@@ -0,0 +1,52 @@ +This is a testharness.js-based test. +FAIL Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - RequestInit's window is not null +FAIL TypeError from request constructor takes priority - Input URL is not valid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - Input URL has credentials promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is navigate promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's referrer is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's method is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's method is forbidden promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and method is not simple promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and integrity is not empty promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - RequestInit's cache mode is only-if-cached and mode is not same-origin +PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode cors +PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode no-cors +FAIL TypeError from request constructor takes priority - Bad referrerPolicy init parameter value promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - Bad mode init parameter value +PASS TypeError from request constructor takes priority - Bad credentials init parameter value +PASS TypeError from request constructor takes priority - Bad cache init parameter value +PASS TypeError from request constructor takes priority - Bad redirect init parameter value +FAIL Request objects have a signal property assert_true: Signal member is present & truthy expected true got false +FAIL Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Readable stream synchronously cancels with AbortError if aborted before reading promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal state is cloned AbortController is not defined +FAIL Clone aborts with original controller AbortController is not defined +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/abort/general.any.worker-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/abort/general.any.worker-expected.txt new file mode 100644 index 0000000..d9b7c58 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/abort/general.any.worker-expected.txt
@@ -0,0 +1,52 @@ +This is a testharness.js-based test. +FAIL Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - RequestInit's window is not null +FAIL TypeError from request constructor takes priority - Input URL is not valid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - Input URL has credentials promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is navigate promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's referrer is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's method is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's method is forbidden promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and method is not simple promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and integrity is not empty promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - RequestInit's cache mode is only-if-cached and mode is not same-origin +PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode cors +PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode no-cors +FAIL TypeError from request constructor takes priority - Bad referrerPolicy init parameter value promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - Bad mode init parameter value +PASS TypeError from request constructor takes priority - Bad credentials init parameter value +PASS TypeError from request constructor takes priority - Bad cache init parameter value +PASS TypeError from request constructor takes priority - Bad redirect init parameter value +FAIL Request objects have a signal property assert_true: Signal member is present & truthy expected true got false +FAIL Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Readable stream synchronously cancels with AbortError if aborted before reading promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal state is cloned AbortController is not defined +FAIL Clone aborts with original controller AbortController is not defined +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/request/request-error-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/request/request-error-expected.txt new file mode 100644 index 0000000..697b78fd0 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/request/request-error-expected.txt
@@ -0,0 +1,25 @@ +This is a testharness.js-based test. +FAIL RequestInit's window is not null assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +PASS Input URL is not valid +PASS Input URL has credentials +PASS RequestInit's mode is navigate +PASS RequestInit's referrer is invalid +PASS RequestInit's method is invalid +PASS RequestInit's method is forbidden +PASS RequestInit's mode is no-cors and method is not simple +PASS RequestInit's mode is no-cors and integrity is not empty +FAIL RequestInit's cache mode is only-if-cached and mode is not same-origin assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +FAIL Request with cache mode: only-if-cached and fetch mode cors assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +FAIL Request with cache mode: only-if-cached and fetch mode no-cors assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +PASS Bad referrerPolicy init parameter value +FAIL Bad mode init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +FAIL Bad credentials init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +FAIL Bad cache init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +FAIL Bad redirect init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +PASS Request should get its content-type from the init request +PASS Request should not get its content-type from the init request if init headers are provided +PASS Request should get its content-type from the body if none is provided +PASS Request should get its content-type from init headers if one is provided +PASS Request with cache mode: only-if-cached and fetch mode: same-origin +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/request/request-idl-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/request/request-idl-expected.txt new file mode 100644 index 0000000..6835e7d --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/request/request-idl-expected.txt
@@ -0,0 +1,50 @@ +This is a testharness.js-based test. +PASS Request interface: existence and properties of interface object +PASS Request interface object length +PASS Request interface object name +PASS Request interface: existence and properties of interface prototype object +PASS Request interface: existence and properties of interface prototype object's "constructor" property +PASS Request interface: attribute method +PASS Request interface: attribute url +PASS Request interface: attribute headers +FAIL Request interface: attribute type assert_true: The prototype object must have a property "type" expected true got false +FAIL Request interface: attribute destination assert_true: The prototype object must have a property "destination" expected true got false +PASS Request interface: attribute referrer +PASS Request interface: attribute referrerPolicy +PASS Request interface: attribute mode +PASS Request interface: attribute credentials +PASS Request interface: attribute cache +PASS Request interface: attribute redirect +PASS Request interface: attribute integrity +PASS Request interface: operation clone() +FAIL Request interface: attribute body assert_true: The prototype object must have a property "body" expected true got false +PASS Request interface: attribute bodyUsed +PASS Request interface: operation arrayBuffer() +PASS Request interface: operation blob() +PASS Request interface: operation formData() +PASS Request interface: operation json() +PASS Request interface: operation text() +PASS Request must be primary interface of new Request("") +PASS Stringification of new Request("") +PASS Request interface: new Request("") must inherit property "method" with the proper type +PASS Request interface: new Request("") must inherit property "url" with the proper type +PASS Request interface: new Request("") must inherit property "headers" with the proper type +FAIL Request interface: new Request("") must inherit property "type" with the proper type assert_inherits: property "type" not found in prototype chain +FAIL Request interface: new Request("") must inherit property "destination" with the proper type assert_inherits: property "destination" not found in prototype chain +PASS Request interface: new Request("") must inherit property "referrer" with the proper type +PASS Request interface: new Request("") must inherit property "referrerPolicy" with the proper type +PASS Request interface: new Request("") must inherit property "mode" with the proper type +PASS Request interface: new Request("") must inherit property "credentials" with the proper type +PASS Request interface: new Request("") must inherit property "cache" with the proper type +PASS Request interface: new Request("") must inherit property "redirect" with the proper type +PASS Request interface: new Request("") must inherit property "integrity" with the proper type +PASS Request interface: new Request("") must inherit property "clone()" with the proper type +FAIL Request interface: new Request("") must inherit property "body" with the proper type assert_inherits: property "body" not found in prototype chain +PASS Request interface: new Request("") must inherit property "bodyUsed" with the proper type +PASS Request interface: new Request("") must inherit property "arrayBuffer()" with the proper type +PASS Request interface: new Request("") must inherit property "blob()" with the proper type +PASS Request interface: new Request("") must inherit property "formData()" with the proper type +PASS Request interface: new Request("") must inherit property "json()" with the proper type +PASS Request interface: new Request("") must inherit property "text()" with the proper type +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/response/response-idl-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/response/response-idl-expected.txt new file mode 100644 index 0000000..db7454c6 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/response/response-idl-expected.txt
@@ -0,0 +1,45 @@ +This is a testharness.js-based test. +PASS Response interface: existence and properties of interface object +PASS Response interface object length +PASS Response interface object name +PASS Response interface: existence and properties of interface prototype object +PASS Response interface: existence and properties of interface prototype object's "constructor" property +PASS Response interface: operation error() +PASS Response interface: operation redirect(USVString, unsigned short) +PASS Response interface: attribute type +PASS Response interface: attribute url +PASS Response interface: attribute status +PASS Response interface: attribute ok +PASS Response interface: attribute statusText +PASS Response interface: attribute headers +FAIL Response interface: attribute trailer assert_true: The prototype object must have a property "trailer" expected true got false +PASS Response interface: operation clone() +PASS Response interface: attribute body +PASS Response interface: attribute bodyUsed +PASS Response interface: operation arrayBuffer() +PASS Response interface: operation blob() +PASS Response interface: operation formData() +PASS Response interface: operation json() +PASS Response interface: operation text() +PASS Response must be primary interface of new Response() +PASS Stringification of new Response() +PASS Response interface: new Response() must inherit property "error()" with the proper type +PASS Response interface: new Response() must inherit property "redirect(USVString, unsigned short)" with the proper type +PASS Response interface: calling redirect(USVString, unsigned short) on new Response() with too few arguments must throw TypeError +PASS Response interface: new Response() must inherit property "type" with the proper type +PASS Response interface: new Response() must inherit property "url" with the proper type +PASS Response interface: new Response() must inherit property "status" with the proper type +PASS Response interface: new Response() must inherit property "ok" with the proper type +PASS Response interface: new Response() must inherit property "statusText" with the proper type +PASS Response interface: new Response() must inherit property "headers" with the proper type +FAIL Response interface: new Response() must inherit property "trailer" with the proper type assert_inherits: property "trailer" not found in prototype chain +PASS Response interface: new Response() must inherit property "clone()" with the proper type +PASS Response interface: new Response() must inherit property "body" with the proper type +PASS Response interface: new Response() must inherit property "bodyUsed" with the proper type +PASS Response interface: new Response() must inherit property "arrayBuffer()" with the proper type +PASS Response interface: new Response() must inherit property "blob()" with the proper type +PASS Response interface: new Response() must inherit property "formData()" with the proper type +PASS Response interface: new Response() must inherit property "json()" with the proper type +PASS Response interface: new Response() must inherit property "text()" with the proper type +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt new file mode 100644 index 0000000..b92d7aa --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
@@ -0,0 +1,187 @@ +This is a testharness.js-based test. +PASS Interfaces and attributes in ServiceWorkerGlobalScope +PASS test setup (cache creation) +PASS Event constructors +PASS ServiceWorkerGlobalScope interface: existence and properties of interface object +PASS ServiceWorkerGlobalScope interface object length +PASS ServiceWorkerGlobalScope interface object name +PASS ServiceWorkerGlobalScope interface: existence and properties of interface prototype object +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Object.setPrototypeOf should throw a TypeError +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via __proto__ should throw a TypeError +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Reflect.setPrototypeOf should return false +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Object.setPrototypeOf should not throw +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via __proto__ should not throw +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Reflect.setPrototypeOf should return true +PASS ServiceWorkerGlobalScope interface: existence and properties of interface prototype object's "constructor" property +PASS ServiceWorkerGlobalScope interface: attribute clients +PASS ServiceWorkerGlobalScope interface: attribute registration +PASS ServiceWorkerGlobalScope interface: operation skipWaiting() +PASS ServiceWorkerGlobalScope interface: attribute oninstall +PASS ServiceWorkerGlobalScope interface: attribute onactivate +PASS ServiceWorkerGlobalScope interface: attribute onfetch +PASS ServiceWorkerGlobalScope interface: attribute onforeignfetch +PASS ServiceWorkerGlobalScope interface: attribute onmessage +FAIL ServiceWorkerGlobalScope interface: attribute onmessageerror assert_own_property: The global object must have a property "onmessageerror" expected property "onmessageerror" missing +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Object.setPrototypeOf should throw a TypeError +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via __proto__ should throw a TypeError +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Reflect.setPrototypeOf should return false +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Object.setPrototypeOf should not throw +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via __proto__ should not throw +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Reflect.setPrototypeOf should return true +PASS ServiceWorkerGlobalScope must be primary interface of self +PASS Stringification of self +PASS ServiceWorkerGlobalScope interface: self must inherit property "clients" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "registration" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "skipWaiting()" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "oninstall" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "onactivate" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "onfetch" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "onforeignfetch" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "onmessage" with the proper type +FAIL ServiceWorkerGlobalScope interface: self must inherit property "onmessageerror" with the proper type assert_own_property: expected property "onmessageerror" missing +PASS Client interface: existence and properties of interface object +PASS Client interface object length +PASS Client interface object name +PASS Client interface: existence and properties of interface prototype object +PASS Client interface: existence and properties of interface prototype object's "constructor" property +PASS Client interface: attribute url +PASS Client interface: attribute id +PASS Client interface: attribute type +FAIL Client interface: attribute reserved assert_true: The prototype object must have a property "reserved" expected true got false +PASS Client interface: operation postMessage(any, [object Object]) +PASS WindowClient interface: existence and properties of interface object +PASS WindowClient interface object length +PASS WindowClient interface object name +PASS WindowClient interface: existence and properties of interface prototype object +PASS WindowClient interface: existence and properties of interface prototype object's "constructor" property +PASS WindowClient interface: attribute visibilityState +PASS WindowClient interface: attribute focused +FAIL WindowClient interface: attribute ancestorOrigins assert_true: The prototype object must have a property "ancestorOrigins" expected true got false +PASS WindowClient interface: operation focus() +PASS WindowClient interface: operation navigate(USVString) +PASS Clients interface: existence and properties of interface object +PASS Clients interface object length +PASS Clients interface object name +PASS Clients interface: existence and properties of interface prototype object +PASS Clients interface: existence and properties of interface prototype object's "constructor" property +PASS Clients interface: operation get(DOMString) +PASS Clients interface: operation matchAll(ClientQueryOptions) +PASS Clients interface: operation openWindow(USVString) +PASS Clients interface: operation claim() +PASS Clients must be primary interface of self.clients +PASS Stringification of self.clients +PASS Clients interface: self.clients must inherit property "get(DOMString)" with the proper type +PASS Clients interface: calling get(DOMString) on self.clients with too few arguments must throw TypeError +PASS Clients interface: self.clients must inherit property "matchAll(ClientQueryOptions)" with the proper type +PASS Clients interface: calling matchAll(ClientQueryOptions) on self.clients with too few arguments must throw TypeError +PASS Clients interface: self.clients must inherit property "openWindow(USVString)" with the proper type +PASS Clients interface: calling openWindow(USVString) on self.clients with too few arguments must throw TypeError +PASS Clients interface: self.clients must inherit property "claim()" with the proper type +FAIL ServiceWorker interface: existence and properties of interface object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface object length assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface object name assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: existence and properties of interface prototype object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: attribute scriptURL assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: attribute state assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: operation postMessage(any, [object Object]) assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: attribute onstatechange assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +PASS ServiceWorkerRegistration interface: existence and properties of interface object +PASS ServiceWorkerRegistration interface object length +PASS ServiceWorkerRegistration interface object name +PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object +PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object's "constructor" property +PASS ServiceWorkerRegistration interface: attribute installing +PASS ServiceWorkerRegistration interface: attribute waiting +PASS ServiceWorkerRegistration interface: attribute active +PASS ServiceWorkerRegistration interface: attribute navigationPreload +PASS ServiceWorkerRegistration interface: attribute scope +FAIL ServiceWorkerRegistration interface: attribute updateViaCache assert_true: The prototype object must have a property "updateViaCache" expected true got false +PASS ServiceWorkerRegistration interface: operation update() +PASS ServiceWorkerRegistration interface: operation unregister() +PASS ServiceWorkerRegistration interface: attribute onupdatefound +PASS ServiceWorkerRegistration must be primary interface of self.registration +PASS Stringification of self.registration +PASS ServiceWorkerRegistration interface: self.registration must inherit property "installing" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "waiting" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "active" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "navigationPreload" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "scope" with the proper type +FAIL ServiceWorkerRegistration interface: self.registration must inherit property "updateViaCache" with the proper type assert_inherits: property "updateViaCache" not found in prototype chain +PASS ServiceWorkerRegistration interface: self.registration must inherit property "update()" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "unregister()" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "onupdatefound" with the proper type +PASS EventTarget interface: self.registration must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on self.registration with too few arguments must throw TypeError +PASS EventTarget interface: self.registration must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on self.registration with too few arguments must throw TypeError +PASS EventTarget interface: self.registration must inherit property "dispatchEvent(Event)" with the proper type +PASS EventTarget interface: calling dispatchEvent(Event) on self.registration with too few arguments must throw TypeError +PASS EventTarget interface: existence and properties of interface object +PASS EventTarget interface object length +PASS EventTarget interface object name +PASS EventTarget interface: existence and properties of interface prototype object +PASS EventTarget interface: existence and properties of interface prototype object's "constructor" property +PASS EventTarget interface: operation addEventListener(DOMString, EventListener, [object Object],[object Object]) +PASS EventTarget interface: operation removeEventListener(DOMString, EventListener, [object Object],[object Object]) +PASS EventTarget interface: operation dispatchEvent(Event) +PASS NavigationPreloadManager interface: existence and properties of interface object +PASS NavigationPreloadManager interface object length +PASS NavigationPreloadManager interface object name +PASS NavigationPreloadManager interface: existence and properties of interface prototype object +PASS NavigationPreloadManager interface: existence and properties of interface prototype object's "constructor" property +PASS NavigationPreloadManager interface: operation enable() +PASS NavigationPreloadManager interface: operation disable() +PASS NavigationPreloadManager interface: operation setHeaderValue(ByteString) +PASS NavigationPreloadManager interface: operation getState() +PASS Cache interface: existence and properties of interface object +PASS Cache interface object length +PASS Cache interface object name +PASS Cache interface: existence and properties of interface prototype object +PASS Cache interface: existence and properties of interface prototype object's "constructor" property +PASS Cache interface: operation match(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation matchAll(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation add(RequestInfo) +PASS Cache interface: operation addAll([object Object]) +PASS Cache interface: operation put(RequestInfo, Response) +PASS Cache interface: operation delete(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation keys(RequestInfo, CacheQueryOptions) +PASS Cache must be primary interface of self.cacheInstance +PASS Stringification of self.cacheInstance +PASS Cache interface: self.cacheInstance must inherit property "match(RequestInfo, CacheQueryOptions)" with the proper type +PASS Cache interface: calling match(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "matchAll(RequestInfo, CacheQueryOptions)" with the proper type +PASS Cache interface: calling matchAll(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "add(RequestInfo)" with the proper type +PASS Cache interface: calling add(RequestInfo) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "addAll([object Object])" with the proper type +PASS Cache interface: calling addAll([object Object]) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "put(RequestInfo, Response)" with the proper type +PASS Cache interface: calling put(RequestInfo, Response) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "delete(RequestInfo, CacheQueryOptions)" with the proper type +PASS Cache interface: calling delete(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "keys(RequestInfo, CacheQueryOptions)" with the proper type +PASS Cache interface: calling keys(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError +PASS CacheStorage interface: existence and properties of interface object +PASS CacheStorage interface object length +PASS CacheStorage interface object name +PASS CacheStorage interface: existence and properties of interface prototype object +PASS CacheStorage interface: existence and properties of interface prototype object's "constructor" property +PASS CacheStorage interface: operation match(RequestInfo, CacheQueryOptions) +PASS CacheStorage interface: operation has(DOMString) +PASS CacheStorage interface: operation open(DOMString) +PASS CacheStorage interface: operation delete(DOMString) +PASS CacheStorage interface: operation keys() +PASS CacheStorage must be primary interface of self.caches +PASS Stringification of self.caches +PASS CacheStorage interface: self.caches must inherit property "match(RequestInfo, CacheQueryOptions)" with the proper type +PASS CacheStorage interface: calling match(RequestInfo, CacheQueryOptions) on self.caches with too few arguments must throw TypeError +PASS CacheStorage interface: self.caches must inherit property "has(DOMString)" with the proper type +PASS CacheStorage interface: calling has(DOMString) on self.caches with too few arguments must throw TypeError +PASS CacheStorage interface: self.caches must inherit property "open(DOMString)" with the proper type +PASS CacheStorage interface: calling open(DOMString) on self.caches with too few arguments must throw TypeError +PASS CacheStorage interface: self.caches must inherit property "delete(DOMString)" with the proper type +PASS CacheStorage interface: calling delete(DOMString) on self.caches with too few arguments must throw TypeError +PASS CacheStorage interface: self.caches must inherit property "keys()" with the proper type +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt new file mode 100644 index 0000000..c9f3ca90 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt
@@ -0,0 +1,101 @@ +This is a testharness.js-based test. +PASS test setup (worker registration) +PASS WorkerGlobalScope interface: existence and properties of interface object +PASS ServiceWorkerGlobalScope interface: existence and properties of interface object +PASS Client interface: existence and properties of interface object +PASS WindowClient interface: existence and properties of interface object +PASS Clients interface: existence and properties of interface object +PASS ServiceWorker interface: existence and properties of interface object +PASS ServiceWorker interface object length +PASS ServiceWorker interface object name +PASS ServiceWorker interface: existence and properties of interface prototype object +PASS ServiceWorker interface: existence and properties of interface prototype object's "constructor" property +PASS ServiceWorker interface: attribute scriptURL +PASS ServiceWorker interface: attribute state +PASS ServiceWorker interface: operation postMessage(any, [object Object]) +PASS ServiceWorker interface: attribute onstatechange +PASS ServiceWorker must be primary interface of window.registrationInstance.installing +PASS Stringification of window.registrationInstance.installing +PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "scriptURL" with the proper type +PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "state" with the proper type +PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "postMessage(any, [object Object])" with the proper type +PASS ServiceWorker interface: calling postMessage(any, [object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError +PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "onstatechange" with the proper type +PASS EventTarget interface: window.registrationInstance.installing must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError +PASS EventTarget interface: window.registrationInstance.installing must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError +PASS EventTarget interface: window.registrationInstance.installing must inherit property "dispatchEvent(Event)" with the proper type +PASS EventTarget interface: calling dispatchEvent(Event) on window.registrationInstance.installing with too few arguments must throw TypeError +PASS ServiceWorkerRegistration interface: existence and properties of interface object +PASS ServiceWorkerRegistration interface object length +PASS ServiceWorkerRegistration interface object name +PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object +PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object's "constructor" property +PASS ServiceWorkerRegistration interface: attribute installing +PASS ServiceWorkerRegistration interface: attribute waiting +PASS ServiceWorkerRegistration interface: attribute active +PASS ServiceWorkerRegistration interface: attribute navigationPreload +PASS ServiceWorkerRegistration interface: attribute scope +FAIL ServiceWorkerRegistration interface: attribute updateViaCache assert_true: The prototype object must have a property "updateViaCache" expected true got false +PASS ServiceWorkerRegistration interface: operation update() +PASS ServiceWorkerRegistration interface: operation unregister() +PASS ServiceWorkerRegistration interface: attribute onupdatefound +PASS ServiceWorkerRegistration must be primary interface of window.registrationInstance +PASS Stringification of window.registrationInstance +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "installing" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "waiting" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "active" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "navigationPreload" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "scope" with the proper type +FAIL ServiceWorkerRegistration interface: window.registrationInstance must inherit property "updateViaCache" with the proper type assert_inherits: property "updateViaCache" not found in prototype chain +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "update()" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "unregister()" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "onupdatefound" with the proper type +PASS EventTarget interface: window.registrationInstance must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance with too few arguments must throw TypeError +PASS EventTarget interface: window.registrationInstance must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance with too few arguments must throw TypeError +PASS EventTarget interface: window.registrationInstance must inherit property "dispatchEvent(Event)" with the proper type +PASS EventTarget interface: calling dispatchEvent(Event) on window.registrationInstance with too few arguments must throw TypeError +PASS EventTarget interface: existence and properties of interface object +PASS EventTarget interface object length +PASS EventTarget interface object name +PASS EventTarget interface: existence and properties of interface prototype object +PASS EventTarget interface: existence and properties of interface prototype object's "constructor" property +PASS EventTarget interface: operation addEventListener(DOMString, EventListener, [object Object],[object Object]) +PASS EventTarget interface: operation removeEventListener(DOMString, EventListener, [object Object],[object Object]) +PASS EventTarget interface: operation dispatchEvent(Event) +PASS NavigationPreloadManager interface: existence and properties of interface object +PASS NavigationPreloadManager interface object length +PASS NavigationPreloadManager interface object name +PASS NavigationPreloadManager interface: existence and properties of interface prototype object +PASS NavigationPreloadManager interface: existence and properties of interface prototype object's "constructor" property +PASS NavigationPreloadManager interface: operation enable() +PASS NavigationPreloadManager interface: operation disable() +PASS NavigationPreloadManager interface: operation setHeaderValue(ByteString) +PASS NavigationPreloadManager interface: operation getState() +PASS Cache interface: existence and properties of interface object +PASS Cache interface object length +PASS Cache interface object name +PASS Cache interface: existence and properties of interface prototype object +PASS Cache interface: existence and properties of interface prototype object's "constructor" property +PASS Cache interface: operation match(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation matchAll(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation add(RequestInfo) +PASS Cache interface: operation addAll([object Object]) +PASS Cache interface: operation put(RequestInfo, Response) +PASS Cache interface: operation delete(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation keys(RequestInfo, CacheQueryOptions) +PASS CacheStorage interface: existence and properties of interface object +PASS CacheStorage interface object length +PASS CacheStorage interface object name +PASS CacheStorage interface: existence and properties of interface prototype object +PASS CacheStorage interface: existence and properties of interface prototype object's "constructor" property +PASS CacheStorage interface: operation match(RequestInfo, CacheQueryOptions) +PASS CacheStorage interface: operation has(DOMString) +PASS CacheStorage interface: operation open(DOMString) +PASS CacheStorage interface: operation delete(DOMString) +PASS CacheStorage interface: operation keys() +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/placeholder-position-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/placeholder-position-expected.png index 0f91d1e0..aee0d16 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/placeholder-position-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/placeholder-position-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/images/color-profile-munsell-adobe-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/images/color-profile-munsell-adobe-to-srgb-expected.png index 2152282b..1808da3e 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/images/color-profile-munsell-adobe-to-srgb-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/images/color-profile-munsell-adobe-to-srgb-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png index fe630a2..6912cba 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb-expected.png index df47f5d..8347146 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fast/forms/placeholder-position-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fast/forms/placeholder-position-expected.png index 284ceea..68da93f71 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fast/forms/placeholder-position-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fast/forms/placeholder-position-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/canvas/canvas-composite-video-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/canvas/canvas-composite-video-expected.png index 9877fa03..c0aea11f 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/canvas/canvas-composite-video-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/canvas/canvas-composite-video-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/canvas/canvas-composite-video-shadow-expected.png index f6b9b659..6f897226 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/canvas/canvas-composite-video-shadow-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/canvas/canvas-composite-video-shadow-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/placeholder-position-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/placeholder-position-expected.png index 655db98..ba959f0 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/placeholder-position-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/placeholder-position-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/layers/scroll-with-transform-layer-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/layers/scroll-with-transform-layer-expected.png index b94996b..066f8be 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/layers/scroll-with-transform-layer-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/layers/scroll-with-transform-layer-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/foreign-object-skew-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/foreign-object-skew-expected.png index c0aa7b730..35db139c 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/foreign-object-skew-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/foreign-object-skew-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png index 9877fa03..c0aea11f 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-shadow-expected.png index f6b9b659..6f897226 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-shadow-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-shadow-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-retina/fast/forms/placeholder-position-expected.png b/third_party/WebKit/LayoutTests/platform/mac-retina/fast/forms/placeholder-position-expected.png index 284ceea..68da93f71 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-retina/fast/forms/placeholder-position-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-retina/fast/forms/placeholder-position-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/compositing/reflections/nested-reflection-transformed-expected.png b/third_party/WebKit/LayoutTests/platform/mac/compositing/reflections/nested-reflection-transformed-expected.png index cd6d214b..5050e02e 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/compositing/reflections/nested-reflection-transformed-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/compositing/reflections/nested-reflection-transformed-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/compositing/reflections/nested-reflection-transformed2-expected.png b/third_party/WebKit/LayoutTests/platform/mac/compositing/reflections/nested-reflection-transformed2-expected.png index 9517ed2a..a344d8c 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/compositing/reflections/nested-reflection-transformed2-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/compositing/reflections/nested-reflection-transformed2-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/compositing/reflections/reflection-in-composited-expected.png b/third_party/WebKit/LayoutTests/platform/mac/compositing/reflections/reflection-in-composited-expected.png index 349bd305..09073d2 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/compositing/reflections/reflection-in-composited-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/compositing/reflections/reflection-in-composited-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png index fbc89829..8881d88 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/borders/border-image-rotate-transform-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/borders/border-image-rotate-transform-expected.png index c79a602..baf5817 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/borders/border-image-rotate-transform-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/borders/border-image-rotate-transform-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/borders/border-inner-bleed-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/borders/border-inner-bleed-expected.png index 57c869b09..88f67dc 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/borders/border-inner-bleed-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/borders/border-inner-bleed-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-composite-video-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-composite-video-expected.png index 89b633e1..4cbdf75 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-composite-video-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-composite-video-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-composite-video-shadow-expected.png index bfd4965..90973311 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-composite-video-shadow-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-composite-video-shadow-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/image-object-in-canvas-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/image-object-in-canvas-expected.png index ebff45f8..6ef7d5c 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/image-object-in-canvas-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/image-object-in-canvas-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/css/transformed-mask-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/css/transformed-mask-expected.png index f4f175d..423ae30 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/css/transformed-mask-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/css/transformed-mask-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/layers/scroll-with-transform-layer-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/layers/scroll-with-transform-layer-expected.png index ddc33d6..e59d3a3 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/layers/scroll-with-transform-layer-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/layers/scroll-with-transform-layer-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/reflections/opacity-reflection-transform-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/reflections/opacity-reflection-transform-expected.png index 161c887..977b328 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/reflections/opacity-reflection-transform-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/reflections/opacity-reflection-transform-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/images/color-profile-image-canvas-svg-expected.png b/third_party/WebKit/LayoutTests/platform/mac/images/color-profile-image-canvas-svg-expected.png index fa863df7..b2096fb 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/images/color-profile-image-canvas-svg-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/images/color-profile-image-canvas-svg-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/images/color-profile-munsell-adobe-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/mac/images/color-profile-munsell-adobe-to-srgb-expected.png index 522c84c..d7353c7 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/images/color-profile-munsell-adobe-to-srgb-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/images/color-profile-munsell-adobe-to-srgb-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/media/color-profile-munsell-bt601-smpte-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/mac/media/color-profile-munsell-bt601-smpte-to-srgb-expected.png index e5b63e7..4ea3221 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/media/color-profile-munsell-bt601-smpte-to-srgb-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/media/color-profile-munsell-bt601-smpte-to-srgb-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/media/color-profile-munsell-bt709-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/mac/media/color-profile-munsell-bt709-to-srgb-expected.png index ef22cc73..4e71cb3 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/media/color-profile-munsell-bt709-to-srgb-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/media/color-profile-munsell-bt709-to-srgb-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/animated-path-inside-transformed-html-expected.png b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/animated-path-inside-transformed-html-expected.png index c2ded6e8..759daf8 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/animated-path-inside-transformed-html-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/animated-path-inside-transformed-html-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/filters/feTile-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/filters/feTile-expected.png index 5364dc6..cb260e92 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/filters/feTile-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/filters/feTile-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/smallFonts-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/smallFonts-expected.png index 0f003bd..2e864da 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/smallFonts-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/smallFonts-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textFeatures-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textFeatures-expected.png index b4b029d..83765b08 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textFeatures-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textFeatures-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/focus-ring-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/focus-ring-expected.png index b90cbed..0301123 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/focus-ring-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/focus-ring-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/foreign-object-skew-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/foreign-object-skew-expected.png index a71aefe..c5a07ab 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/foreign-object-skew-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/foreign-object-skew-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/pattern-rotate-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/pattern-rotate-expected.png index 17ecef5..9be0afc 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/pattern-rotate-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/pattern-rotate-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/transformed-outlines-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/transformed-outlines-expected.png index c7379b7..ec336cb 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/transformed-outlines-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/transformed-outlines-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/hixie/perf/004-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/hixie/perf/004-expected.png index 46b1b9d2..f8392e94 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/hixie/perf/004-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/hixie/perf/004-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/transforms/text-with-pattern-inside-transformed-html-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/transforms/text-with-pattern-inside-transformed-html-expected.png index 731024c..7c7281fc 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/transforms/text-with-pattern-inside-transformed-html-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/transforms/text-with-pattern-inside-transformed-html-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/transforms/text-with-pattern-with-svg-transform-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/transforms/text-with-pattern-with-svg-transform-expected.png index 580ebf3..0fafdf7 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/transforms/text-with-pattern-with-svg-transform-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/transforms/text-with-pattern-with-svg-transform-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/transforms/transformed-document-element-expected.png b/third_party/WebKit/LayoutTests/platform/mac/transforms/transformed-document-element-expected.png index b3a8853..6ad401a 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/transforms/transformed-document-element-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/transforms/transformed-document-element-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-expected.png index 369581c..0d10a60 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png index 89b633e1..4cbdf75 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-shadow-expected.png index bfd4965..90973311 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-shadow-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-shadow-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png new file mode 100644 index 0000000..fe14df1 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-incremental-repaint-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-incremental-repaint-expected.png index 8a308f1..d1a5b0f1 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-incremental-repaint-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-incremental-repaint-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/fillrect_gradient-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/fillrect_gradient-expected.png index 03a026a..3ce8b7d 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/fillrect_gradient-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/fillrect_gradient-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/image-object-in-canvas-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/image-object-in-canvas-expected.png index ae68f842..ebff45f8 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/image-object-in-canvas-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/image-object-in-canvas-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-image-canvas-svg-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-image-canvas-svg-expected.png index 7c31ef7d..a971274 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-image-canvas-svg-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-image-canvas-svg-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png index f5d1dc4..a695fb4 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/images/color-profile-image-canvas-svg-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/images/color-profile-image-canvas-svg-expected.png index 95ed5a56..6f0f3489 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/images/color-profile-image-canvas-svg-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/images/color-profile-image-canvas-svg-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb-expected.png index 20f0f484..5e51737 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt index 792f6117..b18b8d79 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt
@@ -1,33 +1,4 @@ This is a testharness.js-based test. -FAIL ServiceWorkerGlobalScope: Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Request objects have a signal property assert_true: Signal member is present & truthy expected true got false -FAIL ServiceWorkerGlobalScope: Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" -FAIL ServiceWorkerGlobalScope: Readable stream synchronously cancels with AbortError if aborted before reading AbortController is not defined +FAIL General fetch abort tests in a service worker Failed to register a ServiceWorker: The script does not have a MIME type. Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/abort/general-sharedworker-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/abort/general-sharedworker-expected.txt new file mode 100644 index 0000000..d9b7c58 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/abort/general-sharedworker-expected.txt
@@ -0,0 +1,52 @@ +This is a testharness.js-based test. +FAIL Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - RequestInit's window is not null +FAIL TypeError from request constructor takes priority - Input URL is not valid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - Input URL has credentials promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is navigate promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's referrer is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's method is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's method is forbidden promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and method is not simple promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and integrity is not empty promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - RequestInit's cache mode is only-if-cached and mode is not same-origin +PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode cors +PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode no-cors +FAIL TypeError from request constructor takes priority - Bad referrerPolicy init parameter value promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - Bad mode init parameter value +PASS TypeError from request constructor takes priority - Bad credentials init parameter value +PASS TypeError from request constructor takes priority - Bad cache init parameter value +PASS TypeError from request constructor takes priority - Bad redirect init parameter value +FAIL Request objects have a signal property assert_true: Signal member is present & truthy expected true got false +FAIL Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Readable stream synchronously cancels with AbortError if aborted before reading promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal state is cloned AbortController is not defined +FAIL Clone aborts with original controller AbortController is not defined +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/abort/general.any-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/abort/general.any-expected.txt new file mode 100644 index 0000000..d9b7c58 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/abort/general.any-expected.txt
@@ -0,0 +1,52 @@ +This is a testharness.js-based test. +FAIL Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - RequestInit's window is not null +FAIL TypeError from request constructor takes priority - Input URL is not valid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - Input URL has credentials promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is navigate promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's referrer is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's method is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's method is forbidden promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and method is not simple promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and integrity is not empty promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - RequestInit's cache mode is only-if-cached and mode is not same-origin +PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode cors +PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode no-cors +FAIL TypeError from request constructor takes priority - Bad referrerPolicy init parameter value promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - Bad mode init parameter value +PASS TypeError from request constructor takes priority - Bad credentials init parameter value +PASS TypeError from request constructor takes priority - Bad cache init parameter value +PASS TypeError from request constructor takes priority - Bad redirect init parameter value +FAIL Request objects have a signal property assert_true: Signal member is present & truthy expected true got false +FAIL Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Readable stream synchronously cancels with AbortError if aborted before reading promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal state is cloned AbortController is not defined +FAIL Clone aborts with original controller AbortController is not defined +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/abort/general.any.worker-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/abort/general.any.worker-expected.txt new file mode 100644 index 0000000..d9b7c58 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/abort/general.any.worker-expected.txt
@@ -0,0 +1,52 @@ +This is a testharness.js-based test. +FAIL Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - RequestInit's window is not null +FAIL TypeError from request constructor takes priority - Input URL is not valid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - Input URL has credentials promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is navigate promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's referrer is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's method is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's method is forbidden promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and method is not simple promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and integrity is not empty promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - RequestInit's cache mode is only-if-cached and mode is not same-origin +PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode cors +PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode no-cors +FAIL TypeError from request constructor takes priority - Bad referrerPolicy init parameter value promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - Bad mode init parameter value +PASS TypeError from request constructor takes priority - Bad credentials init parameter value +PASS TypeError from request constructor takes priority - Bad cache init parameter value +PASS TypeError from request constructor takes priority - Bad redirect init parameter value +FAIL Request objects have a signal property assert_true: Signal member is present & truthy expected true got false +FAIL Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Readable stream synchronously cancels with AbortError if aborted before reading promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal state is cloned AbortController is not defined +FAIL Clone aborts with original controller AbortController is not defined +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/request/request-error-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/request/request-error-expected.txt new file mode 100644 index 0000000..697b78fd0 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/request/request-error-expected.txt
@@ -0,0 +1,25 @@ +This is a testharness.js-based test. +FAIL RequestInit's window is not null assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +PASS Input URL is not valid +PASS Input URL has credentials +PASS RequestInit's mode is navigate +PASS RequestInit's referrer is invalid +PASS RequestInit's method is invalid +PASS RequestInit's method is forbidden +PASS RequestInit's mode is no-cors and method is not simple +PASS RequestInit's mode is no-cors and integrity is not empty +FAIL RequestInit's cache mode is only-if-cached and mode is not same-origin assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +FAIL Request with cache mode: only-if-cached and fetch mode cors assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +FAIL Request with cache mode: only-if-cached and fetch mode no-cors assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +PASS Bad referrerPolicy init parameter value +FAIL Bad mode init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +FAIL Bad credentials init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +FAIL Bad cache init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +FAIL Bad redirect init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +PASS Request should get its content-type from the init request +PASS Request should not get its content-type from the init request if init headers are provided +PASS Request should get its content-type from the body if none is provided +PASS Request should get its content-type from init headers if one is provided +PASS Request with cache mode: only-if-cached and fetch mode: same-origin +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/request/request-idl-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/request/request-idl-expected.txt new file mode 100644 index 0000000..6835e7d --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/request/request-idl-expected.txt
@@ -0,0 +1,50 @@ +This is a testharness.js-based test. +PASS Request interface: existence and properties of interface object +PASS Request interface object length +PASS Request interface object name +PASS Request interface: existence and properties of interface prototype object +PASS Request interface: existence and properties of interface prototype object's "constructor" property +PASS Request interface: attribute method +PASS Request interface: attribute url +PASS Request interface: attribute headers +FAIL Request interface: attribute type assert_true: The prototype object must have a property "type" expected true got false +FAIL Request interface: attribute destination assert_true: The prototype object must have a property "destination" expected true got false +PASS Request interface: attribute referrer +PASS Request interface: attribute referrerPolicy +PASS Request interface: attribute mode +PASS Request interface: attribute credentials +PASS Request interface: attribute cache +PASS Request interface: attribute redirect +PASS Request interface: attribute integrity +PASS Request interface: operation clone() +FAIL Request interface: attribute body assert_true: The prototype object must have a property "body" expected true got false +PASS Request interface: attribute bodyUsed +PASS Request interface: operation arrayBuffer() +PASS Request interface: operation blob() +PASS Request interface: operation formData() +PASS Request interface: operation json() +PASS Request interface: operation text() +PASS Request must be primary interface of new Request("") +PASS Stringification of new Request("") +PASS Request interface: new Request("") must inherit property "method" with the proper type +PASS Request interface: new Request("") must inherit property "url" with the proper type +PASS Request interface: new Request("") must inherit property "headers" with the proper type +FAIL Request interface: new Request("") must inherit property "type" with the proper type assert_inherits: property "type" not found in prototype chain +FAIL Request interface: new Request("") must inherit property "destination" with the proper type assert_inherits: property "destination" not found in prototype chain +PASS Request interface: new Request("") must inherit property "referrer" with the proper type +PASS Request interface: new Request("") must inherit property "referrerPolicy" with the proper type +PASS Request interface: new Request("") must inherit property "mode" with the proper type +PASS Request interface: new Request("") must inherit property "credentials" with the proper type +PASS Request interface: new Request("") must inherit property "cache" with the proper type +PASS Request interface: new Request("") must inherit property "redirect" with the proper type +PASS Request interface: new Request("") must inherit property "integrity" with the proper type +PASS Request interface: new Request("") must inherit property "clone()" with the proper type +FAIL Request interface: new Request("") must inherit property "body" with the proper type assert_inherits: property "body" not found in prototype chain +PASS Request interface: new Request("") must inherit property "bodyUsed" with the proper type +PASS Request interface: new Request("") must inherit property "arrayBuffer()" with the proper type +PASS Request interface: new Request("") must inherit property "blob()" with the proper type +PASS Request interface: new Request("") must inherit property "formData()" with the proper type +PASS Request interface: new Request("") must inherit property "json()" with the proper type +PASS Request interface: new Request("") must inherit property "text()" with the proper type +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/response/response-idl-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/response/response-idl-expected.txt new file mode 100644 index 0000000..db7454c6 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/response/response-idl-expected.txt
@@ -0,0 +1,45 @@ +This is a testharness.js-based test. +PASS Response interface: existence and properties of interface object +PASS Response interface object length +PASS Response interface object name +PASS Response interface: existence and properties of interface prototype object +PASS Response interface: existence and properties of interface prototype object's "constructor" property +PASS Response interface: operation error() +PASS Response interface: operation redirect(USVString, unsigned short) +PASS Response interface: attribute type +PASS Response interface: attribute url +PASS Response interface: attribute status +PASS Response interface: attribute ok +PASS Response interface: attribute statusText +PASS Response interface: attribute headers +FAIL Response interface: attribute trailer assert_true: The prototype object must have a property "trailer" expected true got false +PASS Response interface: operation clone() +PASS Response interface: attribute body +PASS Response interface: attribute bodyUsed +PASS Response interface: operation arrayBuffer() +PASS Response interface: operation blob() +PASS Response interface: operation formData() +PASS Response interface: operation json() +PASS Response interface: operation text() +PASS Response must be primary interface of new Response() +PASS Stringification of new Response() +PASS Response interface: new Response() must inherit property "error()" with the proper type +PASS Response interface: new Response() must inherit property "redirect(USVString, unsigned short)" with the proper type +PASS Response interface: calling redirect(USVString, unsigned short) on new Response() with too few arguments must throw TypeError +PASS Response interface: new Response() must inherit property "type" with the proper type +PASS Response interface: new Response() must inherit property "url" with the proper type +PASS Response interface: new Response() must inherit property "status" with the proper type +PASS Response interface: new Response() must inherit property "ok" with the proper type +PASS Response interface: new Response() must inherit property "statusText" with the proper type +PASS Response interface: new Response() must inherit property "headers" with the proper type +FAIL Response interface: new Response() must inherit property "trailer" with the proper type assert_inherits: property "trailer" not found in prototype chain +PASS Response interface: new Response() must inherit property "clone()" with the proper type +PASS Response interface: new Response() must inherit property "body" with the proper type +PASS Response interface: new Response() must inherit property "bodyUsed" with the proper type +PASS Response interface: new Response() must inherit property "arrayBuffer()" with the proper type +PASS Response interface: new Response() must inherit property "blob()" with the proper type +PASS Response interface: new Response() must inherit property "formData()" with the proper type +PASS Response interface: new Response() must inherit property "json()" with the proper type +PASS Response interface: new Response() must inherit property "text()" with the proper type +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt new file mode 100644 index 0000000..b92d7aa --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
@@ -0,0 +1,187 @@ +This is a testharness.js-based test. +PASS Interfaces and attributes in ServiceWorkerGlobalScope +PASS test setup (cache creation) +PASS Event constructors +PASS ServiceWorkerGlobalScope interface: existence and properties of interface object +PASS ServiceWorkerGlobalScope interface object length +PASS ServiceWorkerGlobalScope interface object name +PASS ServiceWorkerGlobalScope interface: existence and properties of interface prototype object +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Object.setPrototypeOf should throw a TypeError +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via __proto__ should throw a TypeError +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Reflect.setPrototypeOf should return false +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Object.setPrototypeOf should not throw +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via __proto__ should not throw +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Reflect.setPrototypeOf should return true +PASS ServiceWorkerGlobalScope interface: existence and properties of interface prototype object's "constructor" property +PASS ServiceWorkerGlobalScope interface: attribute clients +PASS ServiceWorkerGlobalScope interface: attribute registration +PASS ServiceWorkerGlobalScope interface: operation skipWaiting() +PASS ServiceWorkerGlobalScope interface: attribute oninstall +PASS ServiceWorkerGlobalScope interface: attribute onactivate +PASS ServiceWorkerGlobalScope interface: attribute onfetch +PASS ServiceWorkerGlobalScope interface: attribute onforeignfetch +PASS ServiceWorkerGlobalScope interface: attribute onmessage +FAIL ServiceWorkerGlobalScope interface: attribute onmessageerror assert_own_property: The global object must have a property "onmessageerror" expected property "onmessageerror" missing +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Object.setPrototypeOf should throw a TypeError +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via __proto__ should throw a TypeError +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Reflect.setPrototypeOf should return false +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Object.setPrototypeOf should not throw +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via __proto__ should not throw +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Reflect.setPrototypeOf should return true +PASS ServiceWorkerGlobalScope must be primary interface of self +PASS Stringification of self +PASS ServiceWorkerGlobalScope interface: self must inherit property "clients" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "registration" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "skipWaiting()" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "oninstall" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "onactivate" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "onfetch" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "onforeignfetch" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "onmessage" with the proper type +FAIL ServiceWorkerGlobalScope interface: self must inherit property "onmessageerror" with the proper type assert_own_property: expected property "onmessageerror" missing +PASS Client interface: existence and properties of interface object +PASS Client interface object length +PASS Client interface object name +PASS Client interface: existence and properties of interface prototype object +PASS Client interface: existence and properties of interface prototype object's "constructor" property +PASS Client interface: attribute url +PASS Client interface: attribute id +PASS Client interface: attribute type +FAIL Client interface: attribute reserved assert_true: The prototype object must have a property "reserved" expected true got false +PASS Client interface: operation postMessage(any, [object Object]) +PASS WindowClient interface: existence and properties of interface object +PASS WindowClient interface object length +PASS WindowClient interface object name +PASS WindowClient interface: existence and properties of interface prototype object +PASS WindowClient interface: existence and properties of interface prototype object's "constructor" property +PASS WindowClient interface: attribute visibilityState +PASS WindowClient interface: attribute focused +FAIL WindowClient interface: attribute ancestorOrigins assert_true: The prototype object must have a property "ancestorOrigins" expected true got false +PASS WindowClient interface: operation focus() +PASS WindowClient interface: operation navigate(USVString) +PASS Clients interface: existence and properties of interface object +PASS Clients interface object length +PASS Clients interface object name +PASS Clients interface: existence and properties of interface prototype object +PASS Clients interface: existence and properties of interface prototype object's "constructor" property +PASS Clients interface: operation get(DOMString) +PASS Clients interface: operation matchAll(ClientQueryOptions) +PASS Clients interface: operation openWindow(USVString) +PASS Clients interface: operation claim() +PASS Clients must be primary interface of self.clients +PASS Stringification of self.clients +PASS Clients interface: self.clients must inherit property "get(DOMString)" with the proper type +PASS Clients interface: calling get(DOMString) on self.clients with too few arguments must throw TypeError +PASS Clients interface: self.clients must inherit property "matchAll(ClientQueryOptions)" with the proper type +PASS Clients interface: calling matchAll(ClientQueryOptions) on self.clients with too few arguments must throw TypeError +PASS Clients interface: self.clients must inherit property "openWindow(USVString)" with the proper type +PASS Clients interface: calling openWindow(USVString) on self.clients with too few arguments must throw TypeError +PASS Clients interface: self.clients must inherit property "claim()" with the proper type +FAIL ServiceWorker interface: existence and properties of interface object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface object length assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface object name assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: existence and properties of interface prototype object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: attribute scriptURL assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: attribute state assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: operation postMessage(any, [object Object]) assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: attribute onstatechange assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +PASS ServiceWorkerRegistration interface: existence and properties of interface object +PASS ServiceWorkerRegistration interface object length +PASS ServiceWorkerRegistration interface object name +PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object +PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object's "constructor" property +PASS ServiceWorkerRegistration interface: attribute installing +PASS ServiceWorkerRegistration interface: attribute waiting +PASS ServiceWorkerRegistration interface: attribute active +PASS ServiceWorkerRegistration interface: attribute navigationPreload +PASS ServiceWorkerRegistration interface: attribute scope +FAIL ServiceWorkerRegistration interface: attribute updateViaCache assert_true: The prototype object must have a property "updateViaCache" expected true got false +PASS ServiceWorkerRegistration interface: operation update() +PASS ServiceWorkerRegistration interface: operation unregister() +PASS ServiceWorkerRegistration interface: attribute onupdatefound +PASS ServiceWorkerRegistration must be primary interface of self.registration +PASS Stringification of self.registration +PASS ServiceWorkerRegistration interface: self.registration must inherit property "installing" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "waiting" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "active" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "navigationPreload" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "scope" with the proper type +FAIL ServiceWorkerRegistration interface: self.registration must inherit property "updateViaCache" with the proper type assert_inherits: property "updateViaCache" not found in prototype chain +PASS ServiceWorkerRegistration interface: self.registration must inherit property "update()" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "unregister()" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "onupdatefound" with the proper type +PASS EventTarget interface: self.registration must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on self.registration with too few arguments must throw TypeError +PASS EventTarget interface: self.registration must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on self.registration with too few arguments must throw TypeError +PASS EventTarget interface: self.registration must inherit property "dispatchEvent(Event)" with the proper type +PASS EventTarget interface: calling dispatchEvent(Event) on self.registration with too few arguments must throw TypeError +PASS EventTarget interface: existence and properties of interface object +PASS EventTarget interface object length +PASS EventTarget interface object name +PASS EventTarget interface: existence and properties of interface prototype object +PASS EventTarget interface: existence and properties of interface prototype object's "constructor" property +PASS EventTarget interface: operation addEventListener(DOMString, EventListener, [object Object],[object Object]) +PASS EventTarget interface: operation removeEventListener(DOMString, EventListener, [object Object],[object Object]) +PASS EventTarget interface: operation dispatchEvent(Event) +PASS NavigationPreloadManager interface: existence and properties of interface object +PASS NavigationPreloadManager interface object length +PASS NavigationPreloadManager interface object name +PASS NavigationPreloadManager interface: existence and properties of interface prototype object +PASS NavigationPreloadManager interface: existence and properties of interface prototype object's "constructor" property +PASS NavigationPreloadManager interface: operation enable() +PASS NavigationPreloadManager interface: operation disable() +PASS NavigationPreloadManager interface: operation setHeaderValue(ByteString) +PASS NavigationPreloadManager interface: operation getState() +PASS Cache interface: existence and properties of interface object +PASS Cache interface object length +PASS Cache interface object name +PASS Cache interface: existence and properties of interface prototype object +PASS Cache interface: existence and properties of interface prototype object's "constructor" property +PASS Cache interface: operation match(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation matchAll(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation add(RequestInfo) +PASS Cache interface: operation addAll([object Object]) +PASS Cache interface: operation put(RequestInfo, Response) +PASS Cache interface: operation delete(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation keys(RequestInfo, CacheQueryOptions) +PASS Cache must be primary interface of self.cacheInstance +PASS Stringification of self.cacheInstance +PASS Cache interface: self.cacheInstance must inherit property "match(RequestInfo, CacheQueryOptions)" with the proper type +PASS Cache interface: calling match(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "matchAll(RequestInfo, CacheQueryOptions)" with the proper type +PASS Cache interface: calling matchAll(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "add(RequestInfo)" with the proper type +PASS Cache interface: calling add(RequestInfo) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "addAll([object Object])" with the proper type +PASS Cache interface: calling addAll([object Object]) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "put(RequestInfo, Response)" with the proper type +PASS Cache interface: calling put(RequestInfo, Response) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "delete(RequestInfo, CacheQueryOptions)" with the proper type +PASS Cache interface: calling delete(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "keys(RequestInfo, CacheQueryOptions)" with the proper type +PASS Cache interface: calling keys(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError +PASS CacheStorage interface: existence and properties of interface object +PASS CacheStorage interface object length +PASS CacheStorage interface object name +PASS CacheStorage interface: existence and properties of interface prototype object +PASS CacheStorage interface: existence and properties of interface prototype object's "constructor" property +PASS CacheStorage interface: operation match(RequestInfo, CacheQueryOptions) +PASS CacheStorage interface: operation has(DOMString) +PASS CacheStorage interface: operation open(DOMString) +PASS CacheStorage interface: operation delete(DOMString) +PASS CacheStorage interface: operation keys() +PASS CacheStorage must be primary interface of self.caches +PASS Stringification of self.caches +PASS CacheStorage interface: self.caches must inherit property "match(RequestInfo, CacheQueryOptions)" with the proper type +PASS CacheStorage interface: calling match(RequestInfo, CacheQueryOptions) on self.caches with too few arguments must throw TypeError +PASS CacheStorage interface: self.caches must inherit property "has(DOMString)" with the proper type +PASS CacheStorage interface: calling has(DOMString) on self.caches with too few arguments must throw TypeError +PASS CacheStorage interface: self.caches must inherit property "open(DOMString)" with the proper type +PASS CacheStorage interface: calling open(DOMString) on self.caches with too few arguments must throw TypeError +PASS CacheStorage interface: self.caches must inherit property "delete(DOMString)" with the proper type +PASS CacheStorage interface: calling delete(DOMString) on self.caches with too few arguments must throw TypeError +PASS CacheStorage interface: self.caches must inherit property "keys()" with the proper type +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt new file mode 100644 index 0000000..c9f3ca90 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt
@@ -0,0 +1,101 @@ +This is a testharness.js-based test. +PASS test setup (worker registration) +PASS WorkerGlobalScope interface: existence and properties of interface object +PASS ServiceWorkerGlobalScope interface: existence and properties of interface object +PASS Client interface: existence and properties of interface object +PASS WindowClient interface: existence and properties of interface object +PASS Clients interface: existence and properties of interface object +PASS ServiceWorker interface: existence and properties of interface object +PASS ServiceWorker interface object length +PASS ServiceWorker interface object name +PASS ServiceWorker interface: existence and properties of interface prototype object +PASS ServiceWorker interface: existence and properties of interface prototype object's "constructor" property +PASS ServiceWorker interface: attribute scriptURL +PASS ServiceWorker interface: attribute state +PASS ServiceWorker interface: operation postMessage(any, [object Object]) +PASS ServiceWorker interface: attribute onstatechange +PASS ServiceWorker must be primary interface of window.registrationInstance.installing +PASS Stringification of window.registrationInstance.installing +PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "scriptURL" with the proper type +PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "state" with the proper type +PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "postMessage(any, [object Object])" with the proper type +PASS ServiceWorker interface: calling postMessage(any, [object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError +PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "onstatechange" with the proper type +PASS EventTarget interface: window.registrationInstance.installing must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError +PASS EventTarget interface: window.registrationInstance.installing must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError +PASS EventTarget interface: window.registrationInstance.installing must inherit property "dispatchEvent(Event)" with the proper type +PASS EventTarget interface: calling dispatchEvent(Event) on window.registrationInstance.installing with too few arguments must throw TypeError +PASS ServiceWorkerRegistration interface: existence and properties of interface object +PASS ServiceWorkerRegistration interface object length +PASS ServiceWorkerRegistration interface object name +PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object +PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object's "constructor" property +PASS ServiceWorkerRegistration interface: attribute installing +PASS ServiceWorkerRegistration interface: attribute waiting +PASS ServiceWorkerRegistration interface: attribute active +PASS ServiceWorkerRegistration interface: attribute navigationPreload +PASS ServiceWorkerRegistration interface: attribute scope +FAIL ServiceWorkerRegistration interface: attribute updateViaCache assert_true: The prototype object must have a property "updateViaCache" expected true got false +PASS ServiceWorkerRegistration interface: operation update() +PASS ServiceWorkerRegistration interface: operation unregister() +PASS ServiceWorkerRegistration interface: attribute onupdatefound +PASS ServiceWorkerRegistration must be primary interface of window.registrationInstance +PASS Stringification of window.registrationInstance +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "installing" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "waiting" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "active" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "navigationPreload" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "scope" with the proper type +FAIL ServiceWorkerRegistration interface: window.registrationInstance must inherit property "updateViaCache" with the proper type assert_inherits: property "updateViaCache" not found in prototype chain +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "update()" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "unregister()" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "onupdatefound" with the proper type +PASS EventTarget interface: window.registrationInstance must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance with too few arguments must throw TypeError +PASS EventTarget interface: window.registrationInstance must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance with too few arguments must throw TypeError +PASS EventTarget interface: window.registrationInstance must inherit property "dispatchEvent(Event)" with the proper type +PASS EventTarget interface: calling dispatchEvent(Event) on window.registrationInstance with too few arguments must throw TypeError +PASS EventTarget interface: existence and properties of interface object +PASS EventTarget interface object length +PASS EventTarget interface object name +PASS EventTarget interface: existence and properties of interface prototype object +PASS EventTarget interface: existence and properties of interface prototype object's "constructor" property +PASS EventTarget interface: operation addEventListener(DOMString, EventListener, [object Object],[object Object]) +PASS EventTarget interface: operation removeEventListener(DOMString, EventListener, [object Object],[object Object]) +PASS EventTarget interface: operation dispatchEvent(Event) +PASS NavigationPreloadManager interface: existence and properties of interface object +PASS NavigationPreloadManager interface object length +PASS NavigationPreloadManager interface object name +PASS NavigationPreloadManager interface: existence and properties of interface prototype object +PASS NavigationPreloadManager interface: existence and properties of interface prototype object's "constructor" property +PASS NavigationPreloadManager interface: operation enable() +PASS NavigationPreloadManager interface: operation disable() +PASS NavigationPreloadManager interface: operation setHeaderValue(ByteString) +PASS NavigationPreloadManager interface: operation getState() +PASS Cache interface: existence and properties of interface object +PASS Cache interface object length +PASS Cache interface object name +PASS Cache interface: existence and properties of interface prototype object +PASS Cache interface: existence and properties of interface prototype object's "constructor" property +PASS Cache interface: operation match(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation matchAll(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation add(RequestInfo) +PASS Cache interface: operation addAll([object Object]) +PASS Cache interface: operation put(RequestInfo, Response) +PASS Cache interface: operation delete(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation keys(RequestInfo, CacheQueryOptions) +PASS CacheStorage interface: existence and properties of interface object +PASS CacheStorage interface object length +PASS CacheStorage interface object name +PASS CacheStorage interface: existence and properties of interface prototype object +PASS CacheStorage interface: existence and properties of interface prototype object's "constructor" property +PASS CacheStorage interface: operation match(RequestInfo, CacheQueryOptions) +PASS CacheStorage interface: operation has(DOMString) +PASS CacheStorage interface: operation open(DOMString) +PASS CacheStorage interface: operation delete(DOMString) +PASS CacheStorage interface: operation keys() +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-localstorage/external/wpt/webstorage/idlharness-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-localstorage/external/wpt/webstorage/idlharness-expected.txt new file mode 100644 index 0000000..4b5ce02 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-localstorage/external/wpt/webstorage/idlharness-expected.txt
@@ -0,0 +1,38 @@ +This is a testharness.js-based test. +PASS Window interface: attribute sessionStorage +PASS Window interface: attribute localStorage +PASS Storage interface: existence and properties of interface object +PASS Storage interface object length +PASS Storage interface object name +PASS Storage interface: existence and properties of interface prototype object +PASS Storage interface: existence and properties of interface prototype object's "constructor" property +FAIL Storage interface: attribute length assert_true: property should be enumerable expected true got false +FAIL Storage interface: operation key(unsigned long) assert_true: property should be enumerable expected true got false +FAIL Storage interface: operation getItem(DOMString) assert_true: property should be enumerable expected true got false +FAIL Storage interface: operation setItem(DOMString, DOMString) assert_true: property should be enumerable expected true got false +FAIL Storage interface: operation removeItem(DOMString) assert_true: property should be enumerable expected true got false +FAIL Storage interface: operation clear() assert_true: property should be enumerable expected true got false +PASS Storage must be primary interface of window.localStorage +PASS Stringification of window.localStorage +PASS Storage interface: window.localStorage must inherit property "length" with the proper type +PASS Storage interface: window.localStorage must inherit property "key(unsigned long)" with the proper type +PASS Storage interface: calling key(unsigned long) on window.localStorage with too few arguments must throw TypeError +PASS Storage interface: window.localStorage must inherit property "getItem(DOMString)" with the proper type +PASS Storage interface: calling getItem(DOMString) on window.localStorage with too few arguments must throw TypeError +PASS Storage interface: window.localStorage must inherit property "setItem(DOMString, DOMString)" with the proper type +PASS Storage interface: calling setItem(DOMString, DOMString) on window.localStorage with too few arguments must throw TypeError +PASS Storage interface: window.localStorage must inherit property "removeItem(DOMString)" with the proper type +PASS Storage interface: calling removeItem(DOMString) on window.localStorage with too few arguments must throw TypeError +PASS Storage interface: window.localStorage must inherit property "clear()" with the proper type +PASS StorageEvent interface: existence and properties of interface object +PASS StorageEvent interface object length +PASS StorageEvent interface object name +PASS StorageEvent interface: existence and properties of interface prototype object +PASS StorageEvent interface: existence and properties of interface prototype object's "constructor" property +PASS StorageEvent interface: attribute key +PASS StorageEvent interface: attribute oldValue +PASS StorageEvent interface: attribute newValue +PASS StorageEvent interface: attribute url +PASS StorageEvent interface: attribute storageArea +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt new file mode 100644 index 0000000..b92d7aa --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
@@ -0,0 +1,187 @@ +This is a testharness.js-based test. +PASS Interfaces and attributes in ServiceWorkerGlobalScope +PASS test setup (cache creation) +PASS Event constructors +PASS ServiceWorkerGlobalScope interface: existence and properties of interface object +PASS ServiceWorkerGlobalScope interface object length +PASS ServiceWorkerGlobalScope interface object name +PASS ServiceWorkerGlobalScope interface: existence and properties of interface prototype object +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Object.setPrototypeOf should throw a TypeError +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via __proto__ should throw a TypeError +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Reflect.setPrototypeOf should return false +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Object.setPrototypeOf should not throw +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via __proto__ should not throw +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Reflect.setPrototypeOf should return true +PASS ServiceWorkerGlobalScope interface: existence and properties of interface prototype object's "constructor" property +PASS ServiceWorkerGlobalScope interface: attribute clients +PASS ServiceWorkerGlobalScope interface: attribute registration +PASS ServiceWorkerGlobalScope interface: operation skipWaiting() +PASS ServiceWorkerGlobalScope interface: attribute oninstall +PASS ServiceWorkerGlobalScope interface: attribute onactivate +PASS ServiceWorkerGlobalScope interface: attribute onfetch +PASS ServiceWorkerGlobalScope interface: attribute onforeignfetch +PASS ServiceWorkerGlobalScope interface: attribute onmessage +FAIL ServiceWorkerGlobalScope interface: attribute onmessageerror assert_own_property: The global object must have a property "onmessageerror" expected property "onmessageerror" missing +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Object.setPrototypeOf should throw a TypeError +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via __proto__ should throw a TypeError +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Reflect.setPrototypeOf should return false +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Object.setPrototypeOf should not throw +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via __proto__ should not throw +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Reflect.setPrototypeOf should return true +PASS ServiceWorkerGlobalScope must be primary interface of self +PASS Stringification of self +PASS ServiceWorkerGlobalScope interface: self must inherit property "clients" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "registration" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "skipWaiting()" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "oninstall" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "onactivate" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "onfetch" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "onforeignfetch" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "onmessage" with the proper type +FAIL ServiceWorkerGlobalScope interface: self must inherit property "onmessageerror" with the proper type assert_own_property: expected property "onmessageerror" missing +PASS Client interface: existence and properties of interface object +PASS Client interface object length +PASS Client interface object name +PASS Client interface: existence and properties of interface prototype object +PASS Client interface: existence and properties of interface prototype object's "constructor" property +PASS Client interface: attribute url +PASS Client interface: attribute id +PASS Client interface: attribute type +FAIL Client interface: attribute reserved assert_true: The prototype object must have a property "reserved" expected true got false +PASS Client interface: operation postMessage(any, [object Object]) +PASS WindowClient interface: existence and properties of interface object +PASS WindowClient interface object length +PASS WindowClient interface object name +PASS WindowClient interface: existence and properties of interface prototype object +PASS WindowClient interface: existence and properties of interface prototype object's "constructor" property +PASS WindowClient interface: attribute visibilityState +PASS WindowClient interface: attribute focused +FAIL WindowClient interface: attribute ancestorOrigins assert_true: The prototype object must have a property "ancestorOrigins" expected true got false +PASS WindowClient interface: operation focus() +PASS WindowClient interface: operation navigate(USVString) +PASS Clients interface: existence and properties of interface object +PASS Clients interface object length +PASS Clients interface object name +PASS Clients interface: existence and properties of interface prototype object +PASS Clients interface: existence and properties of interface prototype object's "constructor" property +PASS Clients interface: operation get(DOMString) +PASS Clients interface: operation matchAll(ClientQueryOptions) +PASS Clients interface: operation openWindow(USVString) +PASS Clients interface: operation claim() +PASS Clients must be primary interface of self.clients +PASS Stringification of self.clients +PASS Clients interface: self.clients must inherit property "get(DOMString)" with the proper type +PASS Clients interface: calling get(DOMString) on self.clients with too few arguments must throw TypeError +PASS Clients interface: self.clients must inherit property "matchAll(ClientQueryOptions)" with the proper type +PASS Clients interface: calling matchAll(ClientQueryOptions) on self.clients with too few arguments must throw TypeError +PASS Clients interface: self.clients must inherit property "openWindow(USVString)" with the proper type +PASS Clients interface: calling openWindow(USVString) on self.clients with too few arguments must throw TypeError +PASS Clients interface: self.clients must inherit property "claim()" with the proper type +FAIL ServiceWorker interface: existence and properties of interface object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface object length assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface object name assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: existence and properties of interface prototype object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: attribute scriptURL assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: attribute state assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: operation postMessage(any, [object Object]) assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: attribute onstatechange assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +PASS ServiceWorkerRegistration interface: existence and properties of interface object +PASS ServiceWorkerRegistration interface object length +PASS ServiceWorkerRegistration interface object name +PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object +PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object's "constructor" property +PASS ServiceWorkerRegistration interface: attribute installing +PASS ServiceWorkerRegistration interface: attribute waiting +PASS ServiceWorkerRegistration interface: attribute active +PASS ServiceWorkerRegistration interface: attribute navigationPreload +PASS ServiceWorkerRegistration interface: attribute scope +FAIL ServiceWorkerRegistration interface: attribute updateViaCache assert_true: The prototype object must have a property "updateViaCache" expected true got false +PASS ServiceWorkerRegistration interface: operation update() +PASS ServiceWorkerRegistration interface: operation unregister() +PASS ServiceWorkerRegistration interface: attribute onupdatefound +PASS ServiceWorkerRegistration must be primary interface of self.registration +PASS Stringification of self.registration +PASS ServiceWorkerRegistration interface: self.registration must inherit property "installing" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "waiting" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "active" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "navigationPreload" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "scope" with the proper type +FAIL ServiceWorkerRegistration interface: self.registration must inherit property "updateViaCache" with the proper type assert_inherits: property "updateViaCache" not found in prototype chain +PASS ServiceWorkerRegistration interface: self.registration must inherit property "update()" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "unregister()" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "onupdatefound" with the proper type +PASS EventTarget interface: self.registration must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on self.registration with too few arguments must throw TypeError +PASS EventTarget interface: self.registration must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on self.registration with too few arguments must throw TypeError +PASS EventTarget interface: self.registration must inherit property "dispatchEvent(Event)" with the proper type +PASS EventTarget interface: calling dispatchEvent(Event) on self.registration with too few arguments must throw TypeError +PASS EventTarget interface: existence and properties of interface object +PASS EventTarget interface object length +PASS EventTarget interface object name +PASS EventTarget interface: existence and properties of interface prototype object +PASS EventTarget interface: existence and properties of interface prototype object's "constructor" property +PASS EventTarget interface: operation addEventListener(DOMString, EventListener, [object Object],[object Object]) +PASS EventTarget interface: operation removeEventListener(DOMString, EventListener, [object Object],[object Object]) +PASS EventTarget interface: operation dispatchEvent(Event) +PASS NavigationPreloadManager interface: existence and properties of interface object +PASS NavigationPreloadManager interface object length +PASS NavigationPreloadManager interface object name +PASS NavigationPreloadManager interface: existence and properties of interface prototype object +PASS NavigationPreloadManager interface: existence and properties of interface prototype object's "constructor" property +PASS NavigationPreloadManager interface: operation enable() +PASS NavigationPreloadManager interface: operation disable() +PASS NavigationPreloadManager interface: operation setHeaderValue(ByteString) +PASS NavigationPreloadManager interface: operation getState() +PASS Cache interface: existence and properties of interface object +PASS Cache interface object length +PASS Cache interface object name +PASS Cache interface: existence and properties of interface prototype object +PASS Cache interface: existence and properties of interface prototype object's "constructor" property +PASS Cache interface: operation match(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation matchAll(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation add(RequestInfo) +PASS Cache interface: operation addAll([object Object]) +PASS Cache interface: operation put(RequestInfo, Response) +PASS Cache interface: operation delete(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation keys(RequestInfo, CacheQueryOptions) +PASS Cache must be primary interface of self.cacheInstance +PASS Stringification of self.cacheInstance +PASS Cache interface: self.cacheInstance must inherit property "match(RequestInfo, CacheQueryOptions)" with the proper type +PASS Cache interface: calling match(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "matchAll(RequestInfo, CacheQueryOptions)" with the proper type +PASS Cache interface: calling matchAll(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "add(RequestInfo)" with the proper type +PASS Cache interface: calling add(RequestInfo) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "addAll([object Object])" with the proper type +PASS Cache interface: calling addAll([object Object]) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "put(RequestInfo, Response)" with the proper type +PASS Cache interface: calling put(RequestInfo, Response) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "delete(RequestInfo, CacheQueryOptions)" with the proper type +PASS Cache interface: calling delete(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "keys(RequestInfo, CacheQueryOptions)" with the proper type +PASS Cache interface: calling keys(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError +PASS CacheStorage interface: existence and properties of interface object +PASS CacheStorage interface object length +PASS CacheStorage interface object name +PASS CacheStorage interface: existence and properties of interface prototype object +PASS CacheStorage interface: existence and properties of interface prototype object's "constructor" property +PASS CacheStorage interface: operation match(RequestInfo, CacheQueryOptions) +PASS CacheStorage interface: operation has(DOMString) +PASS CacheStorage interface: operation open(DOMString) +PASS CacheStorage interface: operation delete(DOMString) +PASS CacheStorage interface: operation keys() +PASS CacheStorage must be primary interface of self.caches +PASS Stringification of self.caches +PASS CacheStorage interface: self.caches must inherit property "match(RequestInfo, CacheQueryOptions)" with the proper type +PASS CacheStorage interface: calling match(RequestInfo, CacheQueryOptions) on self.caches with too few arguments must throw TypeError +PASS CacheStorage interface: self.caches must inherit property "has(DOMString)" with the proper type +PASS CacheStorage interface: calling has(DOMString) on self.caches with too few arguments must throw TypeError +PASS CacheStorage interface: self.caches must inherit property "open(DOMString)" with the proper type +PASS CacheStorage interface: calling open(DOMString) on self.caches with too few arguments must throw TypeError +PASS CacheStorage interface: self.caches must inherit property "delete(DOMString)" with the proper type +PASS CacheStorage interface: calling delete(DOMString) on self.caches with too few arguments must throw TypeError +PASS CacheStorage interface: self.caches must inherit property "keys()" with the proper type +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt new file mode 100644 index 0000000..c9f3ca90 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt
@@ -0,0 +1,101 @@ +This is a testharness.js-based test. +PASS test setup (worker registration) +PASS WorkerGlobalScope interface: existence and properties of interface object +PASS ServiceWorkerGlobalScope interface: existence and properties of interface object +PASS Client interface: existence and properties of interface object +PASS WindowClient interface: existence and properties of interface object +PASS Clients interface: existence and properties of interface object +PASS ServiceWorker interface: existence and properties of interface object +PASS ServiceWorker interface object length +PASS ServiceWorker interface object name +PASS ServiceWorker interface: existence and properties of interface prototype object +PASS ServiceWorker interface: existence and properties of interface prototype object's "constructor" property +PASS ServiceWorker interface: attribute scriptURL +PASS ServiceWorker interface: attribute state +PASS ServiceWorker interface: operation postMessage(any, [object Object]) +PASS ServiceWorker interface: attribute onstatechange +PASS ServiceWorker must be primary interface of window.registrationInstance.installing +PASS Stringification of window.registrationInstance.installing +PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "scriptURL" with the proper type +PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "state" with the proper type +PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "postMessage(any, [object Object])" with the proper type +PASS ServiceWorker interface: calling postMessage(any, [object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError +PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "onstatechange" with the proper type +PASS EventTarget interface: window.registrationInstance.installing must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError +PASS EventTarget interface: window.registrationInstance.installing must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError +PASS EventTarget interface: window.registrationInstance.installing must inherit property "dispatchEvent(Event)" with the proper type +PASS EventTarget interface: calling dispatchEvent(Event) on window.registrationInstance.installing with too few arguments must throw TypeError +PASS ServiceWorkerRegistration interface: existence and properties of interface object +PASS ServiceWorkerRegistration interface object length +PASS ServiceWorkerRegistration interface object name +PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object +PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object's "constructor" property +PASS ServiceWorkerRegistration interface: attribute installing +PASS ServiceWorkerRegistration interface: attribute waiting +PASS ServiceWorkerRegistration interface: attribute active +PASS ServiceWorkerRegistration interface: attribute navigationPreload +PASS ServiceWorkerRegistration interface: attribute scope +FAIL ServiceWorkerRegistration interface: attribute updateViaCache assert_true: The prototype object must have a property "updateViaCache" expected true got false +PASS ServiceWorkerRegistration interface: operation update() +PASS ServiceWorkerRegistration interface: operation unregister() +PASS ServiceWorkerRegistration interface: attribute onupdatefound +PASS ServiceWorkerRegistration must be primary interface of window.registrationInstance +PASS Stringification of window.registrationInstance +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "installing" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "waiting" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "active" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "navigationPreload" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "scope" with the proper type +FAIL ServiceWorkerRegistration interface: window.registrationInstance must inherit property "updateViaCache" with the proper type assert_inherits: property "updateViaCache" not found in prototype chain +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "update()" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "unregister()" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "onupdatefound" with the proper type +PASS EventTarget interface: window.registrationInstance must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance with too few arguments must throw TypeError +PASS EventTarget interface: window.registrationInstance must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance with too few arguments must throw TypeError +PASS EventTarget interface: window.registrationInstance must inherit property "dispatchEvent(Event)" with the proper type +PASS EventTarget interface: calling dispatchEvent(Event) on window.registrationInstance with too few arguments must throw TypeError +PASS EventTarget interface: existence and properties of interface object +PASS EventTarget interface object length +PASS EventTarget interface object name +PASS EventTarget interface: existence and properties of interface prototype object +PASS EventTarget interface: existence and properties of interface prototype object's "constructor" property +PASS EventTarget interface: operation addEventListener(DOMString, EventListener, [object Object],[object Object]) +PASS EventTarget interface: operation removeEventListener(DOMString, EventListener, [object Object],[object Object]) +PASS EventTarget interface: operation dispatchEvent(Event) +PASS NavigationPreloadManager interface: existence and properties of interface object +PASS NavigationPreloadManager interface object length +PASS NavigationPreloadManager interface object name +PASS NavigationPreloadManager interface: existence and properties of interface prototype object +PASS NavigationPreloadManager interface: existence and properties of interface prototype object's "constructor" property +PASS NavigationPreloadManager interface: operation enable() +PASS NavigationPreloadManager interface: operation disable() +PASS NavigationPreloadManager interface: operation setHeaderValue(ByteString) +PASS NavigationPreloadManager interface: operation getState() +PASS Cache interface: existence and properties of interface object +PASS Cache interface object length +PASS Cache interface object name +PASS Cache interface: existence and properties of interface prototype object +PASS Cache interface: existence and properties of interface prototype object's "constructor" property +PASS Cache interface: operation match(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation matchAll(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation add(RequestInfo) +PASS Cache interface: operation addAll([object Object]) +PASS Cache interface: operation put(RequestInfo, Response) +PASS Cache interface: operation delete(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation keys(RequestInfo, CacheQueryOptions) +PASS CacheStorage interface: existence and properties of interface object +PASS CacheStorage interface object length +PASS CacheStorage interface object name +PASS CacheStorage interface: existence and properties of interface prototype object +PASS CacheStorage interface: existence and properties of interface prototype object's "constructor" property +PASS CacheStorage interface: operation match(RequestInfo, CacheQueryOptions) +PASS CacheStorage interface: operation has(DOMString) +PASS CacheStorage interface: operation open(DOMString) +PASS CacheStorage interface: operation delete(DOMString) +PASS CacheStorage interface: operation keys() +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt new file mode 100644 index 0000000..b18b8d79 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt
@@ -0,0 +1,4 @@ +This is a testharness.js-based test. +FAIL General fetch abort tests in a service worker Failed to register a ServiceWorker: The script does not have a MIME type. +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/abort/general-sharedworker-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/abort/general-sharedworker-expected.txt new file mode 100644 index 0000000..d9b7c58 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/abort/general-sharedworker-expected.txt
@@ -0,0 +1,52 @@ +This is a testharness.js-based test. +FAIL Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - RequestInit's window is not null +FAIL TypeError from request constructor takes priority - Input URL is not valid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - Input URL has credentials promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is navigate promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's referrer is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's method is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's method is forbidden promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and method is not simple promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and integrity is not empty promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - RequestInit's cache mode is only-if-cached and mode is not same-origin +PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode cors +PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode no-cors +FAIL TypeError from request constructor takes priority - Bad referrerPolicy init parameter value promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - Bad mode init parameter value +PASS TypeError from request constructor takes priority - Bad credentials init parameter value +PASS TypeError from request constructor takes priority - Bad cache init parameter value +PASS TypeError from request constructor takes priority - Bad redirect init parameter value +FAIL Request objects have a signal property assert_true: Signal member is present & truthy expected true got false +FAIL Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Readable stream synchronously cancels with AbortError if aborted before reading promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal state is cloned AbortController is not defined +FAIL Clone aborts with original controller AbortController is not defined +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/abort/general.any-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/abort/general.any-expected.txt new file mode 100644 index 0000000..d9b7c58 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/abort/general.any-expected.txt
@@ -0,0 +1,52 @@ +This is a testharness.js-based test. +FAIL Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - RequestInit's window is not null +FAIL TypeError from request constructor takes priority - Input URL is not valid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - Input URL has credentials promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is navigate promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's referrer is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's method is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's method is forbidden promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and method is not simple promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and integrity is not empty promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - RequestInit's cache mode is only-if-cached and mode is not same-origin +PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode cors +PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode no-cors +FAIL TypeError from request constructor takes priority - Bad referrerPolicy init parameter value promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - Bad mode init parameter value +PASS TypeError from request constructor takes priority - Bad credentials init parameter value +PASS TypeError from request constructor takes priority - Bad cache init parameter value +PASS TypeError from request constructor takes priority - Bad redirect init parameter value +FAIL Request objects have a signal property assert_true: Signal member is present & truthy expected true got false +FAIL Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Readable stream synchronously cancels with AbortError if aborted before reading promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal state is cloned AbortController is not defined +FAIL Clone aborts with original controller AbortController is not defined +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/abort/general.any.worker-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/abort/general.any.worker-expected.txt new file mode 100644 index 0000000..d9b7c58 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/abort/general.any.worker-expected.txt
@@ -0,0 +1,52 @@ +This is a testharness.js-based test. +FAIL Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - RequestInit's window is not null +FAIL TypeError from request constructor takes priority - Input URL is not valid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - Input URL has credentials promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is navigate promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's referrer is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's method is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's method is forbidden promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and method is not simple promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and integrity is not empty promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - RequestInit's cache mode is only-if-cached and mode is not same-origin +PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode cors +PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode no-cors +FAIL TypeError from request constructor takes priority - Bad referrerPolicy init parameter value promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +PASS TypeError from request constructor takes priority - Bad mode init parameter value +PASS TypeError from request constructor takes priority - Bad credentials init parameter value +PASS TypeError from request constructor takes priority - Bad cache init parameter value +PASS TypeError from request constructor takes priority - Bad redirect init parameter value +FAIL Request objects have a signal property assert_true: Signal member is present & truthy expected true got false +FAIL Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Readable stream synchronously cancels with AbortError if aborted before reading promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined" +FAIL Signal state is cloned AbortController is not defined +FAIL Clone aborts with original controller AbortController is not defined +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/request/request-error-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/request/request-error-expected.txt new file mode 100644 index 0000000..697b78fd0 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/request/request-error-expected.txt
@@ -0,0 +1,25 @@ +This is a testharness.js-based test. +FAIL RequestInit's window is not null assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +PASS Input URL is not valid +PASS Input URL has credentials +PASS RequestInit's mode is navigate +PASS RequestInit's referrer is invalid +PASS RequestInit's method is invalid +PASS RequestInit's method is forbidden +PASS RequestInit's mode is no-cors and method is not simple +PASS RequestInit's mode is no-cors and integrity is not empty +FAIL RequestInit's cache mode is only-if-cached and mode is not same-origin assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +FAIL Request with cache mode: only-if-cached and fetch mode cors assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +FAIL Request with cache mode: only-if-cached and fetch mode no-cors assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +PASS Bad referrerPolicy init parameter value +FAIL Bad mode init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +FAIL Bad credentials init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +FAIL Bad cache init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +FAIL Bad redirect init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw +PASS Request should get its content-type from the init request +PASS Request should not get its content-type from the init request if init headers are provided +PASS Request should get its content-type from the body if none is provided +PASS Request should get its content-type from init headers if one is provided +PASS Request with cache mode: only-if-cached and fetch mode: same-origin +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/request/request-idl-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/request/request-idl-expected.txt new file mode 100644 index 0000000..6835e7d --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/request/request-idl-expected.txt
@@ -0,0 +1,50 @@ +This is a testharness.js-based test. +PASS Request interface: existence and properties of interface object +PASS Request interface object length +PASS Request interface object name +PASS Request interface: existence and properties of interface prototype object +PASS Request interface: existence and properties of interface prototype object's "constructor" property +PASS Request interface: attribute method +PASS Request interface: attribute url +PASS Request interface: attribute headers +FAIL Request interface: attribute type assert_true: The prototype object must have a property "type" expected true got false +FAIL Request interface: attribute destination assert_true: The prototype object must have a property "destination" expected true got false +PASS Request interface: attribute referrer +PASS Request interface: attribute referrerPolicy +PASS Request interface: attribute mode +PASS Request interface: attribute credentials +PASS Request interface: attribute cache +PASS Request interface: attribute redirect +PASS Request interface: attribute integrity +PASS Request interface: operation clone() +FAIL Request interface: attribute body assert_true: The prototype object must have a property "body" expected true got false +PASS Request interface: attribute bodyUsed +PASS Request interface: operation arrayBuffer() +PASS Request interface: operation blob() +PASS Request interface: operation formData() +PASS Request interface: operation json() +PASS Request interface: operation text() +PASS Request must be primary interface of new Request("") +PASS Stringification of new Request("") +PASS Request interface: new Request("") must inherit property "method" with the proper type +PASS Request interface: new Request("") must inherit property "url" with the proper type +PASS Request interface: new Request("") must inherit property "headers" with the proper type +FAIL Request interface: new Request("") must inherit property "type" with the proper type assert_inherits: property "type" not found in prototype chain +FAIL Request interface: new Request("") must inherit property "destination" with the proper type assert_inherits: property "destination" not found in prototype chain +PASS Request interface: new Request("") must inherit property "referrer" with the proper type +PASS Request interface: new Request("") must inherit property "referrerPolicy" with the proper type +PASS Request interface: new Request("") must inherit property "mode" with the proper type +PASS Request interface: new Request("") must inherit property "credentials" with the proper type +PASS Request interface: new Request("") must inherit property "cache" with the proper type +PASS Request interface: new Request("") must inherit property "redirect" with the proper type +PASS Request interface: new Request("") must inherit property "integrity" with the proper type +PASS Request interface: new Request("") must inherit property "clone()" with the proper type +FAIL Request interface: new Request("") must inherit property "body" with the proper type assert_inherits: property "body" not found in prototype chain +PASS Request interface: new Request("") must inherit property "bodyUsed" with the proper type +PASS Request interface: new Request("") must inherit property "arrayBuffer()" with the proper type +PASS Request interface: new Request("") must inherit property "blob()" with the proper type +PASS Request interface: new Request("") must inherit property "formData()" with the proper type +PASS Request interface: new Request("") must inherit property "json()" with the proper type +PASS Request interface: new Request("") must inherit property "text()" with the proper type +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/response/response-idl-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/response/response-idl-expected.txt new file mode 100644 index 0000000..db7454c6 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/response/response-idl-expected.txt
@@ -0,0 +1,45 @@ +This is a testharness.js-based test. +PASS Response interface: existence and properties of interface object +PASS Response interface object length +PASS Response interface object name +PASS Response interface: existence and properties of interface prototype object +PASS Response interface: existence and properties of interface prototype object's "constructor" property +PASS Response interface: operation error() +PASS Response interface: operation redirect(USVString, unsigned short) +PASS Response interface: attribute type +PASS Response interface: attribute url +PASS Response interface: attribute status +PASS Response interface: attribute ok +PASS Response interface: attribute statusText +PASS Response interface: attribute headers +FAIL Response interface: attribute trailer assert_true: The prototype object must have a property "trailer" expected true got false +PASS Response interface: operation clone() +PASS Response interface: attribute body +PASS Response interface: attribute bodyUsed +PASS Response interface: operation arrayBuffer() +PASS Response interface: operation blob() +PASS Response interface: operation formData() +PASS Response interface: operation json() +PASS Response interface: operation text() +PASS Response must be primary interface of new Response() +PASS Stringification of new Response() +PASS Response interface: new Response() must inherit property "error()" with the proper type +PASS Response interface: new Response() must inherit property "redirect(USVString, unsigned short)" with the proper type +PASS Response interface: calling redirect(USVString, unsigned short) on new Response() with too few arguments must throw TypeError +PASS Response interface: new Response() must inherit property "type" with the proper type +PASS Response interface: new Response() must inherit property "url" with the proper type +PASS Response interface: new Response() must inherit property "status" with the proper type +PASS Response interface: new Response() must inherit property "ok" with the proper type +PASS Response interface: new Response() must inherit property "statusText" with the proper type +PASS Response interface: new Response() must inherit property "headers" with the proper type +FAIL Response interface: new Response() must inherit property "trailer" with the proper type assert_inherits: property "trailer" not found in prototype chain +PASS Response interface: new Response() must inherit property "clone()" with the proper type +PASS Response interface: new Response() must inherit property "body" with the proper type +PASS Response interface: new Response() must inherit property "bodyUsed" with the proper type +PASS Response interface: new Response() must inherit property "arrayBuffer()" with the proper type +PASS Response interface: new Response() must inherit property "blob()" with the proper type +PASS Response interface: new Response() must inherit property "formData()" with the proper type +PASS Response interface: new Response() must inherit property "json()" with the proper type +PASS Response interface: new Response() must inherit property "text()" with the proper type +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt new file mode 100644 index 0000000..b92d7aa --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
@@ -0,0 +1,187 @@ +This is a testharness.js-based test. +PASS Interfaces and attributes in ServiceWorkerGlobalScope +PASS test setup (cache creation) +PASS Event constructors +PASS ServiceWorkerGlobalScope interface: existence and properties of interface object +PASS ServiceWorkerGlobalScope interface object length +PASS ServiceWorkerGlobalScope interface object name +PASS ServiceWorkerGlobalScope interface: existence and properties of interface prototype object +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Object.setPrototypeOf should throw a TypeError +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via __proto__ should throw a TypeError +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Reflect.setPrototypeOf should return false +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Object.setPrototypeOf should not throw +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via __proto__ should not throw +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Reflect.setPrototypeOf should return true +PASS ServiceWorkerGlobalScope interface: existence and properties of interface prototype object's "constructor" property +PASS ServiceWorkerGlobalScope interface: attribute clients +PASS ServiceWorkerGlobalScope interface: attribute registration +PASS ServiceWorkerGlobalScope interface: operation skipWaiting() +PASS ServiceWorkerGlobalScope interface: attribute oninstall +PASS ServiceWorkerGlobalScope interface: attribute onactivate +PASS ServiceWorkerGlobalScope interface: attribute onfetch +PASS ServiceWorkerGlobalScope interface: attribute onforeignfetch +PASS ServiceWorkerGlobalScope interface: attribute onmessage +FAIL ServiceWorkerGlobalScope interface: attribute onmessageerror assert_own_property: The global object must have a property "onmessageerror" expected property "onmessageerror" missing +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Object.setPrototypeOf should throw a TypeError +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via __proto__ should throw a TypeError +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Reflect.setPrototypeOf should return false +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Object.setPrototypeOf should not throw +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via __proto__ should not throw +PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Reflect.setPrototypeOf should return true +PASS ServiceWorkerGlobalScope must be primary interface of self +PASS Stringification of self +PASS ServiceWorkerGlobalScope interface: self must inherit property "clients" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "registration" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "skipWaiting()" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "oninstall" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "onactivate" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "onfetch" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "onforeignfetch" with the proper type +PASS ServiceWorkerGlobalScope interface: self must inherit property "onmessage" with the proper type +FAIL ServiceWorkerGlobalScope interface: self must inherit property "onmessageerror" with the proper type assert_own_property: expected property "onmessageerror" missing +PASS Client interface: existence and properties of interface object +PASS Client interface object length +PASS Client interface object name +PASS Client interface: existence and properties of interface prototype object +PASS Client interface: existence and properties of interface prototype object's "constructor" property +PASS Client interface: attribute url +PASS Client interface: attribute id +PASS Client interface: attribute type +FAIL Client interface: attribute reserved assert_true: The prototype object must have a property "reserved" expected true got false +PASS Client interface: operation postMessage(any, [object Object]) +PASS WindowClient interface: existence and properties of interface object +PASS WindowClient interface object length +PASS WindowClient interface object name +PASS WindowClient interface: existence and properties of interface prototype object +PASS WindowClient interface: existence and properties of interface prototype object's "constructor" property +PASS WindowClient interface: attribute visibilityState +PASS WindowClient interface: attribute focused +FAIL WindowClient interface: attribute ancestorOrigins assert_true: The prototype object must have a property "ancestorOrigins" expected true got false +PASS WindowClient interface: operation focus() +PASS WindowClient interface: operation navigate(USVString) +PASS Clients interface: existence and properties of interface object +PASS Clients interface object length +PASS Clients interface object name +PASS Clients interface: existence and properties of interface prototype object +PASS Clients interface: existence and properties of interface prototype object's "constructor" property +PASS Clients interface: operation get(DOMString) +PASS Clients interface: operation matchAll(ClientQueryOptions) +PASS Clients interface: operation openWindow(USVString) +PASS Clients interface: operation claim() +PASS Clients must be primary interface of self.clients +PASS Stringification of self.clients +PASS Clients interface: self.clients must inherit property "get(DOMString)" with the proper type +PASS Clients interface: calling get(DOMString) on self.clients with too few arguments must throw TypeError +PASS Clients interface: self.clients must inherit property "matchAll(ClientQueryOptions)" with the proper type +PASS Clients interface: calling matchAll(ClientQueryOptions) on self.clients with too few arguments must throw TypeError +PASS Clients interface: self.clients must inherit property "openWindow(USVString)" with the proper type +PASS Clients interface: calling openWindow(USVString) on self.clients with too few arguments must throw TypeError +PASS Clients interface: self.clients must inherit property "claim()" with the proper type +FAIL ServiceWorker interface: existence and properties of interface object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface object length assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface object name assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: existence and properties of interface prototype object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: attribute scriptURL assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: attribute state assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: operation postMessage(any, [object Object]) assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +FAIL ServiceWorker interface: attribute onstatechange assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing +PASS ServiceWorkerRegistration interface: existence and properties of interface object +PASS ServiceWorkerRegistration interface object length +PASS ServiceWorkerRegistration interface object name +PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object +PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object's "constructor" property +PASS ServiceWorkerRegistration interface: attribute installing +PASS ServiceWorkerRegistration interface: attribute waiting +PASS ServiceWorkerRegistration interface: attribute active +PASS ServiceWorkerRegistration interface: attribute navigationPreload +PASS ServiceWorkerRegistration interface: attribute scope +FAIL ServiceWorkerRegistration interface: attribute updateViaCache assert_true: The prototype object must have a property "updateViaCache" expected true got false +PASS ServiceWorkerRegistration interface: operation update() +PASS ServiceWorkerRegistration interface: operation unregister() +PASS ServiceWorkerRegistration interface: attribute onupdatefound +PASS ServiceWorkerRegistration must be primary interface of self.registration +PASS Stringification of self.registration +PASS ServiceWorkerRegistration interface: self.registration must inherit property "installing" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "waiting" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "active" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "navigationPreload" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "scope" with the proper type +FAIL ServiceWorkerRegistration interface: self.registration must inherit property "updateViaCache" with the proper type assert_inherits: property "updateViaCache" not found in prototype chain +PASS ServiceWorkerRegistration interface: self.registration must inherit property "update()" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "unregister()" with the proper type +PASS ServiceWorkerRegistration interface: self.registration must inherit property "onupdatefound" with the proper type +PASS EventTarget interface: self.registration must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on self.registration with too few arguments must throw TypeError +PASS EventTarget interface: self.registration must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on self.registration with too few arguments must throw TypeError +PASS EventTarget interface: self.registration must inherit property "dispatchEvent(Event)" with the proper type +PASS EventTarget interface: calling dispatchEvent(Event) on self.registration with too few arguments must throw TypeError +PASS EventTarget interface: existence and properties of interface object +PASS EventTarget interface object length +PASS EventTarget interface object name +PASS EventTarget interface: existence and properties of interface prototype object +PASS EventTarget interface: existence and properties of interface prototype object's "constructor" property +PASS EventTarget interface: operation addEventListener(DOMString, EventListener, [object Object],[object Object]) +PASS EventTarget interface: operation removeEventListener(DOMString, EventListener, [object Object],[object Object]) +PASS EventTarget interface: operation dispatchEvent(Event) +PASS NavigationPreloadManager interface: existence and properties of interface object +PASS NavigationPreloadManager interface object length +PASS NavigationPreloadManager interface object name +PASS NavigationPreloadManager interface: existence and properties of interface prototype object +PASS NavigationPreloadManager interface: existence and properties of interface prototype object's "constructor" property +PASS NavigationPreloadManager interface: operation enable() +PASS NavigationPreloadManager interface: operation disable() +PASS NavigationPreloadManager interface: operation setHeaderValue(ByteString) +PASS NavigationPreloadManager interface: operation getState() +PASS Cache interface: existence and properties of interface object +PASS Cache interface object length +PASS Cache interface object name +PASS Cache interface: existence and properties of interface prototype object +PASS Cache interface: existence and properties of interface prototype object's "constructor" property +PASS Cache interface: operation match(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation matchAll(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation add(RequestInfo) +PASS Cache interface: operation addAll([object Object]) +PASS Cache interface: operation put(RequestInfo, Response) +PASS Cache interface: operation delete(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation keys(RequestInfo, CacheQueryOptions) +PASS Cache must be primary interface of self.cacheInstance +PASS Stringification of self.cacheInstance +PASS Cache interface: self.cacheInstance must inherit property "match(RequestInfo, CacheQueryOptions)" with the proper type +PASS Cache interface: calling match(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "matchAll(RequestInfo, CacheQueryOptions)" with the proper type +PASS Cache interface: calling matchAll(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "add(RequestInfo)" with the proper type +PASS Cache interface: calling add(RequestInfo) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "addAll([object Object])" with the proper type +PASS Cache interface: calling addAll([object Object]) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "put(RequestInfo, Response)" with the proper type +PASS Cache interface: calling put(RequestInfo, Response) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "delete(RequestInfo, CacheQueryOptions)" with the proper type +PASS Cache interface: calling delete(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError +PASS Cache interface: self.cacheInstance must inherit property "keys(RequestInfo, CacheQueryOptions)" with the proper type +PASS Cache interface: calling keys(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError +PASS CacheStorage interface: existence and properties of interface object +PASS CacheStorage interface object length +PASS CacheStorage interface object name +PASS CacheStorage interface: existence and properties of interface prototype object +PASS CacheStorage interface: existence and properties of interface prototype object's "constructor" property +PASS CacheStorage interface: operation match(RequestInfo, CacheQueryOptions) +PASS CacheStorage interface: operation has(DOMString) +PASS CacheStorage interface: operation open(DOMString) +PASS CacheStorage interface: operation delete(DOMString) +PASS CacheStorage interface: operation keys() +PASS CacheStorage must be primary interface of self.caches +PASS Stringification of self.caches +PASS CacheStorage interface: self.caches must inherit property "match(RequestInfo, CacheQueryOptions)" with the proper type +PASS CacheStorage interface: calling match(RequestInfo, CacheQueryOptions) on self.caches with too few arguments must throw TypeError +PASS CacheStorage interface: self.caches must inherit property "has(DOMString)" with the proper type +PASS CacheStorage interface: calling has(DOMString) on self.caches with too few arguments must throw TypeError +PASS CacheStorage interface: self.caches must inherit property "open(DOMString)" with the proper type +PASS CacheStorage interface: calling open(DOMString) on self.caches with too few arguments must throw TypeError +PASS CacheStorage interface: self.caches must inherit property "delete(DOMString)" with the proper type +PASS CacheStorage interface: calling delete(DOMString) on self.caches with too few arguments must throw TypeError +PASS CacheStorage interface: self.caches must inherit property "keys()" with the proper type +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt new file mode 100644 index 0000000..c9f3ca90 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt
@@ -0,0 +1,101 @@ +This is a testharness.js-based test. +PASS test setup (worker registration) +PASS WorkerGlobalScope interface: existence and properties of interface object +PASS ServiceWorkerGlobalScope interface: existence and properties of interface object +PASS Client interface: existence and properties of interface object +PASS WindowClient interface: existence and properties of interface object +PASS Clients interface: existence and properties of interface object +PASS ServiceWorker interface: existence and properties of interface object +PASS ServiceWorker interface object length +PASS ServiceWorker interface object name +PASS ServiceWorker interface: existence and properties of interface prototype object +PASS ServiceWorker interface: existence and properties of interface prototype object's "constructor" property +PASS ServiceWorker interface: attribute scriptURL +PASS ServiceWorker interface: attribute state +PASS ServiceWorker interface: operation postMessage(any, [object Object]) +PASS ServiceWorker interface: attribute onstatechange +PASS ServiceWorker must be primary interface of window.registrationInstance.installing +PASS Stringification of window.registrationInstance.installing +PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "scriptURL" with the proper type +PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "state" with the proper type +PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "postMessage(any, [object Object])" with the proper type +PASS ServiceWorker interface: calling postMessage(any, [object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError +PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "onstatechange" with the proper type +PASS EventTarget interface: window.registrationInstance.installing must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError +PASS EventTarget interface: window.registrationInstance.installing must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError +PASS EventTarget interface: window.registrationInstance.installing must inherit property "dispatchEvent(Event)" with the proper type +PASS EventTarget interface: calling dispatchEvent(Event) on window.registrationInstance.installing with too few arguments must throw TypeError +PASS ServiceWorkerRegistration interface: existence and properties of interface object +PASS ServiceWorkerRegistration interface object length +PASS ServiceWorkerRegistration interface object name +PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object +PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object's "constructor" property +PASS ServiceWorkerRegistration interface: attribute installing +PASS ServiceWorkerRegistration interface: attribute waiting +PASS ServiceWorkerRegistration interface: attribute active +PASS ServiceWorkerRegistration interface: attribute navigationPreload +PASS ServiceWorkerRegistration interface: attribute scope +FAIL ServiceWorkerRegistration interface: attribute updateViaCache assert_true: The prototype object must have a property "updateViaCache" expected true got false +PASS ServiceWorkerRegistration interface: operation update() +PASS ServiceWorkerRegistration interface: operation unregister() +PASS ServiceWorkerRegistration interface: attribute onupdatefound +PASS ServiceWorkerRegistration must be primary interface of window.registrationInstance +PASS Stringification of window.registrationInstance +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "installing" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "waiting" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "active" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "navigationPreload" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "scope" with the proper type +FAIL ServiceWorkerRegistration interface: window.registrationInstance must inherit property "updateViaCache" with the proper type assert_inherits: property "updateViaCache" not found in prototype chain +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "update()" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "unregister()" with the proper type +PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "onupdatefound" with the proper type +PASS EventTarget interface: window.registrationInstance must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance with too few arguments must throw TypeError +PASS EventTarget interface: window.registrationInstance must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type +PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance with too few arguments must throw TypeError +PASS EventTarget interface: window.registrationInstance must inherit property "dispatchEvent(Event)" with the proper type +PASS EventTarget interface: calling dispatchEvent(Event) on window.registrationInstance with too few arguments must throw TypeError +PASS EventTarget interface: existence and properties of interface object +PASS EventTarget interface object length +PASS EventTarget interface object name +PASS EventTarget interface: existence and properties of interface prototype object +PASS EventTarget interface: existence and properties of interface prototype object's "constructor" property +PASS EventTarget interface: operation addEventListener(DOMString, EventListener, [object Object],[object Object]) +PASS EventTarget interface: operation removeEventListener(DOMString, EventListener, [object Object],[object Object]) +PASS EventTarget interface: operation dispatchEvent(Event) +PASS NavigationPreloadManager interface: existence and properties of interface object +PASS NavigationPreloadManager interface object length +PASS NavigationPreloadManager interface object name +PASS NavigationPreloadManager interface: existence and properties of interface prototype object +PASS NavigationPreloadManager interface: existence and properties of interface prototype object's "constructor" property +PASS NavigationPreloadManager interface: operation enable() +PASS NavigationPreloadManager interface: operation disable() +PASS NavigationPreloadManager interface: operation setHeaderValue(ByteString) +PASS NavigationPreloadManager interface: operation getState() +PASS Cache interface: existence and properties of interface object +PASS Cache interface object length +PASS Cache interface object name +PASS Cache interface: existence and properties of interface prototype object +PASS Cache interface: existence and properties of interface prototype object's "constructor" property +PASS Cache interface: operation match(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation matchAll(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation add(RequestInfo) +PASS Cache interface: operation addAll([object Object]) +PASS Cache interface: operation put(RequestInfo, Response) +PASS Cache interface: operation delete(RequestInfo, CacheQueryOptions) +PASS Cache interface: operation keys(RequestInfo, CacheQueryOptions) +PASS CacheStorage interface: existence and properties of interface object +PASS CacheStorage interface object length +PASS CacheStorage interface object name +PASS CacheStorage interface: existence and properties of interface prototype object +PASS CacheStorage interface: existence and properties of interface prototype object's "constructor" property +PASS CacheStorage interface: operation match(RequestInfo, CacheQueryOptions) +PASS CacheStorage interface: operation has(DOMString) +PASS CacheStorage interface: operation open(DOMString) +PASS CacheStorage interface: operation delete(DOMString) +PASS CacheStorage interface: operation keys() +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/nested-reflection-transformed-expected.png b/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/nested-reflection-transformed-expected.png index 326cf1e..3349df3 100644 --- a/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/nested-reflection-transformed-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/nested-reflection-transformed-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/nested-reflection-transformed2-expected.png b/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/nested-reflection-transformed2-expected.png index d59dd8e..19c47c13 100644 --- a/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/nested-reflection-transformed2-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/nested-reflection-transformed2-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/reflection-in-composited-expected.png b/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/reflection-in-composited-expected.png index ec7415fb..6f6ae4c 100644 --- a/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/reflection-in-composited-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/reflection-in-composited-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png index e91a060..8ac880e 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-image-rotate-transform-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-image-rotate-transform-expected.png index 3efca06..1d8da6b 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-image-rotate-transform-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-image-rotate-transform-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-inner-bleed-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-inner-bleed-expected.png index b26d4fd3..d5c1163 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-inner-bleed-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-inner-bleed-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/canvas/canvas-composite-video-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/canvas/canvas-composite-video-expected.png index db2e2723..5754aae 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/canvas/canvas-composite-video-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/canvas/canvas-composite-video-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/canvas/canvas-composite-video-shadow-expected.png index a578bd10..05a993d 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/canvas/canvas-composite-video-shadow-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/canvas/canvas-composite-video-shadow-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/canvas/image-object-in-canvas-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/canvas/image-object-in-canvas-expected.png index e8f71624..bdbc6ab 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/canvas/image-object-in-canvas-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/canvas/image-object-in-canvas-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/css/transformed-mask-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/css/transformed-mask-expected.png index 4d902fa..589c9400 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/css/transformed-mask-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/css/transformed-mask-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/reflections/opacity-reflection-transform-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/reflections/opacity-reflection-transform-expected.png index 9cec965..f76e53c 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/reflections/opacity-reflection-transform-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/reflections/opacity-reflection-transform-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/images/color-profile-image-canvas-svg-expected.png b/third_party/WebKit/LayoutTests/platform/win/images/color-profile-image-canvas-svg-expected.png index c6175ef..d89a19f 100644 --- a/third_party/WebKit/LayoutTests/platform/win/images/color-profile-image-canvas-svg-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/images/color-profile-image-canvas-svg-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/images/color-profile-munsell-adobe-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/win/images/color-profile-munsell-adobe-to-srgb-expected.png index d246ff28..9ba02149 100644 --- a/third_party/WebKit/LayoutTests/platform/win/images/color-profile-munsell-adobe-to-srgb-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/images/color-profile-munsell-adobe-to-srgb-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/media/color-profile-munsell-bt601-smpte-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/win/media/color-profile-munsell-bt601-smpte-to-srgb-expected.png index b39df69..0a4a656 100644 --- a/third_party/WebKit/LayoutTests/platform/win/media/color-profile-munsell-bt601-smpte-to-srgb-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/media/color-profile-munsell-bt601-smpte-to-srgb-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/media/color-profile-munsell-bt709-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/win/media/color-profile-munsell-bt709-to-srgb-expected.png index 7536943..081dac4 100644 --- a/third_party/WebKit/LayoutTests/platform/win/media/color-profile-munsell-bt709-to-srgb-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/media/color-profile-munsell-bt709-to-srgb-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/animated-path-inside-transformed-html-expected.png b/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/animated-path-inside-transformed-html-expected.png index a281ad5..89f387f 100644 --- a/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/animated-path-inside-transformed-html-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/animated-path-inside-transformed-html-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/batik/filters/feTile-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/batik/filters/feTile-expected.png index bfc9e2c..630122b1 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/batik/filters/feTile-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/svg/batik/filters/feTile-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/smallFonts-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/smallFonts-expected.png index b170da1a..c7b51fd 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/smallFonts-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/smallFonts-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textFeatures-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textFeatures-expected.png index a436184..a1a56c30 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textFeatures-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textFeatures-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/custom/focus-ring-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/custom/focus-ring-expected.png index f141ebb..45c44f9 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/custom/focus-ring-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/svg/custom/focus-ring-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/custom/pattern-rotate-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/custom/pattern-rotate-expected.png index 740098a..8adf3b5 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/custom/pattern-rotate-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/svg/custom/pattern-rotate-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/custom/transformed-outlines-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/custom/transformed-outlines-expected.png index 9fe658ad..de89ae7d 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/custom/transformed-outlines-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/svg/custom/transformed-outlines-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/hixie/perf/004-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/hixie/perf/004-expected.png index d57f21b2..aa0fd8c 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/hixie/perf/004-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/svg/hixie/perf/004-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/transforms/text-with-pattern-inside-transformed-html-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/transforms/text-with-pattern-inside-transformed-html-expected.png index 48034234..3738002 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/transforms/text-with-pattern-inside-transformed-html-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/svg/transforms/text-with-pattern-inside-transformed-html-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/transforms/text-with-pattern-with-svg-transform-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/transforms/text-with-pattern-with-svg-transform-expected.png index 8b2d555..a36dd18 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/transforms/text-with-pattern-with-svg-transform-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/svg/transforms/text-with-pattern-with-svg-transform-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/transforms/transformed-document-element-expected.png b/third_party/WebKit/LayoutTests/platform/win/transforms/transformed-document-element-expected.png index 137dee85..c639d58 100644 --- a/third_party/WebKit/LayoutTests/platform/win/transforms/transformed-document-element-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/transforms/transformed-document-element-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-expected.png index 605d21f..ce3c6420c 100644 --- a/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png index db2e2723..5754aae 100644 --- a/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-shadow-expected.png index a578bd10..05a993d 100644 --- a/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-shadow-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-shadow-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png index ae68e7d6..836814b 100644 --- a/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-incremental-repaint-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-incremental-repaint-expected.png index 6b357e5..aa94bdad 100644 --- a/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-incremental-repaint-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-incremental-repaint-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/fillrect_gradient-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/fillrect_gradient-expected.png index 10270a1b..9b37ee0 100644 --- a/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/fillrect_gradient-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/fillrect_gradient-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/image-object-in-canvas-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/image-object-in-canvas-expected.png index e73fe3a..e8f71624 100644 --- a/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/image-object-in-canvas-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/image-object-in-canvas-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-image-canvas-svg-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-image-canvas-svg-expected.png index 17ae7af..4f0b1ca 100644 --- a/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-image-canvas-svg-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-image-canvas-svg-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png index aaacabd..d0c9520 100644 --- a/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-image-canvas-svg-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-image-canvas-svg-expected.png index 6f9aa863..cbefd899 100644 --- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-image-canvas-svg-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-image-canvas-svg-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb-expected.png index 23ea1555..8a0a426 100644 --- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/color_space/fast/canvas/color-space/canvas-createPutGetImageData-colorManaged.html b/third_party/WebKit/LayoutTests/virtual/color_space/fast/canvas/color-space/canvas-createPutGetImageData-colorManaged.html index 78494cb..123626b 100644 --- a/third_party/WebKit/LayoutTests/virtual/color_space/fast/canvas/color-space/canvas-createPutGetImageData-colorManaged.html +++ b/third_party/WebKit/LayoutTests/virtual/color_space/fast/canvas/color-space/canvas-createPutGetImageData-colorManaged.html
@@ -8,16 +8,11 @@ function checkImageData(canvasColorSettings, imageData) { var imageDataColorSettings = imageData.getColorSettings(); - //console.log(canvasColorSettings); - console.log(imageDataColorSettings); - assert_equals(canvasColorSettings.colorSpace, imageDataColorSettings.colorSpace); if (canvasColorSettings.pixelFormat == "8-8-8-8") { - //console.log("8-8-8-8 -> "); assert_equals("uint8", imageDataColorSettings.storageFormat); assert_equals(imageData.data.length, 4 * xWidth * xHeight); } else { - //console.log("float16 -> "); assert_equals("float32", imageDataColorSettings.storageFormat); assert_equals(imageData.dataUnion.length, 4 * xWidth * xHeight); } @@ -44,7 +39,7 @@ ["Test color managed cretateImageData: {p3, float16} -> {p3, float32}", {colorSpace: "p3", pixelFormat: "float16"}], ]; -//generate_tests(runTestCreateImageData, testScenariosCreateImageData); +generate_tests(runTestCreateImageData, testScenariosCreateImageData); // Test getImageData when the canvas is color managed function runTestGetImageData(canvasColorSettings) { @@ -57,10 +52,10 @@ } var testScenariosGetImageData = [ -// ["Test color managed getImageData: {srgb, 8-8-8-8} -> {srgb, uint8}", {colorSpace: "srgb", pixelFormat: "8-8-8-8"}], - ["Test color managed getImageData: {srgb, float16} -> {srgb, float32}", {colorSpace: "srgb", pixelFormat: "float16"}], -// ["Test color managed getImageData: {rec2020, float16} -> {rec2020, float32}", {colorSpace: "rec2020", pixelFormat: "float16"}], -// ["Test color managed getImageData: {p3, float16} -> {p3, float32}", {colorSpace: "p3", pixelFormat: "float16"}], + ["Test color managed getImageData: {srgb, 8-8-8-8} -> {srgb, uint8}", {colorSpace: "srgb", pixelFormat: "8-8-8-8"}], + ["Test color managed getImageData: {srgb, float16} -> {srgb, float32}", {colorSpace: "srgb", pixelFormat: "float16"}], + ["Test color managed getImageData: {rec2020, float16} -> {rec2020, float32}", {colorSpace: "rec2020", pixelFormat: "float16"}], + ["Test color managed getImageData: {p3, float16} -> {p3, float32}", {colorSpace: "p3", pixelFormat: "float16"}], ]; generate_tests(runTestGetImageData, testScenariosGetImageData); @@ -123,7 +118,7 @@ prepareDataArrays(); prepareTestScenariosPutImageData(); -//generate_tests(runTestPutImageData, testScenariosPutImageData); +generate_tests(runTestPutImageData, testScenariosPutImageData); </script> </body>
diff --git a/third_party/WebKit/LayoutTests/virtual/color_space/fast/canvas/color-space/canvas-getImageData-linear-rgb.html b/third_party/WebKit/LayoutTests/virtual/color_space/fast/canvas/color-space/canvas-getImageData-linear-rgb.html new file mode 100644 index 0000000..e0370b06 --- /dev/null +++ b/third_party/WebKit/LayoutTests/virtual/color_space/fast/canvas/color-space/canvas-getImageData-linear-rgb.html
@@ -0,0 +1,75 @@ +<!DOCTYPE html> +<body> +<script src="../../../../../resources/testharness.js"></script> +<script src="../../../../../resources/testharnessreport.js"></script> +<script> +test(drawSRGBThenGetImageDataLinearRGB, 'tests drawing SRGB color on LinearRGB \ +canvas and getting LinearRGB image data.'); +test(putImageDataLinearRGBThenGetImageDataLinearRGB, 'tests putting and \ +getting LinearRGB image data on LinearRGB canvas.'); +test(putImageDataSRGBThenGetImageDataLinearRGB, 'tests putting SRGB image data \ +on LinearRGB canvas and getting LinearRGB image data.'); + +function assert_array_approx_equals(actual, expected, epsilon) +{ + assert_true(actual.length === expected.length); + for (var i=0; i < actual.length; i++) + assert_approx_equals(actual[i], expected[i], epsilon); +} + +function drawSRGBThenGetImageDataLinearRGB() { + var canvas = document.createElement('canvas'); + canvas.width = 10; + canvas.height = 10; + var ctx = canvas.getContext('2d', + {colorSpace: 'srgb', pixelFormat:'float16'}); + ctx.fillStyle = 'rgb(50, 100, 150)'; + ctx.fillRect(0, 0, 10, 10); + var pixel = ctx.getImageData(5, 5, 1, 1).dataUnion; + console.log(pixel); + // Check against the same color in LinearRGB. 0.01 protects the test against + // color conversion deviations. + assert_array_approx_equals(pixel, [0.03, 0.13, 0.30, 1], 0.01); +} + +function putImageDataLinearRGBThenGetImageDataLinearRGB() { + var canvas = document.createElement('canvas'); + canvas.width = 10; + canvas.height = 10; + var ctx = canvas.getContext('2d', + {colorSpace: 'srgb', pixelFormat:'float16'}) + var dataLinearRGB = new Float32Array(4); + dataLinearRGB[0] = 0.03; + dataLinearRGB[1] = 0.13; + dataLinearRGB[2] = 0.30; + dataLinearRGB[3] = 1; + var imageData = ctx.createImageData(dataLinearRGB, 1, 1, + {colorSpace: 'srgb', storageFormat:'float32'}); + ctx.putImageData(imageData, 5, 5); + var pixel = ctx.getImageData(5, 5, 1, 1).dataUnion; + // Check against the same color in LinearRGB. 0.001 protects the test against + // rounding errors. + assert_array_approx_equals(pixel, [0.03, 0.13, 0.30, 1], 0.001); +} + +function putImageDataSRGBThenGetImageDataLinearRGB() { + var canvas = document.createElement('canvas'); + canvas.width = 10; + canvas.height = 10; + var ctx = canvas.getContext('2d', + {colorSpace: 'srgb', pixelFormat:'float16'}); + var dataSRGB = new Uint8ClampedArray(4); + dataSRGB[0] = 50; + dataSRGB[1] = 100; + dataSRGB[2] = 150; + dataSRGB[3] = 255; + var imageData = ctx.createImageData(dataSRGB, 1, 1, + {colorSpace: 'srgb', storageFormat:'uint8'}); + ctx.putImageData(imageData, 5, 5); + var pixel = ctx.getImageData(5, 5, 1, 1).dataUnion; + // Check against the same color in LinearRGB. 0.01 protects the test against + // color conversion deviations. + assert_array_approx_equals(pixel, [0.03, 0.13, 0.30, 1], 0.01); +} +</script> +</body>
diff --git a/third_party/WebKit/LayoutTests/virtual/color_space/fast/canvas/color-space/canvas-getImageData-p3.html b/third_party/WebKit/LayoutTests/virtual/color_space/fast/canvas/color-space/canvas-getImageData-p3.html new file mode 100644 index 0000000..ff90c05 --- /dev/null +++ b/third_party/WebKit/LayoutTests/virtual/color_space/fast/canvas/color-space/canvas-getImageData-p3.html
@@ -0,0 +1,74 @@ +<!DOCTYPE html> +<body> +<script src="../../../../../resources/testharness.js"></script> +<script src="../../../../../resources/testharnessreport.js"></script> +<script> +test(drawSRGBThenGetImageDataP3, + 'tests drawing SRGB color on P3 canvas and getting image data in P3.'); +test(putImageDataP3ThenGetImageDataP3, + 'tests putting and getting P3 image data on P3 canvas.'); +test(putImageDataSRGBThenGetImageDataP3, + 'tests putting SRGB image data on P3 canvas and getting P3 image data.'); + +function assert_array_approx_equals(actual, expected, epsilon) +{ + assert_true(actual.length === expected.length); + for (var i=0; i < actual.length; i++) + assert_approx_equals(actual[i], expected[i], epsilon); +} + +function drawSRGBThenGetImageDataP3() { + var canvas = document.createElement('canvas'); + canvas.width = 10; + canvas.height = 10; + var ctx = canvas.getContext('2d', + {colorSpace: 'p3', pixelFormat:'float16'}); + ctx.fillStyle = 'rgb(50, 100, 150)'; + ctx.fillRect(0, 0, 10, 10); + var pixel = ctx.getImageData(5, 5, 1, 1).dataUnion; + // Check against the same color in P3. 0.01 protects the test against + // color conversion deviations. + assert_array_approx_equals(pixel, [0.05, 0.12, 0.29, 1], 0.01); +} + +function putImageDataP3ThenGetImageDataP3() { + var canvas = document.createElement('canvas'); + canvas.width = 10; + canvas.height = 10; + var ctx = canvas.getContext('2d', + {colorSpace: 'p3', pixelFormat:'float16'}) + var dataP3 = new Float32Array(4); + dataP3[0] = 0.05; + dataP3[1] = 0.12; + dataP3[2] = 0.29; + dataP3[3] = 1; + var imageData = ctx.createImageData(dataP3, 1, 1, + {colorSpace: 'p3', storageFormat:'float32'}); + ctx.putImageData(imageData, 5, 5); + var pixel = ctx.getImageData(5, 5, 1, 1).dataUnion; + // Check against the same color in P3. 0.001 protects the test against + // rounding errors. + assert_array_approx_equals(pixel, [0.05, 0.12, 0.29, 1], 0.001); +} + +function putImageDataSRGBThenGetImageDataP3() { + var canvas = document.createElement('canvas'); + canvas.width = 10; + canvas.height = 10; + var ctx = canvas.getContext('2d', + {colorSpace: 'p3', pixelFormat:'float16'}); + var dataSRGB = new Uint8ClampedArray(4); + dataSRGB[0] = 50; + dataSRGB[1] = 100; + dataSRGB[2] = 150; + dataSRGB[3] = 255; + var imageData = ctx.createImageData(dataSRGB, 1, 1, + {colorSpace: 'srgb', storageFormat:'uint8'}); + ctx.putImageData(imageData, 5, 5); + var pixel = ctx.getImageData(5, 5, 1, 1).dataUnion; + // Check against the same color in P3. 0.01 protects the test against + // color conversion deviations. + assert_array_approx_equals(pixel, [0.05, 0.12, 0.29, 1], 0.01); +} +</script> +</body>
diff --git a/third_party/WebKit/LayoutTests/virtual/color_space/fast/canvas/color-space/canvas-getImageData-rec2020.html b/third_party/WebKit/LayoutTests/virtual/color_space/fast/canvas/color-space/canvas-getImageData-rec2020.html new file mode 100644 index 0000000..5135c7d --- /dev/null +++ b/third_party/WebKit/LayoutTests/virtual/color_space/fast/canvas/color-space/canvas-getImageData-rec2020.html
@@ -0,0 +1,74 @@ +<!DOCTYPE html> +<body> +<script src="../../../../../resources/testharness.js"></script> +<script src="../../../../../resources/testharnessreport.js"></script> +<script> +test(drawSRGBThenGetImageDataRec2020, 'tests drawing SRGB color on Rec2020 \ +canvas and getting Rec2020 image data.'); +test(putImageDataRec2020ThenGetImageDataRec2020, + 'tests putting and getting Rec2020 image data on Rec2020 canvas.'); +test(putImageDataSRGBThenGetImageDataRec2020, 'tests putting SRGB image data \ +on Rec2020 canvas and getting Rec2020 image data.'); + +function assert_array_approx_equals(actual, expected, epsilon) +{ + assert_true(actual.length === expected.length); + for (var i=0; i < actual.length; i++) + assert_approx_equals(actual[i], expected[i], epsilon); +} + +function drawSRGBThenGetImageDataRec2020() { + var canvas = document.createElement('canvas'); + canvas.width = 10; + canvas.height = 10; + var ctx = canvas.getContext('2d', + {colorSpace: 'rec2020', pixelFormat:'float16'}); + ctx.fillStyle = 'rgb(50, 100, 150)'; + ctx.fillRect(0, 0, 10, 10); + var pixel = ctx.getImageData(5, 5, 1, 1).dataUnion; + // Check against the same color in Rec2020. 0.01 protects the test against + // color conversion deviations. + assert_array_approx_equals(pixel, [0.07, 0.12, 0.28, 1], 0.01); +} + +function putImageDataRec2020ThenGetImageDataRec2020() { + var canvas = document.createElement('canvas'); + canvas.width = 10; + canvas.height = 10; + var ctx = canvas.getContext('2d', + {colorSpace: 'rec2020', pixelFormat:'float16'}) + var dataRec2020 = new Float32Array(4); + dataRec2020[0] = 0.07; + dataRec2020[1] = 0.12; + dataRec2020[2] = 0.28; + dataRec2020[3] = 1; + var imageData = ctx.createImageData(dataRec2020, 1, 1, + {colorSpace: 'rec2020', storageFormat:'float32'}); + ctx.putImageData(imageData, 5, 5); + var pixel = ctx.getImageData(5, 5, 1, 1).dataUnion; + // Check against the same color in Rec2020. 0.001 protects the test against + // rounding errors. + assert_array_approx_equals(pixel, [0.07, 0.12, 0.28, 1], 0.001); +} + +function putImageDataSRGBThenGetImageDataRec2020() { + var canvas = document.createElement('canvas'); + canvas.width = 10; + canvas.height = 10; + var ctx = canvas.getContext('2d', + {colorSpace: 'rec2020', pixelFormat:'float16'}); + var dataSRGB = new Uint8ClampedArray(4); + dataSRGB[0] = 50; + dataSRGB[1] = 100; + dataSRGB[2] = 150; + dataSRGB[3] = 255; + var imageData = ctx.createImageData(dataSRGB, 1, 1, + {colorSpace: 'srgb', storageFormat:'uint8'}); + ctx.putImageData(imageData, 5, 5); + var pixel = ctx.getImageData(5, 5, 1, 1).dataUnion; + // Check against the same color in Rec2020. 0.01 protects the test against + // color conversion deviations. + assert_array_approx_equals(pixel, [0.07, 0.12, 0.28, 1], 0.01); +} +</script> +</body>
diff --git a/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-arc-circumference-expected.png b/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-arc-circumference-expected.png deleted file mode 100644 index 7ecb23a..0000000 --- a/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-arc-circumference-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-arc-circumference-fill-expected.png b/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-arc-circumference-fill-expected.png deleted file mode 100644 index f44424a..0000000 --- a/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-arc-circumference-fill-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-transformclip-expected.png b/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-transformclip-expected.png deleted file mode 100644 index 6ff69f8..0000000 --- a/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-transformclip-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-ellipse-circumference-expected.png b/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-ellipse-circumference-expected.png deleted file mode 100644 index 079d827..0000000 --- a/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-ellipse-circumference-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-ellipse-circumference-fill-expected.png b/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-ellipse-circumference-fill-expected.png deleted file mode 100644 index 9679b87..0000000 --- a/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-ellipse-circumference-fill-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png b/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png deleted file mode 100644 index 396bbdb..0000000 --- a/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png b/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png index 1649230..bbfecdf 100644 --- a/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png +++ b/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-image-canvas-expected.png b/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-image-canvas-expected.png index 03a3ff4..ab7bb2da 100644 --- a/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-image-canvas-expected.png +++ b/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-image-canvas-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-image-canvas-pattern-expected.png b/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-image-canvas-pattern-expected.png index c6d9e832..6e84da6 100644 --- a/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-image-canvas-pattern-expected.png +++ b/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-image-canvas-pattern-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/exif-orientation-height-image-document-expected.png b/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/exif-orientation-height-image-document-expected.png index 679d3b5f..6366d72 100644 --- a/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/exif-orientation-height-image-document-expected.png +++ b/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/exif-orientation-height-image-document-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/gpu-rasterization/images/color-profile-image-canvas-expected.png b/third_party/WebKit/LayoutTests/virtual/gpu-rasterization/images/color-profile-image-canvas-expected.png index 5338925..c164551 100644 --- a/third_party/WebKit/LayoutTests/virtual/gpu-rasterization/images/color-profile-image-canvas-expected.png +++ b/third_party/WebKit/LayoutTests/virtual/gpu-rasterization/images/color-profile-image-canvas-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/gpu-rasterization/images/color-profile-image-canvas-pattern-expected.png b/third_party/WebKit/LayoutTests/virtual/gpu-rasterization/images/color-profile-image-canvas-pattern-expected.png index 197d272..181b748 100644 --- a/third_party/WebKit/LayoutTests/virtual/gpu-rasterization/images/color-profile-image-canvas-pattern-expected.png +++ b/third_party/WebKit/LayoutTests/virtual/gpu-rasterization/images/color-profile-image-canvas-pattern-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/service-worker-navigation-preload-disabled/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/virtual/service-worker-navigation-preload-disabled/webexposed/global-interface-listing-expected.txt index 553a40d..adcfe35b 100644 --- a/third_party/WebKit/LayoutTests/virtual/service-worker-navigation-preload-disabled/webexposed/global-interface-listing-expected.txt +++ b/third_party/WebKit/LayoutTests/virtual/service-worker-navigation-preload-disabled/webexposed/global-interface-listing-expected.txt
@@ -4939,8 +4939,8 @@ interface PerformanceServerTiming attribute @@toStringTag getter description - getter metric - getter value + getter duration + getter name method constructor interface PerformanceTiming attribute @@toStringTag
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt index f1c0e7d..ff1ddb4 100644 --- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt +++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
@@ -4946,8 +4946,8 @@ interface PerformanceServerTiming attribute @@toStringTag getter description - getter metric - getter value + getter duration + getter name method constructor interface PerformanceTiming attribute @@toStringTag
diff --git a/third_party/WebKit/Source/bindings/templates/interface_base.cpp.tmpl b/third_party/WebKit/Source/bindings/templates/interface_base.cpp.tmpl index 0e04b24..c4c65283 100644 --- a/third_party/WebKit/Source/bindings/templates/interface_base.cpp.tmpl +++ b/third_party/WebKit/Source/bindings/templates/interface_base.cpp.tmpl
@@ -911,7 +911,7 @@ } void {{v8_class_or_partial}}::install{{feature.name}}(ScriptState* scriptState, v8::Local<v8::Object> instance) { - V8PerContextData* perContextData = V8PerContextData::From(scriptState->GetContext()); + V8PerContextData* perContextData = scriptState->PerContextData(); v8::Local<v8::Object> prototype = perContextData->PrototypeForType(&{{v8_class}}::wrapperTypeInfo); v8::Local<v8::Function> interface = perContextData->ConstructorForType(&{{v8_class}}::wrapperTypeInfo); ALLOW_UNUSED_LOCAL(interface);
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestConstants.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestConstants.cpp index fd15644..d2afdd9 100644 --- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestConstants.cpp +++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestConstants.cpp
@@ -199,7 +199,7 @@ } void V8TestConstants::installFeatureName1(ScriptState* scriptState, v8::Local<v8::Object> instance) { - V8PerContextData* perContextData = V8PerContextData::From(scriptState->GetContext()); + V8PerContextData* perContextData = scriptState->PerContextData(); v8::Local<v8::Object> prototype = perContextData->PrototypeForType(&V8TestConstants::wrapperTypeInfo); v8::Local<v8::Function> interface = perContextData->ConstructorForType(&V8TestConstants::wrapperTypeInfo); ALLOW_UNUSED_LOCAL(interface); @@ -218,7 +218,7 @@ } void V8TestConstants::installFeatureName2(ScriptState* scriptState, v8::Local<v8::Object> instance) { - V8PerContextData* perContextData = V8PerContextData::From(scriptState->GetContext()); + V8PerContextData* perContextData = scriptState->PerContextData(); v8::Local<v8::Object> prototype = perContextData->PrototypeForType(&V8TestConstants::wrapperTypeInfo); v8::Local<v8::Function> interface = perContextData->ConstructorForType(&V8TestConstants::wrapperTypeInfo); ALLOW_UNUSED_LOCAL(interface);
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.cpp index f88287b..4748e12 100644 --- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.cpp +++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.cpp
@@ -13060,7 +13060,7 @@ } void V8TestObject::installFeatureName(ScriptState* scriptState, v8::Local<v8::Object> instance) { - V8PerContextData* perContextData = V8PerContextData::From(scriptState->GetContext()); + V8PerContextData* perContextData = scriptState->PerContextData(); v8::Local<v8::Object> prototype = perContextData->PrototypeForType(&V8TestObject::wrapperTypeInfo); v8::Local<v8::Function> interface = perContextData->ConstructorForType(&V8TestObject::wrapperTypeInfo); ALLOW_UNUSED_LOCAL(interface);
diff --git a/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterfacePartial.cpp b/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterfacePartial.cpp index 070f582..0d32c442 100644 --- a/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterfacePartial.cpp +++ b/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterfacePartial.cpp
@@ -507,7 +507,7 @@ } void V8TestInterfacePartial::installOriginTrialPartialFeature(ScriptState* scriptState, v8::Local<v8::Object> instance) { - V8PerContextData* perContextData = V8PerContextData::From(scriptState->GetContext()); + V8PerContextData* perContextData = scriptState->PerContextData(); v8::Local<v8::Object> prototype = perContextData->PrototypeForType(&V8TestInterface::wrapperTypeInfo); v8::Local<v8::Function> interface = perContextData->ConstructorForType(&V8TestInterface::wrapperTypeInfo); ALLOW_UNUSED_LOCAL(interface);
diff --git a/third_party/WebKit/Source/core/BUILD.gn b/third_party/WebKit/Source/core/BUILD.gn index f80c029..ef7bd85 100644 --- a/third_party/WebKit/Source/core/BUILD.gn +++ b/third_party/WebKit/Source/core/BUILD.gn
@@ -16,9 +16,6 @@ import("//third_party/WebKit/Source/build/scripts/scripts.gni") import("//third_party/WebKit/Source/modules/modules_idl_files.gni") import("//third_party/WebKit/Source/platform/platform_generated.gni") -if (is_win) { - import("//build/config/win/visual_studio_version.gni") -} visibility = [ "//third_party/WebKit/Source/*", @@ -216,16 +213,14 @@ "//third_party/WebKit/Source/core/xmlhttprequest", ] - if (is_win && is_debug && is_component_build && - visual_studio_version == "2015" && current_cpu == "x64") { - # Incremental linking fails in MSVC2015 when the .ilk file gets too large. + if (is_win && is_debug && is_component_build && current_cpu == "x64") { + # Incremental linking fails when the .ilk file gets too large. # 64-bit debug builds with full symbols trigger this problem, so we turn # off incremental linking in that configuration. # For fastest builds, use component release builds without debug # information. # VC++ bug filed for 64-bit debug incremental link failures: # https://connect.microsoft.com/VisualStudio/feedback/details/2846790 - # This is fixed in MSVC2017. configs -= [ "//build/config/win:default_incremental_linking" ] configs += [ "//build/config/win:no_incremental_linking" ] } @@ -1314,7 +1309,6 @@ "css/invalidation/StyleInvalidatorTest.cpp", "css/parser/CSSLazyParsingTest.cpp", "css/parser/CSSParserFastPathsTest.cpp", - "css/parser/CSSParserTokenStreamTest.cpp", "css/parser/CSSParserTokenTest.cpp", "css/parser/CSSPropertyParserTest.cpp", "css/parser/CSSSelectorParserTest.cpp",
diff --git a/third_party/WebKit/Source/core/css/BUILD.gn b/third_party/WebKit/Source/core/css/BUILD.gn index ee3fcd9..7205daa 100644 --- a/third_party/WebKit/Source/core/css/BUILD.gn +++ b/third_party/WebKit/Source/core/css/BUILD.gn
@@ -351,7 +351,6 @@ "parser/CSSParserToken.h", "parser/CSSParserTokenRange.cpp", "parser/CSSParserTokenRange.h", - "parser/CSSParserTokenStream.cpp", "parser/CSSParserTokenStream.h", "parser/CSSPropertyParser.cpp", "parser/CSSPropertyParser.h", @@ -579,6 +578,7 @@ "properties/CSSPropertyWebkitBorderWidthUtils.h", "properties/CSSShorthandPropertyAPIAnimation.cpp", "properties/CSSShorthandPropertyAPIBackgroundPosition.cpp", + "properties/CSSShorthandPropertyAPIBorder.cpp", "properties/CSSShorthandPropertyAPIBorderBottom.cpp", "properties/CSSShorthandPropertyAPIBorderColor.cpp", "properties/CSSShorthandPropertyAPIBorderImage.cpp",
diff --git a/third_party/WebKit/Source/core/css/CSSProperties.json5 b/third_party/WebKit/Source/core/css/CSSProperties.json5 index 836a66fb..7e1c5d4 100644 --- a/third_party/WebKit/Source/core/css/CSSProperties.json5 +++ b/third_party/WebKit/Source/core/css/CSSProperties.json5
@@ -3885,6 +3885,7 @@ name: "border", longhands: ["border-top-color", "border-top-style", "border-top-width", "border-right-color", "border-right-style", "border-right-width", "border-bottom-color", "border-bottom-style", "border-bottom-width", "border-left-color", "border-left-style", "border-left-width", "border-image-source", "border-image-slice", "border-image-width", "border-image-outset", "border-image-repeat"], api_class: true, + api_methods: ["ParseShorthand"], }, { name: "border-bottom",
diff --git a/third_party/WebKit/Source/core/css/parser/CSSParserImpl.cpp b/third_party/WebKit/Source/core/css/parser/CSSParserImpl.cpp index 5e68393..9d9803f 100644 --- a/third_party/WebKit/Source/core/css/parser/CSSParserImpl.cpp +++ b/third_party/WebKit/Source/core/css/parser/CSSParserImpl.cpp
@@ -169,7 +169,8 @@ CSSParserImpl parser(context, document.ElementSheet().Contents()); CSSTokenizer tokenizer(string); CSSParserTokenStream stream(tokenizer); - parser.ConsumeDeclarationList(stream, StyleRule::kStyle); + // TODO(shend): Use streams instead of ranges + parser.ConsumeDeclarationList(stream.MakeRangeToEOF(), StyleRule::kStyle); return CreateStylePropertySet(parser.parsed_properties_, mode); } @@ -182,7 +183,8 @@ rule_type = StyleRule::kViewport; CSSTokenizer tokenizer(string); CSSParserTokenStream stream(tokenizer); - parser.ConsumeDeclarationList(stream, rule_type); + // TODO(shend): Use streams instead of ranges + parser.ConsumeDeclarationList(stream.MakeRangeToEOF(), rule_type); if (parser.parsed_properties_.IsEmpty()) return false; @@ -846,57 +848,6 @@ CreateStylePropertySet(parsed_properties_, context_->Mode())); } -void CSSParserImpl::ConsumeDeclarationList(CSSParserTokenStream& stream, - StyleRule::RuleType rule_type) { - DCHECK(parsed_properties_.IsEmpty()); - - bool use_observer = observer_wrapper_ && (rule_type == StyleRule::kStyle || - rule_type == StyleRule::kKeyframe); - DCHECK(!use_observer); // TODO(shend): Implement streaming with observers. - - while (!stream.AtEnd()) { - switch (stream.UncheckedPeek().GetType()) { - case kWhitespaceToken: - case kSemicolonToken: - stream.UncheckedConsume(); - break; - case kIdentToken: { - // TODO(shend): Use streams instead of ranges - auto range = stream.MakeRangeToEOF(); - - const CSSParserToken* declaration_start = &range.Peek(); - while (!range.AtEnd() && range.Peek().GetType() != kSemicolonToken) - range.ConsumeComponentValue(); - - ConsumeDeclaration(range.MakeSubRange(declaration_start, &range.Peek()), - rule_type); - - stream.UpdatePositionFromRange(range); - break; - } - case kAtKeywordToken: { - AllowedRulesType allowed_rules = - rule_type == StyleRule::kStyle && - RuntimeEnabledFeatures::CSSApplyAtRulesEnabled() - ? kApplyRules - : kNoRules; - - // TODO(shend): Use streams instead of ranges - auto range = stream.MakeRangeToEOF(); - StyleRuleBase* rule = ConsumeAtRule(range, allowed_rules); - stream.UpdatePositionFromRange(range); - DCHECK(!rule); - break; - } - default: // Parse error, unexpected token in declaration list - while (!stream.AtEnd() && - stream.UncheckedPeek().GetType() != kSemicolonToken) - stream.UncheckedConsumeComponentValue(); - break; - } - } -} - void CSSParserImpl::ConsumeDeclarationList(CSSParserTokenRange range, StyleRule::RuleType rule_type) { DCHECK(parsed_properties_.IsEmpty());
diff --git a/third_party/WebKit/Source/core/css/parser/CSSParserImpl.h b/third_party/WebKit/Source/core/css/parser/CSSParserImpl.h index a467eea3f..df169ad 100644 --- a/third_party/WebKit/Source/core/css/parser/CSSParserImpl.h +++ b/third_party/WebKit/Source/core/css/parser/CSSParserImpl.h
@@ -21,7 +21,6 @@ class CSSParserContext; class CSSParserObserver; class CSSParserObserverWrapper; -class CSSParserTokenStream; class StyleRule; class StyleRuleBase; class StyleRuleCharset; @@ -141,8 +140,6 @@ StyleRule* ConsumeStyleRule(CSSParserTokenRange prelude, CSSParserTokenRange block); - void ConsumeDeclarationList(CSSParserTokenStream&, StyleRule::RuleType); - // TODO(shend): Remove this overload once we switch over to streams. void ConsumeDeclarationList(CSSParserTokenRange, StyleRule::RuleType); void ConsumeDeclaration(CSSParserTokenRange, StyleRule::RuleType); void ConsumeDeclarationValue(CSSParserTokenRange,
diff --git a/third_party/WebKit/Source/core/css/parser/CSSParserTokenStream.cpp b/third_party/WebKit/Source/core/css/parser/CSSParserTokenStream.cpp deleted file mode 100644 index 0a2eaf1..0000000 --- a/third_party/WebKit/Source/core/css/parser/CSSParserTokenStream.cpp +++ /dev/null
@@ -1,20 +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 "core/css/parser/CSSParserTokenStream.h" - -namespace blink { - -void CSSParserTokenStream::UncheckedConsumeComponentValue() { - unsigned nesting_level = 0; - do { - const CSSParserToken& token = UncheckedConsume(); - if (token.GetBlockType() == CSSParserToken::kBlockStart) - nesting_level++; - else if (token.GetBlockType() == CSSParserToken::kBlockEnd) - nesting_level--; - } while (nesting_level && !AtEnd()); -} - -} // namespace blink
diff --git a/third_party/WebKit/Source/core/css/parser/CSSParserTokenStream.h b/third_party/WebKit/Source/core/css/parser/CSSParserTokenStream.h index fbfb0ad..ba4c05b 100644 --- a/third_party/WebKit/Source/core/css/parser/CSSParserTokenStream.h +++ b/third_party/WebKit/Source/core/css/parser/CSSParserTokenStream.h
@@ -6,75 +6,23 @@ #define CSSParserTokenStream_h #include "CSSTokenizer.h" -#include "core/css/parser/CSSParserTokenRange.h" namespace blink { // A streaming interface to CSSTokenizer that tokenizes on demand. -// Methods prefixed with "Unchecked" can only be called after Peek() -// returns a non-EOF token or after AtEnd() returns false, with no -// subsequent modifications to the stream such as a consume. -class CORE_EXPORT CSSParserTokenStream { +class CSSParserTokenStream { DISALLOW_NEW(); public: explicit CSSParserTokenStream(CSSTokenizer& tokenizer) - : tokenizer_(tokenizer), next_index_(0) { + : tokenizer_(tokenizer) { DCHECK_EQ(tokenizer.tokens_.size(), 0U); } - // TODO(shend): Remove this method. We should never convert from a range to a - // stream. We can remove this once all the functions in CSSParserImpl.h accept - // streams. - void UpdatePositionFromRange(const CSSParserTokenRange& range) { - next_index_ = range.begin() - tokenizer_.tokens_.begin(); - } - - const CSSParserToken& Peek() const { - if (next_index_ == tokenizer_.tokens_.size()) { - // Reached end of token buffer, but might not be end of input. - if (tokenizer_.TokenizeSingle().IsEOF()) - return g_static_eof_token; - } - DCHECK_LT(next_index_, tokenizer_.tokens_.size()); - return UncheckedPeek(); - } - - const CSSParserToken& UncheckedPeek() const { - DCHECK_LT(next_index_, tokenizer_.tokens_.size()); - return tokenizer_.tokens_[next_index_]; - } - - const CSSParserToken& Consume() { - const CSSParserToken& token = Peek(); - if (!token.IsEOF()) - next_index_++; - - DCHECK_LE(next_index_, tokenizer_.tokens_.size()); - return token; - } - - const CSSParserToken& UncheckedConsume() { - DCHECK_LE(next_index_, tokenizer_.tokens_.size()); - return tokenizer_.tokens_[next_index_++]; - } - - bool AtEnd() const { return Peek().IsEOF(); } - - // Range represents all tokens from current position to EOF. - // Eagerly consumes all the remaining input. - // TODO(shend): Remove this method once we switch over to using streams - // completely. - CSSParserTokenRange MakeRangeToEOF() { - return tokenizer_.TokenRange().MakeSubRange( - tokenizer_.tokens_.begin() + next_index_, tokenizer_.tokens_.end()); - } - - void UncheckedConsumeComponentValue(); + CSSParserTokenRange MakeRangeToEOF() { return tokenizer_.TokenRange(); } private: CSSTokenizer& tokenizer_; - size_t next_index_; // Index of next token to be consumed. }; } // namespace blink
diff --git a/third_party/WebKit/Source/core/css/parser/CSSParserTokenStreamTest.cpp b/third_party/WebKit/Source/core/css/parser/CSSParserTokenStreamTest.cpp deleted file mode 100644 index e675e4d..0000000 --- a/third_party/WebKit/Source/core/css/parser/CSSParserTokenStreamTest.cpp +++ /dev/null
@@ -1,93 +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 "core/css/parser/CSSParserTokenStream.h" - -#include "testing/gtest/include/gtest/gtest.h" - -namespace blink { - -TEST(CSSParserTokenStreamTest, EmptyStream) { - CSSTokenizer tokenizer(""); - CSSParserTokenStream stream(tokenizer); - EXPECT_TRUE(stream.Consume().IsEOF()); - EXPECT_TRUE(stream.Peek().IsEOF()); - EXPECT_TRUE(stream.AtEnd()); - EXPECT_TRUE(stream.MakeRangeToEOF().AtEnd()); -} - -TEST(CSSParserTokenStreamTest, PeekThenConsume) { - CSSTokenizer tokenizer("A"); // kIdent - CSSParserTokenStream stream(tokenizer); - EXPECT_EQ(kIdentToken, stream.Peek().GetType()); - EXPECT_EQ(kIdentToken, stream.Consume().GetType()); - EXPECT_TRUE(stream.AtEnd()); -} - -TEST(CSSParserTokenStreamTest, ConsumeThenPeek) { - CSSTokenizer tokenizer("A"); // kIdent - CSSParserTokenStream stream(tokenizer); - EXPECT_EQ(kIdentToken, stream.Consume().GetType()); - EXPECT_TRUE(stream.AtEnd()); -} - -TEST(CSSParserTokenStreamTest, ConsumeMultipleTokens) { - CSSTokenizer tokenizer("A 1"); // kIdent kWhitespace kNumber - CSSParserTokenStream stream(tokenizer); - EXPECT_EQ(kIdentToken, stream.Consume().GetType()); - EXPECT_EQ(kWhitespaceToken, stream.Consume().GetType()); - EXPECT_EQ(kNumberToken, stream.Consume().GetType()); - EXPECT_TRUE(stream.AtEnd()); -} - -TEST(CSSParserTokenStreamTest, UncheckedPeekAndConsumeAfterPeek) { - CSSTokenizer tokenizer("A"); // kIdent - CSSParserTokenStream stream(tokenizer); - EXPECT_EQ(kIdentToken, stream.Peek().GetType()); - EXPECT_EQ(kIdentToken, stream.UncheckedPeek().GetType()); - EXPECT_EQ(kIdentToken, stream.UncheckedConsume().GetType()); - EXPECT_TRUE(stream.AtEnd()); -} - -TEST(CSSParserTokenStreamTest, UncheckedPeekAndConsumeAfterAtEnd) { - CSSTokenizer tokenizer("A"); // kIdent - CSSParserTokenStream stream(tokenizer); - EXPECT_FALSE(stream.AtEnd()); - EXPECT_EQ(kIdentToken, stream.UncheckedPeek().GetType()); - EXPECT_EQ(kIdentToken, stream.UncheckedConsume().GetType()); - EXPECT_TRUE(stream.AtEnd()); -} - -TEST(CSSParserTokenStreamTest, MakeRangeToEOF) { - CSSTokenizer tokenizer("A 1"); // kIdent kWhitespace kNumber - CSSParserTokenStream stream(tokenizer); - EXPECT_EQ(kIdentToken, stream.Consume().GetType()); - - auto range = stream.MakeRangeToEOF(); - EXPECT_FALSE(stream.AtEnd()); - EXPECT_EQ(kWhitespaceToken, range.Consume().GetType()); - EXPECT_FALSE(stream.AtEnd()); - EXPECT_EQ(kNumberToken, range.Consume().GetType()); - EXPECT_TRUE(range.AtEnd()); - - EXPECT_FALSE(stream.AtEnd()); -} - -TEST(CSSParserTokenStreamTest, UncheckedConsumeComponentValue) { - CSSTokenizer tokenizer("A{1}{2{3}}B"); - CSSParserTokenStream stream(tokenizer); - - EXPECT_EQ(kIdentToken, stream.Peek().GetType()); - stream.UncheckedConsumeComponentValue(); - EXPECT_EQ(kLeftBraceToken, stream.Peek().GetType()); - stream.UncheckedConsumeComponentValue(); - EXPECT_EQ(kLeftBraceToken, stream.Peek().GetType()); - stream.UncheckedConsumeComponentValue(); - EXPECT_EQ(kIdentToken, stream.Peek().GetType()); - stream.UncheckedConsumeComponentValue(); - - EXPECT_TRUE(stream.AtEnd()); -} - -} // namespace blink
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp index c4ffff4..ef4185dc 100644 --- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp +++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
@@ -77,17 +77,6 @@ *parsed_properties_); } -void CSSPropertyParser::AddExpandedPropertyForValue(CSSPropertyID property, - const CSSValue& value, - bool important) { - const StylePropertyShorthand& shorthand = shorthandForProperty(property); - unsigned shorthand_length = shorthand.length(); - DCHECK(shorthand_length); - const CSSPropertyID* longhands = shorthand.properties(); - for (unsigned i = 0; i < shorthand_length; ++i) - AddParsedProperty(longhands[i], property, value, important); -} - bool CSSPropertyParser::ParseValue( CSSPropertyID unresolved_property, bool important, @@ -166,7 +155,8 @@ if (is_shorthand) { const CSSPendingSubstitutionValue& pending_value = *CSSPendingSubstitutionValue::Create(property_id, variable); - AddExpandedPropertyForValue(property_id, pending_value, important); + AddExpandedPropertyForValue(property_id, pending_value, important, + *parsed_properties_); } else { AddParsedProperty(property_id, CSSPropertyInvalid, *variable, important); } @@ -273,7 +263,8 @@ return false; AddParsedProperty(property, CSSPropertyInvalid, *value, important); } else { - AddExpandedPropertyForValue(property, *value, important); + AddExpandedPropertyForValue(property, *value, important, + *parsed_properties_); } range_ = range_copy; return true; @@ -710,50 +701,6 @@ } } -bool CSSPropertyParser::ConsumeBorder(bool important) { - CSSValue* width = nullptr; - const CSSValue* style = nullptr; - CSSValue* color = nullptr; - - while (!width || !style || !color) { - if (!width) { - width = - ConsumeLineWidth(range_, context_->Mode(), UnitlessQuirk::kForbid); - if (width) - continue; - } - if (!style) { - style = ParseSingleValue(CSSPropertyBorderLeftStyle, CSSPropertyBorder); - if (style) - continue; - } - if (!color) { - color = ConsumeColor(range_, context_->Mode()); - if (color) - continue; - } - break; - } - - if (!width && !style && !color) - return false; - - if (!width) - width = CSSInitialValue::Create(); - if (!style) - style = CSSInitialValue::Create(); - if (!color) - color = CSSInitialValue::Create(); - - AddExpandedPropertyForValue(CSSPropertyBorderWidth, *width, important); - AddExpandedPropertyForValue(CSSPropertyBorderStyle, *style, important); - AddExpandedPropertyForValue(CSSPropertyBorderColor, *color, important); - AddExpandedPropertyForValue(CSSPropertyBorderImage, - *CSSInitialValue::Create(), important); - - return range_.AtEnd(); -} - static bool ConsumeRepeatStyleComponent(CSSParserTokenRange& range, CSSValue*& value1, CSSValue*& value2, @@ -920,8 +867,6 @@ } switch (property) { - case CSSPropertyBorder: - return ConsumeBorder(important); case CSSPropertyBackgroundRepeat: case CSSPropertyWebkitMaskRepeat: { CSSValue* result_x = nullptr;
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.h b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.h index 56933e0..7b0c3e8 100644 --- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.h +++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.h
@@ -77,11 +77,6 @@ const CSSValue&, bool important, bool implicit = false); - void AddExpandedPropertyForValue(CSSPropertyID prop_id, - const CSSValue&, - bool); - - bool ConsumeBorder(bool important); bool ParseShorthand(CSSPropertyID, bool important);
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp b/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp index ac8946f..5b3dcc14 100644 --- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp +++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp
@@ -1712,6 +1712,20 @@ return true; } +void AddExpandedPropertyForValue(CSSPropertyID property, + const CSSValue& value, + bool important, + HeapVector<CSSProperty, 256>& properties) { + const StylePropertyShorthand& shorthand = shorthandForProperty(property); + unsigned shorthand_length = shorthand.length(); + DCHECK(shorthand_length); + const CSSPropertyID* longhands = shorthand.properties(); + for (unsigned i = 0; i < shorthand_length; ++i) { + AddProperty(longhands[i], property, value, important, + IsImplicitProperty::kNotImplicit, properties); + } +} + } // namespace CSSPropertyParserHelpers } // namespace blink
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.h b/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.h index 0813aca..7da7e93b 100644 --- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.h +++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.h
@@ -150,6 +150,11 @@ CSSParserTokenRange&, HeapVector<CSSProperty, 256>& properties); +void AddExpandedPropertyForValue(CSSPropertyID prop_id, + const CSSValue&, + bool, + HeapVector<CSSProperty, 256>& properties); + // Template implementations are at the bottom of the file for readability. template <typename... emptyBaseCase>
diff --git a/third_party/WebKit/Source/core/css/properties/CSSShorthandPropertyAPIBorder.cpp b/third_party/WebKit/Source/core/css/properties/CSSShorthandPropertyAPIBorder.cpp new file mode 100644 index 0000000..b95f80f2 --- /dev/null +++ b/third_party/WebKit/Source/core/css/properties/CSSShorthandPropertyAPIBorder.cpp
@@ -0,0 +1,71 @@ +// 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 "core/css/properties/CSSShorthandPropertyAPIBorder.h" + +#include "core/css/CSSInitialValue.h" +#include "core/css/parser/CSSParserContext.h" +#include "core/css/parser/CSSPropertyParserHelpers.h" + +namespace blink { + +bool CSSShorthandPropertyAPIBorder::ParseShorthand( + bool important, + CSSParserTokenRange& range, + const CSSParserContext& context, + bool use_legacy_parsing, + HeapVector<CSSProperty, 256>& properties) { + CSSValue* width = nullptr; + const CSSValue* style = nullptr; + CSSValue* color = nullptr; + + while (!width || !style || !color) { + if (!width) { + width = CSSPropertyParserHelpers::ConsumeLineWidth( + range, context.Mode(), + CSSPropertyParserHelpers::UnitlessQuirk::kForbid); + if (width) + continue; + } + if (!style) { + bool needs_legacy_parsing = false; + style = CSSPropertyParserHelpers::ParseLonghandViaAPI( + CSSPropertyBorderLeftStyle, CSSPropertyBorder, context, range, + needs_legacy_parsing); + DCHECK(!needs_legacy_parsing); + if (style) + continue; + } + if (!color) { + color = CSSPropertyParserHelpers::ConsumeColor(range, context.Mode()); + if (color) + continue; + } + break; + } + + if (!width && !style && !color) + return false; + + if (!width) + width = CSSInitialValue::Create(); + if (!style) + style = CSSInitialValue::Create(); + if (!color) + color = CSSInitialValue::Create(); + + CSSPropertyParserHelpers::AddExpandedPropertyForValue( + CSSPropertyBorderWidth, *width, important, properties); + CSSPropertyParserHelpers::AddExpandedPropertyForValue( + CSSPropertyBorderStyle, *style, important, properties); + CSSPropertyParserHelpers::AddExpandedPropertyForValue( + CSSPropertyBorderColor, *color, important, properties); + CSSPropertyParserHelpers::AddExpandedPropertyForValue( + CSSPropertyBorderImage, *CSSInitialValue::Create(), important, + properties); + + return range.AtEnd(); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/core/dom/Range.cpp b/third_party/WebKit/Source/core/dom/Range.cpp index 5cfc8ad9..981602e 100644 --- a/third_party/WebKit/Source/core/dom/Range.cpp +++ b/third_party/WebKit/Source/core/dom/Range.cpp
@@ -1610,27 +1610,32 @@ return DOMRect::FromFloatRect(BoundingRect()); } +// https://www.w3.org/TR/cssom-view-1/#dom-range-getclientrects void Range::GetBorderAndTextQuads(Vector<FloatQuad>& quads) const { Node* start_container = &start_.Container(); Node* end_container = &end_.Container(); Node* stop_node = PastLastNode(); - HeapHashSet<Member<Node>> node_set; + // Stores the elements selected by the range. + HeapHashSet<Member<Node>> selected_elements; for (Node* node = FirstNode(); node != stop_node; node = NodeTraversal::Next(*node)) { - if (node->IsElementNode()) - node_set.insert(node); + if (!node->IsElementNode()) + continue; + if (selected_elements.Contains(node->parentNode()) || + (!node->contains(start_container) && !node->contains(end_container))) { + DCHECK_LE(StartPosition(), Position::BeforeNode(*node)); + DCHECK_GE(EndPosition(), Position::AfterNode(*node)); + selected_elements.insert(node); + } } for (Node* node = FirstNode(); node != stop_node; node = NodeTraversal::Next(*node)) { if (node->IsElementNode()) { - // Exclude start & end container unless the entire corresponding - // node is included in the range. - if (!node_set.Contains(node->parentNode()) && - (start_container == end_container || - (!node->contains(start_container) && - !node->contains(end_container)))) { + // TODO(xiaochengh): Apply early continue style to reduce indentation. + if (selected_elements.Contains(node) && + !selected_elements.Contains(node->parentNode())) { if (LayoutObject* layout_object = ToElement(node)->GetLayoutObject()) { Vector<FloatQuad> element_quads; layout_object->AbsoluteQuads(element_quads);
diff --git a/third_party/WebKit/Source/core/dom/RangeTest.cpp b/third_party/WebKit/Source/core/dom/RangeTest.cpp index 64ca6ff..34d94d7 100644 --- a/third_party/WebKit/Source/core/dom/RangeTest.cpp +++ b/third_party/WebKit/Source/core/dom/RangeTest.cpp
@@ -296,4 +296,20 @@ EXPECT_EQ(rect_before, rect_after); } +// Regression test for crbug.com/681536 +TEST_F(RangeTest, BorderAndTextQuadsWithInputInBetween) { + GetDocument().body()->setInnerHTML("<div>foo <u><input> bar</u></div>"); + GetDocument().UpdateStyleAndLayout(); + + Node* foo = GetDocument().QuerySelector("div")->firstChild(); + Node* bar = GetDocument().QuerySelector("u")->lastChild(); + Range* range = Range::Create(GetDocument(), foo, 2, bar, 2); + + Vector<FloatQuad> quads; + range->GetBorderAndTextQuads(quads); + + // Should get one quad for "o ", <input> and " b", respectively. + ASSERT_EQ(3u, quads.size()); +} + } // namespace blink
diff --git a/third_party/WebKit/Source/core/editing/BUILD.gn b/third_party/WebKit/Source/core/editing/BUILD.gn index 5434e49d..bbdb5c2 100644 --- a/third_party/WebKit/Source/core/editing/BUILD.gn +++ b/third_party/WebKit/Source/core/editing/BUILD.gn
@@ -9,10 +9,6 @@ sources = [ "CaretDisplayItemClient.cpp", "CaretDisplayItemClient.h", - "CompositionUnderline.cpp", - "CompositionUnderline.h", - "CompositionUnderlineVectorBuilder.cpp", - "CompositionUnderlineVectorBuilder.h", "DOMSelection.cpp", "DOMSelection.h", "DragCaret.cpp", @@ -42,6 +38,10 @@ "FrameSelection.h", "GranularityStrategy.cpp", "GranularityStrategy.h", + "ImeTextSpan.cpp", + "ImeTextSpan.h", + "ImeTextSpanVectorBuilder.cpp", + "ImeTextSpanVectorBuilder.h", "InlineBoxTraversal.cpp", "InlineBoxTraversal.h", "InputMethodController.cpp", @@ -310,7 +310,6 @@ source_set("unit_tests") { testonly = true sources = [ - "CompositionUnderlineTest.cpp", "EditingCommandTest.cpp", "EditingStrategyTest.cpp", "EditingStyleTest.cpp", @@ -322,6 +321,7 @@ "FrameCaretTest.cpp", "FrameSelectionTest.cpp", "GranularityStrategyTest.cpp", + "ImeTextSpanTest.cpp", "InputMethodControllerTest.cpp", "LayoutSelectionTest.cpp", "PositionIteratorTest.cpp",
diff --git a/third_party/WebKit/Source/core/editing/CompositionUnderline.cpp b/third_party/WebKit/Source/core/editing/CompositionUnderline.cpp deleted file mode 100644 index 5bd9d7d..0000000 --- a/third_party/WebKit/Source/core/editing/CompositionUnderline.cpp +++ /dev/null
@@ -1,33 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "core/editing/CompositionUnderline.h" - -#include <algorithm> -#include "public/web/WebCompositionUnderline.h" - -namespace blink { - -CompositionUnderline::CompositionUnderline(unsigned start_offset, - unsigned end_offset, - const Color& color, - bool thick, - const Color& background_color) - : color_(color), thick_(thick), background_color_(background_color) { - // Sanitize offsets by ensuring a valid range corresponding to the last - // possible position. - // TODO(wkorman): Consider replacing with DCHECK_LT(startOffset, endOffset). - start_offset_ = - std::min(start_offset, std::numeric_limits<unsigned>::max() - 1u); - end_offset_ = std::max(start_offset_ + 1u, end_offset); -} - -CompositionUnderline::CompositionUnderline( - const WebCompositionUnderline& underline) - : CompositionUnderline(underline.start_offset, - underline.end_offset, - Color(underline.color), - underline.thick, - Color(underline.background_color)) {} -} // namespace blink
diff --git a/third_party/WebKit/Source/core/editing/CompositionUnderlineTest.cpp b/third_party/WebKit/Source/core/editing/CompositionUnderlineTest.cpp deleted file mode 100644 index ef0a2fb..0000000 --- a/third_party/WebKit/Source/core/editing/CompositionUnderlineTest.cpp +++ /dev/null
@@ -1,72 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "core/editing/CompositionUnderline.h" - -#include "testing/gtest/include/gtest/gtest.h" - -namespace blink { -namespace { - -CompositionUnderline CreateCompositionUnderline(unsigned start_offset, - unsigned end_offset) { - return CompositionUnderline(start_offset, end_offset, Color::kTransparent, - false, Color::kTransparent); -} - -TEST(CompositionUnderlineTest, OneChar) { - CompositionUnderline underline = CreateCompositionUnderline(0, 1); - EXPECT_EQ(0u, underline.StartOffset()); - EXPECT_EQ(1u, underline.EndOffset()); -} - -TEST(CompositionUnderlineTest, MultiChar) { - CompositionUnderline underline = CreateCompositionUnderline(0, 5); - EXPECT_EQ(0u, underline.StartOffset()); - EXPECT_EQ(5u, underline.EndOffset()); -} - -TEST(CompositionUnderlineTest, ZeroLength) { - CompositionUnderline underline = CreateCompositionUnderline(0, 0); - EXPECT_EQ(0u, underline.StartOffset()); - EXPECT_EQ(1u, underline.EndOffset()); -} - -TEST(CompositionUnderlineTest, ZeroLengthNonZeroStart) { - CompositionUnderline underline = CreateCompositionUnderline(3, 3); - EXPECT_EQ(3u, underline.StartOffset()); - EXPECT_EQ(4u, underline.EndOffset()); -} - -TEST(CompositionUnderlineTest, EndBeforeStart) { - CompositionUnderline underline = CreateCompositionUnderline(1, 0); - EXPECT_EQ(1u, underline.StartOffset()); - EXPECT_EQ(2u, underline.EndOffset()); -} - -TEST(CompositionUnderlineTest, LastChar) { - CompositionUnderline underline = - CreateCompositionUnderline(std::numeric_limits<unsigned>::max() - 1, - std::numeric_limits<unsigned>::max()); - EXPECT_EQ(std::numeric_limits<unsigned>::max() - 1, underline.StartOffset()); - EXPECT_EQ(std::numeric_limits<unsigned>::max(), underline.EndOffset()); -} - -TEST(CompositionUnderlineTest, LastCharEndBeforeStart) { - CompositionUnderline underline = - CreateCompositionUnderline(std::numeric_limits<unsigned>::max(), - std::numeric_limits<unsigned>::max() - 1); - EXPECT_EQ(std::numeric_limits<unsigned>::max() - 1, underline.StartOffset()); - EXPECT_EQ(std::numeric_limits<unsigned>::max(), underline.EndOffset()); -} - -TEST(CompositionUnderlineTest, LastCharEndBeforeStartZeroEnd) { - CompositionUnderline underline = - CreateCompositionUnderline(std::numeric_limits<unsigned>::max(), 0); - EXPECT_EQ(std::numeric_limits<unsigned>::max() - 1, underline.StartOffset()); - EXPECT_EQ(std::numeric_limits<unsigned>::max(), underline.EndOffset()); -} - -} // namespace -} // namespace blink
diff --git a/third_party/WebKit/Source/core/editing/ImeTextSpan.cpp b/third_party/WebKit/Source/core/editing/ImeTextSpan.cpp new file mode 100644 index 0000000..e337a2ee2 --- /dev/null +++ b/third_party/WebKit/Source/core/editing/ImeTextSpan.cpp
@@ -0,0 +1,33 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/editing/ImeTextSpan.h" + +#include <algorithm> +#include "public/web/WebImeTextSpan.h" + +namespace blink { + +ImeTextSpan::ImeTextSpan(unsigned start_offset, + unsigned end_offset, + const Color& color, + bool thick, + const Color& background_color) + : color_(color), thick_(thick), background_color_(background_color) { + // Sanitize offsets by ensuring a valid range corresponding to the last + // possible position. + // TODO(wkorman): Consider replacing with DCHECK_LT(startOffset, endOffset). + start_offset_ = + std::min(start_offset, std::numeric_limits<unsigned>::max() - 1u); + end_offset_ = std::max(start_offset_ + 1u, end_offset); +} + +ImeTextSpan::ImeTextSpan(const WebImeTextSpan& ime_text_span) + : ImeTextSpan(ime_text_span.start_offset, + ime_text_span.end_offset, + Color(ime_text_span.color), + ime_text_span.thick, + Color(ime_text_span.background_color)) {} + +} // namespace blink
diff --git a/third_party/WebKit/Source/core/editing/CompositionUnderline.h b/third_party/WebKit/Source/core/editing/ImeTextSpan.h similarity index 81% rename from third_party/WebKit/Source/core/editing/CompositionUnderline.h rename to third_party/WebKit/Source/core/editing/ImeTextSpan.h index cb7d7b4ec..8f50f3b 100644 --- a/third_party/WebKit/Source/core/editing/CompositionUnderline.h +++ b/third_party/WebKit/Source/core/editing/ImeTextSpan.h
@@ -23,8 +23,8 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef CompositionUnderline_h -#define CompositionUnderline_h +#ifndef ImeTextSpan_h +#define ImeTextSpan_h #include "core/CoreExport.h" #include "platform/graphics/Color.h" @@ -32,19 +32,19 @@ namespace blink { -struct WebCompositionUnderline; +struct WebImeTextSpan; -class CORE_EXPORT CompositionUnderline { +class CORE_EXPORT ImeTextSpan { DISALLOW_NEW_EXCEPT_PLACEMENT_NEW(); public: - CompositionUnderline(unsigned start_offset, - unsigned end_offset, - const Color&, - bool thick, - const Color& background_color); + ImeTextSpan(unsigned start_offset, + unsigned end_offset, + const Color&, + bool thick, + const Color& background_color); - CompositionUnderline(const WebCompositionUnderline&); + ImeTextSpan(const WebImeTextSpan&); unsigned StartOffset() const { return start_offset_; } unsigned EndOffset() const { return end_offset_; } @@ -62,4 +62,4 @@ } // namespace blink -#endif // CompositionUnderline_h +#endif // ImeTextSpan_h
diff --git a/third_party/WebKit/Source/core/editing/ImeTextSpanTest.cpp b/third_party/WebKit/Source/core/editing/ImeTextSpanTest.cpp new file mode 100644 index 0000000..858b055 --- /dev/null +++ b/third_party/WebKit/Source/core/editing/ImeTextSpanTest.cpp
@@ -0,0 +1,74 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/editing/ImeTextSpan.h" + +#include "testing/gtest/include/gtest/gtest.h" + +namespace blink { +namespace { + +ImeTextSpan CreateImeTextSpan(unsigned start_offset, unsigned end_offset) { + return ImeTextSpan(start_offset, end_offset, Color::kTransparent, false, + Color::kTransparent); +} + +TEST(ImeTextSpanTest, OneChar) { + ImeTextSpan ime_text_span = CreateImeTextSpan(0, 1); + EXPECT_EQ(0u, ime_text_span.StartOffset()); + EXPECT_EQ(1u, ime_text_span.EndOffset()); +} + +TEST(ImeTextSpanTest, MultiChar) { + ImeTextSpan ime_text_span = CreateImeTextSpan(0, 5); + EXPECT_EQ(0u, ime_text_span.StartOffset()); + EXPECT_EQ(5u, ime_text_span.EndOffset()); +} + +TEST(ImeTextSpanTest, ZeroLength) { + ImeTextSpan ime_text_span = CreateImeTextSpan(0, 0); + EXPECT_EQ(0u, ime_text_span.StartOffset()); + EXPECT_EQ(1u, ime_text_span.EndOffset()); +} + +TEST(ImeTextSpanTest, ZeroLengthNonZeroStart) { + ImeTextSpan ime_text_span = CreateImeTextSpan(3, 3); + EXPECT_EQ(3u, ime_text_span.StartOffset()); + EXPECT_EQ(4u, ime_text_span.EndOffset()); +} + +TEST(ImeTextSpanTest, EndBeforeStart) { + ImeTextSpan ime_text_span = CreateImeTextSpan(1, 0); + EXPECT_EQ(1u, ime_text_span.StartOffset()); + EXPECT_EQ(2u, ime_text_span.EndOffset()); +} + +TEST(ImeTextSpanTest, LastChar) { + ImeTextSpan ime_text_span = + CreateImeTextSpan(std::numeric_limits<unsigned>::max() - 1, + std::numeric_limits<unsigned>::max()); + EXPECT_EQ(std::numeric_limits<unsigned>::max() - 1, + ime_text_span.StartOffset()); + EXPECT_EQ(std::numeric_limits<unsigned>::max(), ime_text_span.EndOffset()); +} + +TEST(ImeTextSpanTest, LastCharEndBeforeStart) { + ImeTextSpan ime_text_span = + CreateImeTextSpan(std::numeric_limits<unsigned>::max(), + std::numeric_limits<unsigned>::max() - 1); + EXPECT_EQ(std::numeric_limits<unsigned>::max() - 1, + ime_text_span.StartOffset()); + EXPECT_EQ(std::numeric_limits<unsigned>::max(), ime_text_span.EndOffset()); +} + +TEST(ImeTextSpanTest, LastCharEndBeforeStartZeroEnd) { + ImeTextSpan ime_text_span = + CreateImeTextSpan(std::numeric_limits<unsigned>::max(), 0); + EXPECT_EQ(std::numeric_limits<unsigned>::max() - 1, + ime_text_span.StartOffset()); + EXPECT_EQ(std::numeric_limits<unsigned>::max(), ime_text_span.EndOffset()); +} + +} // namespace +} // namespace blink
diff --git a/third_party/WebKit/Source/core/editing/CompositionUnderlineVectorBuilder.cpp b/third_party/WebKit/Source/core/editing/ImeTextSpanVectorBuilder.cpp similarity index 84% rename from third_party/WebKit/Source/core/editing/CompositionUnderlineVectorBuilder.cpp rename to third_party/WebKit/Source/core/editing/ImeTextSpanVectorBuilder.cpp index cccfebbb..d312a263 100644 --- a/third_party/WebKit/Source/core/editing/CompositionUnderlineVectorBuilder.cpp +++ b/third_party/WebKit/Source/core/editing/ImeTextSpanVectorBuilder.cpp
@@ -28,17 +28,17 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "core/editing/CompositionUnderlineVectorBuilder.h" +#include "core/editing/ImeTextSpanVectorBuilder.h" namespace blink { -Vector<CompositionUnderline> CompositionUnderlineVectorBuilder::Build( - const WebVector<WebCompositionUnderline>& underlines) { - Vector<CompositionUnderline> result; - size_t size = underlines.size(); +Vector<ImeTextSpan> ImeTextSpanVectorBuilder::Build( + const WebVector<WebImeTextSpan>& ime_text_spans) { + Vector<ImeTextSpan> result; + size_t size = ime_text_spans.size(); result.ReserveCapacity(size); for (size_t i = 0; i < size; ++i) - result.push_back(underlines[i]); + result.push_back(ime_text_spans[i]); return result; }
diff --git a/third_party/WebKit/Source/core/editing/CompositionUnderlineVectorBuilder.h b/third_party/WebKit/Source/core/editing/ImeTextSpanVectorBuilder.h similarity index 77% rename from third_party/WebKit/Source/core/editing/CompositionUnderlineVectorBuilder.h rename to third_party/WebKit/Source/core/editing/ImeTextSpanVectorBuilder.h index 9b44790..fc658ec 100644 --- a/third_party/WebKit/Source/core/editing/CompositionUnderlineVectorBuilder.h +++ b/third_party/WebKit/Source/core/editing/ImeTextSpanVectorBuilder.h
@@ -28,26 +28,26 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef CompositionUnderlineVectorBuilder_h -#define CompositionUnderlineVectorBuilder_h +#ifndef ImeTextSpanVectorBuilder_h +#define ImeTextSpanVectorBuilder_h #include "core/CoreExport.h" -#include "core/editing/CompositionUnderline.h" +#include "core/editing/ImeTextSpan.h" #include "platform/wtf/Vector.h" #include "public/platform/WebVector.h" -#include "public/web/WebCompositionUnderline.h" +#include "public/web/WebImeTextSpan.h" namespace blink { -// This class is used for converting from WebVector<WebCompositionUnderline> -// to Vector<CompositionUnderline>. +// This class is used for converting from WebVector<WebImeTextSpan> +// to Vector<ImeTextSpan>. -class CompositionUnderlineVectorBuilder { - STATIC_ONLY(CompositionUnderlineVectorBuilder); +class ImeTextSpanVectorBuilder { + STATIC_ONLY(ImeTextSpanVectorBuilder); public: - CORE_EXPORT static Vector<CompositionUnderline> Build( - const WebVector<WebCompositionUnderline>&); + CORE_EXPORT static Vector<ImeTextSpan> Build( + const WebVector<WebImeTextSpan>&); }; } // namespace blink
diff --git a/third_party/WebKit/Source/core/editing/InputMethodController.cpp b/third_party/WebKit/Source/core/editing/InputMethodController.cpp index 853f3d59..c78c81c 100644 --- a/third_party/WebKit/Source/core/editing/InputMethodController.cpp +++ b/third_party/WebKit/Source/core/editing/InputMethodController.cpp
@@ -432,14 +432,14 @@ bool InputMethodController::CommitText( const String& text, - const Vector<CompositionUnderline>& underlines, + const Vector<ImeTextSpan>& ime_text_spans, int relative_caret_position) { if (HasComposition()) { return ReplaceCompositionAndMoveCaret(text, relative_caret_position, - underlines); + ime_text_spans); } - return InsertTextAndMoveCaret(text, relative_caret_position, underlines); + return InsertTextAndMoveCaret(text, relative_caret_position, ime_text_spans); } bool InputMethodController::ReplaceComposition(const String& text) { @@ -480,32 +480,34 @@ return text_start + text_length + relative_caret_position; } -void InputMethodController::AddCompositionUnderlines( - const Vector<CompositionUnderline>& underlines, +void InputMethodController::AddImeTextSpans( + const Vector<ImeTextSpan>& ime_text_spans, ContainerNode* base_element, unsigned offset_in_plain_chars) { - for (const auto& underline : underlines) { - unsigned underline_start = offset_in_plain_chars + underline.StartOffset(); - unsigned underline_end = offset_in_plain_chars + underline.EndOffset(); + for (const auto& ime_text_span : ime_text_spans) { + unsigned ime_text_span_start = + offset_in_plain_chars + ime_text_span.StartOffset(); + unsigned ime_text_span_end = + offset_in_plain_chars + ime_text_span.EndOffset(); EphemeralRange ephemeral_line_range = - PlainTextRange(underline_start, underline_end) + PlainTextRange(ime_text_span_start, ime_text_span_end) .CreateRange(*base_element); if (ephemeral_line_range.IsNull()) continue; GetDocument().Markers().AddCompositionMarker( - ephemeral_line_range, underline.GetColor(), - underline.Thick() ? StyleableMarker::Thickness::kThick - : StyleableMarker::Thickness::kThin, - underline.BackgroundColor()); + ephemeral_line_range, ime_text_span.GetColor(), + ime_text_span.Thick() ? StyleableMarker::Thickness::kThick + : StyleableMarker::Thickness::kThin, + ime_text_span.BackgroundColor()); } } bool InputMethodController::ReplaceCompositionAndMoveCaret( const String& text, int relative_caret_position, - const Vector<CompositionUnderline>& underlines) { + const Vector<ImeTextSpan>& ime_text_spans) { Element* root_editable_element = GetFrame() .Selection() @@ -527,7 +529,7 @@ // needs to be audited. see http://crbug.com/590369 for more details. GetDocument().UpdateStyleAndLayoutIgnorePendingStylesheets(); - AddCompositionUnderlines(underlines, root_editable_element, text_start); + AddImeTextSpans(ime_text_spans, root_editable_element, text_start); int absolute_caret_position = ComputeAbsoluteCaretPosition( text_start, text.length(), relative_caret_position); @@ -545,7 +547,7 @@ bool InputMethodController::InsertTextAndMoveCaret( const String& text, int relative_caret_position, - const Vector<CompositionUnderline>& underlines) { + const Vector<ImeTextSpan>& ime_text_spans) { PlainTextRange selection_range = GetSelectionOffsets(); if (selection_range.IsNull()) return false; @@ -559,7 +561,7 @@ .ComputeVisibleSelectionInDOMTreeDeprecated() .RootEditableElement(); if (root_editable_element) { - AddCompositionUnderlines(underlines, root_editable_element, text_start); + AddImeTextSpans(ime_text_spans, root_editable_element, text_start); } int absolute_caret_position = ComputeAbsoluteCaretPosition( @@ -598,7 +600,7 @@ void InputMethodController::SetComposition( const String& text, - const Vector<CompositionUnderline>& underlines, + const Vector<ImeTextSpan>& ime_text_spans, int selection_start, int selection_end) { Editor::RevealSelectionScope reveal_selection_scope(&GetEditor()); @@ -719,7 +721,7 @@ // We shouldn't close typing in the middle of setComposition. SetEditableSelectionOffsets(selected_range, TypingContinuation::kContinue); - if (underlines.IsEmpty()) { + if (ime_text_spans.IsEmpty()) { GetDocument().Markers().AddCompositionMarker( EphemeralRange(composition_range_), Color::kBlack, StyleableMarker::Thickness::kThin, @@ -729,8 +731,8 @@ const PlainTextRange composition_plain_text_range = PlainTextRange::Create(*base_node->parentNode(), *composition_range_); - AddCompositionUnderlines(underlines, base_node->parentNode(), - composition_plain_text_range.Start()); + AddImeTextSpans(ime_text_spans, base_node->parentNode(), + composition_plain_text_range.Start()); } PlainTextRange InputMethodController::CreateSelectionRangeForSetComposition( @@ -745,7 +747,7 @@ } void InputMethodController::SetCompositionFromExistingText( - const Vector<CompositionUnderline>& underlines, + const Vector<ImeTextSpan>& ime_text_spans, unsigned composition_start, unsigned composition_end) { Element* editable = GetFrame() @@ -772,7 +774,7 @@ Clear(); - AddCompositionUnderlines(underlines, editable, composition_start); + AddImeTextSpans(ime_text_spans, editable, composition_start); has_composition_ = true; if (!composition_range_)
diff --git a/third_party/WebKit/Source/core/editing/InputMethodController.h b/third_party/WebKit/Source/core/editing/InputMethodController.h index 88f1f25..40e62b2c 100644 --- a/third_party/WebKit/Source/core/editing/InputMethodController.h +++ b/third_party/WebKit/Source/core/editing/InputMethodController.h
@@ -29,8 +29,8 @@ #include "base/gtest_prod_util.h" #include "core/CoreExport.h" #include "core/dom/SynchronousMutationObserver.h" -#include "core/editing/CompositionUnderline.h" #include "core/editing/EphemeralRange.h" +#include "core/editing/ImeTextSpan.h" #include "core/editing/PlainTextRange.h" #include "platform/heap/Handle.h" #include "platform/wtf/Vector.h" @@ -63,10 +63,10 @@ // international text input composition bool HasComposition() const; void SetComposition(const String& text, - const Vector<CompositionUnderline>& underlines, + const Vector<ImeTextSpan>& ime_text_spans, int selection_start, int selection_end); - void SetCompositionFromExistingText(const Vector<CompositionUnderline>& text, + void SetCompositionFromExistingText(const Vector<ImeTextSpan>& ime_text_spans, unsigned composition_start, unsigned composition_end); @@ -74,7 +74,7 @@ // changes the selection according to relativeCaretPosition, which is // relative to the end of the inserting text. bool CommitText(const String& text, - const Vector<CompositionUnderline>& underlines, + const Vector<ImeTextSpan>& ime_text_spans, int relative_caret_position); // Inserts ongoing composing text; changes the selection to the end of @@ -134,14 +134,14 @@ // Returns true if selection offsets were successfully set. bool SetSelectionOffsets(const PlainTextRange&); - void AddCompositionUnderlines(const Vector<CompositionUnderline>& underlines, - ContainerNode* base_element, - unsigned offset_in_plain_chars); + void AddImeTextSpans(const Vector<ImeTextSpan>& ime_text_spans, + ContainerNode* base_element, + unsigned offset_in_plain_chars); bool InsertText(const String&); bool InsertTextAndMoveCaret(const String&, int relative_caret_position, - const Vector<CompositionUnderline>& underlines); + const Vector<ImeTextSpan>& ime_text_spans); // Inserts the given text string in the place of the existing composition. // Returns true if did replace. @@ -151,7 +151,7 @@ bool ReplaceCompositionAndMoveCaret( const String&, int relative_caret_position, - const Vector<CompositionUnderline>& underlines); + const Vector<ImeTextSpan>& ime_text_spans); // Returns true if moved caret successfully. bool MoveCaret(int new_caret_position);
diff --git a/third_party/WebKit/Source/core/editing/InputMethodControllerTest.cpp b/third_party/WebKit/Source/core/editing/InputMethodControllerTest.cpp index c368cc3..f9b5775 100644 --- a/third_party/WebKit/Source/core/editing/InputMethodControllerTest.cpp +++ b/third_party/WebKit/Source/core/editing/InputMethodControllerTest.cpp
@@ -171,9 +171,9 @@ Element* div = InsertHTMLElement( "<div id='sample' contenteditable>hello world</div>", "sample"); - Vector<CompositionUnderline> underlines; - underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0)); - Controller().SetCompositionFromExistingText(underlines, 0, 5); + Vector<ImeTextSpan> ime_text_spans; + ime_text_spans.push_back(ImeTextSpan(0, 5, Color(255, 0, 0), false, 0)); + Controller().SetCompositionFromExistingText(ime_text_spans, 0, 5); Range* range = Controller().CompositionRange(); EXPECT_EQ(0u, range->startOffset()); @@ -189,8 +189,8 @@ Element* div = InsertHTMLElement( "<div id='sample' contenteditable>🏆</div>", "sample"); - Vector<CompositionUnderline> underlines; - underlines.push_back(CompositionUnderline(0, 2, Color(255, 0, 0), false, 0)); + Vector<ImeTextSpan> ime_text_spans; + ime_text_spans.push_back(ImeTextSpan(0, 2, Color(255, 0, 0), false, 0)); GetDocument().UpdateStyleAndLayout(); Controller().SetEditableSelectionOffsets(PlainTextRange(2, 2)); @@ -205,25 +205,25 @@ .Extent() .ComputeOffsetInContainerNode()); - Controller().SetComposition(String("a"), underlines, 1, 1); + Controller().SetComposition(String("a"), ime_text_spans, 1, 1); EXPECT_STREQ("\xF0\x9F\x8F\x86\x61", div->innerText().Utf8().data()); - Controller().SetComposition(String("ab"), underlines, 2, 2); + Controller().SetComposition(String("ab"), ime_text_spans, 2, 2); EXPECT_STREQ("\xF0\x9F\x8F\x86\x61\x62", div->innerText().Utf8().data()); } TEST_F(InputMethodControllerTest, SetCompositionWithGraphemeCluster) { InsertHTMLElement("<div id='sample' contenteditable></div>", "sample"); - Vector<CompositionUnderline> underlines; - underlines.push_back(CompositionUnderline(6, 6, Color(255, 0, 0), false, 0)); + Vector<ImeTextSpan> ime_text_spans; + ime_text_spans.push_back(ImeTextSpan(6, 6, Color(255, 0, 0), false, 0)); GetDocument().UpdateStyleAndLayout(); // UTF16 = 0x0939 0x0947 0x0932 0x0932. Note that 0x0932 0x0932 is a grapheme // cluster. Controller().SetComposition( String::FromUTF8("\xE0\xA4\xB9\xE0\xA5\x87\xE0\xA4\xB2\xE0\xA4\xB2"), - underlines, 4, 4); + ime_text_spans, 4, 4); EXPECT_EQ(4u, Controller().GetSelectionOffsets().Start()); EXPECT_EQ(4u, Controller().GetSelectionOffsets().End()); @@ -231,7 +231,7 @@ Controller().SetComposition( String::FromUTF8("\xE0\xA4\xB9\xE0\xA5\x87\xE0\xA4\xB2\xE0\xA5\x8D\xE0" "\xA4\xB2\xE0\xA5\x8B"), - underlines, 6, 6); + ime_text_spans, 6, 6); EXPECT_EQ(6u, Controller().GetSelectionOffsets().Start()); EXPECT_EQ(6u, Controller().GetSelectionOffsets().End()); } @@ -241,9 +241,8 @@ Element* div = InsertHTMLElement("<div id='sample' contenteditable></div>", "sample"); - Vector<CompositionUnderline> underlines; - underlines.push_back( - CompositionUnderline(12, 12, Color(255, 0, 0), false, 0)); + Vector<ImeTextSpan> ime_text_spans; + ime_text_spans.push_back(ImeTextSpan(12, 12, Color(255, 0, 0), false, 0)); GetDocument().UpdateStyleAndLayout(); // UTF16 = 0x0939 0x0947 0x0932 0x094D 0x0932 0x094B. 0x0939 0x0947 0x0932 is @@ -251,9 +250,9 @@ Controller().CommitText( String::FromUTF8("\xE0\xA4\xB9\xE0\xA5\x87\xE0\xA4\xB2\xE0\xA5\x8D\xE0" "\xA4\xB2\xE0\xA5\x8B"), - underlines, 1); - Controller().CommitText("\nab ", underlines, 1); - Controller().SetComposition(String("c"), underlines, 1, 1); + ime_text_spans, 1); + Controller().CommitText("\nab ", ime_text_spans, 1); + Controller().SetComposition(String("c"), ime_text_spans, 1, 1); EXPECT_STREQ( "\xE0\xA4\xB9\xE0\xA5\x87\xE0\xA4\xB2\xE0\xA5\x8D\xE0\xA4\xB2\xE0\xA5" "\x8B\nab c", @@ -261,7 +260,7 @@ EXPECT_EQ(11u, Controller().GetSelectionOffsets().Start()); EXPECT_EQ(11u, Controller().GetSelectionOffsets().End()); - Controller().SetComposition(String("cd"), underlines, 2, 2); + Controller().SetComposition(String("cd"), ime_text_spans, 2, 2); EXPECT_STREQ( "\xE0\xA4\xB9\xE0\xA5\x87\xE0\xA4\xB2\xE0\xA5\x8D\xE0\xA4\xB2\xE0\xA5" "\x8B\nab cd", @@ -276,26 +275,26 @@ "contenteditable>abc1<b>2</b>34567<b>8</b>9d<b>e</b>f</div>", "sample"); - Vector<CompositionUnderline> underlines; - underlines.push_back(CompositionUnderline(3, 12, Color(255, 0, 0), false, 0)); - Controller().SetCompositionFromExistingText(underlines, 3, 12); + Vector<ImeTextSpan> ime_text_spans; + ime_text_spans.push_back(ImeTextSpan(3, 12, Color(255, 0, 0), false, 0)); + Controller().SetCompositionFromExistingText(ime_text_spans, 3, 12); // Subtract a character. - Controller().SetComposition(String("12345789"), underlines, 8, 8); + Controller().SetComposition(String("12345789"), ime_text_spans, 8, 8); EXPECT_STREQ("abc1<b>2</b>3457<b>8</b>9d<b>e</b>f", div->innerHTML().Utf8().data()); EXPECT_EQ(11u, Controller().GetSelectionOffsets().Start()); EXPECT_EQ(11u, Controller().GetSelectionOffsets().End()); // Append a character. - Controller().SetComposition(String("123456789"), underlines, 9, 9); + Controller().SetComposition(String("123456789"), ime_text_spans, 9, 9); EXPECT_STREQ("abc1<b>2</b>34567<b>8</b>9d<b>e</b>f", div->innerHTML().Utf8().data()); EXPECT_EQ(12u, Controller().GetSelectionOffsets().Start()); EXPECT_EQ(12u, Controller().GetSelectionOffsets().End()); // Subtract and append characters. - Controller().SetComposition(String("123hello789"), underlines, 11, 11); + Controller().SetComposition(String("123hello789"), ime_text_spans, 11, 11); EXPECT_STREQ("abc1<b>2</b>3hello7<b>8</b>9d<b>e</b>f", div->innerHTML().Utf8().data()); } @@ -305,19 +304,19 @@ Element* div = InsertHTMLElement( "<div id='sample' contenteditable><b>🏠</b></div>", "sample"); - Vector<CompositionUnderline> underlines; - underlines.push_back(CompositionUnderline(0, 2, Color(255, 0, 0), false, 0)); + Vector<ImeTextSpan> ime_text_spans; + ime_text_spans.push_back(ImeTextSpan(0, 2, Color(255, 0, 0), false, 0)); - Controller().SetCompositionFromExistingText(underlines, 0, 2); + Controller().SetCompositionFromExistingText(ime_text_spans, 0, 2); // 0xF0 0x9F 0x8F 0xAB is also an emoji character, with the same leading // surrogate pair to the previous one. - Controller().SetComposition(String::FromUTF8("\xF0\x9F\x8F\xAB"), underlines, - 2, 2); + Controller().SetComposition(String::FromUTF8("\xF0\x9F\x8F\xAB"), + ime_text_spans, 2, 2); EXPECT_STREQ("<b>\xF0\x9F\x8F\xAB</b>", div->innerHTML().Utf8().data()); - Controller().SetComposition(String::FromUTF8("\xF0\x9F\x8F\xA0"), underlines, - 2, 2); + Controller().SetComposition(String::FromUTF8("\xF0\x9F\x8F\xA0"), + ime_text_spans, 2, 2); EXPECT_STREQ("<b>\xF0\x9F\x8F\xA0</b>", div->innerHTML().Utf8().data()); } @@ -329,19 +328,19 @@ Element* div = InsertHTMLElement( "<div id='sample' contenteditable><b>ః</b></div>", "sample"); - Vector<CompositionUnderline> underlines; - underlines.push_back(CompositionUnderline(0, 2, Color(255, 0, 0), false, 0)); - Controller().SetCompositionFromExistingText(underlines, 0, 1); + Vector<ImeTextSpan> ime_text_spans; + ime_text_spans.push_back(ImeTextSpan(0, 2, Color(255, 0, 0), false, 0)); + Controller().SetCompositionFromExistingText(ime_text_spans, 0, 1); // 0xE0 0xB0 0x83 0xE0 0xB0 0x83, a telugu character with 2 code points in // 1 grapheme cluster. Controller().SetComposition(String::FromUTF8("\xE0\xB0\x83\xE0\xB0\x83"), - underlines, 2, 2); + ime_text_spans, 2, 2); EXPECT_STREQ("<b>\xE0\xB0\x83\xE0\xB0\x83</b>", div->innerHTML().Utf8().data()); - Controller().SetComposition(String::FromUTF8("\xE0\xB0\x83"), underlines, 1, - 1); + Controller().SetComposition(String::FromUTF8("\xE0\xB0\x83"), ime_text_spans, + 1, 1); EXPECT_STREQ("<b>\xE0\xB0\x83</b>", div->innerHTML().Utf8().data()); } @@ -351,11 +350,11 @@ "contenteditable>abc1<b>2</b>34567<b>8</b>9</div>", "sample"); - Vector<CompositionUnderline> underlines; - underlines.push_back(CompositionUnderline(3, 12, Color(255, 0, 0), false, 0)); - Controller().SetCompositionFromExistingText(underlines, 3, 12); + Vector<ImeTextSpan> ime_text_spans; + ime_text_spans.push_back(ImeTextSpan(3, 12, Color(255, 0, 0), false, 0)); + Controller().SetCompositionFromExistingText(ime_text_spans, 3, 12); - Controller().SetComposition(String("123hello789"), underlines, 11, 11); + Controller().SetComposition(String("123hello789"), ime_text_spans, 11, 11); EXPECT_STREQ("abc1<b>2</b>3hello7<b>8</b>9", div->innerHTML().Utf8().data()); Controller().FinishComposingText(InputMethodController::kKeepSelection); @@ -368,21 +367,21 @@ "contenteditable>abc1<b>2</b>34567<b>8</b>9</div>", "sample"); - Vector<CompositionUnderline> underlines; - underlines.push_back(CompositionUnderline(3, 12, Color(255, 0, 0), false, 0)); - Controller().SetCompositionFromExistingText(underlines, 3, 12); + Vector<ImeTextSpan> ime_text_spans; + ime_text_spans.push_back(ImeTextSpan(3, 12, Color(255, 0, 0), false, 0)); + Controller().SetCompositionFromExistingText(ime_text_spans, 3, 12); - Controller().CommitText(String("123789"), underlines, 0); + Controller().CommitText(String("123789"), ime_text_spans, 0); EXPECT_STREQ("abc1<b>2</b>37<b>8</b>9", div->innerHTML().Utf8().data()); } TEST_F(InputMethodControllerTest, InsertTextWithNewLine) { Element* div = InsertHTMLElement("<div id='sample' contenteditable></div>", "sample"); - Vector<CompositionUnderline> underlines; - underlines.push_back(CompositionUnderline(0, 11, Color(255, 0, 0), false, 0)); + Vector<ImeTextSpan> ime_text_spans; + ime_text_spans.push_back(ImeTextSpan(0, 11, Color(255, 0, 0), false, 0)); - Controller().CommitText(String("hello\nworld"), underlines, 0); + Controller().CommitText(String("hello\nworld"), ime_text_spans, 0); EXPECT_STREQ("hello<div>world</div>", div->innerHTML().Utf8().data()); } @@ -390,12 +389,12 @@ Element* div = InsertHTMLElement("<div id='sample' contenteditable></div>", "sample"); - Vector<CompositionUnderline> underlines; - Controller().CommitText("a", underlines, 0); - Controller().SetComposition("bcd", underlines, 0, 2); + Vector<ImeTextSpan> ime_text_spans; + Controller().CommitText("a", ime_text_spans, 0); + Controller().SetComposition("bcd", ime_text_spans, 0, 2); EXPECT_STREQ("abcd", div->innerHTML().Utf8().data()); - Controller().CommitText(String("bcd\nefgh\nijkl"), underlines, 0); + Controller().CommitText(String("bcd\nefgh\nijkl"), ime_text_spans, 0); EXPECT_STREQ("abcd<div>efgh</div><div>ijkl</div>", div->innerHTML().Utf8().data()); } @@ -404,9 +403,9 @@ InsertHTMLElement("<div id='sample' contenteditable>hello world</div>", "sample"); - Vector<CompositionUnderline> underlines; - underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0)); - Controller().SetCompositionFromExistingText(underlines, 0, 5); + Vector<ImeTextSpan> ime_text_spans; + ime_text_spans.push_back(ImeTextSpan(0, 5, Color(255, 0, 0), false, 0)); + Controller().SetCompositionFromExistingText(ime_text_spans, 0, 5); Controller().FinishComposingText(InputMethodController::kKeepSelection); EXPECT_EQ(0, GetFrame() @@ -439,11 +438,11 @@ Controller().ExtendSelectionAndDelete(1, 0); EXPECT_STREQ("foo", input->value().Utf8().data()); - Vector<CompositionUnderline> underlines; - underlines.push_back(CompositionUnderline(0, 3, Color(255, 0, 0), false, 0)); - Controller().SetCompositionFromExistingText(underlines, 0, 3); + Vector<ImeTextSpan> ime_text_spans; + ime_text_spans.push_back(ImeTextSpan(0, 3, Color(255, 0, 0), false, 0)); + Controller().SetCompositionFromExistingText(ime_text_spans, 0, 3); - Controller().SetComposition(String(""), underlines, 0, 3); + Controller().SetComposition(String(""), ime_text_spans, 0, 3); EXPECT_STREQ("", input->value().Utf8().data()); } @@ -455,9 +454,9 @@ Element* div = InsertHTMLElement( "<div id='sample' contenteditable>\nhello world</div>", "sample"); - Vector<CompositionUnderline> underlines; - underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0)); - Controller().SetCompositionFromExistingText(underlines, 0, 5); + Vector<ImeTextSpan> ime_text_spans; + ime_text_spans.push_back(ImeTextSpan(0, 5, Color(255, 0, 0), false, 0)); + Controller().SetCompositionFromExistingText(ime_text_spans, 0, 5); Range* range = Controller().CompositionRange(); EXPECT_EQ(1u, range->startOffset()); @@ -472,9 +471,9 @@ SetCompositionFromExistingTextWithInvalidOffsets) { InsertHTMLElement("<div id='sample' contenteditable>test</div>", "sample"); - Vector<CompositionUnderline> underlines; - underlines.push_back(CompositionUnderline(7, 8, Color(255, 0, 0), false, 0)); - Controller().SetCompositionFromExistingText(underlines, 7, 8); + Vector<ImeTextSpan> ime_text_spans; + ime_text_spans.push_back(ImeTextSpan(7, 8, Color(255, 0, 0), false, 0)); + Controller().SetCompositionFromExistingText(ime_text_spans, 7, 8); EXPECT_FALSE(Controller().CompositionRange()); } @@ -483,9 +482,9 @@ HTMLInputElement* input = toHTMLInputElement(InsertHTMLElement( "<input id='sample' type='password' size='24'>", "sample")); - Vector<CompositionUnderline> underlines; - underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0)); - Controller().SetComposition("foo", underlines, 0, 3); + Vector<ImeTextSpan> ime_text_spans; + ime_text_spans.push_back(ImeTextSpan(0, 5, Color(255, 0, 0), false, 0)); + Controller().SetComposition("foo", ime_text_spans, 0, 3); Controller().FinishComposingText(InputMethodController::kKeepSelection); EXPECT_STREQ("foo", input->value().Utf8().data()); @@ -936,47 +935,47 @@ EXPECT_EQ(2u, Controller().GetSelectionOffsets().Start()); EXPECT_EQ(2u, Controller().GetSelectionOffsets().End()); - Vector<CompositionUnderline> underlines; - underlines.push_back(CompositionUnderline(0, 2, Color(255, 0, 0), false, 0)); + Vector<ImeTextSpan> ime_text_spans; + ime_text_spans.push_back(ImeTextSpan(0, 2, Color(255, 0, 0), false, 0)); // The caret exceeds left boundary. // "*heABllo", where * stands for caret. - Controller().SetComposition("AB", underlines, -100, -100); + Controller().SetComposition("AB", ime_text_spans, -100, -100); EXPECT_STREQ("heABllo", input->value().Utf8().data()); EXPECT_EQ(0u, Controller().GetSelectionOffsets().Start()); EXPECT_EQ(0u, Controller().GetSelectionOffsets().End()); // The caret is on left boundary. // "*heABllo". - Controller().SetComposition("AB", underlines, -2, -2); + Controller().SetComposition("AB", ime_text_spans, -2, -2); EXPECT_STREQ("heABllo", input->value().Utf8().data()); EXPECT_EQ(0u, Controller().GetSelectionOffsets().Start()); EXPECT_EQ(0u, Controller().GetSelectionOffsets().End()); // The caret is before the composing text. // "he*ABllo". - Controller().SetComposition("AB", underlines, 0, 0); + Controller().SetComposition("AB", ime_text_spans, 0, 0); EXPECT_STREQ("heABllo", input->value().Utf8().data()); EXPECT_EQ(2u, Controller().GetSelectionOffsets().Start()); EXPECT_EQ(2u, Controller().GetSelectionOffsets().End()); // The caret is after the composing text. // "heAB*llo". - Controller().SetComposition("AB", underlines, 2, 2); + Controller().SetComposition("AB", ime_text_spans, 2, 2); EXPECT_STREQ("heABllo", input->value().Utf8().data()); EXPECT_EQ(4u, Controller().GetSelectionOffsets().Start()); EXPECT_EQ(4u, Controller().GetSelectionOffsets().End()); // The caret is on right boundary. // "heABllo*". - Controller().SetComposition("AB", underlines, 5, 5); + Controller().SetComposition("AB", ime_text_spans, 5, 5); EXPECT_STREQ("heABllo", input->value().Utf8().data()); EXPECT_EQ(7u, Controller().GetSelectionOffsets().Start()); EXPECT_EQ(7u, Controller().GetSelectionOffsets().End()); // The caret exceeds right boundary. // "heABllo*". - Controller().SetComposition("AB", underlines, 100, 100); + Controller().SetComposition("AB", ime_text_spans, 100, 100); EXPECT_STREQ("heABllo", input->value().Utf8().data()); EXPECT_EQ(7u, Controller().GetSelectionOffsets().Start()); EXPECT_EQ(7u, Controller().GetSelectionOffsets().End()); @@ -1000,82 +999,82 @@ EXPECT_EQ(17u, Controller().GetSelectionOffsets().Start()); EXPECT_EQ(17u, Controller().GetSelectionOffsets().End()); - Vector<CompositionUnderline> underlines; - underlines.push_back(CompositionUnderline(0, 2, Color(255, 0, 0), false, 0)); + Vector<ImeTextSpan> ime_text_spans; + ime_text_spans.push_back(ImeTextSpan(0, 2, Color(255, 0, 0), false, 0)); // The caret exceeds left boundary. // "*hello\nworld\n01234AB56789", where * stands for caret. - Controller().SetComposition("AB", underlines, -100, -100); + Controller().SetComposition("AB", ime_text_spans, -100, -100); EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data()); EXPECT_EQ(0u, Controller().GetSelectionOffsets().Start()); EXPECT_EQ(0u, Controller().GetSelectionOffsets().End()); // The caret is on left boundary. // "*hello\nworld\n01234AB56789". - Controller().SetComposition("AB", underlines, -17, -17); + Controller().SetComposition("AB", ime_text_spans, -17, -17); EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data()); EXPECT_EQ(0u, Controller().GetSelectionOffsets().Start()); EXPECT_EQ(0u, Controller().GetSelectionOffsets().End()); // The caret is in the 1st node. // "he*llo\nworld\n01234AB56789". - Controller().SetComposition("AB", underlines, -15, -15); + Controller().SetComposition("AB", ime_text_spans, -15, -15); EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data()); EXPECT_EQ(2u, Controller().GetSelectionOffsets().Start()); EXPECT_EQ(2u, Controller().GetSelectionOffsets().End()); // The caret is on right boundary of the 1st node. // "hello*\nworld\n01234AB56789". - Controller().SetComposition("AB", underlines, -12, -12); + Controller().SetComposition("AB", ime_text_spans, -12, -12); EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data()); EXPECT_EQ(5u, Controller().GetSelectionOffsets().Start()); EXPECT_EQ(5u, Controller().GetSelectionOffsets().End()); // The caret is on right boundary of the 2nd node. // "hello\n*world\n01234AB56789". - Controller().SetComposition("AB", underlines, -11, -11); + Controller().SetComposition("AB", ime_text_spans, -11, -11); EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data()); EXPECT_EQ(6u, Controller().GetSelectionOffsets().Start()); EXPECT_EQ(6u, Controller().GetSelectionOffsets().End()); // The caret is on right boundary of the 3rd node. // "hello\nworld*\n01234AB56789". - Controller().SetComposition("AB", underlines, -6, -6); + Controller().SetComposition("AB", ime_text_spans, -6, -6); EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data()); EXPECT_EQ(11u, Controller().GetSelectionOffsets().Start()); EXPECT_EQ(11u, Controller().GetSelectionOffsets().End()); // The caret is on right boundary of the 4th node. // "hello\nworld\n*01234AB56789". - Controller().SetComposition("AB", underlines, -5, -5); + Controller().SetComposition("AB", ime_text_spans, -5, -5); EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data()); EXPECT_EQ(12u, Controller().GetSelectionOffsets().Start()); EXPECT_EQ(12u, Controller().GetSelectionOffsets().End()); // The caret is before the composing text. // "hello\nworld\n01234*AB56789". - Controller().SetComposition("AB", underlines, 0, 0); + Controller().SetComposition("AB", ime_text_spans, 0, 0); EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data()); EXPECT_EQ(17u, Controller().GetSelectionOffsets().Start()); EXPECT_EQ(17u, Controller().GetSelectionOffsets().End()); // The caret is after the composing text. // "hello\nworld\n01234AB*56789". - Controller().SetComposition("AB", underlines, 2, 2); + Controller().SetComposition("AB", ime_text_spans, 2, 2); EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data()); EXPECT_EQ(19u, Controller().GetSelectionOffsets().Start()); EXPECT_EQ(19u, Controller().GetSelectionOffsets().End()); // The caret is on right boundary. // "hello\nworld\n01234AB56789*". - Controller().SetComposition("AB", underlines, 7, 7); + Controller().SetComposition("AB", ime_text_spans, 7, 7); EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data()); EXPECT_EQ(24u, Controller().GetSelectionOffsets().Start()); EXPECT_EQ(24u, Controller().GetSelectionOffsets().End()); // The caret exceeds right boundary. // "hello\nworld\n01234AB56789*". - Controller().SetComposition("AB", underlines, 100, 100); + Controller().SetComposition("AB", ime_text_spans, 100, 100); EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data()); EXPECT_EQ(24u, Controller().GetSelectionOffsets().Start()); EXPECT_EQ(24u, Controller().GetSelectionOffsets().End()); @@ -1090,20 +1089,20 @@ EXPECT_EQ(2u, Controller().GetSelectionOffsets().Start()); EXPECT_EQ(2u, Controller().GetSelectionOffsets().End()); - Vector<CompositionUnderline> underlines0; - underlines0.push_back(CompositionUnderline(0, 0, Color(255, 0, 0), false, 0)); - Vector<CompositionUnderline> underlines2; - underlines2.push_back(CompositionUnderline(0, 2, Color(255, 0, 0), false, 0)); + Vector<ImeTextSpan> ime_text_spans0; + ime_text_spans0.push_back(ImeTextSpan(0, 0, Color(255, 0, 0), false, 0)); + Vector<ImeTextSpan> ime_text_spans2; + ime_text_spans2.push_back(ImeTextSpan(0, 2, Color(255, 0, 0), false, 0)); - Controller().SetComposition("AB", underlines2, 2, 2); + Controller().SetComposition("AB", ime_text_spans2, 2, 2); // With previous composition. - Controller().SetComposition("", underlines0, 2, 2); + Controller().SetComposition("", ime_text_spans0, 2, 2); EXPECT_STREQ("hello", div->innerText().Utf8().data()); EXPECT_EQ(4u, Controller().GetSelectionOffsets().Start()); EXPECT_EQ(4u, Controller().GetSelectionOffsets().End()); // Without previous composition. - Controller().SetComposition("", underlines0, -1, -1); + Controller().SetComposition("", ime_text_spans0, -1, -1); EXPECT_STREQ("hello", div->innerText().Utf8().data()); EXPECT_EQ(3u, Controller().GetSelectionOffsets().Start()); EXPECT_EQ(3u, Controller().GetSelectionOffsets().End()); @@ -1113,9 +1112,9 @@ Element* div = InsertHTMLElement("<div id='sample' contenteditable></div>", "sample"); - Vector<CompositionUnderline> underlines; - underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0)); - Controller().SetComposition("hello", underlines, 5, 5); + Vector<ImeTextSpan> ime_text_spans; + ime_text_spans.push_back(ImeTextSpan(0, 5, Color(255, 0, 0), false, 0)); + Controller().SetComposition("hello", ime_text_spans, 5, 5); EXPECT_STREQ("hello", div->innerText().Utf8().data()); EXPECT_EQ(5u, Controller().GetSelectionOffsets().Start()); EXPECT_EQ(5u, Controller().GetSelectionOffsets().End()); @@ -1130,9 +1129,9 @@ Element* div = InsertHTMLElement("<div id='sample' contenteditable></div>", "sample"); - Vector<CompositionUnderline> underlines; - underlines.push_back(CompositionUnderline(0, 2, Color(255, 0, 0), false, 0)); - Controller().CommitText("hello", underlines, 0); + Vector<ImeTextSpan> ime_text_spans; + ime_text_spans.push_back(ImeTextSpan(0, 2, Color(255, 0, 0), false, 0)); + Controller().CommitText("hello", ime_text_spans, 0); EXPECT_STREQ("hello", div->innerText().Utf8().data()); Controller().SetEditableSelectionOffsets(PlainTextRange(2, 2)); @@ -1161,17 +1160,17 @@ GetDocument().View()->UpdateAllLifecyclePhases(); // Simulate composition in the |contentEditable|. - Vector<CompositionUnderline> underlines; - underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0)); + Vector<ImeTextSpan> ime_text_spans; + ime_text_spans.push_back(ImeTextSpan(0, 5, Color(255, 0, 0), false, 0)); editable->focus(); GetDocument().setTitle(g_empty_string); - Controller().SetComposition("foo", underlines, 0, 3); + Controller().SetComposition("foo", ime_text_spans, 0, 3); EXPECT_STREQ("beforeinput.isComposing:true;input.isComposing:true;", GetDocument().title().Utf8().data()); GetDocument().setTitle(g_empty_string); - Controller().CommitText("bar", underlines, 0); + Controller().CommitText("bar", ime_text_spans, 0); // Last pair of InputEvent should also be inside composition scope. EXPECT_STREQ("beforeinput.isComposing:true;input.isComposing:true;", GetDocument().title().Utf8().data()); @@ -1181,17 +1180,17 @@ CreateHTMLWithCompositionInputEventListeners(); // Simulate composition in the |contentEditable|. - Vector<CompositionUnderline> underlines; - underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0)); + Vector<ImeTextSpan> ime_text_spans; + ime_text_spans.push_back(ImeTextSpan(0, 5, Color(255, 0, 0), false, 0)); GetDocument().setTitle(g_empty_string); - Controller().SetComposition("hell", underlines, 4, 4); + Controller().SetComposition("hell", ime_text_spans, 4, 4); EXPECT_STREQ("beforeinput.data:hell;input.data:hell;", GetDocument().title().Utf8().data()); // Replace the existing composition. GetDocument().setTitle(g_empty_string); - Controller().SetComposition("hello", underlines, 0, 0); + Controller().SetComposition("hello", ime_text_spans, 0, 0); EXPECT_STREQ("beforeinput.data:hello;input.data:hello;", GetDocument().title().Utf8().data()); } @@ -1200,11 +1199,11 @@ CreateHTMLWithCompositionInputEventListeners(); // Simulate composition in the |contentEditable|. - Vector<CompositionUnderline> underlines; - underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0)); + Vector<ImeTextSpan> ime_text_spans; + ime_text_spans.push_back(ImeTextSpan(0, 5, Color(255, 0, 0), false, 0)); GetDocument().setTitle(g_empty_string); - Controller().SetComposition("hello", underlines, 5, 5); + Controller().SetComposition("hello", ime_text_spans, 5, 5); EXPECT_STREQ("beforeinput.data:hello;input.data:hello;", GetDocument().title().Utf8().data()); @@ -1219,17 +1218,17 @@ CreateHTMLWithCompositionInputEventListeners(); // Simulate composition in the |contentEditable|. - Vector<CompositionUnderline> underlines; - underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0)); + Vector<ImeTextSpan> ime_text_spans; + ime_text_spans.push_back(ImeTextSpan(0, 5, Color(255, 0, 0), false, 0)); GetDocument().setTitle(g_empty_string); - Controller().SetComposition("hello", underlines, 5, 5); + Controller().SetComposition("hello", ime_text_spans, 5, 5); EXPECT_STREQ("beforeinput.data:hello;input.data:hello;", GetDocument().title().Utf8().data()); // Delete the existing composition. GetDocument().setTitle(g_empty_string); - Controller().SetComposition("", underlines, 0, 0); + Controller().SetComposition("", ime_text_spans, 0, 0); EXPECT_STREQ("beforeinput.data:;input.data:null;compositionend.data:;", GetDocument().title().Utf8().data()); } @@ -1238,25 +1237,25 @@ CreateHTMLWithCompositionInputEventListeners(); // Simulate composition in the |contentEditable|. - Vector<CompositionUnderline> underlines; - underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0)); + Vector<ImeTextSpan> ime_text_spans; + ime_text_spans.push_back(ImeTextSpan(0, 5, Color(255, 0, 0), false, 0)); // Insert new text without previous composition. GetDocument().setTitle(g_empty_string); GetDocument().UpdateStyleAndLayout(); - Controller().CommitText("hello", underlines, 0); + Controller().CommitText("hello", ime_text_spans, 0); EXPECT_STREQ("beforeinput.data:hello;input.data:hello;", GetDocument().title().Utf8().data()); GetDocument().setTitle(g_empty_string); - Controller().SetComposition("n", underlines, 1, 1); + Controller().SetComposition("n", ime_text_spans, 1, 1); EXPECT_STREQ("beforeinput.data:n;input.data:n;", GetDocument().title().Utf8().data()); // Insert new text with previous composition. GetDocument().setTitle(g_empty_string); GetDocument().UpdateStyleAndLayout(); - Controller().CommitText("hello", underlines, 1); + Controller().CommitText("hello", ime_text_spans, 1); EXPECT_STREQ( "beforeinput.data:hello;input.data:hello;compositionend.data:hello;", GetDocument().title().Utf8().data()); @@ -1266,24 +1265,24 @@ CreateHTMLWithCompositionInputEventListeners(); // Simulate composition in the |contentEditable|. - Vector<CompositionUnderline> underlines; - underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0)); + Vector<ImeTextSpan> ime_text_spans; + ime_text_spans.push_back(ImeTextSpan(0, 5, Color(255, 0, 0), false, 0)); // Insert empty text without previous composition. GetDocument().setTitle(g_empty_string); GetDocument().UpdateStyleAndLayout(); - Controller().CommitText("", underlines, 0); + Controller().CommitText("", ime_text_spans, 0); EXPECT_STREQ("beforeinput.data:;", GetDocument().title().Utf8().data()); GetDocument().setTitle(g_empty_string); - Controller().SetComposition("n", underlines, 1, 1); + Controller().SetComposition("n", ime_text_spans, 1, 1); EXPECT_STREQ("beforeinput.data:n;input.data:n;", GetDocument().title().Utf8().data()); // Insert empty text with previous composition. GetDocument().setTitle(g_empty_string); GetDocument().UpdateStyleAndLayout(); - Controller().CommitText("", underlines, 1); + Controller().CommitText("", ime_text_spans, 1); EXPECT_STREQ("beforeinput.data:;input.data:null;compositionend.data:;", GetDocument().title().Utf8().data()); } @@ -1292,10 +1291,10 @@ CreateHTMLWithCompositionEndEventListener(kNoSelection); // Simulate composition in the |contentEditable|. - Vector<CompositionUnderline> underlines; - underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0)); + Vector<ImeTextSpan> ime_text_spans; + ime_text_spans.push_back(ImeTextSpan(0, 5, Color(255, 0, 0), false, 0)); - Controller().SetComposition("hello", underlines, 1, 1); + Controller().SetComposition("hello", ime_text_spans, 1, 1); GetDocument().UpdateStyleAndLayout(); EXPECT_EQ(1u, Controller().GetSelectionOffsets().Start()); EXPECT_EQ(1u, Controller().GetSelectionOffsets().End()); @@ -1314,7 +1313,7 @@ EXPECT_EQ(kWebTextInputTypeText, Controller().TextInputType()); // The test requires non-empty composition. - Controller().SetComposition("hello", Vector<CompositionUnderline>(), 5, 5); + Controller().SetComposition("hello", Vector<ImeTextSpan>(), 5, 5); EXPECT_EQ(kWebTextInputTypeText, Controller().TextInputType()); // Remove element 'a'. @@ -1331,8 +1330,8 @@ TEST_F(InputMethodControllerTest, ReflectsSpaceWithoutNbspMangling) { InsertHTMLElement("<div id='sample' contenteditable></div>", "sample"); - Vector<CompositionUnderline> underlines; - Controller().CommitText(String(" "), underlines, 0); + Vector<ImeTextSpan> ime_text_spans; + Controller().CommitText(String(" "), ime_text_spans, 0); // In a contenteditable, multiple spaces or a space at the edge needs to be // nbsp to affect layout properly, but it confuses some IMEs (particularly @@ -1342,13 +1341,13 @@ EXPECT_EQ(' ', Controller().TextInputInfo().value.Ascii()[1]); } -TEST_F(InputMethodControllerTest, SetCompositionPlainTextWithUnderline) { +TEST_F(InputMethodControllerTest, SetCompositionPlainTextWithIme_Span) { InsertHTMLElement("<div id='sample' contenteditable></div>", "sample"); - Vector<CompositionUnderline> underlines; - underlines.push_back(CompositionUnderline(0, 1, Color(255, 0, 0), false, 0)); + Vector<ImeTextSpan> ime_text_spans; + ime_text_spans.push_back(ImeTextSpan(0, 1, Color(255, 0, 0), false, 0)); - Controller().SetComposition(" ", underlines, 1, 1); + Controller().SetComposition(" ", ime_text_spans, 1, 1); ASSERT_EQ(1u, GetDocument().Markers().Markers().size()); @@ -1356,17 +1355,17 @@ EXPECT_EQ(1u, GetDocument().Markers().Markers()[0]->EndOffset()); } -TEST_F(InputMethodControllerTest, CommitPlainTextWithUnderlineInsert) { +TEST_F(InputMethodControllerTest, CommitPlainTextWithIme_SpanInsert) { InsertHTMLElement("<div id='sample' contenteditable>Initial text.</div>", "sample"); - Vector<CompositionUnderline> underlines; + Vector<ImeTextSpan> ime_text_spans; Controller().SetEditableSelectionOffsets(PlainTextRange(8, 8)); - underlines.push_back(CompositionUnderline(1, 11, Color(255, 0, 0), false, 0)); + ime_text_spans.push_back(ImeTextSpan(1, 11, Color(255, 0, 0), false, 0)); - Controller().CommitText(String("underlined"), underlines, 0); + Controller().CommitText(String("ime_text_spand"), ime_text_spans, 0); ASSERT_EQ(1u, GetDocument().Markers().Markers().size()); @@ -1374,17 +1373,17 @@ EXPECT_EQ(19u, GetDocument().Markers().Markers()[0]->EndOffset()); } -TEST_F(InputMethodControllerTest, CommitPlainTextWithUnderlineReplace) { +TEST_F(InputMethodControllerTest, CommitPlainTextWithIme_SpanReplace) { InsertHTMLElement("<div id='sample' contenteditable>Initial text.</div>", "sample"); - Vector<CompositionUnderline> underlines; + Vector<ImeTextSpan> ime_text_spans; - Controller().SetCompositionFromExistingText(underlines, 8, 12); + Controller().SetCompositionFromExistingText(ime_text_spans, 8, 12); - underlines.push_back(CompositionUnderline(1, 11, Color(255, 0, 0), false, 0)); + ime_text_spans.push_back(ImeTextSpan(1, 11, Color(255, 0, 0), false, 0)); - Controller().CommitText(String("string"), underlines, 0); + Controller().CommitText(String("string"), ime_text_spans, 0); ASSERT_EQ(1u, GetDocument().Markers().Markers().size()); @@ -1392,23 +1391,22 @@ EXPECT_EQ(15u, GetDocument().Markers().Markers()[0]->EndOffset()); } -TEST_F(InputMethodControllerTest, - CompositionUnderlineAppearsCorrectlyAfterNewline) { +TEST_F(InputMethodControllerTest, ImeTextSpanAppearsCorrectlyAfterNewline) { Element* div = InsertHTMLElement("<div id='sample' contenteditable></div>", "sample"); - Vector<CompositionUnderline> underlines; - Controller().SetComposition(String("hello"), underlines, 6, 6); + Vector<ImeTextSpan> ime_text_spans; + Controller().SetComposition(String("hello"), ime_text_spans, 6, 6); Controller().FinishComposingText(InputMethodController::kKeepSelection); GetFrame().GetEditor().InsertLineBreak(); - Controller().SetCompositionFromExistingText(underlines, 8, 8); + Controller().SetCompositionFromExistingText(ime_text_spans, 8, 8); - underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0)); - Controller().SetComposition(String("world"), underlines, 0, 0); + ime_text_spans.push_back(ImeTextSpan(0, 5, Color(255, 0, 0), false, 0)); + Controller().SetComposition(String("world"), ime_text_spans, 0, 0); ASSERT_EQ(1u, GetDocument().Markers().Markers().size()); - // Verify composition underline shows up on the second line, not the first + // Verify composition marker shows up on the second line, not the first ASSERT_FALSE(GetDocument().Markers().MarkerAtPosition( PlainTextRange(2).CreateRange(*div).StartPosition(), DocumentMarker::AllMarkers())); @@ -1429,9 +1427,9 @@ editable->focus(); // Simulate composition in the |contentEditable|. - Vector<CompositionUnderline> underlines; - underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0)); - Controller().SetComposition("foo", underlines, 3, 3); + Vector<ImeTextSpan> ime_text_spans; + ime_text_spans.push_back(ImeTextSpan(0, 5, Color(255, 0, 0), false, 0)); + Controller().SetComposition("foo", ime_text_spans, 3, 3); EXPECT_TRUE(Controller().HasComposition()); EXPECT_EQ(0u, Controller().CompositionRange()->startOffset()); @@ -1474,11 +1472,11 @@ GetDocument().UpdateStyleAndLayout(); Controller().SetEditableSelectionOffsets(PlainTextRange(4, 4)); - Vector<CompositionUnderline> underlines; - underlines.push_back(CompositionUnderline(0, 3, Color(255, 0, 0), false, 0)); - Controller().SetComposition(String("def"), underlines, 0, 3); - Controller().SetComposition(String(""), underlines, 0, 3); - Controller().CommitText(String("def"), underlines, 0); + Vector<ImeTextSpan> ime_text_spans; + ime_text_spans.push_back(ImeTextSpan(0, 3, Color(255, 0, 0), false, 0)); + Controller().SetComposition(String("def"), ime_text_spans, 0, 3); + Controller().SetComposition(String(""), ime_text_spans, 0, 3); + Controller().CommitText(String("def"), ime_text_spans, 0); EXPECT_STREQ("abc\ndef", textarea->value().Utf8().data()); } @@ -1488,17 +1486,17 @@ "<div id='sample' contenteditable>Initial text blah</div>", "sample"); // Delete "Initial" - Vector<CompositionUnderline> empty_underlines; - Controller().SetCompositionFromExistingText(empty_underlines, 0, 7); - Controller().CommitText(String(""), empty_underlines, 0); + Vector<ImeTextSpan> empty_ime_text_spans; + Controller().SetCompositionFromExistingText(empty_ime_text_spans, 0, 7); + Controller().CommitText(String(""), empty_ime_text_spans, 0); // The space at the beginning of the string should have been converted to an // nbsp EXPECT_STREQ(" text blah", div->innerHTML().Utf8().data()); // Delete "blah" - Controller().SetCompositionFromExistingText(empty_underlines, 6, 10); - Controller().CommitText(String(""), empty_underlines, 0); + Controller().SetCompositionFromExistingText(empty_ime_text_spans, 6, 10); + Controller().CommitText(String(""), empty_ime_text_spans, 0); // The space at the end of the string should have been converted to an nbsp EXPECT_STREQ(" text ", div->innerHTML().Utf8().data()); @@ -1510,13 +1508,13 @@ input->setValue("Abc Def Ghi"); GetDocument().UpdateStyleAndLayout(); - Vector<CompositionUnderline> empty_underlines; + Vector<ImeTextSpan> empty_ime_text_spans; Controller().SetEditableSelectionOffsets(PlainTextRange(4, 8)); - Controller().CommitText(String(""), empty_underlines, 0); + Controller().CommitText(String(""), empty_ime_text_spans, 0); EXPECT_STREQ("Abc Ghi", input->value().Utf8().data()); Controller().SetEditableSelectionOffsets(PlainTextRange(4, 7)); - Controller().CommitText(String("1"), empty_underlines, 0); + Controller().CommitText(String("1"), empty_ime_text_spans, 0); EXPECT_STREQ("Abc 1", input->value().Utf8().data()); } @@ -1541,13 +1539,13 @@ marker_range, Color::kBlack, StyleableMarker::Thickness::kThin, Color::kBlack); // Delete "Initial" - Vector<CompositionUnderline> empty_underlines; - Controller().SetCompositionFromExistingText(empty_underlines, 0, 7); - Controller().CommitText(String(""), empty_underlines, 0); + Vector<ImeTextSpan> empty_ime_text_spans; + Controller().SetCompositionFromExistingText(empty_ime_text_spans, 0, 7); + Controller().CommitText(String(""), empty_ime_text_spans, 0); // Delete "blah" - Controller().SetCompositionFromExistingText(empty_underlines, 6, 10); - Controller().CommitText(String(""), empty_underlines, 0); + Controller().SetCompositionFromExistingText(empty_ime_text_spans, 6, 10); + Controller().CommitText(String(""), empty_ime_text_spans, 0); // Check that the marker is still attached to "text" and doesn't include // either space around it @@ -1570,13 +1568,13 @@ marker_range, Color::kBlack, StyleableMarker::Thickness::kThin, Color::kBlack); // Delete "Initial" - Vector<CompositionUnderline> empty_underlines; - Controller().SetCompositionFromExistingText(empty_underlines, 0, 7); - Controller().CommitText(String(""), empty_underlines, 0); + Vector<ImeTextSpan> empty_ime_text_spans; + Controller().SetCompositionFromExistingText(empty_ime_text_spans, 0, 7); + Controller().CommitText(String(""), empty_ime_text_spans, 0); // Delete "blah" - Controller().SetCompositionFromExistingText(empty_underlines, 6, 10); - Controller().CommitText(String(""), empty_underlines, 0); + Controller().SetCompositionFromExistingText(empty_ime_text_spans, 6, 10); + Controller().CommitText(String(""), empty_ime_text_spans, 0); // Check that the marker is still attached to " text" and includes the space // before "text" but not the space after @@ -1599,13 +1597,13 @@ marker_range, Color::kBlack, StyleableMarker::Thickness::kThin, Color::kBlack); // Delete "Initial" - Vector<CompositionUnderline> empty_underlines; - Controller().SetCompositionFromExistingText(empty_underlines, 0, 7); - Controller().CommitText(String(""), empty_underlines, 0); + Vector<ImeTextSpan> empty_ime_text_spans; + Controller().SetCompositionFromExistingText(empty_ime_text_spans, 0, 7); + Controller().CommitText(String(""), empty_ime_text_spans, 0); // Delete "blah" - Controller().SetCompositionFromExistingText(empty_underlines, 6, 10); - Controller().CommitText(String(""), empty_underlines, 0); + Controller().SetCompositionFromExistingText(empty_ime_text_spans, 6, 10); + Controller().CommitText(String(""), empty_ime_text_spans, 0); // Check that the marker is still attached to "text " and includes the space // after "text" but not the space before @@ -1630,13 +1628,13 @@ Color::kBlack); // Delete "Initial" - Vector<CompositionUnderline> empty_underlines; - Controller().SetCompositionFromExistingText(empty_underlines, 0, 7); - Controller().CommitText(String(""), empty_underlines, 0); + Vector<ImeTextSpan> empty_ime_text_spans; + Controller().SetCompositionFromExistingText(empty_ime_text_spans, 0, 7); + Controller().CommitText(String(""), empty_ime_text_spans, 0); // Delete "blah" - Controller().SetCompositionFromExistingText(empty_underlines, 6, 10); - Controller().CommitText(String(""), empty_underlines, 0); + Controller().SetCompositionFromExistingText(empty_ime_text_spans, 6, 10); + Controller().CommitText(String(""), empty_ime_text_spans, 0); // Check that the marker is still attached to " text " and includes both the // space before "text" and the space after @@ -1657,9 +1655,9 @@ marker_range, TextMatchMarker::MatchStatus::kInactive); // Replace "Initial" with "Original" - Vector<CompositionUnderline> empty_underlines; - Controller().SetCompositionFromExistingText(empty_underlines, 0, 7); - Controller().CommitText(String("Original"), empty_underlines, 0); + Vector<ImeTextSpan> empty_ime_text_spans; + Controller().SetCompositionFromExistingText(empty_ime_text_spans, 0, 7); + Controller().CommitText(String("Original"), empty_ime_text_spans, 0); // Verify marker was removed EXPECT_EQ(0u, GetDocument().Markers().Markers().size()); @@ -1677,9 +1675,9 @@ Color::kBlack); // Replace "Initial" with "Original" - Vector<CompositionUnderline> empty_underlines; - Controller().SetCompositionFromExistingText(empty_underlines, 0, 7); - Controller().CommitText(String("Original"), empty_underlines, 0); + Vector<ImeTextSpan> empty_ime_text_spans; + Controller().SetCompositionFromExistingText(empty_ime_text_spans, 0, 7); + Controller().CommitText(String("Original"), empty_ime_text_spans, 0); // Verify marker is under "Original text" EXPECT_EQ(1u, GetDocument().Markers().Markers().size()); @@ -1701,9 +1699,9 @@ marker_range, TextMatchMarker::MatchStatus::kInactive); // Replace "some initial" with "boring" - Vector<CompositionUnderline> empty_underlines; - Controller().SetCompositionFromExistingText(empty_underlines, 8, 20); - Controller().CommitText(String("boring"), empty_underlines, 0); + Vector<ImeTextSpan> empty_ime_text_spans; + Controller().SetCompositionFromExistingText(empty_ime_text_spans, 8, 20); + Controller().CommitText(String("boring"), empty_ime_text_spans, 0); // Verify marker was removed EXPECT_EQ(0u, GetDocument().Markers().Markers().size()); @@ -1722,9 +1720,9 @@ Color::kBlack); // Replace "some initial" with "boring" - Vector<CompositionUnderline> empty_underlines; - Controller().SetCompositionFromExistingText(empty_underlines, 8, 20); - Controller().CommitText(String("boring"), empty_underlines, 0); + Vector<ImeTextSpan> empty_ime_text_spans; + Controller().SetCompositionFromExistingText(empty_ime_text_spans, 8, 20); + Controller().CommitText(String("boring"), empty_ime_text_spans, 0); // Verify marker is under " text" EXPECT_EQ(1u, GetDocument().Markers().Markers().size()); @@ -1744,9 +1742,9 @@ marker_range, TextMatchMarker::MatchStatus::kInactive); // Replace "text" with "string" - Vector<CompositionUnderline> empty_underlines; - Controller().SetCompositionFromExistingText(empty_underlines, 8, 12); - Controller().CommitText(String("string"), empty_underlines, 0); + Vector<ImeTextSpan> empty_ime_text_spans; + Controller().SetCompositionFromExistingText(empty_ime_text_spans, 8, 12); + Controller().CommitText(String("string"), empty_ime_text_spans, 0); // Verify marker was removed EXPECT_EQ(0u, GetDocument().Markers().Markers().size()); @@ -1763,9 +1761,9 @@ Color::kBlack); // Replace "text" with "string" - Vector<CompositionUnderline> empty_underlines; - Controller().SetCompositionFromExistingText(empty_underlines, 8, 12); - Controller().CommitText(String("string"), empty_underlines, 0); + Vector<ImeTextSpan> empty_ime_text_spans; + Controller().SetCompositionFromExistingText(empty_ime_text_spans, 8, 12); + Controller().CommitText(String("string"), empty_ime_text_spans, 0); // Verify marker is under "Initial string" EXPECT_EQ(1u, GetDocument().Markers().Markers().size()); @@ -1787,9 +1785,9 @@ marker_range, TextMatchMarker::MatchStatus::kInactive); // Replace "initial text" with "content" - Vector<CompositionUnderline> empty_underlines; - Controller().SetCompositionFromExistingText(empty_underlines, 13, 25); - Controller().CommitText(String("content"), empty_underlines, 0); + Vector<ImeTextSpan> empty_ime_text_spans; + Controller().SetCompositionFromExistingText(empty_ime_text_spans, 13, 25); + Controller().CommitText(String("content"), empty_ime_text_spans, 0); EXPECT_STREQ("This is some content", div->innerHTML().Utf8().data()); @@ -1810,9 +1808,9 @@ Color::kBlack); // Replace "initial text" with "content" - Vector<CompositionUnderline> empty_underlines; - Controller().SetCompositionFromExistingText(empty_underlines, 13, 25); - Controller().CommitText(String("content"), empty_underlines, 0); + Vector<ImeTextSpan> empty_ime_text_spans; + Controller().SetCompositionFromExistingText(empty_ime_text_spans, 13, 25); + Controller().CommitText(String("content"), empty_ime_text_spans, 0); EXPECT_STREQ("This is some content", div->innerHTML().Utf8().data()); @@ -1834,9 +1832,9 @@ marker_range, TextMatchMarker::MatchStatus::kInactive); // Replace "text" with "string" - Vector<CompositionUnderline> empty_underlines; - Controller().SetCompositionFromExistingText(empty_underlines, 8, 12); - Controller().CommitText(String("string"), empty_underlines, 0); + Vector<ImeTextSpan> empty_ime_text_spans; + Controller().SetCompositionFromExistingText(empty_ime_text_spans, 8, 12); + Controller().CommitText(String("string"), empty_ime_text_spans, 0); // Verify marker was removed EXPECT_EQ(0u, GetDocument().Markers().Markers().size()); @@ -1854,9 +1852,9 @@ Color::kBlack); // Replace "text" with "string" - Vector<CompositionUnderline> empty_underlines; - Controller().SetCompositionFromExistingText(empty_underlines, 8, 12); - Controller().CommitText(String("string"), empty_underlines, 0); + Vector<ImeTextSpan> empty_ime_text_spans; + Controller().SetCompositionFromExistingText(empty_ime_text_spans, 8, 12); + Controller().CommitText(String("string"), empty_ime_text_spans, 0); // Verify marker is under "string" EXPECT_EQ(1u, GetDocument().Markers().Markers().size()); @@ -1879,9 +1877,9 @@ EXPECT_EQ(1u, GetDocument().Markers().Markers().size()); // Replace "Initial text" with "New string" - Vector<CompositionUnderline> empty_underlines; - Controller().SetCompositionFromExistingText(empty_underlines, 0, 12); - Controller().CommitText(String("New string"), empty_underlines, 0); + Vector<ImeTextSpan> empty_ime_text_spans; + Controller().SetCompositionFromExistingText(empty_ime_text_spans, 0, 12); + Controller().CommitText(String("New string"), empty_ime_text_spans, 0); // Verify marker was removed EXPECT_EQ(0u, GetDocument().Markers().Markers().size()); @@ -1901,9 +1899,9 @@ EXPECT_EQ(1u, GetDocument().Markers().Markers().size()); // Replace "Initial text" with "New string" - Vector<CompositionUnderline> empty_underlines; - Controller().SetCompositionFromExistingText(empty_underlines, 0, 12); - Controller().CommitText(String("New string"), empty_underlines, 0); + Vector<ImeTextSpan> empty_ime_text_spans; + Controller().SetCompositionFromExistingText(empty_ime_text_spans, 0, 12); + Controller().CommitText(String("New string"), empty_ime_text_spans, 0); // Verify marker was removed EXPECT_EQ(0u, GetDocument().Markers().Markers().size()); @@ -1922,9 +1920,9 @@ EXPECT_EQ(1u, GetDocument().Markers().Markers().size()); // Replace "Initial text" with "New string" - Vector<CompositionUnderline> empty_underlines; - Controller().SetCompositionFromExistingText(empty_underlines, 0, 12); - Controller().CommitText(String("New string"), empty_underlines, 0); + Vector<ImeTextSpan> empty_ime_text_spans; + Controller().SetCompositionFromExistingText(empty_ime_text_spans, 0, 12); + Controller().CommitText(String("New string"), empty_ime_text_spans, 0); // Verify marker was removed EXPECT_EQ(0u, GetDocument().Markers().Markers().size()); @@ -1944,9 +1942,9 @@ EXPECT_EQ(1u, GetDocument().Markers().Markers().size()); // Replace "Initial text" with "New string" - Vector<CompositionUnderline> empty_underlines; - Controller().SetCompositionFromExistingText(empty_underlines, 0, 12); - Controller().CommitText(String("New string"), empty_underlines, 0); + Vector<ImeTextSpan> empty_ime_text_spans; + Controller().SetCompositionFromExistingText(empty_ime_text_spans, 0, 12); + Controller().CommitText(String("New string"), empty_ime_text_spans, 0); // Verify marker was removed EXPECT_EQ(0u, GetDocument().Markers().Markers().size()); @@ -1980,9 +1978,9 @@ EXPECT_EQ(5u, GetDocument().Markers().Markers().size()); // Delete third marker and portions of second and fourth - Vector<CompositionUnderline> empty_underlines; - Controller().SetCompositionFromExistingText(empty_underlines, 8, 17); - Controller().CommitText(String(""), empty_underlines, 0); + Vector<ImeTextSpan> empty_ime_text_spans; + Controller().SetCompositionFromExistingText(empty_ime_text_spans, 8, 17); + Controller().CommitText(String(""), empty_ime_text_spans, 0); // Verify markers were updated correctly EXPECT_EQ(2u, GetDocument().Markers().Markers().size()); @@ -2027,9 +2025,9 @@ EXPECT_EQ(5u, GetDocument().Markers().Markers().size()); // Delete third marker and portions of second and fourth - Vector<CompositionUnderline> empty_underlines; - Controller().SetCompositionFromExistingText(empty_underlines, 8, 17); - Controller().CommitText(String(""), empty_underlines, 0); + Vector<ImeTextSpan> empty_ime_text_spans; + Controller().SetCompositionFromExistingText(empty_ime_text_spans, 8, 17); + Controller().CommitText(String(""), empty_ime_text_spans, 0); // Verify markers were updated correctly EXPECT_EQ(4u, GetDocument().Markers().Markers().size()); @@ -2060,9 +2058,9 @@ EXPECT_EQ(1u, GetDocument().Markers().Markers().size()); // Delete exactly on the marker - Vector<CompositionUnderline> empty_underlines; - Controller().SetCompositionFromExistingText(empty_underlines, 5, 10); - Controller().CommitText(String(""), empty_underlines, 0); + Vector<ImeTextSpan> empty_ime_text_spans; + Controller().SetCompositionFromExistingText(empty_ime_text_spans, 5, 10); + Controller().CommitText(String(""), empty_ime_text_spans, 0); EXPECT_EQ(0u, GetDocument().Markers().Markers().size()); } @@ -2080,9 +2078,9 @@ EXPECT_EQ(1u, GetDocument().Markers().Markers().size()); // Delete exactly on the marker - Vector<CompositionUnderline> empty_underlines; - Controller().SetCompositionFromExistingText(empty_underlines, 5, 10); - Controller().CommitText(String(""), empty_underlines, 0); + Vector<ImeTextSpan> empty_ime_text_spans; + Controller().SetCompositionFromExistingText(empty_ime_text_spans, 5, 10); + Controller().CommitText(String(""), empty_ime_text_spans, 0); EXPECT_EQ(0u, GetDocument().Markers().Markers().size()); } @@ -2096,9 +2094,9 @@ marker_range, TextMatchMarker::MatchStatus::kInactive); // Delete middle of marker - Vector<CompositionUnderline> empty_underlines; - Controller().SetCompositionFromExistingText(empty_underlines, 6, 9); - Controller().CommitText(String(""), empty_underlines, 0); + Vector<ImeTextSpan> empty_ime_text_spans; + Controller().SetCompositionFromExistingText(empty_ime_text_spans, 6, 9); + Controller().CommitText(String(""), empty_ime_text_spans, 0); // Verify marker was removed EXPECT_EQ(0u, GetDocument().Markers().Markers().size()); @@ -2116,9 +2114,9 @@ Color::kBlack); // Delete middle of marker - Vector<CompositionUnderline> empty_underlines; - Controller().SetCompositionFromExistingText(empty_underlines, 6, 9); - Controller().CommitText(String(""), empty_underlines, 0); + Vector<ImeTextSpan> empty_ime_text_spans; + Controller().SetCompositionFromExistingText(empty_ime_text_spans, 6, 9); + Controller().CommitText(String(""), empty_ime_text_spans, 0); EXPECT_EQ(1u, GetDocument().Markers().Markers().size()); @@ -2147,9 +2145,9 @@ EXPECT_EQ(3u, GetDocument().Markers().Markers().size()); // insert in middle of second marker - Vector<CompositionUnderline> empty_underlines; - Controller().SetComposition("", empty_underlines, 7, 7); - Controller().CommitText(String("66666"), empty_underlines, -7); + Vector<ImeTextSpan> empty_ime_text_spans; + Controller().SetComposition("", empty_ime_text_spans, 7, 7); + Controller().CommitText(String("66666"), empty_ime_text_spans, -7); EXPECT_EQ(2u, GetDocument().Markers().Markers().size()); @@ -2184,9 +2182,9 @@ EXPECT_EQ(3u, GetDocument().Markers().Markers().size()); // insert in middle of second marker - Vector<CompositionUnderline> empty_underlines; - Controller().SetComposition("", empty_underlines, 7, 7); - Controller().CommitText(String("66666"), empty_underlines, -7); + Vector<ImeTextSpan> empty_ime_text_spans; + Controller().SetComposition("", empty_ime_text_spans, 7, 7); + Controller().CommitText(String("66666"), empty_ime_text_spans, -7); EXPECT_EQ(3u, GetDocument().Markers().Markers().size()); @@ -2219,9 +2217,9 @@ EXPECT_EQ(3u, GetDocument().Markers().Markers().size()); - Vector<CompositionUnderline> empty_underlines; - Controller().SetComposition("", empty_underlines, 5, 5); - Controller().CommitText(String("77777"), empty_underlines, 0); + Vector<ImeTextSpan> empty_ime_text_spans; + Controller().SetComposition("", empty_ime_text_spans, 5, 5); + Controller().CommitText(String("77777"), empty_ime_text_spans, 0); EXPECT_EQ(3u, GetDocument().Markers().Markers().size()); @@ -2258,9 +2256,9 @@ EXPECT_EQ(3u, GetDocument().Markers().Markers().size()); - Vector<CompositionUnderline> empty_underlines; - Controller().SetComposition("", empty_underlines, 5, 5); - Controller().CommitText(String("77777"), empty_underlines, 0); + Vector<ImeTextSpan> empty_ime_text_spans; + Controller().SetComposition("", empty_ime_text_spans, 5, 5); + Controller().CommitText(String("77777"), empty_ime_text_spans, 0); EXPECT_EQ(3u, GetDocument().Markers().Markers().size()); @@ -2295,7 +2293,7 @@ EXPECT_EQ(kWebTextInputTypeText, Controller().TextInputType()); - Controller().SetComposition("abcde", Vector<CompositionUnderline>(), 4, 4); + Controller().SetComposition("abcde", Vector<ImeTextSpan>(), 4, 4); EXPECT_STREQ("abcde", input->value().Utf8().data()); Controller().FinishComposingText(InputMethodController::kKeepSelection);
diff --git a/third_party/WebKit/Source/core/editing/TextFinder.cpp b/third_party/WebKit/Source/core/editing/TextFinder.cpp index a796228..c0b695ac 100644 --- a/third_party/WebKit/Source/core/editing/TextFinder.cpp +++ b/third_party/WebKit/Source/core/editing/TextFinder.cpp
@@ -373,7 +373,6 @@ // Clear the counters from last operation. last_match_count_ = 0; next_invalidate_after_ = 0; - resume_scoping_from_range_ = nullptr; // The view might be null on detached frames. LocalFrame* frame = OwnerFrame().GetFrame(); @@ -558,6 +557,8 @@ last_find_request_completed_with_no_matches_ = false; scoping_in_progress_ = false; + + resume_scoping_from_range_ = nullptr; } void TextFinder::IncreaseMatchCount(int identifier, int count) {
diff --git a/third_party/WebKit/Source/core/exported/LocalFrameClientImpl.cpp b/third_party/WebKit/Source/core/exported/LocalFrameClientImpl.cpp index 975876e..2a59341 100644 --- a/third_party/WebKit/Source/core/exported/LocalFrameClientImpl.cpp +++ b/third_party/WebKit/Source/core/exported/LocalFrameClientImpl.cpp
@@ -913,7 +913,7 @@ frame_element->ScrollingMode(), frame_element->MarginWidth(), frame_element->MarginHeight(), frame_element->AllowFullscreen(), frame_element->AllowPaymentRequest(), frame_element->IsDisplayNone(), - frame_element->Csp(), frame_element->AllowedFeatures())); + frame_element->Csp())); } void LocalFrameClientImpl::DispatchWillStartUsingPeerConnectionHandler(
diff --git a/third_party/WebKit/Source/core/exported/WebFrame.cpp b/third_party/WebKit/Source/core/exported/WebFrame.cpp index 25a7f83..494a213 100644 --- a/third_party/WebKit/Source/core/exported/WebFrame.cpp +++ b/third_party/WebKit/Source/core/exported/WebFrame.cpp
@@ -180,7 +180,6 @@ owner->SetAllowPaymentRequest(properties.allow_payment_request); owner->SetIsDisplayNone(properties.is_display_none); owner->SetCsp(properties.required_csp); - owner->SetAllowedFeatures(properties.allowed_features); } void WebFrame::Collapse(bool collapsed) {
diff --git a/third_party/WebKit/Source/core/exported/WebInputMethodControllerImpl.cpp b/third_party/WebKit/Source/core/exported/WebInputMethodControllerImpl.cpp index 0a7f545..ec3ab31ac 100644 --- a/third_party/WebKit/Source/core/exported/WebInputMethodControllerImpl.cpp +++ b/third_party/WebKit/Source/core/exported/WebInputMethodControllerImpl.cpp
@@ -7,11 +7,11 @@ #include "core/InputTypeNames.h" #include "core/dom/Document.h" #include "core/dom/UserGestureIndicator.h" -#include "core/editing/CompositionUnderlineVectorBuilder.h" #include "core/editing/EditingUtilities.h" #include "core/editing/Editor.h" #include "core/editing/EphemeralRange.h" #include "core/editing/FrameSelection.h" +#include "core/editing/ImeTextSpanVectorBuilder.h" #include "core/editing/InputMethodController.h" #include "core/editing/PlainTextRange.h" #include "core/exported/WebPluginContainerImpl.h" @@ -37,12 +37,12 @@ bool WebInputMethodControllerImpl::SetComposition( const WebString& text, - const WebVector<WebCompositionUnderline>& underlines, + const WebVector<WebImeTextSpan>& ime_text_spans, const WebRange& replacement_range, int selection_start, int selection_end) { if (WebPlugin* plugin = FocusedPluginIfInputMethodSupported()) { - return plugin->SetComposition(text, underlines, replacement_range, + return plugin->SetComposition(text, ime_text_spans, replacement_range, selection_start, selection_end); } @@ -72,12 +72,8 @@ UserGestureIndicator gesture_indicator(UserGestureToken::Create( GetFrame()->GetDocument(), UserGestureToken::kNewGesture)); - // When the range of composition underlines overlap with the range between - // selectionStart and selectionEnd, WebKit somehow won't paint the selection - // at all (see InlineTextBox::paint() function in InlineTextBox.cpp). - // But the selection range actually takes effect. GetInputMethodController().SetComposition( - String(text), CompositionUnderlineVectorBuilder::Build(underlines), + String(text), ImeTextSpanVectorBuilder::Build(ime_text_spans), selection_start, selection_end); return text.IsEmpty() || GetInputMethodController().HasComposition(); @@ -107,14 +103,14 @@ bool WebInputMethodControllerImpl::CommitText( const WebString& text, - const WebVector<WebCompositionUnderline>& underlines, + const WebVector<WebImeTextSpan>& ime_text_spans, const WebRange& replacement_range, int relative_caret_position) { UserGestureIndicator gesture_indicator(UserGestureToken::Create( GetFrame()->GetDocument(), UserGestureToken::kNewGesture)); if (WebPlugin* plugin = FocusedPluginIfInputMethodSupported()) { - return plugin->CommitText(text, underlines, replacement_range, + return plugin->CommitText(text, ime_text_spans, replacement_range, relative_caret_position); } @@ -127,7 +123,7 @@ GetFrame()->GetDocument()->UpdateStyleAndLayoutIgnorePendingStylesheets(); return GetInputMethodController().CommitText( - text, CompositionUnderlineVectorBuilder::Build(underlines), + text, ImeTextSpanVectorBuilder::Build(ime_text_spans), relative_caret_position); }
diff --git a/third_party/WebKit/Source/core/exported/WebInputMethodControllerImpl.h b/third_party/WebKit/Source/core/exported/WebInputMethodControllerImpl.h index a2e4219..001d1c6 100644 --- a/third_party/WebKit/Source/core/exported/WebInputMethodControllerImpl.h +++ b/third_party/WebKit/Source/core/exported/WebInputMethodControllerImpl.h
@@ -8,7 +8,7 @@ #include "core/CoreExport.h" #include "platform/heap/Handle.h" #include "platform/wtf/Allocator.h" -#include "public/web/WebCompositionUnderline.h" +#include "public/web/WebImeTextSpan.h" #include "public/web/WebInputMethodController.h" namespace blink { @@ -31,12 +31,12 @@ // WebInputMethodController overrides. bool SetComposition(const WebString& text, - const WebVector<WebCompositionUnderline>& underlines, + const WebVector<WebImeTextSpan>& ime_text_spans, const WebRange& replacement_range, int selection_start, int selection_end) override; bool CommitText(const WebString& text, - const WebVector<WebCompositionUnderline>& underlines, + const WebVector<WebImeTextSpan>& ime_text_spans, const WebRange& replacement_range, int relative_caret_position) override; bool FinishComposingText(
diff --git a/third_party/WebKit/Source/core/exported/WebViewImpl.cpp b/third_party/WebKit/Source/core/exported/WebViewImpl.cpp index 41353c58..bf69e60 100644 --- a/third_party/WebKit/Source/core/exported/WebViewImpl.cpp +++ b/third_party/WebKit/Source/core/exported/WebViewImpl.cpp
@@ -1853,11 +1853,8 @@ // apparent position unchanged. ResizeViewportAnchor::ResizeScope resize_scope(*resize_viewport_anchor_); - float browser_controls_viewport_adjustment = - GetBrowserControls().LayoutHeight() - - GetBrowserControls().ContentOffset(); visual_viewport.SetBrowserControlsAdjustment( - browser_controls_viewport_adjustment); + GetBrowserControls().UnreportedSizeAdjustment()); } }
diff --git a/third_party/WebKit/Source/core/exported/WebViewTest.cpp b/third_party/WebKit/Source/core/exported/WebViewTest.cpp index af31524..cb95a65b 100644 --- a/third_party/WebKit/Source/core/exported/WebViewTest.cpp +++ b/third_party/WebKit/Source/core/exported/WebViewTest.cpp
@@ -961,9 +961,9 @@ // The test requires non-empty composition. std::string composition_text("hello"); - WebVector<WebCompositionUnderline> empty_underlines; + WebVector<WebImeTextSpan> empty_ime_text_spans; active_input_method_controller->SetComposition( - WebString::FromUTF8(composition_text.c_str()), empty_underlines, + WebString::FromUTF8(composition_text.c_str()), empty_ime_text_spans, WebRange(), 5, 5); // Do arbitrary change to make layout dirty. @@ -991,9 +991,9 @@ web_view->MainFrameImpl() ->FrameWidget() ->GetActiveWebInputMethodController(); - WebVector<WebCompositionUnderline> empty_underlines; + WebVector<WebImeTextSpan> empty_ime_text_spans; active_input_method_controller->SetComposition( - WebString::FromUTF8(composition_text.c_str()), empty_underlines, + WebString::FromUTF8(composition_text.c_str()), empty_ime_text_spans, WebRange(), 3, 3); WebTextInputInfo info = active_input_method_controller->TextInputInfo(); @@ -1012,7 +1012,7 @@ EXPECT_EQ(-1, info.composition_end); active_input_method_controller->SetComposition( - WebString::FromUTF8(composition_text.c_str()), empty_underlines, + WebString::FromUTF8(composition_text.c_str()), empty_ime_text_spans, WebRange(), 3, 3); info = active_input_method_controller->TextInputInfo(); EXPECT_EQ("helhellolo", std::string(info.value.Utf8().data())); @@ -1040,11 +1040,11 @@ ->FrameWidget() ->GetActiveWebInputMethodController(); - WebVector<WebCompositionUnderline> empty_underlines; + WebVector<WebImeTextSpan> empty_ime_text_spans; - active_input_method_controller->CommitText("hello", empty_underlines, + active_input_method_controller->CommitText("hello", empty_ime_text_spans, WebRange(), 0); - active_input_method_controller->CommitText("world", empty_underlines, + active_input_method_controller->CommitText("world", empty_ime_text_spans, WebRange(), -5); WebTextInputInfo info = active_input_method_controller->TextInputInfo(); @@ -1059,7 +1059,7 @@ // Caret is on the left of composing text. active_input_method_controller->SetComposition( - WebString::FromUTF8(composition_text.c_str()), empty_underlines, + WebString::FromUTF8(composition_text.c_str()), empty_ime_text_spans, WebRange(), 0, 0); info = active_input_method_controller->TextInputInfo(); EXPECT_EQ("helloABCworld", std::string(info.value.Utf8().data())); @@ -1070,7 +1070,7 @@ // Caret is on the right of composing text. active_input_method_controller->SetComposition( - WebString::FromUTF8(composition_text.c_str()), empty_underlines, + WebString::FromUTF8(composition_text.c_str()), empty_ime_text_spans, WebRange(), 3, 3); info = active_input_method_controller->TextInputInfo(); EXPECT_EQ("helloABCworld", std::string(info.value.Utf8().data())); @@ -1081,7 +1081,7 @@ // Caret is between composing text and left boundary. active_input_method_controller->SetComposition( - WebString::FromUTF8(composition_text.c_str()), empty_underlines, + WebString::FromUTF8(composition_text.c_str()), empty_ime_text_spans, WebRange(), -2, -2); info = active_input_method_controller->TextInputInfo(); EXPECT_EQ("helloABCworld", std::string(info.value.Utf8().data())); @@ -1092,7 +1092,7 @@ // Caret is between composing text and right boundary. active_input_method_controller->SetComposition( - WebString::FromUTF8(composition_text.c_str()), empty_underlines, + WebString::FromUTF8(composition_text.c_str()), empty_ime_text_spans, WebRange(), 5, 5); info = active_input_method_controller->TextInputInfo(); EXPECT_EQ("helloABCworld", std::string(info.value.Utf8().data())); @@ -1103,7 +1103,7 @@ // Caret is on the left boundary. active_input_method_controller->SetComposition( - WebString::FromUTF8(composition_text.c_str()), empty_underlines, + WebString::FromUTF8(composition_text.c_str()), empty_ime_text_spans, WebRange(), -5, -5); info = active_input_method_controller->TextInputInfo(); EXPECT_EQ("helloABCworld", std::string(info.value.Utf8().data())); @@ -1114,7 +1114,7 @@ // Caret is on the right boundary. active_input_method_controller->SetComposition( - WebString::FromUTF8(composition_text.c_str()), empty_underlines, + WebString::FromUTF8(composition_text.c_str()), empty_ime_text_spans, WebRange(), 8, 8); info = active_input_method_controller->TextInputInfo(); EXPECT_EQ("helloABCworld", std::string(info.value.Utf8().data())); @@ -1125,7 +1125,7 @@ // Caret exceeds the left boundary. active_input_method_controller->SetComposition( - WebString::FromUTF8(composition_text.c_str()), empty_underlines, + WebString::FromUTF8(composition_text.c_str()), empty_ime_text_spans, WebRange(), -100, -100); info = active_input_method_controller->TextInputInfo(); EXPECT_EQ("helloABCworld", std::string(info.value.Utf8().data())); @@ -1136,7 +1136,7 @@ // Caret exceeds the right boundary. active_input_method_controller->SetComposition( - WebString::FromUTF8(composition_text.c_str()), empty_underlines, + WebString::FromUTF8(composition_text.c_str()), empty_ime_text_spans, WebRange(), 100, 100); info = active_input_method_controller->TextInputInfo(); EXPECT_EQ("helloABCworld", std::string(info.value.Utf8().data())); @@ -1156,9 +1156,9 @@ ->FrameWidget() ->GetActiveWebInputMethodController(); - WebVector<WebCompositionUnderline> empty_underlines; + WebVector<WebImeTextSpan> empty_ime_text_spans; - active_input_method_controller->CommitText("hello", empty_underlines, + active_input_method_controller->CommitText("hello", empty_ime_text_spans, WebRange(), 0); WebTextInputInfo info = active_input_method_controller->TextInputInfo(); @@ -1169,7 +1169,7 @@ EXPECT_EQ(-1, info.composition_end); active_input_method_controller->SetComposition( - WebString::FromUTF8(""), empty_underlines, WebRange(), 0, 0); + WebString::FromUTF8(""), empty_ime_text_spans, WebRange(), 0, 0); info = active_input_method_controller->TextInputInfo(); EXPECT_EQ("hello", std::string(info.value.Utf8().data())); EXPECT_EQ(5, info.selection_start); @@ -1178,7 +1178,7 @@ EXPECT_EQ(-1, info.composition_end); active_input_method_controller->SetComposition( - WebString::FromUTF8(""), empty_underlines, WebRange(), -2, -2); + WebString::FromUTF8(""), empty_ime_text_spans, WebRange(), -2, -2); info = active_input_method_controller->TextInputInfo(); EXPECT_EQ("hello", std::string(info.value.Utf8().data())); EXPECT_EQ(3, info.selection_start); @@ -1197,11 +1197,11 @@ ->FrameWidget() ->GetActiveWebInputMethodController(); - WebVector<WebCompositionUnderline> empty_underlines; + WebVector<WebImeTextSpan> empty_ime_text_spans; // Caret is on the left of composing text. - active_input_method_controller->CommitText("ab", empty_underlines, WebRange(), - -2); + active_input_method_controller->CommitText("ab", empty_ime_text_spans, + WebRange(), -2); WebTextInputInfo info = active_input_method_controller->TextInputInfo(); EXPECT_EQ("ab", std::string(info.value.Utf8().data())); EXPECT_EQ(0, info.selection_start); @@ -1210,8 +1210,8 @@ EXPECT_EQ(-1, info.composition_end); // Caret is on the right of composing text. - active_input_method_controller->CommitText("c", empty_underlines, WebRange(), - 1); + active_input_method_controller->CommitText("c", empty_ime_text_spans, + WebRange(), 1); info = active_input_method_controller->TextInputInfo(); EXPECT_EQ("cab", std::string(info.value.Utf8().data())); EXPECT_EQ(2, info.selection_start); @@ -1220,7 +1220,7 @@ EXPECT_EQ(-1, info.composition_end); // Caret is on the left boundary. - active_input_method_controller->CommitText("def", empty_underlines, + active_input_method_controller->CommitText("def", empty_ime_text_spans, WebRange(), -5); info = active_input_method_controller->TextInputInfo(); EXPECT_EQ("cadefb", std::string(info.value.Utf8().data())); @@ -1230,8 +1230,8 @@ EXPECT_EQ(-1, info.composition_end); // Caret is on the right boundary. - active_input_method_controller->CommitText("g", empty_underlines, WebRange(), - 6); + active_input_method_controller->CommitText("g", empty_ime_text_spans, + WebRange(), 6); info = active_input_method_controller->TextInputInfo(); EXPECT_EQ("gcadefb", std::string(info.value.Utf8().data())); EXPECT_EQ(7, info.selection_start); @@ -1240,8 +1240,8 @@ EXPECT_EQ(-1, info.composition_end); // Caret exceeds the left boundary. - active_input_method_controller->CommitText("hi", empty_underlines, WebRange(), - -100); + active_input_method_controller->CommitText("hi", empty_ime_text_spans, + WebRange(), -100); info = active_input_method_controller->TextInputInfo(); EXPECT_EQ("gcadefbhi", std::string(info.value.Utf8().data())); EXPECT_EQ(0, info.selection_start); @@ -1250,8 +1250,8 @@ EXPECT_EQ(-1, info.composition_end); // Caret exceeds the right boundary. - active_input_method_controller->CommitText("jk", empty_underlines, WebRange(), - 100); + active_input_method_controller->CommitText("jk", empty_ime_text_spans, + WebRange(), 100); info = active_input_method_controller->TextInputInfo(); EXPECT_EQ("jkgcadefbhi", std::string(info.value.Utf8().data())); EXPECT_EQ(11, info.selection_start); @@ -1270,9 +1270,9 @@ ->FrameWidget() ->GetActiveWebInputMethodController(); - WebVector<WebCompositionUnderline> empty_underlines; + WebVector<WebImeTextSpan> empty_ime_text_spans; active_input_method_controller->SetComposition( - WebString::FromUTF8("abc"), empty_underlines, WebRange(), 0, 0); + WebString::FromUTF8("abc"), empty_ime_text_spans, WebRange(), 0, 0); WebTextInputInfo info = active_input_method_controller->TextInputInfo(); EXPECT_EQ("abc", std::string(info.value.Utf8().data())); EXPECT_EQ(0, info.selection_start); @@ -1282,7 +1282,7 @@ // Deletes ongoing composition, inserts the specified text and moves the // caret. - active_input_method_controller->CommitText("hello", empty_underlines, + active_input_method_controller->CommitText("hello", empty_ime_text_spans, WebRange(), -2); info = active_input_method_controller->TextInputInfo(); EXPECT_EQ("hello", std::string(info.value.Utf8().data())); @@ -1292,7 +1292,7 @@ EXPECT_EQ(-1, info.composition_end); active_input_method_controller->SetComposition( - WebString::FromUTF8("abc"), empty_underlines, WebRange(), 0, 0); + WebString::FromUTF8("abc"), empty_ime_text_spans, WebRange(), 0, 0); info = active_input_method_controller->TextInputInfo(); EXPECT_EQ("helabclo", std::string(info.value.Utf8().data())); EXPECT_EQ(3, info.selection_start); @@ -1301,8 +1301,8 @@ EXPECT_EQ(6, info.composition_end); // Deletes ongoing composition and moves the caret. - active_input_method_controller->CommitText("", empty_underlines, WebRange(), - 2); + active_input_method_controller->CommitText("", empty_ime_text_spans, + WebRange(), 2); info = active_input_method_controller->TextInputInfo(); EXPECT_EQ("hello", std::string(info.value.Utf8().data())); EXPECT_EQ(5, info.selection_start); @@ -1311,7 +1311,7 @@ EXPECT_EQ(-1, info.composition_end); // Inserts the specified text and moves the caret. - active_input_method_controller->CommitText("world", empty_underlines, + active_input_method_controller->CommitText("world", empty_ime_text_spans, WebRange(), -5); info = active_input_method_controller->TextInputInfo(); EXPECT_EQ("helloworld", std::string(info.value.Utf8().data())); @@ -1321,8 +1321,8 @@ EXPECT_EQ(-1, info.composition_end); // Only moves the caret. - active_input_method_controller->CommitText("", empty_underlines, WebRange(), - 5); + active_input_method_controller->CommitText("", empty_ime_text_spans, + WebRange(), 5); info = active_input_method_controller->TextInputInfo(); EXPECT_EQ("helloworld", std::string(info.value.Utf8().data())); EXPECT_EQ(10, info.selection_start); @@ -1341,10 +1341,10 @@ EXPECT_EQ(0, web_view->MainFrameImpl()->GetScrollOffset().height); // Set up a composition from existing text that needs to be committed. - Vector<CompositionUnderline> empty_underlines; + Vector<ImeTextSpan> empty_ime_text_spans; WebLocalFrameImpl* frame = web_view->MainFrameImpl(); frame->GetFrame()->GetInputMethodController().SetCompositionFromExistingText( - empty_underlines, 0, 3); + empty_ime_text_spans, 0, 3); // Scroll the input field out of the viewport. Element* element = static_cast<Element*>( @@ -1371,13 +1371,13 @@ base_url_ + "text_area_populated.html"); web_view->SetInitialFocus(false); - WebVector<WebCompositionUnderline> empty_underlines; + WebVector<WebImeTextSpan> empty_ime_text_spans; WebLocalFrameImpl* frame = web_view->MainFrameImpl(); WebInputMethodController* active_input_method_controller = frame->GetInputMethodController(); frame->SetEditableSelectionOffsets(4, 4); - frame->SetCompositionFromExistingText(8, 12, empty_underlines); + frame->SetCompositionFromExistingText(8, 12, empty_ime_text_spans); WebTextInputInfo info = active_input_method_controller->TextInputInfo(); EXPECT_EQ("0123456789abcdefghijklmnopqrstuvwxyz", @@ -1397,7 +1397,7 @@ std::string composition_text("\n"); active_input_method_controller->CommitText( - WebString::FromUTF8(composition_text.c_str()), empty_underlines, + WebString::FromUTF8(composition_text.c_str()), empty_ime_text_spans, WebRange(), 0); info = active_input_method_controller->TextInputInfo(); EXPECT_EQ(5, info.selection_start); @@ -1475,20 +1475,20 @@ WebViewImpl* web_view = web_view_helper_.InitializeAndLoad( base_url_ + "input_field_populated.html"); web_view->SetInitialFocus(false); - WebVector<WebCompositionUnderline> underlines(static_cast<size_t>(1)); - underlines[0] = WebCompositionUnderline(0, 4, 0, false, 0); + WebVector<WebImeTextSpan> ime_text_spans(static_cast<size_t>(1)); + ime_text_spans[0] = WebImeTextSpan(0, 4, 0, false, 0); WebLocalFrameImpl* frame = web_view->MainFrameImpl(); WebInputMethodController* active_input_method_controller = frame->GetInputMethodController(); frame->SetEditableSelectionOffsets(4, 10); - frame->SetCompositionFromExistingText(8, 12, underlines); + frame->SetCompositionFromExistingText(8, 12, ime_text_spans); WebTextInputInfo info = active_input_method_controller->TextInputInfo(); EXPECT_EQ(4, info.selection_start); EXPECT_EQ(10, info.selection_end); EXPECT_EQ(8, info.composition_start); EXPECT_EQ(12, info.composition_end); - WebVector<WebCompositionUnderline> empty_underlines; - frame->SetCompositionFromExistingText(0, 0, empty_underlines); + WebVector<WebImeTextSpan> empty_ime_text_spans; + frame->SetCompositionFromExistingText(0, 0, empty_ime_text_spans); info = active_input_method_controller->TextInputInfo(); EXPECT_EQ(4, info.selection_start); EXPECT_EQ(10, info.selection_end); @@ -1501,23 +1501,23 @@ WebViewImpl* web_view = web_view_helper_.InitializeAndLoad( base_url_ + "text_area_populated.html"); web_view->SetInitialFocus(false); - WebVector<WebCompositionUnderline> underlines(static_cast<size_t>(1)); - underlines[0] = WebCompositionUnderline(0, 4, 0, false, 0); + WebVector<WebImeTextSpan> ime_text_spans(static_cast<size_t>(1)); + ime_text_spans[0] = WebImeTextSpan(0, 4, 0, false, 0); WebLocalFrameImpl* frame = web_view->MainFrameImpl(); WebInputMethodController* active_input_method_controller = frame->FrameWidget()->GetActiveWebInputMethodController(); frame->SetEditableSelectionOffsets(27, 27); std::string new_line_text("\n"); - WebVector<WebCompositionUnderline> empty_underlines; + WebVector<WebImeTextSpan> empty_ime_text_spans; active_input_method_controller->CommitText( - WebString::FromUTF8(new_line_text.c_str()), empty_underlines, WebRange(), - 0); + WebString::FromUTF8(new_line_text.c_str()), empty_ime_text_spans, + WebRange(), 0); WebTextInputInfo info = active_input_method_controller->TextInputInfo(); EXPECT_EQ("0123456789abcdefghijklmnopq\nrstuvwxyz", std::string(info.value.Utf8().data())); frame->SetEditableSelectionOffsets(31, 31); - frame->SetCompositionFromExistingText(30, 34, underlines); + frame->SetCompositionFromExistingText(30, 34, ime_text_spans); info = active_input_method_controller->TextInputInfo(); EXPECT_EQ("0123456789abcdefghijklmnopq\nrstuvwxyz", std::string(info.value.Utf8().data())); @@ -1528,7 +1528,7 @@ std::string composition_text("yolo"); active_input_method_controller->CommitText( - WebString::FromUTF8(composition_text.c_str()), empty_underlines, + WebString::FromUTF8(composition_text.c_str()), empty_ime_text_spans, WebRange(), 0); info = active_input_method_controller->TextInputInfo(); EXPECT_EQ("0123456789abcdefghijklmnopq\nrsyoloxyz", @@ -1544,13 +1544,13 @@ WebViewImpl* web_view = web_view_helper_.InitializeAndLoad( base_url_ + "content_editable_rich_text.html"); web_view->SetInitialFocus(false); - WebVector<WebCompositionUnderline> underlines(static_cast<size_t>(1)); - underlines[0] = WebCompositionUnderline(0, 4, 0, false, 0); + WebVector<WebImeTextSpan> ime_text_spans(static_cast<size_t>(1)); + ime_text_spans[0] = WebImeTextSpan(0, 4, 0, false, 0); WebLocalFrameImpl* frame = web_view->MainFrameImpl(); frame->SetEditableSelectionOffsets(1, 1); WebDocument document = web_view->MainFrameImpl()->GetDocument(); EXPECT_FALSE(document.GetElementById("bold").IsNull()); - frame->SetCompositionFromExistingText(0, 4, underlines); + frame->SetCompositionFromExistingText(0, 4, ime_text_spans); EXPECT_FALSE(document.GetElementById("bold").IsNull()); } @@ -1562,17 +1562,17 @@ std::string composition_text_first("hello "); std::string composition_text_second("world"); - WebVector<WebCompositionUnderline> empty_underlines; + WebVector<WebImeTextSpan> empty_ime_text_spans; WebInputMethodController* active_input_method_controller = web_view->MainFrameImpl() ->FrameWidget() ->GetActiveWebInputMethodController(); active_input_method_controller->CommitText( - WebString::FromUTF8(composition_text_first.c_str()), empty_underlines, + WebString::FromUTF8(composition_text_first.c_str()), empty_ime_text_spans, WebRange(), 0); active_input_method_controller->SetComposition( - WebString::FromUTF8(composition_text_second.c_str()), empty_underlines, - WebRange(), 5, 5); + WebString::FromUTF8(composition_text_second.c_str()), + empty_ime_text_spans, WebRange(), 5, 5); WebTextInputInfo info = active_input_method_controller->TextInputInfo(); EXPECT_EQ("hello world", std::string(info.value.Utf8().data())); @@ -2825,10 +2825,10 @@ WebInputMethodController* active_input_method_controller = frame->FrameWidget()->GetActiveWebInputMethodController(); EXPECT_TRUE(TapElementById(WebInputEvent::kGestureTap, target)); - WebVector<WebCompositionUnderline> empty_underlines; + WebVector<WebImeTextSpan> empty_ime_text_spans; frame->SetEditableSelectionOffsets(8, 8); EXPECT_TRUE(active_input_method_controller->SetComposition( - "12345", empty_underlines, WebRange(), 8, 13)); + "12345", empty_ime_text_spans, WebRange(), 8, 13)); EXPECT_TRUE(frame->GetFrame()->GetInputMethodController().HasComposition()); EXPECT_EQ("", std::string(frame->SelectionAsText().Utf8().data())); EXPECT_FALSE(frame->GetFrame()->Selection().IsHandleVisible()); @@ -3209,9 +3209,9 @@ web_view->SetInitialFocus(false); // Set up a composition that needs to be committed. - WebVector<WebCompositionUnderline> empty_underlines; + WebVector<WebImeTextSpan> empty_ime_text_spans; frame->SetEditableSelectionOffsets(4, 10); - frame->SetCompositionFromExistingText(8, 12, empty_underlines); + frame->SetCompositionFromExistingText(8, 12, empty_ime_text_spans); WebTextInputInfo info = frame->GetInputMethodController()->TextInputInfo(); EXPECT_EQ(4, info.selection_start); EXPECT_EQ(10, info.selection_end); @@ -3253,12 +3253,12 @@ // Test both input elements. for (int i = 0; i < 2; ++i) { // Select composition and do sanity check. - WebVector<WebCompositionUnderline> empty_underlines; + WebVector<WebImeTextSpan> empty_ime_text_spans; frame->SetEditableSelectionOffsets(6, 6); WebInputMethodController* active_input_method_controller = frame->FrameWidget()->GetActiveWebInputMethodController(); EXPECT_TRUE(active_input_method_controller->SetComposition( - "fghij", empty_underlines, WebRange(), 0, 5)); + "fghij", empty_ime_text_spans, WebRange(), 0, 5)); frame->SetEditableSelectionOffsets(11, 11); VerifySelectionAndComposition(web_view, 11, 11, 6, 11, "initial case"); @@ -3273,7 +3273,7 @@ frame->SetEditableSelectionOffsets(6, 6); EXPECT_TRUE(active_input_method_controller->SetComposition( - "fghi", empty_underlines, WebRange(), 0, 4)); + "fghi", empty_ime_text_spans, WebRange(), 0, 4)); frame->SetEditableSelectionOffsets(10, 10); VerifySelectionAndComposition(web_view, 10, 10, 6, 10, "after pressing Backspace"); @@ -3305,9 +3305,9 @@ // Set up a composition that needs to be committed. std::string composition_text("testingtext"); - WebVector<WebCompositionUnderline> empty_underlines; + WebVector<WebImeTextSpan> empty_ime_text_spans; active_input_method_controller->SetComposition( - WebString::FromUTF8(composition_text.c_str()), empty_underlines, + WebString::FromUTF8(composition_text.c_str()), empty_ime_text_spans, WebRange(), 0, composition_text.length()); WebTextInputInfo info = active_input_method_controller->TextInputInfo(); @@ -3338,10 +3338,10 @@ frame->SetAutofillClient(&client); web_view->SetInitialFocus(false); - WebVector<WebCompositionUnderline> empty_underlines; + WebVector<WebImeTextSpan> empty_ime_text_spans; client.ClearChangeCounts(); - frame->SetCompositionFromExistingText(8, 12, empty_underlines); + frame->SetCompositionFromExistingText(8, 12, empty_ime_text_spans); WebTextInputInfo info = frame->GetInputMethodController()->TextInputInfo(); EXPECT_EQ("0123456789abcdefghijklmnopqrstuvwxyz", @@ -4079,7 +4079,7 @@ EXPECT_TRUE( frame->FrameWidget()->GetActiveWebInputMethodController()->SetComposition( WebString::FromUTF8(std::string("hello").c_str()), - WebVector<WebCompositionUnderline>(), WebRange(), 3, 3)); + WebVector<WebImeTextSpan>(), WebRange(), 3, 3)); EXPECT_EQ(1, client.TextChangesFromUserGesture()); EXPECT_FALSE(UserGestureIndicator::ProcessingUserGesture()); EXPECT_TRUE(frame->HasMarkedText()); @@ -4482,12 +4482,12 @@ frame->SetAutofillClient(&client); web_view->SetInitialFocus(false); - WebVector<WebCompositionUnderline> empty_underlines; + WebVector<WebImeTextSpan> empty_ime_text_spans; EXPECT_TRUE( frame->FrameWidget()->GetActiveWebInputMethodController()->CommitText( - WebString::FromUTF8(std::string("hello").c_str()), empty_underlines, - WebRange(), 0)); + WebString::FromUTF8(std::string("hello").c_str()), + empty_ime_text_spans, WebRange(), 0)); EXPECT_EQ(1, client.TextChangesFromUserGesture()); EXPECT_FALSE(UserGestureIndicator::ProcessingUserGesture()); frame->SetAutofillClient(0);
diff --git a/third_party/WebKit/Source/core/frame/BrowserControls.cpp b/third_party/WebKit/Source/core/frame/BrowserControls.cpp index 46a13e38..241b830c 100644 --- a/third_party/WebKit/Source/core/frame/BrowserControls.cpp +++ b/third_party/WebKit/Source/core/frame/BrowserControls.cpp
@@ -80,8 +80,8 @@ top_height_ ? ContentOffset() : BottomContentOffset(); } -float BrowserControls::LayoutHeight() { - return shrink_viewport_ ? top_height_ + bottom_height_ : 0; +float BrowserControls::UnreportedSizeAdjustment() { + return (shrink_viewport_ ? top_height_ : 0) - ContentOffset(); } float BrowserControls::ContentOffset() {
diff --git a/third_party/WebKit/Source/core/frame/BrowserControls.h b/third_party/WebKit/Source/core/frame/BrowserControls.h index 7c61fc2..6dd983c 100644 --- a/third_party/WebKit/Source/core/frame/BrowserControls.h +++ b/third_party/WebKit/Source/core/frame/BrowserControls.h
@@ -30,12 +30,11 @@ DECLARE_TRACE(); - // The amount that the viewport was shrunk by to accommodate the top - // controls. - float LayoutHeight(); + // The height the top controls are hidden; used for viewport adjustments + // while the controls are resizing. + float UnreportedSizeAdjustment(); // The amount that browser controls are currently shown. float ContentOffset(); - float BottomContentOffset(); float TopHeight() const { return top_height_; } float BottomHeight() const { return bottom_height_; } @@ -61,6 +60,7 @@ private: explicit BrowserControls(const Page&); void ResetBaseline(); + float BottomContentOffset(); Member<const Page> page_;
diff --git a/third_party/WebKit/Source/core/frame/BrowserControlsTest.cpp b/third_party/WebKit/Source/core/frame/BrowserControlsTest.cpp index 3596e526..04c0027 100644 --- a/third_party/WebKit/Source/core/frame/BrowserControlsTest.cpp +++ b/third_party/WebKit/Source/core/frame/BrowserControlsTest.cpp
@@ -1132,4 +1132,40 @@ } } +// Test the size adjustment sent to the viewport when top controls exist. +TEST_F(BrowserControlsTest, MAYBE(TopControlsSizeAdjustment)) { + WebViewImpl* web_view = Initialize(); + web_view->ResizeWithBrowserControls(web_view->Size(), 50.f, 0, false); + web_view->GetBrowserControls().SetShownRatio(1); + EXPECT_FLOAT_EQ(-50.f, + web_view->GetBrowserControls().UnreportedSizeAdjustment()); + + web_view->GetBrowserControls().SetShownRatio(0.5); + EXPECT_FLOAT_EQ(-25.f, + web_view->GetBrowserControls().UnreportedSizeAdjustment()); + + web_view->GetBrowserControls().SetShownRatio(0.0); + EXPECT_FLOAT_EQ(0.f, + web_view->GetBrowserControls().UnreportedSizeAdjustment()); +} + +// Test the size adjustment sent to the viewport when bottom controls exist. +// There should never be an adjustment since the bottom controls do not change +// the content offset. +TEST_F(BrowserControlsTest, MAYBE(BottomControlsSizeAdjustment)) { + WebViewImpl* web_view = Initialize(); + web_view->ResizeWithBrowserControls(web_view->Size(), 0, 50.f, false); + web_view->GetBrowserControls().SetShownRatio(1); + EXPECT_FLOAT_EQ(0.f, + web_view->GetBrowserControls().UnreportedSizeAdjustment()); + + web_view->GetBrowserControls().SetShownRatio(0.5); + EXPECT_FLOAT_EQ(0.f, + web_view->GetBrowserControls().UnreportedSizeAdjustment()); + + web_view->GetBrowserControls().SetShownRatio(0.0); + EXPECT_FLOAT_EQ(0.f, + web_view->GetBrowserControls().UnreportedSizeAdjustment()); +} + } // namespace blink
diff --git a/third_party/WebKit/Source/core/frame/FrameOwner.h b/third_party/WebKit/Source/core/frame/FrameOwner.h index f6f1a5a..ef37740b 100644 --- a/third_party/WebKit/Source/core/frame/FrameOwner.h +++ b/third_party/WebKit/Source/core/frame/FrameOwner.h
@@ -50,7 +50,6 @@ virtual bool AllowPaymentRequest() const = 0; virtual bool IsDisplayNone() const = 0; virtual AtomicString Csp() const = 0; - virtual const WebVector<WebFeaturePolicyFeature>& AllowedFeatures() const = 0; virtual const WebParsedFeaturePolicy& ContainerPolicy() const = 0; }; @@ -85,10 +84,6 @@ bool AllowPaymentRequest() const override { return false; } bool IsDisplayNone() const override { return false; } AtomicString Csp() const override { return g_null_atom; } - const WebVector<WebFeaturePolicyFeature>& AllowedFeatures() const override { - DEFINE_STATIC_LOCAL(WebVector<WebFeaturePolicyFeature>, features, ()); - return features; - } const WebParsedFeaturePolicy& ContainerPolicy() const override { DEFINE_STATIC_LOCAL(WebParsedFeaturePolicy, container_policy, ()); return container_policy;
diff --git a/third_party/WebKit/Source/core/frame/LocalFrameView.cpp b/third_party/WebKit/Source/core/frame/LocalFrameView.cpp index d4bff49..fce9db4 100644 --- a/third_party/WebKit/Source/core/frame/LocalFrameView.cpp +++ b/third_party/WebKit/Source/core/frame/LocalFrameView.cpp
@@ -208,12 +208,14 @@ needs_paint_property_update_(true), current_update_lifecycle_phases_target_state_( DocumentLifecycle::kUninitialized), + past_layout_lifecycle_update_(false), scroll_anchor_(this), scrollbar_manager_(*this), needs_scrollbars_update_(false), suppress_adjust_view_size_(false), allows_layout_invalidation_after_layout_clean_(true), forcing_layout_parent_view_(false), + needs_intersection_observation_(false), main_thread_scrolling_reasons_(0), paint_frame_count_(0) { Init(); @@ -3143,6 +3145,9 @@ return; } + AutoReset<bool> past_layout_lifecycle_update(&past_layout_lifecycle_update_, + true); + ForAllNonThrottledLocalFrameViews([](LocalFrameView& frame_view) { frame_view.PerformScrollAnchoringAdjustments(); }); @@ -4977,6 +4982,7 @@ child = child->Tree().NextSibling()) { child->View()->UpdateViewportIntersectionsForSubtree(target_state); } + needs_intersection_observation_ = false; } void LocalFrameView::UpdateRenderThrottlingStatusForTesting() { @@ -5137,9 +5143,23 @@ total_screens_away)); } +void LocalFrameView::SetNeedsIntersectionObservation() { + needs_intersection_observation_ = true; + if (LocalFrameView* parent = ParentFrameView()) + parent->SetNeedsIntersectionObservation(); +} + bool LocalFrameView::ShouldThrottleRendering() const { - return CanThrottleRendering() && frame_->GetDocument() && - Lifecycle().ThrottlingAllowed(); + bool throttled_for_global_reasons = CanThrottleRendering() && + frame_->GetDocument() && + Lifecycle().ThrottlingAllowed(); + if (!throttled_for_global_reasons) + return false; + + // Only lifecycle phases up to layout are needed to generate an + // intersection observation. + return !needs_intersection_observation_ || + GetFrame().LocalFrameRoot().View()->past_layout_lifecycle_update_; } bool LocalFrameView::CanThrottleRendering() const {
diff --git a/third_party/WebKit/Source/core/frame/LocalFrameView.h b/third_party/WebKit/Source/core/frame/LocalFrameView.h index 827c27aa..75319ca 100644 --- a/third_party/WebKit/Source/core/frame/LocalFrameView.h +++ b/third_party/WebKit/Source/core/frame/LocalFrameView.h
@@ -182,6 +182,10 @@ void SetNeedsUpdateGeometries() { needs_update_geometries_ = true; } void UpdateGeometry() override; + // Marks this frame, and ancestor frames, as needing one intersection + // observervation. This overrides throttling for one frame. + void SetNeedsIntersectionObservation(); + // Methods for getting/setting the size Blink should use to layout the // contents. // NOTE: Scrollbar exclusion is based on the LocalFrameView's scrollbars. To @@ -1181,6 +1185,7 @@ // This is set on the local root frame view only. DocumentLifecycle::LifecycleState current_update_lifecycle_phases_target_state_; + bool past_layout_lifecycle_update_; ScrollAnchor scroll_anchor_; using AnchoringAdjustmentQueue = @@ -1194,6 +1199,7 @@ bool suppress_adjust_view_size_; bool allows_layout_invalidation_after_layout_clean_; bool forcing_layout_parent_view_; + bool needs_intersection_observation_; Member<ElementVisibilityObserver> visibility_observer_;
diff --git a/third_party/WebKit/Source/core/frame/RemoteFrameOwner.h b/third_party/WebKit/Source/core/frame/RemoteFrameOwner.h index a6fe4d2..99aafc30 100644 --- a/third_party/WebKit/Source/core/frame/RemoteFrameOwner.h +++ b/third_party/WebKit/Source/core/frame/RemoteFrameOwner.h
@@ -52,9 +52,6 @@ bool AllowPaymentRequest() const override { return allow_payment_request_; } bool IsDisplayNone() const override { return is_display_none_; } AtomicString Csp() const override { return csp_; } - const WebVector<WebFeaturePolicyFeature>& AllowedFeatures() const override { - return allowed_features_; - } const WebParsedFeaturePolicy& ContainerPolicy() const override { return container_policy_; } @@ -75,10 +72,6 @@ is_display_none_ = is_display_none; } void SetCsp(const WebString& csp) { csp_ = csp; } - void SetAllowedFeatures( - const WebVector<WebFeaturePolicyFeature>& allowed_features) { - allowed_features_ = allowed_features; - } void SetContainerPolicy(const WebParsedFeaturePolicy& container_policy) { container_policy_ = container_policy; } @@ -105,7 +98,6 @@ bool allow_payment_request_; bool is_display_none_; WebString csp_; - WebVector<WebFeaturePolicyFeature> allowed_features_; WebParsedFeaturePolicy container_policy_; };
diff --git a/third_party/WebKit/Source/core/frame/WebFrameWidgetImpl.cpp b/third_party/WebKit/Source/core/frame/WebFrameWidgetImpl.cpp index eab267d..d205f37 100644 --- a/third_party/WebKit/Source/core/frame/WebFrameWidgetImpl.cpp +++ b/third_party/WebKit/Source/core/frame/WebFrameWidgetImpl.cpp
@@ -35,7 +35,6 @@ #include "build/build_config.h" #include "core/animation/CompositorMutatorImpl.h" #include "core/dom/UserGestureIndicator.h" -#include "core/editing/CompositionUnderlineVectorBuilder.h" #include "core/editing/EditingUtilities.h" #include "core/editing/Editor.h" #include "core/editing/FrameSelection.h"
diff --git a/third_party/WebKit/Source/core/frame/WebLocalFrameImpl.cpp b/third_party/WebKit/Source/core/frame/WebLocalFrameImpl.cpp index e652c8c5..0b9e98e 100644 --- a/third_party/WebKit/Source/core/frame/WebLocalFrameImpl.cpp +++ b/third_party/WebKit/Source/core/frame/WebLocalFrameImpl.cpp
@@ -109,11 +109,11 @@ #include "core/dom/NodeTraversal.h" #include "core/dom/ShadowRoot.h" #include "core/dom/UserGestureIndicator.h" -#include "core/editing/CompositionUnderlineVectorBuilder.h" #include "core/editing/EditingUtilities.h" #include "core/editing/Editor.h" #include "core/editing/FindInPageCoordinates.h" #include "core/editing/FrameSelection.h" +#include "core/editing/ImeTextSpanVectorBuilder.h" #include "core/editing/InputMethodController.h" #include "core/editing/PlainTextRange.h" #include "core/editing/SetSelectionData.h" @@ -954,7 +954,7 @@ void WebLocalFrameImpl::SetMarkedText(const WebString& text, unsigned location, unsigned length) { - Vector<CompositionUnderline> decorations; + Vector<ImeTextSpan> decorations; GetFrame()->GetInputMethodController().SetComposition(text, decorations, location, length); } @@ -1289,7 +1289,7 @@ bool WebLocalFrameImpl::SetCompositionFromExistingText( int composition_start, int composition_end, - const WebVector<WebCompositionUnderline>& underlines) { + const WebVector<WebImeTextSpan>& ime_text_spans) { TRACE_EVENT0("blink", "WebLocalFrameImpl::setCompositionFromExistingText"); if (!GetFrame()->GetEditor().CanEdit()) return false; @@ -1302,7 +1302,7 @@ GetFrame()->GetDocument()->UpdateStyleAndLayoutIgnorePendingStylesheets(); input_method_controller.SetCompositionFromExistingText( - CompositionUnderlineVectorBuilder::Build(underlines), composition_start, + ImeTextSpanVectorBuilder::Build(ime_text_spans), composition_start, composition_end); return true; @@ -1688,7 +1688,7 @@ owner_element->ScrollingMode(), owner_element->MarginWidth(), owner_element->MarginHeight(), owner_element->AllowFullscreen(), owner_element->AllowPaymentRequest(), owner_element->IsDisplayNone(), - owner_element->Csp(), owner_element->AllowedFeatures()); + owner_element->Csp()); // FIXME: Using subResourceAttributeName as fallback is not a perfect // solution. subResourceAttributeName returns just one attribute name. The // element might not have the attribute, and there might be other attributes
diff --git a/third_party/WebKit/Source/core/frame/WebLocalFrameImpl.h b/third_party/WebKit/Source/core/frame/WebLocalFrameImpl.h index 9cc9467e..548d045 100644 --- a/third_party/WebKit/Source/core/frame/WebLocalFrameImpl.h +++ b/third_party/WebKit/Source/core/frame/WebLocalFrameImpl.h
@@ -203,7 +203,7 @@ bool SetCompositionFromExistingText( int composition_start, int composition_end, - const WebVector<WebCompositionUnderline>& underlines) override; + const WebVector<WebImeTextSpan>& ime_text_spans) override; void ExtendSelectionAndDelete(int before, int after) override; void DeleteSurroundingText(int before, int after) override; void DeleteSurroundingTextInCodePoints(int before, int after) override;
diff --git a/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.cpp b/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.cpp index c5bcbe9..3a1db63 100644 --- a/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.cpp
@@ -187,12 +187,6 @@ DispatchScopedEvent(Event::Create(EventTypeNames::load)); } -const WebVector<WebFeaturePolicyFeature>& -HTMLFrameOwnerElement::AllowedFeatures() const { - DEFINE_STATIC_LOCAL(WebVector<WebFeaturePolicyFeature>, features, ()); - return features; -} - const WebParsedFeaturePolicy& HTMLFrameOwnerElement::ContainerPolicy() const { return container_policy_; }
diff --git a/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.h b/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.h index 5ea9eb8a..5046ce5 100644 --- a/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.h +++ b/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.h
@@ -101,7 +101,6 @@ bool AllowPaymentRequest() const override { return false; } bool IsDisplayNone() const override { return !embedded_content_view_; } AtomicString Csp() const override { return g_null_atom; } - const WebVector<WebFeaturePolicyFeature>& AllowedFeatures() const override; const WebParsedFeaturePolicy& ContainerPolicy() const override; // For unit tests, manually trigger the UpdateContainerPolicy method.
diff --git a/third_party/WebKit/Source/core/html/HTMLIFrameElement.cpp b/third_party/WebKit/Source/core/html/HTMLIFrameElement.cpp index 6aa3ab9..32fd355 100644 --- a/third_party/WebKit/Source/core/html/HTMLIFrameElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLIFrameElement.cpp
@@ -189,7 +189,6 @@ kOtherMessageSource, kErrorMessageLevel, "Error while parsing the 'allow' attribute: " + invalid_tokens)); } - FrameOwnerPropertiesChanged(); UpdateContainerPolicy(); UseCounter::Count(GetDocument(), WebFeature::kFeaturePolicyAllowAttribute); } else { @@ -205,7 +204,7 @@ Vector<WebParsedFeaturePolicyDeclaration> container_policy; // Populate the initial container policy from the allow attribute. - for (const WebFeaturePolicyFeature feature : AllowedFeatures()) { + for (const WebFeaturePolicyFeature feature : allowed_features_) { WebParsedFeaturePolicyDeclaration whitelist; whitelist.feature = feature; whitelist.origins = Vector<WebSecurityOrigin>(1UL, {origin});
diff --git a/third_party/WebKit/Source/core/html/HTMLIFrameElement.h b/third_party/WebKit/Source/core/html/HTMLIFrameElement.h index f49a4bff..c4111f8 100644 --- a/third_party/WebKit/Source/core/html/HTMLIFrameElement.h +++ b/third_party/WebKit/Source/core/html/HTMLIFrameElement.h
@@ -81,9 +81,6 @@ bool AllowFullscreen() const override { return allow_fullscreen_; } bool AllowPaymentRequest() const override { return allow_payment_request_; } AtomicString Csp() const override { return csp_; } - const WebVector<WebFeaturePolicyFeature>& AllowedFeatures() const override { - return allowed_features_; - } AtomicString name_; AtomicString csp_;
diff --git a/third_party/WebKit/Source/core/html/ImageData.cpp b/third_party/WebKit/Source/core/html/ImageData.cpp index 5378061..5b3176e 100644 --- a/third_party/WebKit/Source/core/html/ImageData.cpp +++ b/third_party/WebKit/Source/core/html/ImageData.cpp
@@ -319,13 +319,21 @@ return new ImageData(IntSize(width, height), data.View()); } +bool ColorManagementEnabled(const ImageDataColorSettings& color_settings) { + if (CanvasColorParams::ColorCorrectRenderingInAnyColorSpace()) + return true; + if (CanvasColorParams::ColorCorrectRenderingInSRGBOnly() && + color_settings.colorSpace() == kSRGBCanvasColorSpaceName) + return true; + return false; +} + ImageData* ImageData::CreateImageData( unsigned width, unsigned height, const ImageDataColorSettings& color_settings, ExceptionState& exception_state) { - if (!RuntimeEnabledFeatures::ColorCanvasExtensionsEnabled() && - !RuntimeEnabledFeatures::ColorCorrectRenderingEnabled()) + if (!ColorManagementEnabled(color_settings)) return nullptr; if (!ImageData::ValidateConstructorArguments( @@ -349,7 +357,7 @@ unsigned height, ImageDataColorSettings& color_settings, ExceptionState& exception_state) { - if (!RuntimeEnabledFeatures::ColorCanvasExtensionsEnabled()) + if (!ColorManagementEnabled(color_settings)) return nullptr; DOMArrayBufferView* buffer_view = nullptr; @@ -701,7 +709,7 @@ } CanvasColorParams ImageData::GetCanvasColorParams() { - if (!RuntimeEnabledFeatures::ColorCanvasExtensionsEnabled()) + if (!ColorManagementEnabled(color_settings_)) return CanvasColorParams(); CanvasColorSpace color_space = ImageData::GetCanvasColorSpace(color_settings_.colorSpace());
diff --git a/third_party/WebKit/Source/core/html/canvas/CanvasRenderingContext.cpp b/third_party/WebKit/Source/core/html/canvas/CanvasRenderingContext.cpp index 0a2c8e2..25f5459 100644 --- a/third_party/WebKit/Source/core/html/canvas/CanvasRenderingContext.cpp +++ b/third_party/WebKit/Source/core/html/canvas/CanvasRenderingContext.cpp
@@ -39,27 +39,24 @@ : host_(host), color_params_(kLegacyCanvasColorSpace, kRGBA8CanvasPixelFormat), creation_attributes_(attrs) { - if (RuntimeEnabledFeatures::ColorCanvasExtensionsEnabled()) { - // Set the default color space to SRGB and continue - CanvasColorSpace color_space = kSRGBCanvasColorSpace; - if (creation_attributes_.colorSpace() == kRec2020CanvasColorSpaceName) - color_space = kRec2020CanvasColorSpace; - else if (creation_attributes_.colorSpace() == kP3CanvasColorSpaceName) - color_space = kP3CanvasColorSpace; + if (CanvasColorParams::ColorCorrectRenderingEnabled()) { + color_params_.SetCanvasColorSpace(kSRGBCanvasColorSpace); + if (CanvasColorParams::ColorCorrectRenderingInAnyColorSpace()) { + if (creation_attributes_.colorSpace() == kRec2020CanvasColorSpaceName) + color_params_.SetCanvasColorSpace(kRec2020CanvasColorSpace); + else if (creation_attributes_.colorSpace() == kP3CanvasColorSpaceName) + color_params_.SetCanvasColorSpace(kP3CanvasColorSpace); - // For now, we only support RGBA8 (for SRGB) and F16 (for all). Everything - // else falls back to SRGB + RGBA8. - CanvasPixelFormat pixel_format = kRGBA8CanvasPixelFormat; - if (creation_attributes_.pixelFormat() == kF16CanvasPixelFormatName) { - pixel_format = kF16CanvasPixelFormat; - } else { - color_space = kSRGBCanvasColorSpace; - pixel_format = kRGBA8CanvasPixelFormat; + // For now, we only support RGBA8 (for SRGB) and F16 (for all). Everything + // else falls back to SRGB + RGBA8. + if (creation_attributes_.pixelFormat() == kF16CanvasPixelFormatName) { + color_params_.SetCanvasPixelFormat(kF16CanvasPixelFormat); + } else { + color_params_.SetCanvasColorSpace(kSRGBCanvasColorSpace); + color_params_.SetCanvasPixelFormat(kRGBA8CanvasPixelFormat); + } } - - color_params_ = CanvasColorParams(color_space, pixel_format); } - // Make m_creationAttributes reflect the effective colorSpace, pixelFormat and // linearPixelMath rather than the requested one. creation_attributes_.setColorSpace(ColorSpaceAsString());
diff --git a/third_party/WebKit/Source/core/html/parser/BackgroundHTMLParser.cpp b/third_party/WebKit/Source/core/html/parser/BackgroundHTMLParser.cpp index cc56c1e..bb40501a 100644 --- a/third_party/WebKit/Source/core/html/parser/BackgroundHTMLParser.cpp +++ b/third_party/WebKit/Source/core/html/parser/BackgroundHTMLParser.cpp
@@ -137,12 +137,8 @@ BackgroundHTMLParser::~BackgroundHTMLParser() {} void BackgroundHTMLParser::AppendRawBytesFromMainThread( - std::unique_ptr<Vector<char>> buffer, - double bytes_received_time) { + std::unique_ptr<Vector<char>> buffer) { DCHECK(decoder_); - DEFINE_STATIC_LOCAL(CustomCountHistogram, queue_delay, - ("Parser.AppendBytesDelay", 1, 5000, 50)); - queue_delay.Count(MonotonicallyIncreasingTimeMS() - bytes_received_time); UpdateDocument(decoder_->Decode(buffer->data(), buffer->size())); }
diff --git a/third_party/WebKit/Source/core/html/parser/BackgroundHTMLParser.h b/third_party/WebKit/Source/core/html/parser/BackgroundHTMLParser.h index bedb00d2..b67a00a 100644 --- a/third_party/WebKit/Source/core/html/parser/BackgroundHTMLParser.h +++ b/third_party/WebKit/Source/core/html/parser/BackgroundHTMLParser.h
@@ -89,8 +89,7 @@ String unparsed_input; }; - void AppendRawBytesFromMainThread(std::unique_ptr<Vector<char>>, - double bytes_received_time); + void AppendRawBytesFromMainThread(std::unique_ptr<Vector<char>>); void SetDecoder(std::unique_ptr<TextResourceDecoder>); void Flush(); void ResumeFrom(std::unique_ptr<Checkpoint>);
diff --git a/third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.cpp b/third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.cpp index 4a3dde3..f4243eb 100644 --- a/third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.cpp +++ b/third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.cpp
@@ -181,18 +181,6 @@ } void HTMLDocumentParser::Detach() { - if (!IsParsingFragment() && tokenized_chunk_queue_.Get() && - tokenized_chunk_queue_->PeakPendingChunkCount()) { - DEFINE_STATIC_LOCAL(CustomCountHistogram, peak_pending_chunk_histogram, - ("Parser.PeakPendingChunkCount", 1, 1000, 50)); - peak_pending_chunk_histogram.Count( - tokenized_chunk_queue_->PeakPendingChunkCount()); - DEFINE_STATIC_LOCAL(CustomCountHistogram, peak_pending_token_histogram, - ("Parser.PeakPendingTokenCount", 1, 100000, 50)); - peak_pending_token_histogram.Count( - tokenized_chunk_queue_->PeakPendingTokenCount()); - } - if (have_background_parser_) StopBackgroundParser(); DocumentParser::Detach(); @@ -1186,7 +1174,6 @@ return; if (ShouldUseThreading()) { - double bytes_received_time = MonotonicallyIncreasingTimeMS(); if (!have_background_parser_) StartBackgroundParser(); @@ -1199,8 +1186,7 @@ loading_task_runner_->PostTask( BLINK_FROM_HERE, WTF::Bind(&BackgroundHTMLParser::AppendRawBytesFromMainThread, - background_parser_, WTF::Passed(std::move(buffer)), - bytes_received_time)); + background_parser_, WTF::Passed(std::move(buffer)))); return; }
diff --git a/third_party/WebKit/Source/core/html/parser/TokenizedChunkQueue.cpp b/third_party/WebKit/Source/core/html/parser/TokenizedChunkQueue.cpp index dac3543..528ecd3 100644 --- a/third_party/WebKit/Source/core/html/parser/TokenizedChunkQueue.cpp +++ b/third_party/WebKit/Source/core/html/parser/TokenizedChunkQueue.cpp
@@ -16,20 +16,12 @@ bool TokenizedChunkQueue::Enqueue( std::unique_ptr<HTMLDocumentParser::TokenizedChunk> chunk) { - pending_token_count_ += chunk->tokens->size(); - peak_pending_token_count_ = - std::max(peak_pending_token_count_, pending_token_count_); - bool was_empty = pending_chunks_.IsEmpty(); pending_chunks_.push_back(std::move(chunk)); - peak_pending_chunk_count_ = - std::max(peak_pending_chunk_count_, pending_chunks_.size()); - return was_empty; } void TokenizedChunkQueue::Clear() { - pending_token_count_ = 0; pending_chunks_.clear(); } @@ -39,12 +31,4 @@ pending_chunks_.swap(vector); } -size_t TokenizedChunkQueue::PeakPendingChunkCount() { - return peak_pending_chunk_count_; -} - -size_t TokenizedChunkQueue::PeakPendingTokenCount() { - return peak_pending_token_count_; -} - } // namespace blink
diff --git a/third_party/WebKit/Source/core/html/parser/TokenizedChunkQueue.h b/third_party/WebKit/Source/core/html/parser/TokenizedChunkQueue.h index e84cd884..b7080a4 100644 --- a/third_party/WebKit/Source/core/html/parser/TokenizedChunkQueue.h +++ b/third_party/WebKit/Source/core/html/parser/TokenizedChunkQueue.h
@@ -35,16 +35,11 @@ void Clear(); void TakeAll(Vector<std::unique_ptr<HTMLDocumentParser::TokenizedChunk>>&); - size_t PeakPendingChunkCount(); - size_t PeakPendingTokenCount(); private: TokenizedChunkQueue(); Vector<std::unique_ptr<HTMLDocumentParser::TokenizedChunk>> pending_chunks_; - size_t peak_pending_chunk_count_ = 0; - size_t peak_pending_token_count_ = 0; - size_t pending_token_count_ = 0; }; } // namespace blink
diff --git a/third_party/WebKit/Source/core/imagebitmap/ImageBitmap.cpp b/third_party/WebKit/Source/core/imagebitmap/ImageBitmap.cpp index 96ab5af..ee1d747 100644 --- a/third_party/WebKit/Source/core/imagebitmap/ImageBitmap.cpp +++ b/third_party/WebKit/Source/core/imagebitmap/ImageBitmap.cpp
@@ -67,13 +67,7 @@ } if (options.colorSpaceConversion() != kImageBitmapOptionNone) { - parsed_options.color_canvas_extensions_enabled = - RuntimeEnabledFeatures::ColorCanvasExtensionsEnabled(); - if (!parsed_options.color_canvas_extensions_enabled) { - DCHECK_EQ(options.colorSpaceConversion(), kImageBitmapOptionDefault); - parsed_options.color_params.SetCanvasColorSpace(kLegacyCanvasColorSpace); - parsed_options.color_canvas_extensions_enabled = true; - } else { + if (CanvasColorParams::ColorCorrectRenderingInAnyColorSpace()) { if (options.colorSpaceConversion() == kImageBitmapOptionDefault || options.colorSpaceConversion() == kSRGBImageBitmapColorSpaceConversion) { @@ -96,6 +90,12 @@ << "Invalid ImageBitmap creation attribute colorSpaceConversion: " << options.colorSpaceConversion(); } + } else if (CanvasColorParams::ColorCorrectRenderingInSRGBOnly()) { + DCHECK_EQ(options.colorSpaceConversion(), kImageBitmapOptionDefault); + parsed_options.color_params.SetCanvasColorSpace(kSRGBCanvasColorSpace); + } else { + DCHECK_EQ(options.colorSpaceConversion(), kImageBitmapOptionDefault); + parsed_options.color_params.SetCanvasColorSpace(kLegacyCanvasColorSpace); } } @@ -302,39 +302,27 @@ RefPtr<StaticBitmapImage> ApplyColorSpaceConversion( RefPtr<StaticBitmapImage>&& image, ImageBitmap::ParsedOptions& options) { - if (options.color_params.UsesOutputSpaceBlending() && - RuntimeEnabledFeatures::ColorCorrectRenderingEnabled()) { - image = image->ConvertToColorSpace(options.color_params.GetSkColorSpace(), - SkTransferFunctionBehavior::kIgnore); - } - sk_sp<SkImage> skia_image = image->PaintImageForCurrentFrame().GetSkImage(); - if (!options.color_canvas_extensions_enabled || !skia_image->colorSpace()) + if (!CanvasColorParams::ColorCorrectRenderingEnabled()) return image; - sk_sp<SkColorSpace> dst_color_space = - options.color_params.GetSkColorSpaceForSkSurfaces(); - DCHECK(dst_color_space.get()); - if (SkColorSpace::Equals(skia_image->colorSpace(), dst_color_space.get())) + // TODO(zakerinasab): crbug.com/754713 + // If image does not have any color space info and we must color convert to + // SRGB, we should tag the image as SRGB. Since we cannot use SkImage:: + // makeColorSpace() on SkImages with no color space to get the image in SRGB, + // we have to do this using a slow code path (reading the pixels and creating + // a new SRGB SkImage). This is inefficient and also converts GPU-backed + // images to CPU-backed. For now, we ignore this and let the images be in + // null color space. This must be okay if color management is only supported + // for SRGB. This might be okay for converting null color space to other + // color spaces. Please see crbug.com/754713 for more details. + + if (!CanvasColorParams::ColorCorrectRenderingInAnyColorSpace()) return image; - SkImageInfo dst_info = - SkImageInfo::Make(skia_image->width(), skia_image->height(), - options.color_params.GetSkColorType(), - skia_image->alphaType(), dst_color_space); - size_t size = image->width() * image->height() * dst_info.bytesPerPixel(); - sk_sp<SkData> dst_data = SkData::MakeUninitialized(size); - if (dst_data->size() != size) - return image; - if (skia_image->readPixels(dst_info, dst_data->writable_data(), - skia_image->width() * dst_info.bytesPerPixel(), 0, - 0)) { - skia_image = SkImage::MakeRasterData( - dst_info, dst_data, skia_image->width() * dst_info.bytesPerPixel()); - return StaticBitmapImage::Create(skia_image, - image->ContextProviderWrapper()); - } - NOTREACHED(); - return image; + // Color correct the image. This code path uses SkImage::makeColorSpace(). If + // the color space of the source image is nullptr, it will be assumed in SRGB. + return image->ConvertToColorSpace(options.color_params.GetSkColorSpace(), + SkTransferFunctionBehavior::kRespect); } RefPtr<StaticBitmapImage> MakeBlankImage( @@ -474,9 +462,8 @@ if (!sk_image->isTextureBacked() && !sk_image->peekPixels(&pixmap)) { sk_sp<SkColorSpace> dst_color_space = nullptr; SkColorType dst_color_type = kN32_SkColorType; - if (parsed_options.color_canvas_extensions_enabled || - (parsed_options.color_params.UsesOutputSpaceBlending() && - RuntimeEnabledFeatures::ColorCorrectRenderingEnabled())) { + if (CanvasColorParams::ColorCorrectRenderingInAnyColorSpace() || + parsed_options.color_params.ColorCorrectNoColorSpaceToSRGB()) { dst_color_space = parsed_options.color_params.GetSkColorSpace(); dst_color_type = parsed_options.color_params.GetSkColorType(); } @@ -656,6 +643,12 @@ kUnpremul_SkAlphaType, cropped_data->GetCanvasColorParams().GetSkColorSpaceForSkSurfaces()); + // If we are in color correct rendering mode but we only color correct to + // SRGB, we don't do any color conversion when transferring the pixels from + // ImageData to ImageBitmap to avoid double gamma correction. We tag the + // image with SRGB color space later in ApplyColorSpaceConversion(). + if (CanvasColorParams::ColorCorrectRenderingInSRGBOnly()) + info = info.makeColorSpace(nullptr); image_ = NewImageFromRaster(info, std::move(image_pixels)); // swizzle back
diff --git a/third_party/WebKit/Source/core/imagebitmap/ImageBitmap.h b/third_party/WebKit/Source/core/imagebitmap/ImageBitmap.h index 495cf8c..88221fea 100644 --- a/third_party/WebKit/Source/core/imagebitmap/ImageBitmap.h +++ b/third_party/WebKit/Source/core/imagebitmap/ImageBitmap.h
@@ -150,7 +150,6 @@ IntRect crop_rect; SkFilterQuality resize_quality = kLow_SkFilterQuality; CanvasColorParams color_params; - bool color_canvas_extensions_enabled = false; }; DECLARE_VIRTUAL_TRACE();
diff --git a/third_party/WebKit/Source/core/imagebitmap/ImageBitmapTest.cpp b/third_party/WebKit/Source/core/imagebitmap/ImageBitmapTest.cpp index 6f44d8a3..2ef19db 100644 --- a/third_party/WebKit/Source/core/imagebitmap/ImageBitmapTest.cpp +++ b/third_party/WebKit/Source/core/imagebitmap/ImageBitmapTest.cpp
@@ -230,6 +230,8 @@ } } +constexpr float kWideGamutColorCorrectionTolerance = 0.01; + enum class ColorSpaceConversion : uint8_t { NONE = 0, DEFAULT_NOT_COLOR_CORRECTED = 1, @@ -261,6 +263,50 @@ return options; } +float Float16ToFloat(const uint16_t& f16) { + union FloatUIntUnion { + uint32_t fUInt; + float fFloat; + }; + FloatUIntUnion magic = {126 << 23}; + FloatUIntUnion o; + if (((f16 >> 10) & 0x001f) == 0) { + o.fUInt = magic.fUInt + (f16 & 0x03ff); + o.fFloat -= magic.fFloat; + } else { + o.fUInt = (f16 & 0x03ff) << 13; + if (((f16 >> 10) & 0x001f) == 0x1f) + o.fUInt |= (255 << 23); + else + o.fUInt |= ((127 - 15 + ((f16 >> 10) & 0x001f)) << 23); + } + o.fUInt |= ((f16 >> 15) << 31); + return o.fFloat; +} + +void CompareColorCorrectedPixels(std::unique_ptr<uint8_t[]>& converted_pixel, + std::unique_ptr<uint8_t[]>& transformed_pixel, + int bytes_per_pixel) { + if (bytes_per_pixel == 4) { + ASSERT_EQ(std::memcmp(converted_pixel.get(), transformed_pixel.get(), 4), + 0); + } else { + uint16_t *f16_converted = + static_cast<uint16_t*>((void*)(converted_pixel.get())), + *f16_trnasformed = + static_cast<uint16_t*>((void*)(transformed_pixel.get())); + bool test_passed = true; + for (int p = 0; p < 4; p++) { + if (std::fabs(Float16ToFloat(f16_converted[p]) - + Float16ToFloat(f16_trnasformed[p])) > + kWideGamutColorCorrectionTolerance) { + test_passed = false; + } + } + ASSERT_EQ(test_passed, true); + } +} + // This test is failing on Android Arm 64 Official Test Bot. // See <http://crbug.com/721819>. #if defined(OS_ANDROID) @@ -384,9 +430,8 @@ color_format32, src_pixel.get(), 1, SkAlphaType::kPremul_SkAlphaType); - int compare = std::memcmp(converted_pixel.get(), transformed_pixel.get(), - image_info.bytesPerPixel()); - ASSERT_EQ(compare, 0); + CompareColorCorrectedPixels(converted_pixel, transformed_pixel, + image_info.bytesPerPixel()); } } @@ -510,9 +555,8 @@ color_format32, src_pixel.get(), 1, SkAlphaType::kPremul_SkAlphaType); - int compare = std::memcmp(converted_pixel.get(), transformed_pixel.get(), - image_info.bytesPerPixel()); - ASSERT_EQ(compare, 0); + CompareColorCorrectedPixels(converted_pixel, transformed_pixel, + image_info.bytesPerPixel()); } } @@ -627,9 +671,8 @@ color_format32, src_pixel.get(), 1, SkAlphaType::kPremul_SkAlphaType); - int compare = std::memcmp(converted_pixel.get(), transformed_pixel.get(), - image_info.bytesPerPixel()); - ASSERT_EQ(compare, 0); + CompareColorCorrectedPixels(converted_pixel, transformed_pixel, + image_info.bytesPerPixel()); } } @@ -716,9 +759,8 @@ SkColorSpaceXform::ColorFormat::kRGBA_8888_ColorFormat, src_pixel.get(), 1, SkAlphaType::kPremul_SkAlphaType); - int compare = std::memcmp(converted_pixel.get(), transformed_pixel.get(), - image_info.bytesPerPixel()); - ASSERT_EQ(compare, 0); + CompareColorCorrectedPixels(converted_pixel, transformed_pixel, + image_info.bytesPerPixel()); } }
diff --git a/third_party/WebKit/Source/core/input/ScrollManager.cpp b/third_party/WebKit/Source/core/input/ScrollManager.cpp index ec6c58a..218f6c69 100644 --- a/third_party/WebKit/Source/core/input/ScrollManager.cpp +++ b/third_party/WebKit/Source/core/input/ScrollManager.cpp
@@ -591,9 +591,6 @@ if (scrollbar) { bool should_update_capture = false; - // scrollbar->gestureEvent always returns true for touchpad based GSB - // events. Therefore, while mouse is over a fully scrolled scrollbar, GSB - // won't propagate to the next scrollable layer. if (scrollbar->GestureEvent(gesture_event, &should_update_capture)) { if (should_update_capture) scrollbar_handling_scroll_gesture_ = scrollbar;
diff --git a/third_party/WebKit/Source/core/inspector/browser_protocol.json b/third_party/WebKit/Source/core/inspector/browser_protocol.json index b6ed8c13..1a922071 100644 --- a/third_party/WebKit/Source/core/inspector/browser_protocol.json +++ b/third_party/WebKit/Source/core/inspector/browser_protocol.json
@@ -1096,8 +1096,8 @@ { "name": "securityState", "$ref": "SecurityState", "description": "Security state representing the severity of the factor being explained." }, { "name": "summary", "type": "string", "description": "Short phrase describing the type of factor." }, { "name": "description", "type": "string", "description": "Full text explanation of the factor." }, - { "name": "hasCertificate", "type": "boolean", "description": "True if the page has a certificate." }, - { "name": "mixedContentType", "$ref": "MixedContentType", "description": "The type of mixed content described by the explanation." } + { "name": "mixedContentType", "$ref": "MixedContentType", "description": "The type of mixed content described by the explanation." }, + { "name": "certificate", "type": "array", "items": { "type": "string" }, "description": "Page certificate." } ], "description": "An explanation of an factor contributing to the security state." }, @@ -1132,10 +1132,6 @@ "description": "Disables tracking security state changes." }, { - "name": "showCertificateViewer", - "description": "Displays native dialog with the certificate details." - }, - { "name": "handleCertificateError", "description": "Handles a certificate error that fired a certificateError event.", "parameters": [ @@ -4970,6 +4966,17 @@ ] }, { + "name": "getVersion", + "description": "Returns version information.", + "returns": [ + { "name": "protocolVersion", "type": "string", "description": "Protocol version." }, + { "name": "product", "type": "string", "description": "Product name." }, + { "name": "revision", "type": "string", "description": "Product revision." }, + { "name": "userAgent", "type": "string", "description": "User-Agent." }, + { "name": "jsVersion", "type": "string", "description": "V8 version." } + ] + }, + { "name": "setWindowBounds", "description": "Set position and/or size of the browser window.", "parameters": [
diff --git a/third_party/WebKit/Source/core/intersection_observer/IntersectionObserver.cpp b/third_party/WebKit/Source/core/intersection_observer/IntersectionObserver.cpp index e075155..69643fc6 100644 --- a/third_party/WebKit/Source/core/intersection_observer/IntersectionObserver.cpp +++ b/third_party/WebKit/Source/core/intersection_observer/IntersectionObserver.cpp
@@ -257,8 +257,12 @@ new IntersectionObservation(*this, *target); target->EnsureIntersectionObserverData().AddObservation(*observation); observations_.insert(observation); - if (LocalFrameView* frame_view = target_frame->View()) + if (LocalFrameView* frame_view = target_frame->View()) { + // The IntersectionObsever spec requires that at least one observation + // be recorded afer observe() is called, even if the frame is throttled. + frame_view->SetNeedsIntersectionObservation(); frame_view->ScheduleAnimation(); + } } void IntersectionObserver::unobserve(Element* target,
diff --git a/third_party/WebKit/Source/core/layout/LayoutBox.cpp b/third_party/WebKit/Source/core/layout/LayoutBox.cpp index ca234d0d..68a3782 100644 --- a/third_party/WebKit/Source/core/layout/LayoutBox.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutBox.cpp
@@ -190,8 +190,7 @@ // to the canvas. Just dirty the entire canvas when our style changes // substantially. if ((diff.NeedsFullPaintInvalidation() || diff.NeedsLayout()) && - GetNode() && - (isHTMLHtmlElement(*GetNode()) || isHTMLBodyElement(*GetNode()))) { + GetNode() && (IsDocumentElement() || isHTMLBodyElement(*GetNode()))) { View()->SetShouldDoFullPaintInvalidation(); if (old_style->HasEntirelyFixedBackground() !=
diff --git a/third_party/WebKit/Source/core/layout/LayoutText.cpp b/third_party/WebKit/Source/core/layout/LayoutText.cpp index cf3b4cf..bb6974ec 100644 --- a/third_party/WebKit/Source/core/layout/LayoutText.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutText.cpp
@@ -1634,12 +1634,7 @@ revealed_text = text_[last_typed_character_offset_to_reveal]; } - // Replace all grapheme clusters in the text with the mask character. - size_t length = NumGraphemeClusters(text_); - CHECK_LE(length, text_.length()); - text_.Truncate(length); text_.Fill(mask); - if (last_typed_character_offset_to_reveal >= 0) { text_.replace(last_typed_character_offset_to_reveal, 1, String(&revealed_text, 1));
diff --git a/third_party/WebKit/Source/core/layout/MultiColumnFragmentainerGroup.cpp b/third_party/WebKit/Source/core/layout/MultiColumnFragmentainerGroup.cpp index e0ae9c51..0bec65dd 100644 --- a/third_party/WebKit/Source/core/layout/MultiColumnFragmentainerGroup.cpp +++ b/third_party/WebKit/Source/core/layout/MultiColumnFragmentainerGroup.cpp
@@ -442,6 +442,12 @@ column_set_.PageLogicalWidth()); } +// Clamp "infinite" clips to a number of pixels that can be losslessly +// converted to and from floating point, to avoid loss of precision. +// Note that tables have something similar, see +// TableLayoutAlgorithm::kTableMaxWidth. +static const int kMulticolMaxClipPixels = 1000000; + LayoutRect MultiColumnFragmentainerGroup::FlowThreadPortionOverflowRectAt( unsigned column_index, ClipRectAxesSelector axes_selector) const { @@ -478,7 +484,9 @@ // multicol container, in which case it should allow overflow. It will also // be clipped in the middle of adjacent column gaps. Care is taken here to // avoid rounding errors. - LayoutRect overflow_rect(LayoutRect::InfiniteIntRect()); + LayoutRect overflow_rect( + IntRect(-kMulticolMaxClipPixels, -kMulticolMaxClipPixels, + 2 * kMulticolMaxClipPixels, 2 * kMulticolMaxClipPixels)); LayoutUnit column_gap = column_set_.ColumnGap(); if (column_set_.IsHorizontalWritingMode()) { if (!is_first_column_in_multicol_container)
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc b/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc index 276b2247..a7d0696 100644 --- a/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc +++ b/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc
@@ -36,10 +36,10 @@ bool should_clear_left = (clear == EClear::kBoth || clear == EClear::kLeft); bool should_clear_right = (clear == EClear::kBoth || clear == EClear::kRight); - if (exclusions.last_left_float && should_clear_left) + if (exclusions.float_left_clear_offset && should_clear_left) return true; - if (exclusions.last_right_float && should_clear_right) + if (exclusions.float_right_clear_offset && should_clear_right) return true; auto should_clear_pred =
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_exclusion.cc b/third_party/WebKit/Source/core/layout/ng/ng_exclusion.cc index 444e00eb..dd32629 100644 --- a/third_party/WebKit/Source/core/layout/ng/ng_exclusion.cc +++ b/third_party/WebKit/Source/core/layout/ng/ng_exclusion.cc
@@ -49,37 +49,27 @@ return stream << value.ToString(); } -NGExclusions::NGExclusions() - : last_left_float(nullptr), last_right_float(nullptr) {} - -NGExclusions::NGExclusions(const NGExclusions& other) { - for (const auto& exclusion : other.storage) - Add(*exclusion); -} - void NGExclusions::Add(const NGExclusion& exclusion) { - storage.push_back(WTF::MakeUnique<NGExclusion>(exclusion)); - if (exclusion.type == NGExclusion::kFloatLeft) { - last_left_float = storage.rbegin()->get(); - } else if (exclusion.type == NGExclusion::kFloatRight) { - last_right_float = storage.rbegin()->get(); - } -} + storage.push_back(exclusion); + last_float_block_start = + std::max(last_float_block_start, exclusion.rect.BlockStartOffset()); -inline NGExclusions& NGExclusions::operator=(const NGExclusions& other) { - storage.clear(); - last_left_float = nullptr; - last_right_float = nullptr; - for (const auto& exclusion : other.storage) - Add(*exclusion); - return *this; + if (exclusion.type == NGExclusion::kFloatLeft) { + float_left_clear_offset = + std::max(float_left_clear_offset.value_or(LayoutUnit::Min()), + exclusion.rect.BlockEndOffset()); + } else if (exclusion.type == NGExclusion::kFloatRight) { + float_right_clear_offset = + std::max(float_right_clear_offset.value_or(LayoutUnit::Min()), + exclusion.rect.BlockEndOffset()); + } } bool NGExclusions::operator==(const NGExclusions& other) const { if (storage.size() != other.storage.size()) return false; for (size_t i = 0; i < storage.size(); ++i) { - if (*storage[i] != *other.storage[i]) + if (storage[i] != other.storage[i]) return false; } return true;
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_exclusion.h b/third_party/WebKit/Source/core/layout/ng/ng_exclusion.h index 9466dfb..465e1f87 100644 --- a/third_party/WebKit/Source/core/layout/ng/ng_exclusion.h +++ b/third_party/WebKit/Source/core/layout/ng/ng_exclusion.h
@@ -7,6 +7,7 @@ #include "core/CoreExport.h" #include "core/layout/ng/geometry/ng_logical_rect.h" +#include "platform/wtf/Optional.h" #include "platform/wtf/Vector.h" namespace blink { @@ -56,17 +57,18 @@ CORE_EXPORT std::ostream& operator<<(std::ostream&, const NGExclusion&); struct CORE_EXPORT NGExclusions { - NGExclusions(); - NGExclusions(const NGExclusions& other); + Vector<NGExclusion> storage; - Vector<std::unique_ptr<const NGExclusion>> storage; + // This member is used for implementing the "top edge alignment rule" for + // floats. Floats can be positioned at negative offsets, hence is initialized + // the minimum value. + LayoutUnit last_float_block_start = LayoutUnit::Min(); - // Last left/right float exclusions are used to enforce the top edge alignment - // rule for floats and for the support of CSS "clear" property. - const NGExclusion* last_left_float; // Owned by storage. - const NGExclusion* last_right_float; // Owned by storage. + // These members are used for keeping track of the "lowest" offset for each + // type of float. This is used for implementing float clearance. + Optional<LayoutUnit> float_left_clear_offset; + Optional<LayoutUnit> float_right_clear_offset; - NGExclusions& operator=(const NGExclusions& other); bool operator==(const NGExclusions& other) const; bool operator!=(const NGExclusions& other) const { return !(*this == other); }
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_floats_utils.cc b/third_party/WebKit/Source/core/layout/ng/ng_floats_utils.cc index b222f935..10fe94c8 100644 --- a/third_party/WebKit/Source/core/layout/ng/ng_floats_utils.cc +++ b/third_party/WebKit/Source/core/layout/ng/ng_floats_utils.cc
@@ -22,15 +22,9 @@ NGLogicalOffset AdjustToTopEdgeAlignmentRule(const NGConstraintSpace& space, const NGLogicalOffset& offset) { NGLogicalOffset adjusted_offset = offset; - LayoutUnit& adjusted_block_offset = adjusted_offset.block_offset; - if (space.Exclusions()->last_left_float) - adjusted_block_offset = - std::max(adjusted_block_offset, - space.Exclusions()->last_left_float->rect.BlockStartOffset()); - if (space.Exclusions()->last_right_float) - adjusted_block_offset = - std::max(adjusted_block_offset, - space.Exclusions()->last_right_float->rect.BlockStartOffset()); + adjusted_offset.block_offset = std::max( + adjusted_offset.block_offset, space.Exclusions()->last_float_block_start); + return adjusted_offset; }
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_layout_opportunity_iterator.cc b/third_party/WebKit/Source/core/layout/ng/ng_layout_opportunity_iterator.cc index 3ae30d0..5f9ab6d 100644 --- a/third_party/WebKit/Source/core/layout/ng/ng_layout_opportunity_iterator.cc +++ b/third_party/WebKit/Source/core/layout/ng/ng_layout_opportunity_iterator.cc
@@ -228,10 +228,9 @@ } // Compares exclusions by their top position. -bool CompareNGExclusionsByTopAsc( - const std::unique_ptr<const NGExclusion>& lhs, - const std::unique_ptr<const NGExclusion>& rhs) { - return rhs->rect.offset.block_offset > lhs->rect.offset.block_offset; +bool CompareNGExclusionsByTopAsc(const NGExclusion& lhs, + const NGExclusion& rhs) { + return rhs.rect.offset.block_offset > lhs.rect.offset.block_offset; } // Compares Layout Opportunities by Start Point. @@ -294,14 +293,12 @@ NGLayoutOpportunity initial_opportunity = CreateInitialOpportunity(available_size, Offset()); - opportunity_tree_root_.reset( - new NGLayoutOpportunityTreeNode(initial_opportunity)); + NGLayoutOpportunityTreeNode tree(initial_opportunity); for (const auto& exclusion : exclusions->storage) { - InsertExclusion(MutableOpportunityTreeRoot(), exclusion.get(), - opportunities_); + InsertExclusion(&tree, &exclusion, opportunities_); } - CollectAllOpportunities(OpportunityTreeRoot(), opportunities_); + CollectAllOpportunities(&tree, opportunities_); std::sort(opportunities_.begin(), opportunities_.end(), &CompareNGLayoutOpportunitesByStartPoint); @@ -316,13 +313,4 @@ return NGLayoutOpportunity(*opportunity); } -#ifndef NDEBUG -void NGLayoutOpportunityIterator::ShowLayoutOpportunityTree() const { - StringBuilder string_builder; - string_builder.Append("\n.:: LayoutOpportunity Tree ::.\n\nRoot Node: "); - AppendNodeToString(opportunity_tree_root_.get(), &string_builder); - fprintf(stderr, "%s\n", string_builder.ToString().Utf8().data()); -} -#endif - } // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_layout_opportunity_iterator.h b/third_party/WebKit/Source/core/layout/ng/ng_layout_opportunity_iterator.h index 6144fa7..41e19d9 100644 --- a/third_party/WebKit/Source/core/layout/ng/ng_layout_opportunity_iterator.h +++ b/third_party/WebKit/Source/core/layout/ng/ng_layout_opportunity_iterator.h
@@ -25,6 +25,8 @@ const NGLogicalSize& size); class CORE_EXPORT NGLayoutOpportunityIterator final { + STACK_ALLOCATED(); + public: // Default constructor. // @@ -59,19 +61,8 @@ #endif private: - // Mutable Getters. - NGLayoutOpportunityTreeNode* MutableOpportunityTreeRoot() { - return opportunity_tree_root_.get(); - } - - // Read-only Getters. - const NGLayoutOpportunityTreeNode* OpportunityTreeRoot() const { - return opportunity_tree_root_.get(); - } - NGLayoutOpportunities opportunities_; NGLayoutOpportunities::const_iterator opportunity_iter_; - std::unique_ptr<NGLayoutOpportunityTreeNode> opportunity_tree_root_; NGLogicalOffset offset_; };
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_space_utils.cc b/third_party/WebKit/Source/core/layout/ng/ng_space_utils.cc index f3cf0531..382df0a 100644 --- a/third_party/WebKit/Source/core/layout/ng/ng_space_utils.cc +++ b/third_party/WebKit/Source/core/layout/ng/ng_space_utils.cc
@@ -12,50 +12,28 @@ #include "core/layout/ng/ng_writing_mode.h" namespace blink { -namespace { -// Returns max of 2 {@code WTF::Optional} values. -template <typename T> -WTF::Optional<T> OptionalMax(const WTF::Optional<T>& value1, - const WTF::Optional<T>& value2) { - if (value1 && value2) { - return std::max(value1.value(), value2.value()); - } else if (value1) { - return value1; - } - return value2; -} - -} // namespace - -WTF::Optional<LayoutUnit> GetClearanceOffset( - const std::shared_ptr<NGExclusions>& exclusions, - EClear clear_type) { - const NGExclusion* right_exclusion = exclusions->last_right_float; - const NGExclusion* left_exclusion = exclusions->last_left_float; - - WTF::Optional<LayoutUnit> left_offset; - if (left_exclusion) { - left_offset = left_exclusion->rect.BlockEndOffset(); - } - WTF::Optional<LayoutUnit> right_offset; - if (right_exclusion) { - right_offset = right_exclusion->rect.BlockEndOffset(); - } +LayoutUnit GetClearanceOffset(const std::shared_ptr<NGExclusions>& exclusions, + EClear clear_type) { + LayoutUnit float_left_clear_offset = + exclusions->float_left_clear_offset.value_or(LayoutUnit::Min()); + LayoutUnit float_right_clear_offset = + exclusions->float_right_clear_offset.value_or(LayoutUnit::Min()); switch (clear_type) { case EClear::kNone: - return WTF::nullopt; // nothing to do here. + return LayoutUnit::Min(); // nothing to do here. case EClear::kLeft: - return left_offset; + return float_left_clear_offset; case EClear::kRight: - return right_offset; + return float_right_clear_offset; case EClear::kBoth: - return OptionalMax<LayoutUnit>(left_offset, right_offset); + return std::max(float_left_clear_offset, float_right_clear_offset); default: NOTREACHED(); } - return WTF::nullopt; + + return LayoutUnit::Min(); } bool ShouldShrinkToFit(const ComputedStyle& parent_style,
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_space_utils.h b/third_party/WebKit/Source/core/layout/ng/ng_space_utils.h index c2c9737..1217b4f 100644 --- a/third_party/WebKit/Source/core/layout/ng/ng_space_utils.h +++ b/third_party/WebKit/Source/core/layout/ng/ng_space_utils.h
@@ -18,9 +18,9 @@ // Gets the clearance offset based on the provided {@code clear_type} and list // of exclusions that represent left/right float. -CORE_EXPORT WTF::Optional<LayoutUnit> GetClearanceOffset( - const std::shared_ptr<NGExclusions>& exclusions, - EClear clear_type); +CORE_EXPORT LayoutUnit +GetClearanceOffset(const std::shared_ptr<NGExclusions>& exclusions, + EClear clear_type); // Whether child's constraint space should shrink to its intrinsic width. // This is needed for buttons, select, input, floats and orthogonal children.
diff --git a/third_party/WebKit/Source/core/loader/resource/ImageResource.cpp b/third_party/WebKit/Source/core/loader/resource/ImageResource.cpp index a29f179..2cbba67 100644 --- a/third_party/WebKit/Source/core/loader/resource/ImageResource.cpp +++ b/third_party/WebKit/Source/core/loader/resource/ImageResource.cpp
@@ -289,7 +289,14 @@ } void ImageResource::AllClientsAndObserversRemoved() { - CHECK(!GetContent()->HasImage() || !ErrorOccurred()); + // After ErrorOccurred() is set true in Resource::FinishAsError() before + // the subsequent UpdateImage() in ImageResource::FinishAsError(), + // HasImage() is true and ErrorOccurred() is true. + // |is_during_finish_as_error_| is introduced to allow such cases. + // crbug.com/701723 + // TODO(hiroshige): Make the CHECK condition cleaner. + CHECK(is_during_finish_as_error_ || !GetContent()->HasImage() || + !ErrorOccurred()); // If possible, delay the resetting until back at the event loop. Doing so // after a conservative GC prevents resetAnimation() from upsetting ongoing // animation updates (crbug.com/613709) @@ -410,7 +417,9 @@ // TODO(hiroshige): Move setEncodedSize() call to Resource::error() if it // is really needed, or remove it otherwise. SetEncodedSize(0); + is_during_finish_as_error_ = true; Resource::FinishAsError(error); + is_during_finish_as_error_ = false; UpdateImage(nullptr, ImageResourceContent::kClearImageAndNotifyObservers, true); }
diff --git a/third_party/WebKit/Source/core/loader/resource/ImageResource.h b/third_party/WebKit/Source/core/loader/resource/ImageResource.h index 40b40ac5..1159c1f 100644 --- a/third_party/WebKit/Source/core/loader/resource/ImageResource.h +++ b/third_party/WebKit/Source/core/loader/resource/ImageResource.h
@@ -176,6 +176,8 @@ Timer<ImageResource> flush_timer_; double last_flush_time_ = 0.; + + bool is_during_finish_as_error_ = false; }; DEFINE_RESOURCE_TYPE_CASTS(Image);
diff --git a/third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp b/third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp index 36e4c77..be2e0f48 100644 --- a/third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp +++ b/third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp
@@ -41,6 +41,7 @@ #include "platform/loader/fetch/FetchParameters.h" #include "platform/loader/fetch/MemoryCache.h" #include "platform/loader/fetch/ResourceFetcher.h" +#include "platform/loader/fetch/ResourceFinishObserver.h" #include "platform/loader/fetch/ResourceLoader.h" #include "platform/loader/fetch/UniqueIdentifier.h" #include "platform/loader/testing/MockFetchContext.h" @@ -57,6 +58,7 @@ #include "public/platform/WebURL.h" #include "public/platform/WebURLLoaderMockFactory.h" #include "public/platform/WebURLResponse.h" +#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" namespace blink { @@ -498,6 +500,64 @@ EXPECT_FALSE(GetMemoryCache()->ResourceForURL(test_url)); } +class MockFinishObserver : public GarbageCollectedFinalized<MockFinishObserver>, + public ResourceFinishObserver { + USING_GARBAGE_COLLECTED_MIXIN(MockFinishObserver); + + public: + static MockFinishObserver* Create() { + return + + new ::testing::StrictMock<MockFinishObserver>; + } + MOCK_METHOD0(NotifyFinished, void()); + String DebugName() const override { return "MockFinishObserver"; } + + DEFINE_INLINE_VIRTUAL_TRACE() { + blink::ResourceFinishObserver::Trace(visitor); + } + + protected: + MockFinishObserver() {} +}; + +TEST(ImageResourceTest, CancelWithImageAndFinishObserver) { + KURL test_url(kParsedURLString, kTestURL); + ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); + + ResourceFetcher* fetcher = CreateFetcher(); + + // Emulate starting a real load. + ImageResource* image_resource = ImageResource::CreateForTest(test_url); + image_resource->SetIdentifier(CreateUniqueIdentifier()); + + fetcher->StartLoad(image_resource); + GetMemoryCache()->Add(image_resource); + + Persistent<MockFinishObserver> finish_observer = MockFinishObserver::Create(); + image_resource->AddFinishObserver(finish_observer); + + // Send the image response. + image_resource->ResponseReceived( + ResourceResponse(NullURL(), "image/jpeg", sizeof(kJpegImage), + g_null_atom), + nullptr); + image_resource->AppendData(reinterpret_cast<const char*>(kJpegImage), + sizeof(kJpegImage)); + ASSERT_TRUE(image_resource->GetContent()->HasImage()); + EXPECT_EQ(ResourceStatus::kPending, image_resource->GetStatus()); + + // This shouldn't crash. crbug.com/701723 + image_resource->Loader()->Cancel(); + + EXPECT_EQ(ResourceStatus::kLoadError, image_resource->GetStatus()); + EXPECT_FALSE(GetMemoryCache()->ResourceForURL(test_url)); + + // ResourceFinishObserver is notified asynchronously. + EXPECT_CALL(*finish_observer, NotifyFinished()); + blink::testing::RunPendingTasks(); +} + TEST(ImageResourceTest, DecodedDataRemainsWhileHasClients) { ImageResource* image_resource = ImageResource::CreateForTest(NullURL()); image_resource->SetStatus(ResourceStatus::kPending);
diff --git a/third_party/WebKit/Source/core/paint/EmbeddedContentPainter.cpp b/third_party/WebKit/Source/core/paint/EmbeddedContentPainter.cpp index 8ebba762..a260c8e 100644 --- a/third_party/WebKit/Source/core/paint/EmbeddedContentPainter.cpp +++ b/third_party/WebKit/Source/core/paint/EmbeddedContentPainter.cpp
@@ -62,10 +62,6 @@ return; if (layout_embedded_content_.GetEmbeddedContentView()) { - // TODO(schenney) crbug.com/93805 Speculative release assert to verify that - // the crashes we see in EmbeddedContentView painting are due to a destroyed - // LayoutEmbeddedContent object. - CHECK(layout_embedded_content_.GetNode()); Optional<RoundedInnerRectClipper> clipper; if (layout_embedded_content_.Style()->HasBorderRadius()) { if (border_rect.IsEmpty())
diff --git a/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp b/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp index abef542..48f1dd9 100644 --- a/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp +++ b/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp
@@ -1973,10 +1973,6 @@ needs_composited_scrolling = false; } - // TODO(schenney) Tests fail if we do not also exclude - // layer->layoutObject().style()->hasBorderDecoration() (missing background - // behind dashed borders). Resolve this case, or not, and update this check - // with the results. if (layer->GetLayoutObject().Style()->HasBorderRadius()) { non_composited_main_thread_scrolling_reasons_ |= MainThreadScrollingReason::kHasBorderRadius;
diff --git a/third_party/WebKit/Source/core/paint/compositing/PaintLayerCompositor.h b/third_party/WebKit/Source/core/paint/compositing/PaintLayerCompositor.h index bc67cd7..f1cf7baa 100644 --- a/third_party/WebKit/Source/core/paint/compositing/PaintLayerCompositor.h +++ b/third_party/WebKit/Source/core/paint/compositing/PaintLayerCompositor.h
@@ -27,6 +27,7 @@ #define PaintLayerCompositor_h #include <memory> +#include "base/gtest_prod_util.h" #include "core/CoreExport.h" #include "core/dom/DocumentLifecycle.h" #include "core/paint/compositing/CompositingReasonFinder.h" @@ -298,6 +299,9 @@ std::unique_ptr<GraphicsLayer> layer_for_horizontal_scrollbar_; std::unique_ptr<GraphicsLayer> layer_for_vertical_scrollbar_; std::unique_ptr<GraphicsLayer> layer_for_scroll_corner_; + + FRIEND_TEST_ALL_PREFIXES(FrameThrottlingTest, + IntersectionObservationOverridesThrottling); }; } // namespace blink
diff --git a/third_party/WebKit/Source/core/scheduler/FrameThrottlingTest.cpp b/third_party/WebKit/Source/core/scheduler/FrameThrottlingTest.cpp index 8db9bfb..49c5c1e6 100644 --- a/third_party/WebKit/Source/core/scheduler/FrameThrottlingTest.cpp +++ b/third_party/WebKit/Source/core/scheduler/FrameThrottlingTest.cpp
@@ -189,6 +189,70 @@ EXPECT_TRUE(inner_frame_document->View()->CanThrottleRendering()); } +TEST_P(FrameThrottlingTest, IntersectionObservationOverridesThrottling) { + // Create a document with doubly nested iframes. + SimRequest main_resource("https://example.com/", "text/html"); + SimRequest frame_resource("https://example.com/iframe.html", "text/html"); + + LoadURL("https://example.com/"); + main_resource.Complete("<iframe id=frame src=iframe.html></iframe>"); + frame_resource.Complete("<iframe id=innerFrame sandbox></iframe>"); + + auto* frame_element = + toHTMLIFrameElement(GetDocument().getElementById("frame")); + auto* frame_document = frame_element->contentDocument(); + + auto* inner_frame_element = + toHTMLIFrameElement(frame_document->getElementById("innerFrame")); + auto* inner_frame_document = inner_frame_element->contentDocument(); + + DocumentLifecycle::AllowThrottlingScope throttling_scope( + GetDocument().Lifecycle()); + + // Hidden cross origin frames are throttled. + frame_element->setAttribute(styleAttr, "transform: translateY(480px)"); + CompositeFrame(); + EXPECT_FALSE(GetDocument().View()->CanThrottleRendering()); + EXPECT_FALSE(frame_document->View()->CanThrottleRendering()); + EXPECT_TRUE(inner_frame_document->View()->ShouldThrottleRendering()); + + // An intersection observation overrides... + inner_frame_document->View()->SetNeedsIntersectionObservation(); + EXPECT_FALSE(inner_frame_document->View()->ShouldThrottleRendering()); + inner_frame_document->View()->ScheduleAnimation(); + + LayoutView* inner_view = inner_frame_document->View()->GetLayoutView(); + + inner_view->SetNeedsLayout("test"); + inner_view->Compositor()->SetNeedsCompositingUpdate( + kCompositingUpdateRebuildTree); + inner_view->SetShouldDoFullPaintInvalidation( + PaintInvalidationReason::kForTesting); + inner_view->Layer()->SetNeedsRepaint(); + EXPECT_FALSE(inner_frame_document->View() + ->GetLayoutView() + ->FullPaintInvalidationReason() == + PaintInvalidationReason::kNone); + inner_view->Compositor()->SetNeedsCompositingUpdate( + kCompositingUpdateRebuildTree); + EXPECT_EQ(kCompositingUpdateRebuildTree, + inner_view->Compositor()->pending_update_type_); + EXPECT_TRUE(inner_view->Layer()->NeedsRepaint()); + + CompositeFrame(); + // ...but only for one frame. + EXPECT_TRUE(inner_frame_document->View()->ShouldThrottleRendering()); + + EXPECT_FALSE(inner_view->NeedsLayout()); + EXPECT_FALSE(inner_frame_document->View() + ->GetLayoutView() + ->FullPaintInvalidationReason() == + PaintInvalidationReason::kNone); + EXPECT_EQ(kCompositingUpdateRebuildTree, + inner_view->Compositor()->pending_update_type_); + EXPECT_TRUE(inner_view->Layer()->NeedsRepaint()); +} + TEST_P(FrameThrottlingTest, HiddenCrossOriginZeroByZeroFramesAreNotThrottled) { // Create a document with doubly nested iframes. SimRequest main_resource("https://example.com/", "text/html");
diff --git a/third_party/WebKit/Source/core/style/ComputedStyle.h b/third_party/WebKit/Source/core/style/ComputedStyle.h index 45e16ee..b97cc88b 100644 --- a/third_party/WebKit/Source/core/style/ComputedStyle.h +++ b/third_party/WebKit/Source/core/style/ComputedStyle.h
@@ -1210,21 +1210,6 @@ !ColumnRuleColorInternal().Alpha(); } bool ColumnRuleEquivalent(const ComputedStyle& other_style) const; - void InheritColumnPropertiesFrom(const ComputedStyle& parent) { - SetColumnGapInternal(parent.ColumnGap()); - SetColumnWidthInternal(parent.ColumnWidth()); - SetVisitedLinkColumnRuleColorInternal( - parent.VisitedLinkColumnRuleColorInternal()); - SetColumnRuleColorInternal(parent.ColumnRuleColorInternal()); - SetColumnCountInternal(parent.ColumnCount()); - SetColumnRuleStyle(parent.ColumnRuleStyle()); - SetColumnAutoCountInternal(parent.ColumnAutoCountInternal()); - SetColumnAutoWidthInternal(parent.ColumnAutoWidthInternal()); - SetColumnFill(parent.GetColumnFill()); - SetColumnNormalGapInternal(parent.ColumnNormalGapInternal()); - SetColumnRuleColorIsCurrentColor(parent.ColumnRuleColorIsCurrentColor()); - SetColumnSpan(parent.GetColumnSpan()); - } // Flex utility functions. bool IsColumnFlexDirection() const {
diff --git a/third_party/WebKit/Source/core/timing/PerformanceServerTiming.cpp b/third_party/WebKit/Source/core/timing/PerformanceServerTiming.cpp index 597b765..80eb269 100644 --- a/third_party/WebKit/Source/core/timing/PerformanceServerTiming.cpp +++ b/third_party/WebKit/Source/core/timing/PerformanceServerTiming.cpp
@@ -11,23 +11,23 @@ namespace blink { PerformanceServerTiming::PerformanceServerTiming( - const String& metric, - double value, + const String& name, + double duration, const String& description, ShouldAllowTimingDetails shouldAllowTimingDetails) - : metric_(metric), - value_(value), + : name_(name), + duration_(duration), description_(description), shouldAllowTimingDetails_(shouldAllowTimingDetails) {} PerformanceServerTiming::~PerformanceServerTiming() {} -String PerformanceServerTiming::metric() const { - return metric_; +String PerformanceServerTiming::name() const { + return name_; } -double PerformanceServerTiming::value() const { - return shouldAllowTimingDetails_ == ShouldAllowTimingDetails::Yes ? value_ +double PerformanceServerTiming::duration() const { + return shouldAllowTimingDetails_ == ShouldAllowTimingDetails::Yes ? duration_ : 0.0; } @@ -40,8 +40,8 @@ ScriptValue PerformanceServerTiming::toJSONForBinding( ScriptState* script_state) const { V8ObjectBuilder builder(script_state); - builder.AddString("metric", metric()); - builder.AddNumber("value", value()); + builder.AddString("name", name()); + builder.AddNumber("duration", duration()); builder.AddString("description", description()); return builder.GetScriptValue(); } @@ -56,7 +56,7 @@ response.HttpHeaderField(HTTPNames::Server_Timing)); for (const auto& header : *headers) { entries.push_back(new PerformanceServerTiming( - header->metric, header->value, header->description, + header->name, header->duration, header->description, shouldAllowTimingDetails)); } }
diff --git a/third_party/WebKit/Source/core/timing/PerformanceServerTiming.h b/third_party/WebKit/Source/core/timing/PerformanceServerTiming.h index 815bb363..9f0a2b49 100644 --- a/third_party/WebKit/Source/core/timing/PerformanceServerTiming.h +++ b/third_party/WebKit/Source/core/timing/PerformanceServerTiming.h
@@ -28,14 +28,14 @@ No, }; - PerformanceServerTiming(const String& metric, - double value, + PerformanceServerTiming(const String& name, + double duration, const String& description, ShouldAllowTimingDetails); ~PerformanceServerTiming(); - String metric() const; - double value() const; + String name() const; + double duration() const; String description() const; static PerformanceServerTimingVector ParseServerTiming( @@ -47,8 +47,8 @@ DEFINE_INLINE_VIRTUAL_TRACE() {} private: - const String metric_; - double value_; + const String name_; + double duration_; const String description_; ShouldAllowTimingDetails shouldAllowTimingDetails_; };
diff --git a/third_party/WebKit/Source/core/timing/PerformanceServerTiming.idl b/third_party/WebKit/Source/core/timing/PerformanceServerTiming.idl index fd4069e..5026f3a 100644 --- a/third_party/WebKit/Source/core/timing/PerformanceServerTiming.idl +++ b/third_party/WebKit/Source/core/timing/PerformanceServerTiming.idl
@@ -7,7 +7,7 @@ [ RuntimeEnabled=ServerTiming ] interface PerformanceServerTiming { - readonly attribute DOMString metric; - readonly attribute double value; + readonly attribute DOMString name; + readonly attribute DOMHighResTimeStamp duration; readonly attribute DOMString description; };
diff --git a/third_party/WebKit/Source/devtools/BUILD.gn b/third_party/WebKit/Source/devtools/BUILD.gn index 0ffc52c..34355b7 100644 --- a/third_party/WebKit/Source/devtools/BUILD.gn +++ b/third_party/WebKit/Source/devtools/BUILD.gn
@@ -19,6 +19,8 @@ "front_end/accessibility/axBreadcrumbs.css", "front_end/accessibility/AXBreadcrumbsPane.js", "front_end/accessibility/module.json", + "front_end/accessibility_test_runner/AccessibilityPaneTestRunner.js", + "front_end/accessibility_test_runner/module.json", "front_end/animation/AnimationGroupPreviewUI.js", "front_end/animation/AnimationModel.js", "front_end/animation/animationScreenshotPopover.css", @@ -27,6 +29,13 @@ "front_end/animation/AnimationTimeline.js", "front_end/animation/AnimationUI.js", "front_end/animation/module.json", + "front_end/application_test_runner/AppcacheTestRunner.js", + "front_end/application_test_runner/CacheStorageTestRunner.js", + "front_end/application_test_runner/IndexedDBTestRunner.js", + "front_end/application_test_runner/module.json", + "front_end/application_test_runner/ResourcesTestRunner.js", + "front_end/application_test_runner/ResourceTreeTestRunner.js", + "front_end/application_test_runner/ServiceWorkersTestRunner.js", "front_end/audits/AuditCategories.js", "front_end/audits/AuditCategory.js", "front_end/audits/AuditController.js", @@ -54,6 +63,8 @@ "front_end/audits2/lighthouse/renderer/report-renderer.js", "front_end/audits2/lighthouse/renderer/util.js", "front_end/audits2/module.json", + "front_end/audits_test_runner/AuditsTestRunner.js", + "front_end/audits_test_runner/module.json", "front_end/bindings/BlackboxManager.js", "front_end/bindings/BreakpointManager.js", "front_end/bindings/CompilerScriptMapping.js", @@ -72,6 +83,11 @@ "front_end/bindings/SASSSourceMapping.js", "front_end/bindings/StylesSourceMapping.js", "front_end/bindings/TempFile.js", + "front_end/bindings_test_runner/AutomappingTestRunner.js", + "front_end/bindings_test_runner/BindingsTestRunner.js", + "front_end/bindings_test_runner/IsolatedFilesystemTestRunner.js", + "front_end/bindings_test_runner/module.json", + "front_end/bindings_test_runner/PersistenceTestRunner.js", "front_end/changes/ChangesHighlighter.js", "front_end/changes/changesView.css", "front_end/changes/ChangesView.js", @@ -163,6 +179,8 @@ "front_end/coverage/coverageView.css", "front_end/coverage/CoverageView.js", "front_end/coverage/module.json", + "front_end/coverage_test_runner/CoverageTestRunner.js", + "front_end/coverage_test_runner/module.json", "front_end/data_grid/dataGrid.css", "front_end/data_grid/DataGrid.js", "front_end/data_grid/module.json", @@ -171,6 +189,8 @@ "front_end/data_grid/ViewportDataGrid.js", "front_end/data_grid_test_runner/DataGridTestRunner.js", "front_end/data_grid_test_runner/module.json", + "front_end/device_mode_test_runner/DeviceModeTestRunner.js", + "front_end/device_mode_test_runner/module.json", "front_end/devices/devicesView.css", "front_end/devices/DevicesView.js", "front_end/devices/module.json", @@ -209,6 +229,11 @@ "front_end/elements/stylesSectionTree.css", "front_end/elements/stylesSidebarPane.css", "front_end/elements/StylesSidebarPane.js", + "front_end/elements_test_runner/EditDOMTestRunner.js", + "front_end/elements_test_runner/ElementsPanelShadowSelectionOnRefreshTestRunner.js", + "front_end/elements_test_runner/ElementsTestRunner.js", + "front_end/elements_test_runner/SetOuterHTMLTestRunner.js", + "front_end/elements_test_runner/StylesUpdateLinksTestRunner.js", "front_end/emulated_devices/module.json", "front_end/emulation/AdvancedApp.js", "front_end/emulation/DeviceModeModel.js", @@ -238,6 +263,9 @@ "front_end/extensions/ExtensionServer.js", "front_end/extensions/ExtensionView.js", "front_end/extensions/module.json", + "front_end/extensions_test_runner/ExtensionsNetworkTestRunner.js", + "front_end/extensions_test_runner/ExtensionsTestRunner.js", + "front_end/extensions_test_runner/module.json", "front_end/formatter/FormatterWorkerPool.js", "front_end/formatter/module.json", "front_end/formatter/ScriptFormatter.js", @@ -303,6 +331,8 @@ "front_end/integration_test_runner.json", "front_end/integration_test_runner/IntegrationTestRunner.js", "front_end/integration_test_runner/module.json", + "front_end/integration_test_runner/PageMockTestRunner.js", + "front_end/integration_test_runner/SyntaxHighlightTestRunner.js", "front_end/layer_viewer/layerDetailsView.css", "front_end/layer_viewer/LayerDetailsView.js", "front_end/layer_viewer/layers3DView.css", @@ -317,6 +347,8 @@ "front_end/layers/LayersPanel.js", "front_end/layers/LayerTreeModel.js", "front_end/layers/module.json", + "front_end/layers_test_runner/LayersTestRunner.js", + "front_end/layers_test_runner/module.json", "front_end/main/ExecutionContextSelector.js", "front_end/main/GCActionDelegate.js", "front_end/main/Main.js", @@ -374,6 +406,9 @@ "front_end/network_log/NetworkLog.js", "front_end/network_priorities/module.json", "front_end/network_priorities/NetworkPriorities.js", + "front_end/network_test_runner/module.json", + "front_end/network_test_runner/NetworkTestRunner.js", + "front_end/network_test_runner/ProductRegistryTestRunner.js", "front_end/object_ui/customPreviewComponent.css", "front_end/object_ui/CustomPreviewComponent.js", "front_end/object_ui/JavaScriptAutocomplete.js", @@ -401,6 +436,9 @@ "front_end/perf_ui/TimelineGrid.js", "front_end/perf_ui/timelineOverviewInfo.css", "front_end/perf_ui/TimelineOverviewPane.js", + "front_end/performance_test_runner/module.json", + "front_end/performance_test_runner/TimelineDataTestRunner.js", + "front_end/performance_test_runner/TimelineTestRunner.js", "front_end/persistence/Automapping.js", "front_end/persistence/DefaultMapping.js", "front_end/persistence/editFileSystemView.css", @@ -444,6 +482,9 @@ "front_end/profiler/ProfileView.js", "front_end/profiler/TargetsComboBoxController.js", "front_end/profiler/TopDownProfileDataGrid.js", + "front_end/profiler_test_runner/HeapSnapshotTestRunner.js", + "front_end/profiler_test_runner/module.json", + "front_end/profiler_test_runner/ProfilerTestRunner.js", "front_end/protocol/InspectorBackend.js", "front_end/protocol/module.json", "front_end/quick_open/CommandMenu.js", @@ -485,6 +526,8 @@ "front_end/sass/SASSProcessor.js", "front_end/sass/SASSSourceMapFactory.js", "front_end/sass/SASSSupport.js", + "front_end/sass_test_runner/module.json", + "front_end/sass_test_runner/SASSTestRunner.js", "front_end/screencast/InputModel.js", "front_end/screencast/module.json", "front_end/screencast/ScreencastApp.js", @@ -540,6 +583,8 @@ "front_end/security/SecurityModel.js", "front_end/security/SecurityPanel.js", "front_end/security/sidebar.css", + "front_end/security_test_runner/module.json", + "front_end/security_test_runner/SecurityTestRunner.js", "front_end/services/ServiceManager.js", "front_end/settings/frameworkBlackboxSettingsTab.css", "front_end/settings/FrameworkBlackboxSettingsTab.js", @@ -618,6 +663,12 @@ "front_end/sources/WorkspaceMappingTip.js", "front_end/sources/xhrBreakpointsSidebarPane.css", "front_end/sources/XHRBreakpointsSidebarPane.js", + "front_end/sources_test_runner/AutocompleteTestRunner.js", + "front_end/sources_test_runner/BreakpointManagerTestRunner.js", + "front_end/sources_test_runner/DebuggerTestRunner.js", + "front_end/sources_test_runner/EditorTestRunner.js", + "front_end/sources_test_runner/LiveEditTestRunner.js", + "front_end/sources_test_runner/SearchTestRunner.js", "front_end/sources_test_runner/SourcesTestRunner.js", "front_end/sources_test_runner/module.json", "front_end/terminal/terminal.css",
diff --git a/third_party/WebKit/Source/devtools/front_end/Runtime.js b/third_party/WebKit/Source/devtools/front_end/Runtime.js index b3123ed4..f8dd1ac 100644 --- a/third_party/WebKit/Source/devtools/front_end/Runtime.js +++ b/third_party/WebKit/Source/devtools/front_end/Runtime.js
@@ -738,6 +738,7 @@ 'object_ui': 'ObjectUI', 'perf_ui': 'PerfUI', 'har_importer': 'HARImporter', + 'sass_test_runner': 'SASSTestRunner', }; var namespace = specialCases[this._name] || this._name.split('_').map(a => a.substring(0, 1).toUpperCase() + a.substring(1)).join(''); self[namespace] = self[namespace] || {};
diff --git a/third_party/WebKit/Source/devtools/front_end/accessibility_test_runner/AccessibilityPaneTestRunner.js b/third_party/WebKit/Source/devtools/front_end/accessibility_test_runner/AccessibilityPaneTestRunner.js new file mode 100644 index 0000000..7d19972 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/accessibility_test_runner/AccessibilityPaneTestRunner.js
@@ -0,0 +1,74 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +AccessibilityTestRunner.accessibilitySidebarPane = function() { + return self.runtime.sharedInstance(Accessibility.AccessibilitySidebarView); +}; + +AccessibilityTestRunner.selectNodeAndWaitForAccessibility = function(idValue) { + return new Promise(resolve => { + ElementsTestRunner.selectNodeWithId(idValue, function() { + self.runtime.sharedInstance(Accessibility.AccessibilitySidebarView).doUpdate().then(resolve); + }); + }); +}; + +AccessibilityTestRunner.dumpSelectedElementAccessibilityNode = function() { + var sidebarPane = AccessibilityTestRunner.accessibilitySidebarPane(); + + if (!sidebarPane) { + TestRunner.addResult('No sidebarPane in dumpSelectedElementAccessibilityNode'); + TestRunner.completeTest(); + return; + } + + AccessibilityTestRunner.dumpAccessibilityNode(sidebarPane._axNodeSubPane._axNode); +}; + +AccessibilityTestRunner.dumpAccessibilityNode = function(accessibilityNode) { + if (!accessibilityNode) { + TestRunner.addResult('<null>'); + TestRunner.completeTest(); + return; + } + + var builder = []; + builder.push(accessibilityNode.role().value); + builder.push((accessibilityNode.name() ? '"' + accessibilityNode.name().value + '"' : '<undefined>')); + + if (accessibilityNode.properties()) { + for (var property of accessibilityNode.properties()) { + if ('value' in property) + builder.push(property.name + '="' + property.value.value + '"'); + } + } + + TestRunner.addResult(builder.join(' ')); +}; + +AccessibilityTestRunner.findARIAAttributeTreeElement = function(attribute) { + var sidebarPane = AccessibilityTestRunner.accessibilitySidebarPane(); + + if (!sidebarPane) { + TestRunner.addResult('Could not get Accessibility sidebar pane.'); + TestRunner.completeTest(); + return; + } + + var ariaSubPane = sidebarPane._ariaSubPane; + var treeOutline = ariaSubPane._treeOutline; + var childNodes = treeOutline._rootElement._children; + + for (var treeElement of childNodes) { + if (treeElement._attribute.name === attribute) + return treeElement; + } + + return null; +};
diff --git a/third_party/WebKit/Source/devtools/front_end/accessibility_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/accessibility_test_runner/module.json new file mode 100644 index 0000000..aac49bd --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/accessibility_test_runner/module.json
@@ -0,0 +1,14 @@ +{ + "dependencies": [ + "test_runner", + "integration_test_runner", + "accessibility", + "elements_test_runner" + ], + "scripts": [ + "AccessibilityPaneTestRunner.js" + ], + "skip_compilation": [ + "AccessibilityPaneTestRunner.js" + ] +}
diff --git a/third_party/WebKit/Source/devtools/front_end/application_test_runner/AppcacheTestRunner.js b/third_party/WebKit/Source/devtools/front_end/application_test_runner/AppcacheTestRunner.js new file mode 100644 index 0000000..17c8274 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/application_test_runner/AppcacheTestRunner.js
@@ -0,0 +1,215 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +ApplicationTestRunner.createAndNavigateIFrame = function(url, callback) { + TestRunner.addSniffer(SDK.ResourceTreeModel.prototype, '_frameNavigated', frameNavigated); + TestRunner.evaluateInPage('createAndNavigateIFrame(unescape(\'' + escape(url) + '\'))'); + + function frameNavigated(frame) { + callback(frame.id); + } +}; + +ApplicationTestRunner.navigateIFrame = function(frameId, url, callback) { + var frame = TestRunner.resourceTreeModel.frameForId(frameId); + TestRunner.evaluateInPage( + 'navigateIFrame(unescape(\'' + escape(frame.name) + '\'), unescape(\'' + escape(url) + '\'))'); + TestRunner.addSniffer(SDK.ResourceTreeModel.prototype, '_frameNavigated', frameNavigated); + + function frameNavigated(frame) { + callback(frame.id); + } +}; + +ApplicationTestRunner.removeIFrame = function(frameId, callback) { + var frame = TestRunner.resourceTreeModel.frameForId(frameId); + TestRunner.evaluateInPage('removeIFrame(unescape(\'' + escape(frame.name) + '\'))'); + TestRunner.addSniffer(SDK.ResourceTreeModel.prototype, '_frameDetached', frameDetached); + + function frameDetached(frame) { + callback(frame.id); + } +}; + +ApplicationTestRunner.swapFrameCache = function(frameId) { + var frame = TestRunner.resourceTreeModel.frameForId(frameId); + TestRunner.evaluateInPage('swapFrameCache(unescape(\'' + escape(frame.name) + '\'))'); +}; + +ApplicationTestRunner.dumpApplicationCache = function() { + ApplicationTestRunner.dumpApplicationCacheTree(); + ApplicationTestRunner.dumpApplicationCacheModel(); + TestRunner.addResult(''); +}; + +ApplicationTestRunner.dumpApplicationCacheTree = function() { + TestRunner.addResult('Dumping application cache tree:'); + var applicationCacheTreeElement = UI.panels.resources._sidebar.applicationCacheListTreeElement; + + if (!applicationCacheTreeElement.childCount()) { + TestRunner.addResult(' (empty)'); + return; + } + + for (var i = 0; i < applicationCacheTreeElement.childCount(); ++i) { + var manifestTreeElement = applicationCacheTreeElement.childAt(i); + TestRunner.addResult(' Manifest URL: ' + manifestTreeElement.manifestURL); + + if (!manifestTreeElement.childCount()) { + TestRunner.addResult(' (no frames)'); + continue; + } + + for (var j = 0; j < manifestTreeElement.childCount(); ++j) { + var frameTreeElement = manifestTreeElement.childAt(j); + TestRunner.addResult(' Frame: ' + frameTreeElement.title); + } + } +}; + +ApplicationTestRunner.frameIdToString = function(frameId) { + if (!ApplicationTestRunner.framesByFrameId) + ApplicationTestRunner.framesByFrameId = {}; + + var frame = TestRunner.resourceTreeModel.frameForId(frameId); + + if (!frame) + frame = ApplicationTestRunner.framesByFrameId[frameId]; + + ApplicationTestRunner.framesByFrameId[frameId] = frame; + return frame.name; +}; + +ApplicationTestRunner.applicationCacheStatusToString = function(status) { + var statusInformation = {}; + statusInformation[applicationCache.UNCACHED] = 'UNCACHED'; + statusInformation[applicationCache.IDLE] = 'IDLE'; + statusInformation[applicationCache.CHECKING] = 'CHECKING'; + statusInformation[applicationCache.DOWNLOADING] = 'DOWNLOADING'; + statusInformation[applicationCache.UPDATEREADY] = 'UPDATEREADY'; + statusInformation[applicationCache.OBSOLETE] = 'OBSOLETE'; + return statusInformation[status] || statusInformation[applicationCache.UNCACHED]; +}; + +ApplicationTestRunner.dumpApplicationCacheModel = function() { + TestRunner.addResult('Dumping application cache model:'); + var model = UI.panels.resources._sidebar._applicationCacheModel; + var frameIds = []; + + for (var frameId in model._manifestURLsByFrame) + frameIds.push(frameId); + + function compareFunc(a, b) { + return ApplicationTestRunner.frameIdToString(a).localeCompare(ApplicationTestRunner.frameIdToString(b)); + } + + frameIds.sort(compareFunc); + + if (!frameIds.length) { + TestRunner.addResult(' (empty)'); + return; + } + + for (var i = 0; i < frameIds.length; ++i) { + var frameId = frameIds[i]; + var manifestURL = model.frameManifestURL(frameId); + var status = model.frameManifestStatus(frameId); + TestRunner.addResult(' Frame: ' + ApplicationTestRunner.frameIdToString(frameId)); + TestRunner.addResult(' manifest url: ' + manifestURL); + TestRunner.addResult(' status: ' + ApplicationTestRunner.applicationCacheStatusToString(status)); + } +}; + +ApplicationTestRunner.waitForFrameManifestURLAndStatus = function(frameId, manifestURL, status, callback) { + var frameManifestStatus = UI.panels.resources._sidebar._applicationCacheModel.frameManifestStatus(frameId); + var frameManifestURL = UI.panels.resources._sidebar._applicationCacheModel.frameManifestURL(frameId); + + if (frameManifestStatus === status && frameManifestURL.indexOf(manifestURL) !== -1) { + callback(); + return; + } + + var handler = + ApplicationTestRunner.waitForFrameManifestURLAndStatus.bind(this, frameId, manifestURL, status, callback); + TestRunner.addSniffer(Resources.ApplicationCacheModel.prototype, '_frameManifestUpdated', handler); +}; + +ApplicationTestRunner.startApplicationCacheStatusesRecording = function() { + if (ApplicationTestRunner.applicationCacheStatusesRecords) { + ApplicationTestRunner.applicationCacheStatusesRecords = {}; + return; + } + + ApplicationTestRunner.applicationCacheStatusesRecords = {}; + + function addRecord(frameId, manifestURL, status) { + var record = {}; + record.manifestURL = manifestURL; + record.status = status; + + if (!ApplicationTestRunner.applicationCacheStatusesRecords[frameId]) + ApplicationTestRunner.applicationCacheStatusesRecords[frameId] = []; + + ApplicationTestRunner.applicationCacheStatusesRecords[frameId].push(record); + + if (ApplicationTestRunner.awaitedFrameStatusEventsCount && + ApplicationTestRunner.awaitedFrameStatusEventsCount[frameId]) { + ApplicationTestRunner.awaitedFrameStatusEventsCount[frameId].count--; + + if (!ApplicationTestRunner.awaitedFrameStatusEventsCount[frameId].count) + ApplicationTestRunner.awaitedFrameStatusEventsCount[frameId].callback(); + } + } + + TestRunner.addSniffer(Resources.ApplicationCacheModel.prototype, '_frameManifestUpdated', addRecord, true); +}; + +ApplicationTestRunner.ensureFrameStatusEventsReceived = function(frameId, count, callback) { + var records = ApplicationTestRunner.applicationCacheStatusesRecords[frameId] || []; + var eventsLeft = count - records.length; + + if (!eventsLeft) { + callback(); + return; + } + + if (!ApplicationTestRunner.awaitedFrameStatusEventsCount) + ApplicationTestRunner.awaitedFrameStatusEventsCount = {}; + + ApplicationTestRunner.awaitedFrameStatusEventsCount[frameId] = {count: eventsLeft, callback: callback}; +}; + +(async function() { + await TestRunner.evaluateInPagePromise(` + var framesCount = 0; + + function createAndNavigateIFrame(url) { + var iframe = document.createElement('iframe'); + iframe.src = url; + iframe.name = 'frame' + ++framesCount; + iframe.id = iframe.name; + document.body.appendChild(iframe); + } + + function removeIFrame(name) { + var iframe = document.querySelector('#' + name); + iframe.parentElement.removeChild(iframe); + } + + function navigateIFrame(name, url) { + var iframe = document.querySelector('#' + name); + iframe.src = url; + } + + function swapFrameCache(name) { + var iframe = document.querySelector('#' + name); + iframe.contentWindow.applicationCache.swapCache(); + } + `); +})();
diff --git a/third_party/WebKit/Source/devtools/front_end/application_test_runner/CacheStorageTestRunner.js b/third_party/WebKit/Source/devtools/front_end/application_test_runner/CacheStorageTestRunner.js new file mode 100644 index 0000000..2a290155 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/application_test_runner/CacheStorageTestRunner.js
@@ -0,0 +1,173 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +ApplicationTestRunner.dumpCacheTree = async function() { + UI.panels.resources._sidebar.cacheStorageListTreeElement.expand(); + TestRunner.addResult('Dumping CacheStorage tree:'); + var cachesTreeElement = UI.panels.resources._sidebar.cacheStorageListTreeElement; + var promise = TestRunner.addSnifferPromise(SDK.ServiceWorkerCacheModel.prototype, '_updateCacheNames'); + UI.panels.resources._sidebar.cacheStorageListTreeElement._refreshCaches(); + await promise; + + if (!cachesTreeElement.childCount()) { + TestRunner.addResult(' (empty)'); + return; + } + + for (var i = 0; i < cachesTreeElement.childCount(); ++i) { + var cacheTreeElement = cachesTreeElement.childAt(i); + TestRunner.addResult(' cache: ' + cacheTreeElement.title); + var view = cacheTreeElement._view; + promise = TestRunner.addSnifferPromise(Resources.ServiceWorkerCacheView.prototype, '_updateDataCallback'); + + if (!view) + cacheTreeElement.onselect(false); + else + view._updateData(true); + + view = cacheTreeElement._view; + await promise; + + if (view._entries.length === 0) { + TestRunner.addResult(' (cache empty)'); + continue; + } + + var dataGrid = view._dataGrid; + + for (var node of dataGrid.rootNode().children) { + var children = Array.from(node.element().children).filter(function(element) { + return !element.classList.contains('responseTime-column'); + }); + + var entries = Array.from(children, td => td.textContent).filter(text => text); + TestRunner.addResult(' ' + entries.join(', ')); + } + } +}; + +ApplicationTestRunner.deleteCacheFromInspector = async function(cacheName, optionalEntry) { + UI.panels.resources._sidebar.cacheStorageListTreeElement.expand(); + + if (optionalEntry) + TestRunner.addResult('Deleting CacheStorage entry ' + optionalEntry + ' in cache ' + cacheName); + else + TestRunner.addResult('Deleting CacheStorage cache ' + cacheName); + + var cachesTreeElement = UI.panels.resources._sidebar.cacheStorageListTreeElement; + var promise = TestRunner.addSnifferPromise(SDK.ServiceWorkerCacheModel.prototype, '_updateCacheNames'); + UI.panels.resources._sidebar.cacheStorageListTreeElement._refreshCaches(); + await promise; + + if (!cachesTreeElement.childCount()) + throw 'Error: Could not find CacheStorage cache ' + cacheName; + + + for (var i = 0; i < cachesTreeElement.childCount(); i++) { + var cacheTreeElement = cachesTreeElement.childAt(i); + var title = cacheTreeElement.title; + var elementCacheName = title.substring(0, title.lastIndexOf(' - ')); + + if (elementCacheName !== cacheName) + continue; + + if (!optionalEntry) { + promise = TestRunner.addSnifferPromise(SDK.ServiceWorkerCacheModel.prototype, '_cacheRemoved'); + cacheTreeElement._clearCache(); + await promise; + return; + } + + promise = TestRunner.addSnifferPromise(Resources.ServiceWorkerCacheView.prototype, '_updateDataCallback'); + var view = cacheTreeElement._view; + + if (!view) + cacheTreeElement.onselect(false); + else + view._updateData(true); + + view = cacheTreeElement._view; + await promise; + var entry = view._entries.find(entry => entry.request === optionalEntry); + + if (!entry) + throw 'Error: Could not find cache entry to delete: ' + optionalEntry; + + await view._model.deleteCacheEntry(view._cache, entry.request); + return; + } + + throw 'Error: Could not find CacheStorage cache ' + cacheName; +}; + +ApplicationTestRunner.waitForCacheRefresh = function(callback) { + TestRunner.addSniffer(SDK.ServiceWorkerCacheModel.prototype, '_updateCacheNames', callback, false); +}; + +ApplicationTestRunner.createCache = function(cacheName) { + return TestRunner.callFunctionInPageAsync('createCache', [cacheName]); +}; + +ApplicationTestRunner.addCacheEntry = function(cacheName, requestUrl, responseText) { + return TestRunner.callFunctionInPageAsync('addCacheEntry', [cacheName, requestUrl, responseText]); +}; + +ApplicationTestRunner.deleteCache = function(cacheName) { + return TestRunner.callFunctionInPageAsync('deleteCache', [cacheName]); +}; + +ApplicationTestRunner.deleteCacheEntry = function(cacheName, requestUrl) { + return TestRunner.callFunctionInPageAsync('deleteCacheEntry', [cacheName, requestUrl]); +}; + +ApplicationTestRunner.clearAllCaches = function() { + return TestRunner.callFunctionInPageAsync('clearAllCaches'); +}; + +(async function() { + await TestRunner.evaluateInPagePromise(` + function onCacheStorageError(e) { + console.error('CacheStorage error: ' + e); + } + + function createCache(cacheName) { + return caches.open(cacheName).catch(onCacheStorageError); + } + + function addCacheEntry(cacheName, requestUrl, responseText) { + return caches.open(cacheName).then(function(cache) { + var request = new Request(requestUrl); + var myBlob = new Blob(); + + var init = { + 'status': 200, + 'statusText': responseText + }; + + var response = new Response(myBlob, init); + return cache.put(request, response); + }).catch(onCacheStorageError); + } + + function deleteCache(cacheName) { + return caches.delete(cacheName).then(function(success) { + if (!success) + onCacheStorageError('Could not find cache ' + cacheName); + }).catch(onCacheStorageError); + } + + function deleteCacheEntry(cacheName, requestUrl) { + return caches.open(cacheName).then(cache => cache.delete(new Request(requestUrl))).catch(onCacheStorageError); + } + + function clearAllCaches() { + return caches.keys().then(keys => Promise.all(keys.map(key => caches.delete(key)))).catch(onCacheStorageError.bind(this, undefined)); + } + `); +})();
diff --git a/third_party/WebKit/Source/devtools/front_end/application_test_runner/IndexedDBTestRunner.js b/third_party/WebKit/Source/devtools/front_end/application_test_runner/IndexedDBTestRunner.js new file mode 100644 index 0000000..696bf91 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/application_test_runner/IndexedDBTestRunner.js
@@ -0,0 +1,356 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +ApplicationTestRunner.dumpIndexedDBTree = function() { + TestRunner.addResult('Dumping IndexedDB tree:'); + var indexedDBTreeElement = UI.panels.resources._sidebar.indexedDBListTreeElement; + + if (!indexedDBTreeElement.childCount()) { + TestRunner.addResult(' (empty)'); + return; + } + + for (var i = 0; i < indexedDBTreeElement.childCount(); ++i) { + var databaseTreeElement = indexedDBTreeElement.childAt(i); + TestRunner.addResult(' database: ' + databaseTreeElement.title); + + if (!databaseTreeElement.childCount()) { + TestRunner.addResult(' (no object stores)'); + continue; + } + + for (var j = 0; j < databaseTreeElement.childCount(); ++j) { + var objectStoreTreeElement = databaseTreeElement.childAt(j); + TestRunner.addResult(' Object store: ' + objectStoreTreeElement.title); + + if (!objectStoreTreeElement.childCount()) { + TestRunner.addResult(' (no indexes)'); + continue; + } + + for (var k = 0; k < objectStoreTreeElement.childCount(); ++k) { + var indexTreeElement = objectStoreTreeElement.childAt(k); + TestRunner.addResult(' Index: ' + indexTreeElement.title); + } + } + } +}; + +var lastCallbackId = 0; +var callbacks = {}; +var callbackIdPrefix = 'InspectorTest.IndexedDB_callback'; + +ApplicationTestRunner.evaluateWithCallback = function(frameId, methodName, parameters, callback) { + ApplicationTestRunner._installIndexedDBSniffer(); + var callbackId = ++lastCallbackId; + callbacks[callbackId] = callback; + var parametersString = 'dispatchCallback.bind(this, "' + callbackIdPrefix + callbackId + '")'; + + for (var i = 0; i < parameters.length; ++i) + parametersString += ', ' + JSON.stringify(parameters[i]); + + var requestString = methodName + '(' + parametersString + ')'; + TestRunner.evaluateInPage(requestString); +}; + +ApplicationTestRunner._installIndexedDBSniffer = function() { + ConsoleTestRunner.addConsoleSniffer(consoleMessageOverride, false); + + function consoleMessageOverride(msg) { + var text = msg.messageText; + + if (!text.startsWith(callbackIdPrefix)) { + ConsoleTestRunner.addConsoleSniffer(consoleMessageOverride, false); + return; + } + + var callbackId = text.substring(callbackIdPrefix.length); + callbacks[callbackId].call(); + delete callbacks[callbackId]; + } +}; + +ApplicationTestRunner.createDatabase = function(frameId, databaseName, callback) { + ApplicationTestRunner.evaluateWithCallback(frameId, 'createDatabase', [databaseName], callback); +}; + +ApplicationTestRunner.deleteDatabase = function(frameId, databaseName, callback) { + ApplicationTestRunner.evaluateWithCallback(frameId, 'deleteDatabase', [databaseName], callback); +}; + +ApplicationTestRunner.createObjectStore = function( + frameId, databaseName, objectStoreName, keyPath, autoIncrement, callback) { + ApplicationTestRunner.evaluateWithCallback( + frameId, 'createObjectStore', [databaseName, objectStoreName, keyPath, autoIncrement], callback); +}; + +ApplicationTestRunner.deleteObjectStore = function(frameId, databaseName, objectStoreName, callback) { + ApplicationTestRunner.evaluateWithCallback(frameId, 'deleteObjectStore', [databaseName, objectStoreName], callback); +}; + +ApplicationTestRunner.createObjectStoreIndex = function( + frameId, databaseName, objectStoreName, objectStoreIndexName, keyPath, unique, multiEntry, callback) { + ApplicationTestRunner.evaluateWithCallback( + frameId, 'createObjectStoreIndex', + [databaseName, objectStoreName, objectStoreIndexName, keyPath, unique, multiEntry], callback); +}; + +ApplicationTestRunner.deleteObjectStoreIndex = function( + frameId, databaseName, objectStoreName, objectStoreIndexName, callback) { + ApplicationTestRunner.evaluateWithCallback( + frameId, 'deleteObjectStoreIndex', [databaseName, objectStoreName, objectStoreIndexName], callback); +}; + +ApplicationTestRunner.addIDBValue = function(frameId, databaseName, objectStoreName, value, key, callback) { + ApplicationTestRunner.evaluateWithCallback( + frameId, 'addIDBValue', [databaseName, objectStoreName, value, key], callback); +}; + +ApplicationTestRunner.createIndexedDBModel = function() { + var indexedDBModel = new Resources.IndexedDBModel(SDK.targetManager.mainTarget(), TestRunner.securityOriginManager); + indexedDBModel.enable(); + return indexedDBModel; +}; + +ApplicationTestRunner.createDatabaseAsync = function(databaseName) { + return TestRunner.evaluateInPageAsync('createDatabaseAsync(\'' + databaseName + '\')'); +}; + +ApplicationTestRunner.createObjectStoreAsync = function(databaseName, objectStoreName, indexName, keyPath) { + return TestRunner.evaluateInPageAsync( + 'createObjectStoreAsync(\'' + databaseName + '\', \'' + objectStoreName + '\', \'' + indexName + '\', \'' + + keyPath + '\')'); +}; + +ApplicationTestRunner.addIDBValueAsync = function(databaseName, objectStoreName, key, value) { + return TestRunner.evaluateInPageAsync( + 'addIDBValueAsync(\'' + databaseName + '\', \'' + objectStoreName + '\', \'' + key + '\', \'' + value + '\')'); +}; + +(async function() { + await TestRunner.evaluateInPagePromise(` + function dispatchCallback(callbackId) { + console.log(callbackId); + } + + function onIndexedDBError(e) { + console.error('IndexedDB error: ' + e); + } + + function onIndexedDBBlocked(e) { + console.error('IndexedDB blocked: ' + e); + } + + function doWithDatabase(databaseName, callback) { + function innerCallback() { + var db = request.result; + callback(db); + } + + var request = indexedDB.open(databaseName); + request.onblocked = onIndexedDBBlocked; + request.onerror = onIndexedDBError; + request.onsuccess = innerCallback; + } + + function doWithVersionTransaction(databaseName, callback, commitCallback) { + doWithDatabase(databaseName, step2); + + function step2(db) { + var version = db.version; + db.close(); + request = indexedDB.open(databaseName, version + 1); + request.onerror = onIndexedDBError; + request.onupgradeneeded = onUpgradeNeeded; + request.onsuccess = onOpened; + + function onUpgradeNeeded(e) { + var db = e.target.result; + var trans = e.target.transaction; + callback(db, trans); + } + + function onOpened(e) { + var db = e.target.result; + db.close(); + commitCallback(); + } + } + } + + function doWithReadWriteTransaction(databaseName, objectStoreName, callback, commitCallback) { + doWithDatabase(databaseName, step2); + + function step2(db) { + var transaction = db.transaction([objectStoreName], 'readwrite'); + var objectStore = transaction.objectStore(objectStoreName); + callback(objectStore, innerCommitCallback); + + function innerCommitCallback() { + db.close(); + commitCallback(); + } + } + } + + function createDatabase(callback, databaseName) { + var request = indexedDB.open(databaseName); + request.onerror = onIndexedDBError; + request.onsuccess = closeDatabase; + + function closeDatabase() { + request.result.close(); + callback(); + } + } + + function deleteDatabase(callback, databaseName) { + var request = indexedDB.deleteDatabase(databaseName); + request.onerror = onIndexedDBError; + request.onsuccess = callback; + } + + function createObjectStore(callback, databaseName, objectStoreName, keyPath, autoIncrement) { + doWithVersionTransaction(databaseName, withTransactionCallback, callback); + + function withTransactionCallback(db, transaction) { + var store = db.createObjectStore(objectStoreName, { + keyPath: keyPath, + autoIncrement: autoIncrement + }); + } + } + + function deleteObjectStore(callback, databaseName, objectStoreName) { + doWithVersionTransaction(databaseName, withTransactionCallback, callback); + + function withTransactionCallback(db, transaction) { + var store = db.deleteObjectStore(objectStoreName); + } + } + + function createObjectStoreIndex(callback, databaseName, objectStoreName, objectStoreIndexName, keyPath, unique, multiEntry) { + doWithVersionTransaction(databaseName, withTransactionCallback, callback); + + function withTransactionCallback(db, transaction) { + var objectStore = transaction.objectStore(objectStoreName); + + objectStore.createIndex(objectStoreIndexName, keyPath, { + unique: unique, + multiEntry: multiEntry + }); + } + } + + function deleteObjectStoreIndex(callback, databaseName, objectStoreName, objectStoreIndexName) { + doWithVersionTransaction(databaseName, withTransactionCallback, callback); + + function withTransactionCallback(db, transaction) { + var objectStore = transaction.objectStore(objectStoreName); + objectStore.deleteIndex(objectStoreIndexName); + } + } + + function addIDBValue(callback, databaseName, objectStoreName, value, key) { + doWithReadWriteTransaction(databaseName, objectStoreName, withTransactionCallback, callback); + + function withTransactionCallback(objectStore, commitCallback) { + var request; + + if (key) + request = objectStore.add(value, key); + else + request = objectStore.add(value); + + request.onerror = onIndexedDBError; + request.onsuccess = commitCallback; + } + } + + function createDatabaseAsync(databaseName) { + var callback; + var promise = new Promise(fulfill => callback = fulfill); + var request = indexedDB.open(databaseName); + request.onerror = onIndexedDBError; + + request.onsuccess = function(event) { + request.result.close(); + callback(); + }; + + return promise; + } + + function createObjectStoreAsync(databaseName, objectStoreName, indexName, keyPath) { + var callback; + var promise = new Promise(fulfill => callback = fulfill); + var request = indexedDB.open(databaseName); + request.onerror = onIndexedDBError; + + request.onsuccess = function(event) { + var db = request.result; + var version = db.version; + db.close(); + var upgradeRequest = indexedDB.open(databaseName, version + 1); + upgradeRequest.onerror = onIndexedDBError; + + upgradeRequest.onupgradeneeded = function(e) { + var upgradeDb = e.target.result; + + var store = upgradeDb.createObjectStore(objectStoreName, { + keyPath: 'test', + autoIncrement: false + }); + + store.createIndex(indexName, 'test', { + unique: false, + multiEntry: false + }); + + callback(); + }; + + upgradeRequest.onsuccess = function(e) { + var upgradeDb = e.target.result; + upgradeDb.close(); + callback(); + }; + }; + + return promise; + } + + function addIDBValueAsync(databaseName, objectStoreName, key, value) { + var callback; + var promise = new Promise(fulfill => callback = fulfill); + var request = indexedDB.open(databaseName); + request.onerror = onIndexedDBError; + + request.onsuccess = function(event) { + var db = request.result; + var transaction = db.transaction(objectStoreName, 'readwrite'); + var store = transaction.objectStore(objectStoreName); + + store.put({ + test: key, + testValue: value + }); + + transaction.onerror = onIndexedDBError; + + transaction.oncomplete = function() { + db.close(); + callback(); + }; + }; + + return promise; + } + `); +})();
diff --git a/third_party/WebKit/Source/devtools/front_end/application_test_runner/ResourceTreeTestRunner.js b/third_party/WebKit/Source/devtools/front_end/application_test_runner/ResourceTreeTestRunner.js new file mode 100644 index 0000000..941d976 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/application_test_runner/ResourceTreeTestRunner.js
@@ -0,0 +1,92 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +ApplicationTestRunner.dumpResources = function(formatter) { + var results = []; + + function formatterWrapper(resource) { + if (formatter) + results.push({resource: resource, text: formatter(resource)}); + else + results.push({resource: resource, text: resource.url}); + } + + TestRunner.resourceTreeModel.forAllResources(formatterWrapper); + + function comparator(result1, result2) { + return result1.resource.url.localeCompare(result2.resource.url); + } + + results.sort(comparator); + + for (var i = 0; i < results.length; ++i) + TestRunner.addResult(results[i].text); +}; + +ApplicationTestRunner.dumpResourcesURLMap = function() { + var results = []; + TestRunner.resourceTreeModel.forAllResources(collect); + + function collect(resource) { + results.push({url: resource.url, resource: TestRunner.resourceTreeModel.resourceForURL(resource.url)}); + } + + function comparator(result1, result2) { + if (result1.url > result2.url) + return 1; + + if (result2.url > result1.url) + return -1; + + return 0; + } + + results.sort(comparator); + + for (var i = 0; i < results.length; ++i) + TestRunner.addResult(results[i].url + ' == ' + results[i].resource.url); +}; + +ApplicationTestRunner.dumpResourcesTree = function() { + function dump(treeItem, prefix) { + if (typeof treeItem._resetBubble === 'function') + treeItem._resetBubble(); + + TestRunner.addResult(prefix + treeItem.listItemElement.textContent); + treeItem.expand(); + var children = treeItem.children(); + + for (var i = 0; children && i < children.length; ++i) + dump(children[i], prefix + ' '); + } + + dump(UI.panels.resources._sidebar._resourcesSection._treeElement, ''); + + if (!ApplicationTestRunner._testSourceNavigator) { + ApplicationTestRunner._testSourceNavigator = new Sources.SourcesNavigatorView(); + ApplicationTestRunner._testSourceNavigator.show(UI.inspectorView.element); + } + + SourcesTestRunner.dumpNavigatorViewInAllModes(ApplicationTestRunner._testSourceNavigator); +}; + +ApplicationTestRunner.dumpResourceTreeEverything = function() { + function format(resource) { + return resource.resourceType().name() + ' ' + resource.url; + } + + TestRunner.addResult('Resources:'); + ApplicationTestRunner.dumpResources(format); + TestRunner.addResult(''); + TestRunner.addResult('Resources URL Map:'); + ApplicationTestRunner.dumpResourcesURLMap(); + TestRunner.addResult(''); + TestRunner.addResult('Resources Tree:'); + ApplicationTestRunner.dumpResourcesTree(); +};
diff --git a/third_party/WebKit/Source/devtools/front_end/application_test_runner/ResourcesTestRunner.js b/third_party/WebKit/Source/devtools/front_end/application_test_runner/ResourcesTestRunner.js new file mode 100644 index 0000000..7c620763 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/application_test_runner/ResourcesTestRunner.js
@@ -0,0 +1,109 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +ApplicationTestRunner.createWebSQLDatabase = function(name) { + return TestRunner.evaluateInPageAsync(`_openWebSQLDatabase("${name}")`); +}; + +ApplicationTestRunner.requestURLComparer = function(r1, r2) { + return r1.request.url.localeCompare(r2.request.url); +}; + +ApplicationTestRunner.runAfterCachedResourcesProcessed = function(callback) { + if (!TestRunner.resourceTreeModel._cachedResourcesProcessed) + TestRunner.resourceTreeModel.addEventListener(SDK.ResourceTreeModel.Events.CachedResourcesLoaded, callback); + else + callback(); +}; + +ApplicationTestRunner.runAfterResourcesAreFinished = function(resourceURLs, callback) { + var resourceURLsMap = new Set(resourceURLs); + + function checkResources() { + for (var url of resourceURLsMap) { + var resource = ApplicationTestRunner.resourceMatchingURL(url); + + if (resource) + resourceURLsMap.delete(url); + } + + if (!resourceURLsMap.size) { + TestRunner.resourceTreeModel.removeEventListener(SDK.ResourceTreeModel.Events.ResourceAdded, checkResources); + callback(); + } + } + + checkResources(); + + if (resourceURLsMap.size) + TestRunner.resourceTreeModel.addEventListener(SDK.ResourceTreeModel.Events.ResourceAdded, checkResources); +}; + +ApplicationTestRunner.showResource = function(resourceURL, callback) { + var reported = false; + + function callbackWrapper(sourceFrame) { + if (reported) + return; + + callback(sourceFrame); + reported = true; + } + + function showResourceCallback() { + var resource = ApplicationTestRunner.resourceMatchingURL(resourceURL); + + if (!resource) + return; + + UI.panels.resources.showResource(resource, 1); + var sourceFrame = UI.panels.resources._resourceViewForResource(resource); + + if (sourceFrame.loaded) + callbackWrapper(sourceFrame); + else + TestRunner.addSniffer(sourceFrame, 'onTextEditorContentSet', callbackWrapper.bind(null, sourceFrame)); + } + + ApplicationTestRunner.runAfterResourcesAreFinished([resourceURL], showResourceCallback); +}; + +ApplicationTestRunner.resourceMatchingURL = function(resourceURL) { + var result = null; + TestRunner.resourceTreeModel.forAllResources(visit); + + function visit(resource) { + if (resource.url.indexOf(resourceURL) !== -1) { + result = resource; + return true; + } + } + + return result; +}; + +ApplicationTestRunner.databaseModel = function() { + return TestRunner.mainTarget.model(Resources.DatabaseModel); +}; + +ApplicationTestRunner.domStorageModel = function() { + return TestRunner.mainTarget.model(Resources.DOMStorageModel); +}; + +ApplicationTestRunner.indexedDBModel = function() { + return TestRunner.mainTarget.model(Resources.IndexedDBModel); +}; + +(async function() { + await TestRunner.evaluateInPagePromise(` + function _openWebSQLDatabase(name) { + return new Promise(resolve => openDatabase(name, '1.0', '', 1024 * 1024, resolve)); + } + `); +})();
diff --git a/third_party/WebKit/Source/devtools/front_end/application_test_runner/ServiceWorkersTestRunner.js b/third_party/WebKit/Source/devtools/front_end/application_test_runner/ServiceWorkersTestRunner.js new file mode 100644 index 0000000..51158e46 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/application_test_runner/ServiceWorkersTestRunner.js
@@ -0,0 +1,104 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +ApplicationTestRunner.registerServiceWorker = function(script, scope) { + return TestRunner.callFunctionInPageAsync('registerServiceWorker', [script, scope]); +}; + +ApplicationTestRunner.unregisterServiceWorker = function(scope) { + return TestRunner.callFunctionInPageAsync('unregisterServiceWorker', [scope]); +}; + +ApplicationTestRunner.postToServiceWorker = function(scope, message) { + return TestRunner.evaluateInPagePromise('postToServiceWorker("' + scope + '","' + message + '")'); +}; + +ApplicationTestRunner.waitForServiceWorker = function(callback) { + function isRightTarget(target) { + return TestRunner.isDedicatedWorker(target) && TestRunner.isServiceWorker(target.parentTarget()); + } + + SDK.targetManager.observeTargets({ + targetAdded: function(target) { + if (isRightTarget(target) && callback) { + setTimeout(callback.bind(null, target), 0); + callback = null; + } + }, + + targetRemoved: function(target) {} + }); +}; + +ApplicationTestRunner.dumpServiceWorkersView = function() { + var swView = UI.panels.resources.visibleView; + + return swView._reportView._sectionList.childTextNodes() + .map(function(node) { + return node.textContent.replace(/Received.*/, 'Received').replace(/#\d+/, '#N'); + }) + .join('\n'); +}; + +ApplicationTestRunner.deleteServiceWorkerRegistration = function(scope) { + TestRunner.serviceWorkerManager.registrations().valuesArray().map(function(registration) { + if (registration.scopeURL === scope) + TestRunner.serviceWorkerManager.deleteRegistration(registration.id); + }); +}; + +ApplicationTestRunner.makeFetchInServiceWorker = function(scope, url, requestInitializer, callback) { + TestRunner.callFunctionInPageAsync('makeFetchInServiceWorker', [scope, url, requestInitializer]).then(callback); +}; + +(async function() { + await TestRunner.evaluateInPagePromise(` + var registrations = {}; + + function registerServiceWorker(script, scope) { + return navigator.serviceWorker.register(script, { + scope: scope + }).then(reg => registrations[scope] = reg); + } + + function postToServiceWorker(scope, message) { + registrations[scope].active.postMessage(message); + } + + function unregisterServiceWorker(scope) { + var registration = registrations[scope]; + + if (!registration) + return Promise.reject('ServiceWorker for ' + scope + ' is not registered'); + + return registration.unregister().then(() => delete registrations[scope]); + } + + function makeFetchInServiceWorker(scope, url, requestInitializer) { + let script = 'resources/network-fetch-worker.js'; + + return navigator.serviceWorker.register(script, { + scope: scope + }).then(registration => { + let worker = registration.installing; + + return new Promise(resolve => { + navigator.serviceWorker.onmessage = e => { + resolve(e.data); + }; + + worker.postMessage({ + url: url, + init: requestInitializer + }); + }); + }); + } + `); +})();
diff --git a/third_party/WebKit/Source/devtools/front_end/application_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/application_test_runner/module.json new file mode 100644 index 0000000..ccb40aca --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/application_test_runner/module.json
@@ -0,0 +1,26 @@ +{ + "dependencies": [ + "test_runner", + "integration_test_runner", + "resources", + "console_test_runner", + "sources", + "sources_test_runner" + ], + "scripts": [ + "AppcacheTestRunner.js", + "CacheStorageTestRunner.js", + "IndexedDBTestRunner.js", + "ResourceTreeTestRunner.js", + "ResourcesTestRunner.js", + "ServiceWorkersTestRunner.js" + ], + "skip_compilation": [ + "AppcacheTestRunner.js", + "CacheStorageTestRunner.js", + "IndexedDBTestRunner.js", + "ResourceTreeTestRunner.js", + "ResourcesTestRunner.js", + "ServiceWorkersTestRunner.js" + ] +}
diff --git a/third_party/WebKit/Source/devtools/front_end/audits_test_runner/AuditsTestRunner.js b/third_party/WebKit/Source/devtools/front_end/audits_test_runner/AuditsTestRunner.js new file mode 100644 index 0000000..649f1c40 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/audits_test_runner/AuditsTestRunner.js
@@ -0,0 +1,66 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +AuditsTestRunner.collectAuditResults = function(callback) { + UI.panels.audits.showResults(UI.panels.audits._auditResultsTreeElement.firstChild().results); + var trees = UI.panels.audits.visibleView.element.querySelectorAll('.audit-result-tree'); + + for (var i = 0; i < trees.length; ++i) { + var liElements = trees[i].shadowRoot.querySelectorAll('li'); + + for (var j = 0; j < liElements.length; ++j) { + if (liElements[j].treeElement) + liElements[j].treeElement.expand(); + } + } + + TestRunner.deprecatedRunAfterPendingDispatches(function() { + AuditsTestRunner.collectTextContent(UI.panels.audits.visibleView.element, ''); + callback(); + }); +}; + +AuditsTestRunner.launchAllAudits = function(shouldReload, callback) { + TestRunner.addSniffer(Audits.AuditController.prototype, '_auditFinishedCallback', callback); + var launcherView = UI.panels.audits._launcherView; + launcherView._selectAllClicked(true); + launcherView._auditPresentStateElement.checked = !shouldReload; + launcherView._launchButtonClicked(); +}; + +AuditsTestRunner.collectTextContent = function(element, indent) { + var nodeOutput = ''; + var child = element.shadowRoot || element.firstChild; + + var nonTextTags = {'STYLE': 1, 'SCRIPT': 1}; + + while (child) { + if (child.nodeName === 'CONTENT') { + AuditsTestRunner.collectTextContent(child.getDistributedNodes()[0], indent); + } else if (child.nodeType === Node.TEXT_NODE) { + if (!nonTextTags[child.parentElement.nodeName]) + nodeOutput += child.nodeValue.replace('​', ''); + } else if (child.nodeType === Node.ELEMENT_NODE || child.nodeType === Node.DOCUMENT_FRAGMENT_NODE) { + if (nodeOutput !== '') { + TestRunner.addResult(indent + nodeOutput); + nodeOutput = ''; + } + + if (!child.firstChild && child.classList.contains('severity')) + nodeOutput = '[' + child.className + '] '; + else + AuditsTestRunner.collectTextContent(child, indent + ' '); + } + + child = child.nextSibling; + } + + if (nodeOutput !== '') + TestRunner.addResult(indent + nodeOutput); +};
diff --git a/third_party/WebKit/Source/devtools/front_end/audits_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/audits_test_runner/module.json new file mode 100644 index 0000000..be3a2642 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/audits_test_runner/module.json
@@ -0,0 +1,13 @@ +{ + "dependencies": [ + "test_runner", + "integration_test_runner", + "audits" + ], + "scripts": [ + "AuditsTestRunner.js" + ], + "skip_compilation": [ + "AuditsTestRunner.js" + ] +}
diff --git a/third_party/WebKit/Source/devtools/front_end/bindings_test_runner/AutomappingTestRunner.js b/third_party/WebKit/Source/devtools/front_end/bindings_test_runner/AutomappingTestRunner.js new file mode 100644 index 0000000..56d89996 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/bindings_test_runner/AutomappingTestRunner.js
@@ -0,0 +1,121 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +BindingsTestRunner.addFiles = function(testFileSystem, files) { + for (var filePath in files) { + var file = files[filePath]; + testFileSystem.addFile(filePath, file.content, (file.time ? file.time.getTime() : 0)); + } +}; + +var timeOverrides; +var originalRequestMetadata; + +BindingsTestRunner.overrideNetworkModificationTime = function(urlToTime) { + if (!timeOverrides) { + timeOverrides = new Map(); + originalRequestMetadata = + TestRunner.override(Bindings.ContentProviderBasedProject.prototype, 'requestMetadata', overrideTime, true); + } + + for (var url in urlToTime) + timeOverrides.set(url, urlToTime[url]); + + function overrideTime(uiSourceCode) { + if (!timeOverrides.has(uiSourceCode.url())) + return originalRequestMetadata.call(this, uiSourceCode); + + var override = timeOverrides.get(uiSourceCode.url()); + return originalRequestMetadata.call(this, uiSourceCode).then(onOriginalMetadata.bind(null, override)); + } + + function onOriginalMetadata(timeOverride, metadata) { + if (!timeOverride && !metadata) + return null; + + return new Workspace.UISourceCodeMetadata(timeOverride, (metadata ? metadata.contentSize : null)); + } +}; + +BindingsTestRunner.AutomappingTest = function(workspace) { + this._workspace = workspace; + this._networkProject = new Bindings.ContentProviderBasedProject( + this._workspace, 'AUTOMAPPING', Workspace.projectTypes.Network, 'simple website'); + + if (workspace !== Workspace.workspace) + new Persistence.FileSystemWorkspaceBinding(Persistence.isolatedFileSystemManager, this._workspace); + + this._failedBindingsCount = 0; + this._automapping = + new Persistence.Automapping(this._workspace, this._onBindingAdded.bind(this), this._onBindingRemoved.bind(this)); + TestRunner.addSniffer(this._automapping, '_onBindingFailedForTest', this._onBindingFailed.bind(this), true); + TestRunner.addSniffer(this._automapping, '_onSweepHappenedForTest', this._onSweepHappened.bind(this), true); +}; + +BindingsTestRunner.AutomappingTest.prototype = { + removeResources: function(urls) { + for (var url of urls) + this._networkProject.removeFile(url); + }, + + addNetworkResources: function(assets) { + for (var url in assets) { + var asset = assets[url]; + var contentType = asset.contentType || Common.resourceTypes.Script; + var contentProvider = new Common.StaticContentProvider(url, contentType, Promise.resolve(asset.content)); + var metadata = + (typeof asset.content === 'string' || asset.time ? + new Workspace.UISourceCodeMetadata(asset.time, asset.content.length) : + null); + var uiSourceCode = this._networkProject.createUISourceCode(url, contentType); + this._networkProject.addUISourceCodeWithProvider(uiSourceCode, contentProvider, metadata); + } + }, + + waitUntilMappingIsStabilized: function() { + var promise = new Promise(x => this._stabilizedCallback = x); + this._checkStabilized(); + return promise; + }, + + _onSweepHappened: function() { + this._failedBindingsCount = 0; + this._checkStabilized(); + }, + + _onBindingAdded: function(binding) { + TestRunner.addResult('Binding created: ' + binding); + this._checkStabilized(); + }, + + _onBindingFailed: function() { + ++this._failedBindingsCount; + this._checkStabilized(); + }, + + _onBindingRemoved: function(binding) { + TestRunner.addResult('Binding removed: ' + binding); + this._checkStabilized(); + }, + + _checkStabilized: function() { + if (!this._stabilizedCallback || this._automapping._sweepThrottler._process) + return; + + var networkUISourceCodes = this._workspace.uiSourceCodesForProjectType(Workspace.projectTypes.Network); + var stabilized = this._failedBindingsCount + this._automapping._bindings.size === networkUISourceCodes.length; + + if (stabilized) { + TestRunner.addResult('Mapping has stabilized.'); + var callback = this._stabilizedCallback; + delete this._stabilizedCallback; + callback.call(null); + } + } +};
diff --git a/third_party/WebKit/Source/devtools/front_end/bindings_test_runner/BindingsTestRunner.js b/third_party/WebKit/Source/devtools/front_end/bindings_test_runner/BindingsTestRunner.js new file mode 100644 index 0000000..ec92bcd6 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/bindings_test_runner/BindingsTestRunner.js
@@ -0,0 +1,219 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +BindingsTestRunner.dumpWorkspace = function(previousSnapshot) { + var uiSourceCodes = Workspace.workspace.uiSourceCodes().slice(); + var urls = uiSourceCodes.map(code => code.url()); + + urls = urls.map(url => { + if (!url.startsWith('debugger://')) + return url; + + return url.replace(/VM\d+/g, 'VM[XXX]'); + }); + + urls.sort(String.caseInsensetiveComparator); + var isAdded = new Array(urls.length).fill(false); + var removedLines = []; + + if (previousSnapshot) { + var diff = Diff.Diff.lineDiff(previousSnapshot, urls); + var removedEntries = diff.filter(entry => entry[0] === Diff.Diff.Operation.Delete).map(entry => entry[1]); + removedLines = [].concat.apply([], removedEntries); + var index = 0; + + for (var entry of diff) { + if (entry[0] === Diff.Diff.Operation.Delete) + continue; + + if (entry[0] === Diff.Diff.Operation.Equal) { + index += entry[1].length; + continue; + } + + // eslint-disable-next-line no-unused-vars + for (var line of entry[1]) + isAdded[index++] = true; + } + + var addedEntries = diff.filter(entry => entry[0] === Diff.Diff.Operation.Insert).map(entry => entry[1]); + addedLines = [].concat.apply([], addedEntries); + } + + TestRunner.addResult(`Removed: ${removedLines.length} uiSourceCodes`); + + for (var url of removedLines) + TestRunner.addResult('[-] ' + url); + + TestRunner.addResult(`Workspace: ${urls.length} uiSourceCodes.`); + + for (var i = 0; i < urls.length; ++i) { + var url = urls[i]; + var prefix = (isAdded[i] ? '[+] ' : ' '); + TestRunner.addResult(prefix + url); + } + + return urls; +}; + +BindingsTestRunner.attachFrame = function(frameId, url, evalSourceURL) { + var evalSource = `(${attachFrame.toString()})('${frameId}', '${url}')`; + + if (evalSourceURL) + evalSource += '//# sourceURL=' + evalSourceURL; + + return TestRunner.evaluateInPageAsync(evalSource); + + function attachFrame(frameId, url) { + var frame = document.createElement('iframe'); + frame.src = url; + frame.id = frameId; + document.body.appendChild(frame); + return new Promise(x => frame.onload = x); + } +}; + +BindingsTestRunner.detachFrame = function(frameId, evalSourceURL) { + var evalSource = `(${detachFrame.toString()})('${frameId}')`; + + if (evalSourceURL) + evalSource += '//# sourceURL=' + evalSourceURL; + + return TestRunner.evaluateInPagePromise(evalSource); + + function detachFrame(frameId) { + var frame = document.getElementById(frameId); + frame.remove(); + } +}; + +BindingsTestRunner.navigateFrame = function(frameId, navigateURL, evalSourceURL) { + var evalSource = `(${navigateFrame.toString()})('${frameId}', '${navigateURL}')`; + + if (evalSourceURL) + evalSource += '//# sourceURL=' + evalSourceURL; + + return TestRunner.evaluateInPageAsync(evalSource); + + function navigateFrame(frameId, url) { + var frame = document.getElementById(frameId); + frame.src = url; + return new Promise(x => frame.onload = x); + } +}; + +BindingsTestRunner.attachShadowDOM = function(id, templateSelector, evalSourceURL) { + var evalSource = `(${createShadowDOM.toString()})('${id}', '${templateSelector}')`; + + if (evalSourceURL) + evalSource += '//# sourceURL=' + evalSourceURL; + + return TestRunner.evaluateInPagePromise(evalSource); + + function createShadowDOM(id, templateSelector) { + var shadowHost = document.createElement('div'); + shadowHost.setAttribute('id', id); + + let shadowRoot = shadowHost.attachShadow({mode: 'open'}); + + var t = document.querySelector(templateSelector); + var instance = t.content.cloneNode(true); + shadowRoot.appendChild(instance); + document.body.appendChild(shadowHost); + } +}; + +BindingsTestRunner.detachShadowDOM = function(id, evalSourceURL) { + var evalSource = `(${removeShadowDOM.toString()})('${id}')`; + + if (evalSourceURL) + evalSource += '//# sourceURL=' + evalSourceURL; + + return TestRunner.evaluateInPagePromise(evalSource); + + function removeShadowDOM(id) { + document.querySelector('#' + id).remove(); + } +}; + +BindingsTestRunner.waitForStyleSheetRemoved = function(urlSuffix) { + var fulfill; + var promise = new Promise(x => fulfill = x); + TestRunner.cssModel.addEventListener(SDK.CSSModel.Events.StyleSheetRemoved, onStyleSheetRemoved); + return promise; + + function onStyleSheetRemoved(event) { + var styleSheetHeader = event.data; + + if (!styleSheetHeader.resourceURL().endsWith(urlSuffix)) + return; + + TestRunner.cssModel.removeEventListener(SDK.CSSModel.Events.StyleSheetRemoved, onStyleSheetRemoved); + fulfill(); + } +}; + +TestRunner.addSniffer(Bindings.CompilerScriptMapping.prototype, '_sourceMapAttachedForTest', onSourceMap, true); +TestRunner.addSniffer(Bindings.SASSSourceMapping.prototype, '_sourceMapAttachedForTest', onSourceMap, true); +var sourceMapCallbacks = new Map(); + +function onSourceMap(sourceMap) { + for (var urlSuffix of sourceMapCallbacks.keys()) { + if (sourceMap.url().endsWith(urlSuffix)) { + var callback = sourceMapCallbacks.get(urlSuffix); + callback.call(null); + sourceMapCallbacks.delete(urlSuffix); + } + } +} + +BindingsTestRunner.waitForSourceMap = function(sourceMapURLSuffix) { + var fulfill; + var promise = new Promise(x => fulfill = x); + sourceMapCallbacks.set(sourceMapURLSuffix, fulfill); + return promise; +}; + +var locationPool = new Bindings.LiveLocationPool(); +var nameSymbol = Symbol('LiveLocationNameForTest'); +var createdSymbol = Symbol('LiveLocationCreated'); + +BindingsTestRunner.createDebuggerLiveLocation = function(name, urlSuffix, lineNumber, columnNumber) { + var script = TestRunner.debuggerModel.scripts().find(script => script.sourceURL.endsWith(urlSuffix)); + var rawLocation = TestRunner.debuggerModel.createRawLocation(script, lineNumber || 0, columnNumber || 0); + return Bindings.debuggerWorkspaceBinding.createLiveLocation( + rawLocation, updateDelegate.bind(null, name), locationPool); +}; + +BindingsTestRunner.createCSSLiveLocation = function(name, urlSuffix, lineNumber, columnNumber) { + var header = TestRunner.cssModel.styleSheetHeaders().find(header => header.resourceURL().endsWith(urlSuffix)); + var rawLocation = new SDK.CSSLocation(header, lineNumber || 0, columnNumber || 0); + return Bindings.cssWorkspaceBinding.createLiveLocation(rawLocation, updateDelegate.bind(null, name), locationPool); +}; + +function updateDelegate(name, liveLocation) { + liveLocation[nameSymbol] = name; + var hint = (liveLocation[createdSymbol] ? '[ UPDATE ]' : '[ CREATE ]'); + liveLocation[createdSymbol] = true; + BindingsTestRunner.dumpLocation(liveLocation, hint); +} + +BindingsTestRunner.dumpLocation = function(liveLocation, hint) { + hint = hint || '[ GET ]'; + var prefix = `${hint} LiveLocation-${liveLocation[nameSymbol]}: `; + var uiLocation = liveLocation.uiLocation(); + + if (!uiLocation) { + TestRunner.addResult(prefix + 'null'); + return; + } + + TestRunner.addResult( + prefix + uiLocation.uiSourceCode.url() + ':' + uiLocation.lineNumber + ':' + uiLocation.columnNumber); +};
diff --git a/third_party/WebKit/Source/devtools/front_end/bindings_test_runner/IsolatedFilesystemTestRunner.js b/third_party/WebKit/Source/devtools/front_end/bindings_test_runner/IsolatedFilesystemTestRunner.js new file mode 100644 index 0000000..6c77c419 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/bindings_test_runner/IsolatedFilesystemTestRunner.js
@@ -0,0 +1,292 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +InspectorFrontendHost.isolatedFileSystem = function(name) { + return BindingsTestRunner.TestFileSystem._instances[name]; +}; + +BindingsTestRunner.TestFileSystem = function(fileSystemPath) { + this.root = new BindingsTestRunner.TestFileSystem.Entry(this, '', true, null); + this.fileSystemPath = fileSystemPath; +}; + +BindingsTestRunner.TestFileSystem._instances = {}; + +BindingsTestRunner.TestFileSystem.prototype = { + dumpAsText: function() { + var result = []; + dfs(this.root, ''); + result[0] = this.fileSystemPath; + return result.join('\n'); + + function dfs(node, indent) { + result.push(indent + node.name); + var newIndent = indent + ' '; + + for (var child of node._children) + dfs(child, newIndent); + } + }, + + reportCreatedPromise: function() { + return new Promise(fulfill => this.reportCreated(fulfill)); + }, + + reportCreated: function(callback) { + var fileSystemPath = this.fileSystemPath; + BindingsTestRunner.TestFileSystem._instances[this.fileSystemPath] = this; + + InspectorFrontendHost.events.dispatchEventToListeners( + InspectorFrontendHostAPI.Events.FileSystemAdded, + {fileSystem: {fileSystemPath: this.fileSystemPath, fileSystemName: this.fileSystemPath}}); + + Persistence.isolatedFileSystemManager.addEventListener( + Persistence.IsolatedFileSystemManager.Events.FileSystemAdded, created); + + function created(event) { + var fileSystem = event.data; + + if (fileSystem.path() !== fileSystemPath) + return; + + Persistence.isolatedFileSystemManager.removeEventListener( + Persistence.IsolatedFileSystemManager.Events.FileSystemAdded, created); + callback(fileSystem); + } + }, + + reportRemoved: function() { + delete BindingsTestRunner.TestFileSystem._instances[this.fileSystemPath]; + InspectorFrontendHost.events.dispatchEventToListeners( + InspectorFrontendHostAPI.Events.FileSystemRemoved, this.fileSystemPath); + }, + + addFileMapping: function(urlPrefix, pathPrefix) { + var fileSystemMapping = new Persistence.FileSystemMapping(Persistence.isolatedFileSystemManager); + fileSystemMapping.addFileSystem(this.fileSystemPath); + fileSystemMapping.addFileMapping(this.fileSystemPath, urlPrefix, pathPrefix); + fileSystemMapping.dispose(); + Persistence.fileSystemMapping._loadFromSettings(); + }, + + addFile: function(path, content, lastModified) { + var pathTokens = path.split('/'); + var node = this.root; + var folders = pathTokens.slice(0, pathTokens.length - 1); + var fileName = pathTokens.peekLast(); + + for (var folder of folders) { + var dir = node._childrenMap[folder]; + + if (!dir) + dir = node.mkdir(folder); + + node = dir; + } + + var file = node.addFile(fileName, content); + + if (lastModified) + file._timestamp = lastModified; + + return file; + } +}; + +BindingsTestRunner.TestFileSystem.Entry = function(fileSystem, name, isDirectory, parent) { + this._fileSystem = fileSystem; + this.name = name; + this._children = []; + this._childrenMap = {}; + this.isDirectory = isDirectory; + this._timestamp = 1000000; + this._parent = parent; +}; + +BindingsTestRunner.TestFileSystem.Entry.prototype = { + get fullPath() { + return (this.parent ? this.parent.fullPath + '/' + this.name : ''); + }, + + remove: function(success, failure) { + this._parent._removeChild(this, success, failure); + }, + + _removeChild: function(child, success, failure) { + var index = this._children.indexOf(child); + + if (index === -1) { + failure('Failed to remove file: file not found.'); + return; + } + + var fullPath = this._fileSystem.fileSystemPath + child.fullPath; + this._children.splice(index, 1); + delete this._childrenMap[child.name]; + child.parent = null; + + InspectorFrontendHost.events.dispatchEventToListeners( + InspectorFrontendHostAPI.Events.FileSystemFilesChangedAddedRemoved, + {changed: [], added: [], removed: [fullPath]}); + + success(); + }, + + mkdir: function(name) { + var child = new BindingsTestRunner.TestFileSystem.Entry(this._fileSystem, name, true, this); + this._childrenMap[name] = child; + this._children.push(child); + child.parent = this; + return child; + }, + + addFile: function(name, content) { + var child = new BindingsTestRunner.TestFileSystem.Entry(this._fileSystem, name, false, this); + this._childrenMap[name] = child; + this._children.push(child); + child.parent = this; + + child.content = new Blob([content], {type: 'text/plain'}); + + var fullPath = this._fileSystem.fileSystemPath + child.fullPath; + + InspectorFrontendHost.events.dispatchEventToListeners( + InspectorFrontendHostAPI.Events.FileSystemFilesChangedAddedRemoved, + {changed: [], added: [fullPath], removed: []}); + + return child; + }, + + setContent: function(content) { + this.content = new Blob([content], {type: 'text/plain'}); + + this._timestamp += 1000; + var fullPath = this._fileSystem.fileSystemPath + this.fullPath; + + InspectorFrontendHost.events.dispatchEventToListeners( + InspectorFrontendHostAPI.Events.FileSystemFilesChangedAddedRemoved, + {changed: [fullPath], added: [], removed: []}); + }, + + createReader: function() { + return new BindingsTestRunner.TestFileSystem.Reader(this._children); + }, + + createWriter: function(success, failure) { + success(new BindingsTestRunner.TestFileSystem.Writer(this)); + }, + + file: function(callback) { + callback(this.content); + }, + + getDirectory: function(path, noop, callback, errorCallback) { + this.getEntry(path, noop, callback, errorCallback); + }, + + getFile: function(path, noop, callback, errorCallback) { + this.getEntry(path, noop, callback, errorCallback); + }, + + _createEntry: function(path, options, callback, errorCallback) { + var tokens = path.split('/'); + var name = tokens.pop(); + var parentEntry = this; + + for (var token of tokens) + parentEntry = parentEntry._childrenMap[token]; + + var entry = parentEntry._childrenMap[name]; + + if (entry && options.exclusive) { + errorCallback(new DOMException('File exists: ' + path, 'InvalidModificationError')); + return; + } + + if (!entry) + entry = parentEntry.addFile(name, ''); + + callback(entry); + }, + + getEntry: function(path, options, callback, errorCallback) { + if (path.startsWith('/')) + path = path.substring(1); + + if (options && options.create) { + this._createEntry(path, options, callback, errorCallback); + return; + } + + if (!path) { + callback(this); + return; + } + + var entry = this; + + for (var token of path.split('/')) + entry = entry._childrenMap[token]; + + (entry ? callback(entry) : errorCallback(new DOMException('Path not found: ' + path, 'NotFoundError'))); + }, + + getMetadata: function(success, failure) { + success({modificationTime: new Date(this._timestamp), size: (this.isDirectory ? 0 : this.content.size)}); + }, + + moveTo: function(parent, newName, callback, errorCallback) { + this._parent._children.remove(this); + delete this._parent._childrenMap[this.name]; + this._parent = parent; + this._parent._children.push(this); + this.name = newName; + this._parent._childrenMap[this.name] = this; + callback(this); + }, + + getParent: function(callback, errorCallback) { + callback(this._parent); + } +}; + +BindingsTestRunner.TestFileSystem.Reader = function(children) { + this._children = children; +}; + +BindingsTestRunner.TestFileSystem.Reader.prototype = { + readEntries: function(callback) { + var children = this._children; + this._children = []; + callback(children); + } +}; + +BindingsTestRunner.TestFileSystem.Writer = function(entry) { + this._entry = entry; + this._modificationTimesDelta = 500; +}; + +BindingsTestRunner.TestFileSystem.Writer.prototype = { + write: function(blob) { + this._entry._timestamp += this._modificationTimesDelta; + this._entry.content = blob; + + if (this.onwriteend) + this.onwriteend(); + }, + + truncate: function(num) { + this._entry._timestamp += this._modificationTimesDelta; + this._entry.content = this._entry.content.slice(0, num); + + if (this.onwriteend) + this.onwriteend(); + } +};
diff --git a/third_party/WebKit/Source/devtools/front_end/bindings_test_runner/PersistenceTestRunner.js b/third_party/WebKit/Source/devtools/front_end/bindings_test_runner/PersistenceTestRunner.js new file mode 100644 index 0000000..6ec92a4 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/bindings_test_runner/PersistenceTestRunner.js
@@ -0,0 +1,113 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +Runtime.experiments.enableForTest('persistenceValidation'); + +Persistence.PersistenceBinding.prototype.toString = function() { + var lines = [ + '{', ' network: ' + this.network.url(), ' fileSystem: ' + this.fileSystem.url(), + ' exactMatch: ' + this.exactMatch, '}' + ]; + + return lines.join('\n'); +}; + +BindingsTestRunner.waitForBinding = function(fileName) { + var uiSourceCodes = Workspace.workspace.uiSourceCodes(); + + for (var uiSourceCode of uiSourceCodes) { + var binding = Persistence.persistence.binding(uiSourceCode); + + if (!binding) + continue; + + if (uiSourceCode.name() === fileName) + return Promise.resolve(binding); + } + + return TestRunner.waitForEvent( + Persistence.Persistence.Events.BindingCreated, Persistence.persistence, + binding => binding.network.name() === fileName || binding.fileSystem.name() === fileName); +}; + +BindingsTestRunner.addFooJSFile = function(fs) { + return fs.root.mkdir('inspector') + .mkdir('persistence') + .mkdir('resources') + .addFile('foo.js', '\n\nwindow.foo = ()=>\'foo\';'); +}; + +BindingsTestRunner.forceUseDefaultMapping = function() { + Persistence.persistence._setMappingForTest((bindingCreated, bindingRemoved) => { + return new Persistence.DefaultMapping( + Workspace.workspace, Persistence.fileSystemMapping, bindingCreated, bindingRemoved); + }); +}; + +BindingsTestRunner.initializeTestMapping = function() { + var testMapping; + + Persistence.persistence._setMappingForTest((bindingCreated, bindingRemoved) => { + testMapping = new TestMapping(bindingCreated, bindingRemoved); + return testMapping; + }); + + return testMapping; +}; + +class TestMapping { + constructor(onBindingAdded, onBindingRemoved) { + this._onBindingAdded = onBindingAdded; + this._onBindingRemoved = onBindingRemoved; + this._bindings = new Set(); + } + + async addBinding(urlSuffix) { + if (this._findBinding(urlSuffix)) { + TestRunner.addResult(`FAILED TO ADD BINDING: binding already exists for ${urlSuffix}`); + TestRunner.completeTest(); + return; + } + + var networkUISourceCode = await TestRunner.waitForUISourceCode(urlSuffix, Workspace.projectTypes.Network); + var fileSystemUISourceCode = await TestRunner.waitForUISourceCode(urlSuffix, Workspace.projectTypes.FileSystem); + var binding = new Persistence.PersistenceBinding(networkUISourceCode, fileSystemUISourceCode, false); + this._bindings.add(binding); + this._onBindingAdded.call(null, binding); + } + + _findBinding(urlSuffix) { + for (var binding of this._bindings) { + if (binding.network.url().endsWith(urlSuffix)) + return binding; + } + + return null; + } + + async removeBinding(urlSuffix) { + var binding = this._findBinding(urlSuffix); + + if (!binding) { + TestRunner.addResult(`FAILED TO REMOVE BINDING: binding does not exist for ${urlSuffix}`); + TestRunner.completeTest(); + return; + } + + this._bindings.delete(binding); + this._onBindingRemoved.call(null, binding); + } + + dispose() { + for (var binding of this._bindings) + this._onBindingRemoved.call(null, binding); + + this._bindings.clear(); + } +}
diff --git a/third_party/WebKit/Source/devtools/front_end/bindings_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/bindings_test_runner/module.json new file mode 100644 index 0000000..82d789a --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/bindings_test_runner/module.json
@@ -0,0 +1,22 @@ +{ + "dependencies": [ + "test_runner", + "integration_test_runner", + "workspace", + "diff", + "bindings", + "persistence" + ], + "scripts": [ + "BindingsTestRunner.js", + "IsolatedFilesystemTestRunner.js", + "AutomappingTestRunner.js", + "PersistenceTestRunner.js" + ], + "skip_compilation": [ + "BindingsTestRunner.js", + "IsolatedFilesystemTestRunner.js", + "AutomappingTestRunner.js", + "PersistenceTestRunner.js" + ] +}
diff --git a/third_party/WebKit/Source/devtools/front_end/coverage_test_runner/CoverageTestRunner.js b/third_party/WebKit/Source/devtools/front_end/coverage_test_runner/CoverageTestRunner.js new file mode 100644 index 0000000..185834f8 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/coverage_test_runner/CoverageTestRunner.js
@@ -0,0 +1,84 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +CoverageTestRunner.startCoverage = function() { + UI.viewManager.showView('coverage'); + var coverageView = self.runtime.sharedInstance(Coverage.CoverageView); + coverageView._startRecording(); +}; + +CoverageTestRunner.stopCoverage = function() { + var coverageView = self.runtime.sharedInstance(Coverage.CoverageView); + return coverageView._stopRecording(); +}; + +CoverageTestRunner.sourceDecorated = async function(source) { + await UI.inspectorView.showPanel('sources'); + var decoratePromise = TestRunner.addSnifferPromise(Coverage.CoverageView.LineDecorator.prototype, '_innerDecorate'); + var sourceFrame = await new Promise(fulfill => SourcesTestRunner.showScriptSource(source, fulfill)); + await decoratePromise; + return sourceFrame; +}; + +CoverageTestRunner.dumpDecorations = async function(source) { + var sourceFrame = await CoverageTestRunner.sourceDecorated(source); + CoverageTestRunner.dumpDecorationsInSourceFrame(sourceFrame); +}; + +CoverageTestRunner.findCoverageNodeForURL = function(url) { + var coverageListView = self.runtime.sharedInstance(Coverage.CoverageView)._listView; + var rootNode = coverageListView._dataGrid.rootNode(); + + for (var child of rootNode.children) { + if (child._coverageInfo.url().endsWith(url)) + return child; + } + + return null; +}; + +CoverageTestRunner.dumpDecorationsInSourceFrame = function(sourceFrame) { + var markerMap = new Map([['used', '+'], ['unused', '-']]); + var codeMirror = sourceFrame.textEditor.codeMirror(); + + for (var line = 0; line < codeMirror.lineCount(); ++line) { + var text = codeMirror.getLine(line); + var markerType = ' '; + var lineInfo = codeMirror.lineInfo(line); + + if (!lineInfo) + continue; + + var gutterElement = lineInfo.gutterMarkers && lineInfo.gutterMarkers['CodeMirror-gutter-coverage']; + + if (gutterElement) { + var markerClass = /^text-editor-coverage-(\w*)-marker$/.exec(gutterElement.classList)[1]; + markerType = markerMap.get(markerClass) || gutterElement.classList; + } + + TestRunner.addResult(`${line}: ${markerType} ${text}`); + } +}; + +CoverageTestRunner.dumpCoverageListView = function() { + var coverageListView = self.runtime.sharedInstance(Coverage.CoverageView)._listView; + var dataGrid = coverageListView._dataGrid; + dataGrid.updateInstantly(); + + for (var child of dataGrid.rootNode().children) { + var data = child._coverageInfo; + var url = TestRunner.formatters.formatAsURL(data.url()); + + if (url.endsWith('-test.js') || url.endsWith('.html')) + continue; + + var type = Coverage.CoverageListView._typeToString(data.type()); + TestRunner.addResult(`${url} ${type} used: ${data.usedSize()} unused: ${data.unusedSize()} total: ${data.size()}`); + } +};
diff --git a/third_party/WebKit/Source/devtools/front_end/coverage_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/coverage_test_runner/module.json new file mode 100644 index 0000000..4f200a4 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/coverage_test_runner/module.json
@@ -0,0 +1,14 @@ +{ + "dependencies": [ + "test_runner", + "integration_test_runner", + "coverage", + "sources_test_runner" + ], + "scripts": [ + "CoverageTestRunner.js" + ], + "skip_compilation": [ + "CoverageTestRunner.js" + ] +}
diff --git a/third_party/WebKit/Source/devtools/front_end/data_grid/DataGrid.js b/third_party/WebKit/Source/devtools/front_end/data_grid/DataGrid.js index b891fc2..6500f66 100644 --- a/third_party/WebKit/Source/devtools/front_end/data_grid/DataGrid.js +++ b/third_party/WebKit/Source/devtools/front_end/data_grid/DataGrid.js
@@ -125,6 +125,23 @@ } /** + * @param {!Element} element + * @param {string} newText + * @param {boolean} longText + */ + static setElementText(element, newText, longText) { + if (longText && newText.length > 1000) { + element.textContent = newText.trimEnd(1000); + element.title = newText; + element[DataGrid.DataGrid._longTextSymbol] = newText; + } else { + element.textContent = newText; + element.title = ''; + element[DataGrid.DataGrid._longTextSymbol] = undefined; + } + } + + /** * @param {boolean} isStriped */ setStriped(isStriped) { @@ -351,6 +368,8 @@ } this._editing = true; + if (element[DataGrid.DataGrid._longTextSymbol]) + element.textContent = element[DataGrid.DataGrid._longTextSymbol]; UI.InplaceEditor.startEditing(element, this._startEditingConfig(element)); element.getComponentSelection().selectAllChildren(element); @@ -368,8 +387,7 @@ * @return {!UI.InplaceEditor.Config} */ _startEditingConfig(element) { - return new UI.InplaceEditor.Config( - this._editingCommitted.bind(this), this._editingCancelled.bind(this), element.textContent); + return new UI.InplaceEditor.Config(this._editingCommitted.bind(this), this._editingCancelled.bind(this)); } /** @@ -437,6 +455,9 @@ } } + // Show trimmed text after editing. + DataGrid.DataGrid.setElementText(element, newText, !!column.longText); + if (textBeforeEditing === newText) { this._editingCancelled(element); moveToNextIfNeeded.call(this, false); @@ -1216,6 +1237,7 @@ DataGrid.DataGrid._preferredWidthSymbol = Symbol('preferredWidth'); DataGrid.DataGrid._columnIdSymbol = Symbol('columnId'); DataGrid.DataGrid._sortIconSymbol = Symbol('sortIcon'); +DataGrid.DataGrid._longTextSymbol = Symbol('longText'); DataGrid.DataGrid.ColumnResizePadding = 24; DataGrid.DataGrid.CenterResizerOverBorderAdjustment = 3; @@ -1581,13 +1603,10 @@ var cell = this.createTD(columnId); var data = this.data[columnId]; - if (data instanceof Node) { + if (data instanceof Node) cell.appendChild(data); - } else if (data !== null) { - cell.textContent = data; - if (this.dataGrid._columns[columnId].longText) - cell.title = data; - } + else if (data !== null) + DataGrid.DataGrid.setElementText(cell, /** @type {string} */ (data), !!this.dataGrid._columns[columnId].longText); return cell; }
diff --git a/third_party/WebKit/Source/devtools/front_end/data_grid_test_runner/DataGridTestRunner.js b/third_party/WebKit/Source/devtools/front_end/data_grid_test_runner/DataGridTestRunner.js index bff22d7..ad3e492 100644 --- a/third_party/WebKit/Source/devtools/front_end/data_grid_test_runner/DataGridTestRunner.js +++ b/third_party/WebKit/Source/devtools/front_end/data_grid_test_runner/DataGridTestRunner.js
@@ -78,3 +78,43 @@ } return output.join('\n'); }; + +DataGridTestRunner.validateDataGrid = function(root) { + var children = root.children; + + for (var i = 0; i < children.length; ++i) { + var child = children[i]; + + if (child.parent !== root) + throw 'Wrong parent for child ' + child.data.id + ' of ' + root.data.id; + + if (child.nextSibling !== ((i + 1 === children.length ? null : children[i + 1]))) + throw 'Wrong child.nextSibling for ' + child.data.id + ' (' + i + ' of ' + children.length + ') '; + + if (child.previousSibling !== ((i ? children[i - 1] : null))) + throw 'Wrong child.previousSibling for ' + child.data.id + ' (' + i + ' of ' + children.length + ') '; + + if (child.parent && !child.parent._isRoot && child.depth !== root.depth + 1) + throw 'Wrong depth for ' + child.data.id + ' expected ' + (root.depth + 1) + ' but got ' + child.depth; + + DataGridTestRunner.validateDataGrid(child); + } + + var selectedNode = root.dataGrid.selectedNode; + + if (!root.parent && selectedNode) { + if (!selectedNode.selectable) + throw 'Selected node is not selectable'; + + for (var node = selectedNode; node && node !== root; node = node.parent) { + } + + if (!node) + throw 'Selected node (' + selectedNode.data.id + ') is not within the DataGrid'; + } +}; + +DataGridTestRunner.dumpAndValidateDataGrid = function(root) { + DataGridTestRunner.dumpDataGrid(root); + DataGridTestRunner.validateDataGrid(root); +};
diff --git a/third_party/WebKit/Source/devtools/front_end/data_grid_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/data_grid_test_runner/module.json index 89ab830..8a1da515 100644 --- a/third_party/WebKit/Source/devtools/front_end/data_grid_test_runner/module.json +++ b/third_party/WebKit/Source/devtools/front_end/data_grid_test_runner/module.json
@@ -5,5 +5,8 @@ ], "scripts": [ "DataGridTestRunner.js" + ], + "skip_compilation": [ + "DataGridTestRunner.js" ] }
diff --git a/third_party/WebKit/Source/devtools/front_end/device_mode_test_runner/DeviceModeTestRunner.js b/third_party/WebKit/Source/devtools/front_end/device_mode_test_runner/DeviceModeTestRunner.js new file mode 100644 index 0000000..017b5d59 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/device_mode_test_runner/DeviceModeTestRunner.js
@@ -0,0 +1,45 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +DeviceModeTestRunner.buildFakePhone = function(overrides) { + var StandardPhoneJSON = { + 'show-by-default': false, + 'title': 'Fake Phone 1', + + 'screen': { + 'horizontal': {'width': 480, 'height': 320}, + + 'device-pixel-ratio': 2, + + 'vertical': {'width': 320, 'height': 480} + }, + + 'capabilities': ['touch', 'mobile'], + 'user-agent': 'fakeUserAgent', + 'type': 'phone', + + 'modes': [ + { + 'title': 'default', + 'orientation': 'vertical', + + 'insets': {'left': 0, 'top': 0, 'right': 0, 'bottom': 0} + }, + { + 'title': 'default', + 'orientation': 'horizontal', + + 'insets': {'left': 0, 'top': 0, 'right': 0, 'bottom': 0} + } + ] + }; + + var json = Object.assign(StandardPhoneJSON, overrides || {}); + return Emulation.EmulatedDevice.fromJSONV1(json); +};
diff --git a/third_party/WebKit/Source/devtools/front_end/device_mode_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/device_mode_test_runner/module.json new file mode 100644 index 0000000..dde42c2a --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/device_mode_test_runner/module.json
@@ -0,0 +1,13 @@ +{ + "dependencies": [ + "test_runner", + "integration_test_runner", + "emulation" + ], + "scripts": [ + "DeviceModeTestRunner.js" + ], + "skip_compilation": [ + "DeviceModeTestRunner.js" + ] +}
diff --git a/third_party/WebKit/Source/devtools/front_end/elements_test_runner/EditDOMTestRunner.js b/third_party/WebKit/Source/devtools/front_end/elements_test_runner/EditDOMTestRunner.js new file mode 100644 index 0000000..e2bb707 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/elements_test_runner/EditDOMTestRunner.js
@@ -0,0 +1,76 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +ElementsTestRunner.doAddAttribute = function(testName, dataNodeId, attributeText, next) { + ElementsTestRunner.domActionTestForNodeId(testName, dataNodeId, testBody, next); + + function testBody(node, done) { + ElementsTestRunner.editNodePart(node, 'webkit-html-attribute'); + eventSender.keyDown('Tab'); + TestRunner.deprecatedRunAfterPendingDispatches(testContinuation); + + function testContinuation() { + var editorElement = UI.panels.elements._treeOutlines[0]._shadowRoot.getSelection().anchorNode.parentElement; + editorElement.textContent = attributeText; + editorElement.dispatchEvent(TestRunner.createKeyEvent('Enter')); + TestRunner.addSniffer(Elements.ElementsTreeOutline.prototype, '_updateModifiedNodes', done); + } + } +}; + +ElementsTestRunner.domActionTestForNodeId = function(testName, dataNodeId, testBody, next) { + function callback(testNode, continuation) { + ElementsTestRunner.selectNodeWithId(dataNodeId, continuation); + } + + ElementsTestRunner.domActionTest(testName, callback, testBody, next); +}; + +ElementsTestRunner.domActionTest = function(testName, dataNodeSelectionCallback, testBody, next) { + var testNode = ElementsTestRunner.expandedNodeWithId(testName); + TestRunner.addResult('==== before ===='); + ElementsTestRunner.dumpElementsTree(testNode); + dataNodeSelectionCallback(testNode, step0); + + function step0(node) { + TestRunner.deprecatedRunAfterPendingDispatches(step1.bind(null, node)); + } + + function step1(node) { + testBody(node, step2); + } + + function step2() { + TestRunner.addResult('==== after ===='); + ElementsTestRunner.dumpElementsTree(testNode); + next(); + } +}; + +ElementsTestRunner.editNodePart = function(node, className) { + var treeElement = ElementsTestRunner.firstElementsTreeOutline().findTreeElement(node); + var textElement = treeElement.listItemElement.getElementsByClassName(className)[0]; + + if (!textElement && treeElement.childrenListElement) + textElement = treeElement.childrenListElement.getElementsByClassName(className)[0]; + + treeElement._startEditingTarget(textElement); + return textElement; +}; + +ElementsTestRunner.editNodePartAndRun = function(node, className, newValue, step2, useSniffer) { + var editorElement = ElementsTestRunner.editNodePart(node, className); + editorElement.textContent = newValue; + editorElement.dispatchEvent(TestRunner.createKeyEvent('Enter')); + + if (useSniffer) + TestRunner.addSniffer(Elements.ElementsTreeOutline.prototype, '_updateModifiedNodes', step2); + else + TestRunner.deprecatedRunAfterPendingDispatches(step2); +};
diff --git a/third_party/WebKit/Source/devtools/front_end/elements_test_runner/ElementsPanelShadowSelectionOnRefreshTestRunner.js b/third_party/WebKit/Source/devtools/front_end/elements_test_runner/ElementsPanelShadowSelectionOnRefreshTestRunner.js new file mode 100644 index 0000000..ceea077 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/elements_test_runner/ElementsPanelShadowSelectionOnRefreshTestRunner.js
@@ -0,0 +1,39 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +ElementsTestRunner.selectReloadAndDump = function(next, node) { + ElementsTestRunner.selectNode(node).then(onSelected); + var reloaded = false; + var selected = false; + + function onSelected() { + TestRunner.reloadPage(onReloaded); + TestRunner.addSniffer(Elements.ElementsPanel.prototype, '_lastSelectedNodeSelectedForTest', onReSelected); + } + + function onReloaded() { + reloaded = true; + maybeDumpSelectedNode(); + } + + function onReSelected() { + selected = true; + maybeDumpSelectedNode(); + } + + function maybeDumpSelectedNode() { + if (!reloaded || !selected) + return; + + var selectedElement = ElementsTestRunner.firstElementsTreeOutline().selectedTreeElement; + var nodeName = (selectedElement ? selectedElement.node().nodeNameInCorrectCase() : 'null'); + TestRunner.addResult('Selected node: \'' + nodeName + '\''); + next(); + } +};
diff --git a/third_party/WebKit/Source/devtools/front_end/elements_test_runner/ElementsTestRunner.js b/third_party/WebKit/Source/devtools/front_end/elements_test_runner/ElementsTestRunner.js index 502cd8c..6f70ac2 100644 --- a/third_party/WebKit/Source/devtools/front_end/elements_test_runner/ElementsTestRunner.js +++ b/third_party/WebKit/Source/devtools/front_end/elements_test_runner/ElementsTestRunner.js
@@ -121,3 +121,962 @@ EventListeners.EventListenersView.prototype, '_eventListenersArrivedForTest', listenersArrived); } }; + +ElementsTestRunner.inlineStyleSection = function() { + return UI.panels.elements._stylesWidget._sectionBlocks[0].sections[0]; +}; + +ElementsTestRunner.computedStyleWidget = function() { + return UI.panels.elements._computedStyleWidget; +}; + +ElementsTestRunner.dumpComputedStyle = function(doNotAutoExpand) { + var computed = ElementsTestRunner.computedStyleWidget(); + var treeOutline = computed._propertiesOutline; + var children = treeOutline.rootElement().children(); + + for (var treeElement of children) { + var property = treeElement[Elements.ComputedStyleWidget._propertySymbol]; + + if (property.name === 'width' || property.name === 'height') + continue; + + var dumpText = ''; + dumpText += treeElement.title.querySelector('.property-name').textContent; + dumpText += ' '; + dumpText += treeElement.title.querySelector('.property-value').textContent; + TestRunner.addResult(dumpText); + + if (doNotAutoExpand && !treeElement.expanded) + continue; + + for (var trace of treeElement.children()) { + var title = trace.title; + var dumpText = ''; + + if (trace.title.classList.contains('property-trace-inactive')) + dumpText += 'OVERLOADED '; + + dumpText += title.querySelector('.property-trace-value').textContent; + dumpText += ' - '; + dumpText += title.querySelector('.property-trace-selector').textContent; + var link = title.querySelector('.trace-link'); + + if (link) + dumpText += ' ' + extractLinkText(link); + + TestRunner.addResult(' ' + dumpText); + } + } +}; + +ElementsTestRunner.findComputedPropertyWithName = function(name) { + var computed = ElementsTestRunner.computedStyleWidget(); + var treeOutline = computed._propertiesOutline; + var children = treeOutline.rootElement().children(); + + for (var treeElement of children) { + var property = treeElement[Elements.ComputedStyleWidget._propertySymbol]; + + if (property.name === name) + return treeElement; + } + + return null; +}; + +ElementsTestRunner.firstMatchedStyleSection = function() { + return UI.panels.elements._stylesWidget._sectionBlocks[0].sections[1]; +}; + +ElementsTestRunner.firstMediaTextElementInSection = function(section) { + return section.element.querySelector('.media-text'); +}; + +ElementsTestRunner.querySelector = async function(selector, callback) { + var doc = await TestRunner.domModel.requestDocumentPromise(); + var nodeId = await TestRunner.domModel.querySelector(doc.id, selector); + callback(TestRunner.domModel.nodeForId(nodeId)); +}; + +ElementsTestRunner.shadowRootByHostId = function(idValue, callback) { + function shadowRootMatches(node) { + return node.isShadowRoot() && node.parentNode.getAttribute('id') === idValue; + } + + ElementsTestRunner.findNode(shadowRootMatches, callback); +}; + +ElementsTestRunner.nodeWithClass = function(classValue, callback) { + function nodeClassMatches(node) { + var classAttr = node.getAttribute('class'); + return classAttr && classAttr.indexOf(classValue) > -1; + } + + ElementsTestRunner.findNode(nodeClassMatches, callback); +}; + +ElementsTestRunner.expandedNodeWithId = function(idValue) { + var result; + ElementsTestRunner.nodeWithId(idValue, node => result = node); + return result; +}; + +function waitForStylesRebuild(matchFunction, callback, requireRebuild) { + (function sniff(node, rebuild) { + if ((rebuild || !requireRebuild) && node && matchFunction(node)) { + callback(); + return; + } + + TestRunner.addSniffer(Elements.StylesSidebarPane.prototype, '_nodeStylesUpdatedForTest', sniff); + })(null); +} + +ElementsTestRunner.waitForStyles = function(idValue, callback, requireRebuild) { + callback = TestRunner.safeWrap(callback); + + function nodeWithId(node) { + return node.getAttribute('id') === idValue; + } + + waitForStylesRebuild(nodeWithId, callback, requireRebuild); +}; + +ElementsTestRunner.waitForStylesForClass = function(classValue, callback, requireRebuild) { + callback = TestRunner.safeWrap(callback); + + function nodeWithClass(node) { + var classAttr = node.getAttribute('class'); + return classAttr && classAttr.indexOf(classValue) > -1; + } + + waitForStylesRebuild(nodeWithClass, callback, requireRebuild); +}; + +ElementsTestRunner.waitForSelectorCommitted = function(callback) { + TestRunner.addSniffer(Elements.StylePropertiesSection.prototype, '_editingSelectorCommittedForTest', callback); +}; + +ElementsTestRunner.waitForMediaTextCommitted = function(callback) { + TestRunner.addSniffer(Elements.StylePropertiesSection.prototype, '_editingMediaTextCommittedForTest', callback); +}; + +ElementsTestRunner.waitForStyleApplied = function(callback) { + TestRunner.addSniffer(Elements.StylePropertyTreeElement.prototype, 'styleTextAppliedForTest', callback); +}; + +ElementsTestRunner.selectNodeAndWaitForStyles = function(idValue, callback) { + callback = TestRunner.safeWrap(callback); + var targetNode; + ElementsTestRunner.waitForStyles(idValue, stylesUpdated, true); + ElementsTestRunner.selectNodeWithId(idValue, nodeSelected); + + function nodeSelected(node) { + targetNode = node; + } + + function stylesUpdated() { + callback(targetNode); + } +}; + +ElementsTestRunner.selectPseudoElementAndWaitForStyles = function(parentId, pseudoType, callback) { + callback = TestRunner.safeWrap(callback); + var targetNode; + waitForStylesRebuild(isPseudoElement, stylesUpdated, true); + ElementsTestRunner.findNode(isPseudoElement, nodeFound); + + function nodeFound(node) { + targetNode = node; + Common.Revealer.reveal(node); + } + + function stylesUpdated() { + callback(targetNode); + } + + function isPseudoElement(node) { + return node.parentNode && node.parentNode.getAttribute('id') === parentId && node.pseudoType() === pseudoType; + } +}; + +ElementsTestRunner.selectNodeAndWaitForStylesWithComputed = function(idValue, callback) { + callback = TestRunner.safeWrap(callback); + ElementsTestRunner.selectNodeAndWaitForStyles(idValue, onSidebarRendered); + + function onSidebarRendered(node) { + ElementsTestRunner.computedStyleWidget().doUpdate().then(callback.bind(null, node)); + } +}; + +ElementsTestRunner.firstElementsTreeOutline = function() { + return UI.panels.elements._treeOutlines[0]; +}; + +ElementsTestRunner.filterMatchedStyles = function(text) { + var regex = (text ? new RegExp(text, 'i') : null); + TestRunner.addResult('Filtering styles by: ' + text); + UI.panels.elements._stylesWidget._onFilterChanged(regex); +}; + +ElementsTestRunner.dumpRenderedMatchedStyles = function() { + var sectionBlocks = UI.panels.elements._stylesWidget._sectionBlocks; + + for (var block of sectionBlocks) { + for (var section of block.sections) { + if (section.element.classList.contains('hidden')) + continue; + + dumpRenderedSection(section); + } + } + + function dumpRenderedSection(section) { + TestRunner.addResult(section._selectorElement.textContent + ' {'); + var rootElement = section.propertiesTreeOutline.rootElement(); + + for (var i = 0; i < rootElement.childCount(); ++i) + dumpRenderedProperty(rootElement.childAt(i)); + + TestRunner.addResult('}'); + } + + function dumpRenderedProperty(property) { + var text = new Array(4).join(' '); + text += property.nameElement.textContent; + text += ':'; + + if (property.isExpandable()) + text += (property.expanded ? 'v' : '>'); + else + text += ' '; + + text += property.valueElement.textContent; + + if (property.listItemElement.classList.contains('filter-match')) + text = 'F' + text.substring(1); + + TestRunner.addResult(text); + + if (!property.expanded) + return; + + var indent = new Array(8).join(' '); + + for (var i = 0; i < property.childCount(); ++i) { + var childProperty = property.childAt(i); + var text = indent; + text += String.sprintf('%s: %s', childProperty.nameElement.textContent, childProperty.valueElement.textContent); + + if (childProperty.listItemElement.classList.contains('filter-match')) + text = 'F' + text.substring(1); + + TestRunner.addResult(text); + } + } +}; + +ElementsTestRunner.dumpSelectedElementStyles = function( + excludeComputed, excludeMatched, omitLonghands, includeSelectorGroupMarks) { + var sectionBlocks = UI.panels.elements._stylesWidget._sectionBlocks; + + if (!excludeComputed) + ElementsTestRunner.dumpComputedStyle(); + + for (var block of sectionBlocks) { + for (var section of block.sections) { + if (section.style().parentRule && excludeMatched) + continue; + + if (section.element.previousSibling && section.element.previousSibling.className === 'sidebar-separator') { + var nodeDescription = ''; + + if (section.element.previousSibling.firstElementChild) + nodeDescription = section.element.previousSibling.firstElementChild.shadowRoot.lastChild.textContent; + + TestRunner.addResult('======== ' + section.element.previousSibling.textContent + nodeDescription + ' ========'); + } + + printStyleSection(section, omitLonghands, includeSelectorGroupMarks); + } + } +}; + +function printStyleSection(section, omitLonghands, includeSelectorGroupMarks) { + if (!section) + return; + + TestRunner.addResult( + '[expanded] ' + ((section.propertiesTreeOutline.element.classList.contains('no-affect') ? '[no-affect] ' : ''))); + var medias = section._titleElement.querySelectorAll('.media-list .media'); + + for (var i = 0; i < medias.length; ++i) { + var media = medias[i]; + TestRunner.addResult(media.textContent); + } + + var selector = + section._titleElement.querySelector('.selector') || section._titleElement.querySelector('.keyframe-key'); + var selectorText = (includeSelectorGroupMarks ? buildMarkedSelectors(selector) : selector.textContent); + selectorText += selector.nextSibling.textContent; + var anchor = section._titleElement.querySelector('.styles-section-subtitle'); + + if (anchor) { + var anchorText = extractLinkText(anchor); + selectorText += String.sprintf(' (%s)', anchorText); + } + + TestRunner.addResult(selectorText); + ElementsTestRunner.dumpStyleTreeOutline(section.propertiesTreeOutline, (omitLonghands ? 1 : 2)); + TestRunner.addResult(''); +} + +function extractLinkText(element) { + var anchor = element.querySelector('.devtools-link'); + + if (!anchor) + return element.textContent; + + var anchorText = anchor.textContent; + var info = Components.Linkifier._linkInfo(anchor); + var uiLocation = info && info.uiLocation; + var anchorTarget = + (uiLocation ? + uiLocation.uiSourceCode.name() + ':' + (uiLocation.lineNumber + 1) + ':' + (uiLocation.columnNumber + 1) : + ''); + return anchorText + ' -> ' + anchorTarget; +} + +function buildMarkedSelectors(element) { + var result = ''; + + for (var node = element.firstChild; node; node = node.nextSibling) { + if (node.nodeType === Node.ELEMENT_NODE && node.classList.contains('selector-matches')) + result += '[$' + node.textContent + '$]'; + else + result += node.textContent; + } + + return result; +} + +ElementsTestRunner.toggleStyleProperty = function(propertyName, checked) { + var treeItem = ElementsTestRunner.getElementStylePropertyTreeItem(propertyName); + + treeItem._toggleEnabled({ + target: {checked: checked}, + + consume: function() {} + }); +}; + +ElementsTestRunner.toggleMatchedStyleProperty = function(propertyName, checked) { + var treeItem = ElementsTestRunner.getMatchedStylePropertyTreeItem(propertyName); + + treeItem._toggleEnabled({ + target: {checked: checked}, + + consume: function() {} + }); +}; + +ElementsTestRunner.eventListenersWidget = function() { + UI.viewManager.showView('elements.eventListeners'); + return self.runtime.sharedInstance(Elements.EventListenersWidget); +}; + +ElementsTestRunner.showEventListenersWidget = function() { + return UI.viewManager.showView('elements.eventListeners'); +}; + +ElementsTestRunner.expandAndDumpSelectedElementEventListeners = function(callback, force) { + ElementsTestRunner.expandAndDumpEventListeners( + ElementsTestRunner.eventListenersWidget()._eventListenersView, callback, force); +}; + +ElementsTestRunner.removeFirstEventListener = function() { + var treeOutline = ElementsTestRunner.eventListenersWidget()._eventListenersView._treeOutline; + var listenerTypes = treeOutline.rootElement().children(); + + for (var i = 0; i < listenerTypes.length; i++) { + var listeners = listenerTypes[i].children(); + + if (listeners.length && !listenerTypes[i].hidden) { + listeners[0].eventListener().remove(); + listeners[0]._removeListenerBar(); + break; + } + } +}; + +ElementsTestRunner.dumpObjectPropertySectionDeep = function(section) { + function domNodeToString(node) { + if (node) + return '\'' + node.textContent + '\''; + else + return 'null'; + } + + function dumpTreeElementRecursively(treeElement, prefix) { + if ('nameElement' in treeElement) { + TestRunner.addResult( + prefix + domNodeToString(treeElement.nameElement) + ' => ' + domNodeToString(treeElement.valueElement)); + } else { + TestRunner.addResult(prefix + treeElement.title); + } + + for (var i = 0; i < treeElement.childCount(); i++) + dumpTreeElementRecursively(treeElement.childAt(i), prefix + ' '); + } + + var childNodes = section.propertiesTreeOutline.rootElement().children(); + + for (var i = 0; i < childNodes.length; i++) + dumpTreeElementRecursively(childNodes[i], ''); + +}; + +ElementsTestRunner.getElementStylePropertyTreeItem = function(propertyName) { + return ElementsTestRunner.getFirstPropertyTreeItemForSection(ElementsTestRunner.inlineStyleSection(), propertyName); +}; + +ElementsTestRunner.getMatchedStylePropertyTreeItem = function(propertyName) { + var sectionBlocks = UI.panels.elements._stylesWidget._sectionBlocks; + + for (var block of sectionBlocks) { + for (var section of block.sections) { + var treeItem = ElementsTestRunner.getFirstPropertyTreeItemForSection(section, propertyName); + + if (treeItem) + return treeItem; + } + } + + return null; +}; + +ElementsTestRunner.getFirstPropertyTreeItemForSection = function(section, propertyName) { + var outline = section.propertiesTreeOutline.rootElement(); + + for (var i = 0; i < outline.childCount(); ++i) { + var treeItem = outline.childAt(i); + + if (treeItem.name === propertyName) + return treeItem; + } + + return null; +}; + +ElementsTestRunner.dumpStyleTreeOutline = function(treeItem, depth) { + var children = treeItem.rootElement().children(); + + for (var i = 0; i < children.length; ++i) + ElementsTestRunner.dumpStyleTreeItem(children[i], '', depth || 2); +}; + +ElementsTestRunner.dumpStyleTreeItem = function(treeItem, prefix, depth) { + if (treeItem.listItemElement.textContent.indexOf(' width:') !== -1 || + treeItem.listItemElement.textContent.indexOf(' height:') !== -1) + return; + + if (treeItem.listItemElement.classList.contains('inherited')) + return; + + var typePrefix = ''; + + if (treeItem.listItemElement.classList.contains('overloaded') || + treeItem.listItemElement.classList.contains('inactive') || + treeItem.listItemElement.classList.contains('not-parsed-ok')) + typePrefix += '/-- overloaded --/ '; + + if (treeItem.listItemElement.classList.contains('disabled')) + typePrefix += '/-- disabled --/ '; + + var textContent = treeItem.listItemElement.textContent; + TestRunner.addResult(prefix + typePrefix + textContent); + + if (--depth) { + treeItem.expand(); + var children = treeItem.children(); + + for (var i = 0; children && i < children.length; ++i) + ElementsTestRunner.dumpStyleTreeItem(children[i], prefix + ' ', depth); + } +}; + +ElementsTestRunner.dumpElementsTree = function(rootNode, depth, resultsArray) { + function beautify(element) { + return element.innerText.replace(/\u200b/g, '').replace(/\n/g, '\\n').trim(); + } + + function dumpMap(name, map) { + var result = []; + + for (var id of map.keys()) + result.push(id + '=' + map.get(id)); + + if (!result.length) + return ''; + + return name + ':[' + result.join(',') + ']'; + } + + function markersDataDump(treeItem) { + if (treeItem._elementCloseTag) + return ''; + + var markers = ''; + var node = treeItem._node; + + if (node) { + markers += dumpMap('markers', node._markers); + var dump = (node._subtreeMarkerCount ? 'subtreeMarkerCount:' + node._subtreeMarkerCount : ''); + + if (dump) { + if (markers) + markers += ', '; + + markers += dump; + } + + if (markers) + markers = ' [' + markers + ']'; + } + + return markers; + } + + function print(treeItem, prefix, depth) { + if (!treeItem.root) { + var expander; + + if (treeItem.isExpandable()) { + if (treeItem.expanded) + expander = '- '; + else + expander = '+ '; + } else { + expander = ' '; + } + + var markers = markersDataDump(treeItem); + var value = prefix + expander + beautify(treeItem.listItemElement) + markers; + + if (treeItem.shadowHostToolbar) { + value = prefix + expander + 'shadow-root '; + + for (var i = 0; i < treeItem.shadowHostToolbar.children.length; ++i) { + var button = treeItem.shadowHostToolbar.children[i]; + var toggled = button.disabled; + var name = ((toggled ? '<' : '')) + button.textContent + ((toggled ? '>' : '')); + value += name + ' '; + } + } + + if (resultsArray) + resultsArray.push(value); + else + TestRunner.addResult(value); + } + + if (!treeItem.expanded) + return; + + var children = treeItem.children(); + var newPrefix = (treeItem.root ? '' : prefix + ' '); + + for (var i = 0; depth && children && i < children.length; ++i) { + if (!children[i]._elementCloseTag) + print(children[i], newPrefix, depth - 1); + else + print(children[i], prefix, depth); + } + } + + var treeOutline = ElementsTestRunner.firstElementsTreeOutline(); + treeOutline.runPendingUpdates(); + print((rootNode ? treeOutline.findTreeElement(rootNode) : treeOutline.rootElement()), '', depth || 10000); +}; + +ElementsTestRunner.dumpDOMUpdateHighlights = function(rootNode, callback, depth) { + var hasHighlights = false; + TestRunner.addSniffer(Elements.ElementsTreeOutline.prototype, '_updateModifiedNodes', didUpdate); + + function didUpdate() { + var treeOutline = ElementsTestRunner.firstElementsTreeOutline(); + print((rootNode ? treeOutline.findTreeElement(rootNode) : treeOutline.rootElement()), '', depth || 10000); + + if (!hasHighlights) + TestRunner.addResult('<No highlights>'); + + if (callback) + callback(); + } + + function print(treeItem, prefix, depth) { + if (!treeItem.root) { + var elementXPath = Components.DOMPresentationUtils.xPath(treeItem.node(), true); + var highlightedElements = treeItem.listItemElement.querySelectorAll('.dom-update-highlight'); + + for (var i = 0; i < highlightedElements.length; ++i) { + var element = highlightedElements[i]; + var classList = element.classList; + var xpath = elementXPath; + + if (classList.contains('webkit-html-attribute-name')) { + xpath += '/@' + element.textContent + ' (empty)'; + } else if (classList.contains('webkit-html-attribute-value')) { + name = element.parentElement.querySelector('.webkit-html-attribute-name').textContent; + xpath += '/@' + name + ' ' + element.textContent; + } else if (classList.contains('webkit-html-text-node')) { + xpath += '/text() "' + element.textContent + '"'; + } + + TestRunner.addResult(prefix + xpath); + hasHighlights = true; + } + } + + if (!treeItem.expanded) + return; + + var children = treeItem.children(); + var newPrefix = (treeItem.root ? '' : prefix + ' '); + + for (var i = 0; depth && children && i < children.length; ++i) { + if (!children[i]._elementCloseTag) + print(children[i], newPrefix, depth - 1); + } + } +}; + +ElementsTestRunner.expandElementsTree = function(callback) { + var expandedSomething = false; + callback = TestRunner.safeWrap(callback); + + function expand(treeItem) { + var children = treeItem.children(); + + for (var i = 0; children && i < children.length; ++i) { + var child = children[i]; + + if (child.isExpandable() && !child.expanded) { + child.expand(); + expandedSomething = true; + } + + expand(child); + } + } + + function onAllNodesAvailable() { + ElementsTestRunner.firstElementsTreeOutline().runPendingUpdates(); + expand(ElementsTestRunner.firstElementsTreeOutline().rootElement()); + setTimeout(callback.bind(null, expandedSomething)); + } + + ElementsTestRunner.findNode(function() { + return false; + }, onAllNodesAvailable); +}; + +ElementsTestRunner.dumpDOMAgentTree = function(node) { + if (!TestRunner.domModel._document) + return; + + function dump(node, prefix) { + TestRunner.addResult(prefix + node.nodeName()); + prefix = prefix + ' '; + + if (node.templateContent()) + dump(node.templateContent(), prefix); + + if (node.importedDocument()) + dump(node.importedDocument(), prefix); + + var shadowRoots = node.shadowRoots(); + + for (var i = 0; i < shadowRoots.length; ++i) + dump(shadowRoots[i], prefix); + + var children = node.children(); + + for (var i = 0; children && i < children.length; ++i) + dump(children[i], prefix); + } + + dump(node, ''); +}; + +ElementsTestRunner.rangeText = function(range) { + if (!range) + return '[undefined-undefined]'; + + return '[' + range.startLine + ':' + range.startColumn + '-' + range.endLine + ':' + range.endColumn + ']'; +}; + +ElementsTestRunner.generateUndoTest = function(testBody) { + function result(next) { + var testNode = ElementsTestRunner.expandedNodeWithId(/function\s([^(]*)/.exec(testBody)[1]); + TestRunner.addResult('Initial:'); + ElementsTestRunner.dumpElementsTree(testNode); + testBody(undo); + + function undo() { + TestRunner.addResult('Post-action:'); + ElementsTestRunner.dumpElementsTree(testNode); + ElementsTestRunner.expandElementsTree(expandedCallback); + + function expandedCallback(expandedSomething) { + if (expandedSomething) { + TestRunner.addResult('== Expanded: =='); + ElementsTestRunner.dumpElementsTree(testNode); + } + + TestRunner.domModel.undo().then(redo); + } + } + + function redo() { + TestRunner.addResult('Post-undo (initial):'); + ElementsTestRunner.dumpElementsTree(testNode); + ElementsTestRunner.expandElementsTree(expandedCallback); + + function expandedCallback(expandedSomething) { + if (expandedSomething) { + TestRunner.addResult('== Expanded: =='); + ElementsTestRunner.dumpElementsTree(testNode); + } + + TestRunner.domModel.redo().then(done); + } + } + + function done() { + TestRunner.addResult('Post-redo (action):'); + ElementsTestRunner.dumpElementsTree(testNode); + ElementsTestRunner.expandElementsTree(expandedCallback); + + function expandedCallback(expandedSomething) { + if (expandedSomething) { + TestRunner.addResult('== Expanded: =='); + ElementsTestRunner.dumpElementsTree(testNode); + } + + next(); + } + } + } + + result.toString = function() { + return testBody.toString(); + }; + + return result; +}; + +const indent = ' '; + +ElementsTestRunner.dumpRulesArray = function(rules, currentIndent) { + if (!rules) + return; + + currentIndent = currentIndent || ''; + + for (var i = 0; i < rules.length; ++i) + ElementsTestRunner.dumpRule(rules[i], currentIndent); +}; + +ElementsTestRunner.dumpRuleMatchesArray = function(matches, currentIndent) { + if (!matches) + return; + + currentIndent = currentIndent || ''; + + for (var i = 0; i < matches.length; ++i) + ElementsTestRunner.dumpRule(matches[i].rule, currentIndent); +}; + +ElementsTestRunner.dumpRule = function(rule, currentIndent) { + function selectorRange() { + var selectors = rule.selectorList.selectors; + + if (!selectors || !selectors[0].range) + return ''; + + var ranges = []; + + for (var i = 0; i < selectors.length; ++i) { + var range = selectors[i].range; + ranges.push(range.startLine + ':' + range.startColumn + '-' + range.endLine + ':' + range.endColumn); + } + + return ', ' + ranges.join('; '); + } + + currentIndent = currentIndent || ''; + + if (!rule.type || rule.type === 'style') { + TestRunner.addResult(currentIndent + rule.selectorList.text + ': [' + rule.origin + selectorRange() + '] {'); + ElementsTestRunner.dumpStyle(rule.style, currentIndent + indent); + TestRunner.addResult(currentIndent + '}'); + return; + } + + if (rule.type === 'media') { + TestRunner.addResult(currentIndent + '@media ' + rule.mediaText + ' {'); + ElementsTestRunner.dumpRulesArray(rule.childRules, currentIndent + indent); + TestRunner.addResult(currentIndent + '}'); + return; + } + + if (rule.type === 'import') { + TestRunner.addResult( + currentIndent + '@import: header=' + ElementsTestRunner.rangeText(rule.headerRange) + + ', body=' + ElementsTestRunner.rangeText(rule.bodyRange)); + + return; + } + + if (rule.type === 'page' || rule.type === 'font-face') { + if (rule.type === 'page') { + TestRunner.addResult(currentIndent + rule.selectorList.text + ' {'); + } else { + TestRunner.addResult( + currentIndent + '@' + rule.type + ' ' + ((rule.selectorList.text ? rule.selectorList.text + ' ' : '')) + '{'); + } + + ElementsTestRunner.dumpStyle(rule.style, currentIndent + indent); + TestRunner.addResult(currentIndent + '}'); + return; + } + + if (rule.type === 'charset') { + TestRunner.addResult('@charset'); + return; + } + + TestRunner.addResult( + currentIndent + '[UNKNOWN RULE]: header=' + ElementsTestRunner.rangeText(rule.headerRange) + + ', body=' + ElementsTestRunner.rangeText(rule.bodyRange)); +}; + +ElementsTestRunner.dumpStyle = function(style, currentIndent) { + currentIndent = currentIndent || ''; + + if (!style) { + TestRunner.addResult(currentIndent + '[NO STYLE]'); + return; + } + + for (var i = 0; i < style.cssProperties.length; ++i) { + var property = style.cssProperties[i]; + + if (!property.disabled) { + TestRunner.addResult( + currentIndent + '[\'' + property.name + '\':\'' + property.value + '\'' + + ((property.important ? ' is-important' : '')) + (('parsedOk' in property ? ' non-parsed' : '')) + '] @' + + ElementsTestRunner.rangeText(property.range) + ' '); + } else { + TestRunner.addResult(currentIndent + '[text=\'' + property.text + '\'] disabled'); + } + } +}; + +ElementsTestRunner.dumpCSSStyleDeclaration = function(style, currentIndent) { + currentIndent = currentIndent || ''; + + if (!style) { + TestRunner.addResult(currentIndent + '[NO STYLE]'); + return; + } + + var properties = style.allProperties(); + + for (var i = 0; i < properties.length; ++i) { + var property = properties[i]; + + if (!property.disabled) { + TestRunner.addResult( + currentIndent + '[\'' + property.name + '\':\'' + property.value + '\'' + + ((property.important ? ' is-important' : '')) + ((!property['parsedOk'] ? ' non-parsed' : '')) + '] @' + + ElementsTestRunner.rangeText(property.range) + ' '); + } else { + TestRunner.addResult(currentIndent + '[text=\'' + property.text + '\'] disabled'); + } + } +}; + +ElementsTestRunner.dumpBreadcrumb = function(message) { + if (message) + TestRunner.addResult(message + ':'); + + var result = []; + var crumbs = UI.panels.elements._breadcrumbs.crumbsElement; + var crumb = crumbs.lastChild; + + while (crumb) { + result.unshift(crumb.textContent); + crumb = crumb.previousSibling; + } + + TestRunner.addResult(result.join(' > ')); +}; + +ElementsTestRunner.matchingSelectors = function(matchedStyles, rule) { + var selectors = []; + var matchingSelectors = matchedStyles.matchingSelectors(rule); + + for (var i = 0; i < matchingSelectors.length; ++i) + selectors.push(rule.selectors[matchingSelectors[i]].text); + + return '[' + selectors.join(', ') + ']'; +}; + +ElementsTestRunner.addNewRuleInStyleSheet = function(styleSheetHeader, selector, callback) { + TestRunner.addSniffer( + Elements.StylesSidebarPane.prototype, '_addBlankSection', onBlankSection.bind(null, selector, callback)); + UI.panels.elements._stylesWidget._createNewRuleInStyleSheet(styleSheetHeader); +}; + +ElementsTestRunner.addNewRule = function(selector, callback) { + UI.panels.elements._stylesWidget.contentElement.querySelector('.styles-pane-toolbar') + .shadowRoot.querySelector('.largeicon-add') + .click(); + TestRunner.addSniffer( + Elements.StylesSidebarPane.prototype, '_addBlankSection', onBlankSection.bind(null, selector, callback)); +}; + +function onBlankSection(selector, callback) { + var section = ElementsTestRunner.firstMatchedStyleSection(); + + if (typeof selector === 'string') + section._selectorElement.textContent = selector; + + section._selectorElement.dispatchEvent(TestRunner.createKeyEvent('Enter')); + ElementsTestRunner.waitForSelectorCommitted(callback.bind(null, section)); +} + +ElementsTestRunner.dumpInspectorHighlightJSON = function(idValue, callback) { + ElementsTestRunner.nodeWithId(idValue, nodeResolved); + + async function nodeResolved(node) { + var result = await TestRunner.OverlayAgent.getHighlightObjectForTest(node.id); + TestRunner.addResult(idValue + JSON.stringify(result, null, 2)); + callback(); + } +}; + +ElementsTestRunner.waitForAnimationAdded = function(callback) { + TestRunner.addSniffer(Animation.AnimationTimeline.prototype, '_addAnimationGroup', callback); +}; + +ElementsTestRunner.dumpAnimationTimeline = function(timeline) { + for (var ui of timeline._uiAnimations) { + TestRunner.addResult(ui.animation().type()); + TestRunner.addResult(ui._nameElement.innerHTML); + TestRunner.addResult(ui._svg.innerHTML); + } +};
diff --git a/third_party/WebKit/Source/devtools/front_end/elements_test_runner/SetOuterHTMLTestRunner.js b/third_party/WebKit/Source/devtools/front_end/elements_test_runner/SetOuterHTMLTestRunner.js new file mode 100644 index 0000000..abdc7e7 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/elements_test_runner/SetOuterHTMLTestRunner.js
@@ -0,0 +1,109 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +ElementsTestRunner.events = []; +ElementsTestRunner.containerId; + +ElementsTestRunner.setUpTestSuite = function(next) { + ElementsTestRunner.expandElementsTree(step1); + + function step1() { + ElementsTestRunner.selectNodeWithId('container', step2); + } + + function step2(node) { + ElementsTestRunner.containerId = node.id; + TestRunner.DOMAgent.getOuterHTML(ElementsTestRunner.containerId).then(step3); + } + + function step3(text) { + ElementsTestRunner.containerText = text; + + for (var key in SDK.DOMModel.Events) { + var eventName = SDK.DOMModel.Events[key]; + + if (eventName === SDK.DOMModel.Events.MarkersChanged || eventName === SDK.DOMModel.Events.DOMMutated) + continue; + + TestRunner.domModel.addEventListener( + eventName, ElementsTestRunner.recordEvent.bind(ElementsTestRunner, eventName)); + } + + next(); + } +}; + +ElementsTestRunner.recordEvent = function(eventName, event) { + if (!event.data) + return; + + var node = event.data.node || event.data; + var parent = event.data.parent; + + for (var currentNode = parent || node; currentNode; currentNode = currentNode.parentNode) { + if (currentNode.getAttribute('id') === 'output') + return; + } + + ElementsTestRunner.events.push('Event ' + eventName.toString() + ': ' + node.nodeName()); +}; + +ElementsTestRunner.patchOuterHTML = function(pattern, replacement, next) { + TestRunner.addResult('Replacing \'' + pattern + '\' with \'' + replacement + '\'\n'); + ElementsTestRunner.setOuterHTML(ElementsTestRunner.containerText.replace(pattern, replacement), next); +}; + +ElementsTestRunner.patchOuterHTMLUseUndo = function(pattern, replacement, next) { + TestRunner.addResult('Replacing \'' + pattern + '\' with \'' + replacement + '\'\n'); + ElementsTestRunner.setOuterHTMLUseUndo(ElementsTestRunner.containerText.replace(pattern, replacement), next); +}; + +ElementsTestRunner.setOuterHTML = function(newText, next) { + ElementsTestRunner.innerSetOuterHTML(newText, false, bringBack); + + function bringBack() { + TestRunner.addResult('\nBringing things back\n'); + ElementsTestRunner.innerSetOuterHTML(ElementsTestRunner.containerText, true, next); + } +}; + +ElementsTestRunner.setOuterHTMLUseUndo = function(newText, next) { + ElementsTestRunner.innerSetOuterHTML(newText, false, bringBack); + + async function bringBack() { + TestRunner.addResult('\nBringing things back\n'); + await TestRunner.domModel.undo(); + ElementsTestRunner._dumpOuterHTML(true, next); + } +}; + +ElementsTestRunner.innerSetOuterHTML = async function(newText, last, next) { + await TestRunner.DOMAgent.setOuterHTML(ElementsTestRunner.containerId, newText); + ElementsTestRunner._dumpOuterHTML(last, next); +}; + +ElementsTestRunner._dumpOuterHTML = async function(last, next) { + var result = await TestRunner.RuntimeAgent.evaluate('document.getElementById("identity").wrapperIdentity'); + TestRunner.addResult('Wrapper identity: ' + result.value); + ElementsTestRunner.events.sort(); + + for (var i = 0; i < ElementsTestRunner.events.length; ++i) + TestRunner.addResult(ElementsTestRunner.events[i]); + + ElementsTestRunner.events = []; + var text = await TestRunner.DOMAgent.getOuterHTML(ElementsTestRunner.containerId); + TestRunner.addResult('==========8<=========='); + TestRunner.addResult(text); + TestRunner.addResult('==========>8=========='); + + if (last) + TestRunner.addResult('\n\n\n'); + + next(); +};
diff --git a/third_party/WebKit/Source/devtools/front_end/elements_test_runner/StylesUpdateLinksTestRunner.js b/third_party/WebKit/Source/devtools/front_end/elements_test_runner/StylesUpdateLinksTestRunner.js new file mode 100644 index 0000000..a48b193 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/elements_test_runner/StylesUpdateLinksTestRunner.js
@@ -0,0 +1,129 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +function flattenRuleRanges(rule) { + var ranges = []; + var medias = rule.media || []; + + for (var i = 0; i < medias.length; ++i) { + var media = medias[i]; + + if (!media.range) + continue; + + ranges.push({range: media.range, name: 'media #' + i}); + } + + for (var i = 0; i < rule.selectors.length; ++i) { + var selector = rule.selectors[i]; + + if (!selector.range) + continue; + + ranges.push({range: selector.range, name: 'selector #' + i}); + } + + if (rule.style.range) + ranges.push({range: rule.style.range, name: 'style range'}); + + + var properties = rule.style.allProperties(); + + for (var i = 0; i < properties.length; ++i) { + var property = properties[i]; + + if (!property.range) + continue; + + ranges.push({range: property.range, name: 'property >>' + property.text + '<<'}); + } + + return ranges; +} + +function compareRuleRanges(lazyRule, originalRule) { + if (lazyRule.selectorText !== originalRule.selectorText) { + TestRunner.addResult( + 'Error: rule selectors are not equal: ' + lazyRule.selectorText + ' != ' + originalRule.selectorText); + return false; + } + + var flattenLazy = flattenRuleRanges(lazyRule); + var flattenOriginal = flattenRuleRanges(originalRule); + + if (flattenLazy.length !== flattenOriginal.length) { + TestRunner.addResult( + 'Error: rule range amount is not equal: ' + flattenLazy.length + ' != ' + flattenOriginal.length); + return false; + } + + for (var i = 0; i < flattenLazy.length; ++i) { + var lazyRange = flattenLazy[i]; + var originalRange = flattenOriginal[i]; + + if (lazyRange.name !== originalRange.name) { + TestRunner.addResult('Error: rule names are not equal: ' + lazyRange.name + ' != ' + originalRange.name); + return false; + } + + if (!lazyRange.range.equal(originalRange.range)) { + TestRunner.addResult( + 'Error: ranges \'' + lazyRange.name + '\' are not equal: ' + lazyRange.range.toString() + + ' != ' + originalRange.range.toString()); + + return false; + } + } + + TestRunner.addResult(flattenLazy.length + ' rule ranges are equal.'); + return true; +} + +ElementsTestRunner.validateRuleRanges = function(selector, rules, callback) { + ElementsTestRunner.selectNodeAndWaitForStyles('other', onOtherSelected); + + function onOtherSelected() { + ElementsTestRunner.selectNodeAndWaitForStyles(selector, onContainerSelected); + } + + function onContainerSelected() { + var fetchedRules = ElementsTestRunner.getMatchedRules(); + + if (fetchedRules.length !== rules.length) { + TestRunner.addResult(String.sprintf( + 'Error: rules sizes are not equal! Expected: %d, actual: %d', fetchedRules.length, rules.length)); + TestRunner.completeTest(); + return; + } + + for (var i = 0; i < fetchedRules.length; ++i) { + if (!compareRuleRanges(rules[i], fetchedRules[i])) { + TestRunner.completeTest(); + return; + } + } + + callback(); + } +}; + +ElementsTestRunner.getMatchedRules = function() { + var rules = []; + + for (var block of UI.panels.elements._stylesWidget._sectionBlocks) { + for (var section of block.sections) { + var rule = section.style().parentRule; + + if (rule) + rules.push(rule); + } + } + + return rules; +};
diff --git a/third_party/WebKit/Source/devtools/front_end/elements_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/elements_test_runner/module.json index f39e9e9b..6111fce0 100644 --- a/third_party/WebKit/Source/devtools/front_end/elements_test_runner/module.json +++ b/third_party/WebKit/Source/devtools/front_end/elements_test_runner/module.json
@@ -3,9 +3,21 @@ "test_runner", "integration_test_runner", "elements", - "event_listeners" + "event_listeners", + "animation" ], "scripts": [ - "ElementsTestRunner.js" + "ElementsTestRunner.js", + "EditDOMTestRunner.js", + "SetOuterHTMLTestRunner.js", + "ElementsPanelShadowSelectionOnRefreshTestRunner.js", + "StylesUpdateLinksTestRunner.js" + ], + "skip_compilation": [ + "ElementsTestRunner.js", + "EditDOMTestRunner.js", + "SetOuterHTMLTestRunner.js", + "ElementsPanelShadowSelectionOnRefreshTestRunner.js", + "StylesUpdateLinksTestRunner.js" ] }
diff --git a/third_party/WebKit/Source/devtools/front_end/extensions_test_runner/ExtensionsNetworkTestRunner.js b/third_party/WebKit/Source/devtools/front_end/extensions_test_runner/ExtensionsNetworkTestRunner.js new file mode 100644 index 0000000..497078f1 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/extensions_test_runner/ExtensionsNetworkTestRunner.js
@@ -0,0 +1,28 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +function extension_getRequestByUrl(urls, callback) { + function onHAR(response) { + var entries = response.entries; + + for (var i = 0; i < entries.length; ++i) { + for (var url = 0; url < urls.length; ++url) { + if (urls[url].test(entries[i].request.url)) { + callback(entries[i]); + return; + } + } + } + + output('no item found'); + callback(null); + } + + webInspector.network.getHAR(onHAR); +}
diff --git a/third_party/WebKit/Source/devtools/front_end/extensions_test_runner/ExtensionsTestRunner.js b/third_party/WebKit/Source/devtools/front_end/extensions_test_runner/ExtensionsTestRunner.js new file mode 100644 index 0000000..21cb4d88 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/extensions_test_runner/ExtensionsTestRunner.js
@@ -0,0 +1,75 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +var extensionsHost = 'devtools-extensions.oopif.test'; +var extensionsOrigin = `http://${extensionsHost}:8000`; +Extensions.extensionServer._registerHandler('evaluateForTestInFrontEnd', onEvaluate); + +Extensions.extensionServer._extensionAPITestHook = function(extensionServerClient, coreAPI) { + window.webInspector = coreAPI; + window._extensionServerForTests = extensionServerClient; + coreAPI.panels.themeName = 'themeNameForTest'; +}; + +ExtensionsTestRunner._replyToExtension = function(requestId, port) { + Extensions.extensionServer._dispatchCallback(requestId, port); +}; + +function onEvaluate(message, port) { + try { + eval(message.expression); + } catch (e) { + TestRunner.addResult('Exception while running: ' + message.expression + '\n' + (e.stack || e)); + TestRunner.completeTest(); + } +} + +ExtensionsTestRunner.runExtensionTests = async function() { + var result = await TestRunner.RuntimeAgent.evaluate('location.href', 'console', false); + + if (!result) + return; + + var pageURL = result.value; + var extensionURL = ((/^https?:/.test(pageURL) ? pageURL.replace(/^(https?:\/\/[^\/]*\/).*$/, '$1') : + pageURL.replace(/\/inspector\/extensions\/[^\/]*$/, '/http/tests'))) + + 'inspector/resources/extension-main.html'; + extensionURL = extensionURL.replace('127.0.0.1', extensionsHost); + + InspectorFrontendAPI.addExtensions( + [{startPage: extensionURL, name: 'test extension', exposeWebInspectorNamespace: true}]); + + Extensions.extensionServer.initializeExtensions(); +}; + +(async function() { + await TestRunner.evaluateInPagePromise(` + function extensionFunctions() { + var functions = ''; + + for (symbol in window) { + if (/^extension_/.exec(symbol) && typeof window[symbol] === 'function') + functions += window[symbol].toString(); + } + + return functions; + } + + var extensionsOrigin = 'http://devtools-extensions.oopif.test:8000'; + + function extension_showPanel(panelId, callback) { + evaluateOnFrontend('InspectorTest.showPanel(unescape(\'' + escape(panelId) + '\')).then(function() { reply(); });', callback); + } + + var test = function() { + Common.moduleSetting('shortcutPanelSwitch').set(true); + InspectorTest.runExtensionTests(); + }; + `); +})();
diff --git a/third_party/WebKit/Source/devtools/front_end/extensions_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/extensions_test_runner/module.json new file mode 100644 index 0000000..82e956c --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/extensions_test_runner/module.json
@@ -0,0 +1,15 @@ +{ + "dependencies": [ + "test_runner", + "integration_test_runner", + "extensions" + ], + "scripts": [ + "ExtensionsNetworkTestRunner.js", + "ExtensionsTestRunner.js" + ], + "skip_compilation": [ + "ExtensionsNetworkTestRunner.js", + "ExtensionsTestRunner.js" + ] +}
diff --git a/third_party/WebKit/Source/devtools/front_end/integration_test_runner.json b/third_party/WebKit/Source/devtools/front_end/integration_test_runner.json index c327aab4..0242b890 100644 --- a/third_party/WebKit/Source/devtools/front_end/integration_test_runner.json +++ b/third_party/WebKit/Source/devtools/front_end/integration_test_runner.json
@@ -1,5 +1,18 @@ { "modules" : [ + { "name": "application_test_runner" }, + { "name": "audits_test_runner" }, + { "name": "bindings_test_runner" }, + { "name": "extensions_test_runner" }, + { "name": "layers_test_runner" }, + { "name": "network_test_runner" }, + { "name": "security_test_runner" }, + { "name": "performance_test_runner" }, + { "name": "coverage_test_runner" }, + { "name": "device_mode_test_runner" }, + { "name": "accessibility_test_runner" }, + { "name": "profiler_test_runner" }, + { "name": "sass_test_runner" }, { "name": "test_runner", "type": "autostart" }, { "name": "integration_test_runner", "type": "autostart" }, { "name": "console_test_runner" }, @@ -8,6 +21,11 @@ { "name": "data_grid_test_runner" }, + + { "name": "heap_snapshot_worker" }, + + + { "name": "platform", "type": "autostart" }, { "name": "dom_extension", "type": "autostart" }, { "name": "main", "type": "autostart" },
diff --git a/third_party/WebKit/Source/devtools/front_end/integration_test_runner/IntegrationTestRunner.js b/third_party/WebKit/Source/devtools/front_end/integration_test_runner/IntegrationTestRunner.js index 8c7901b..5da2f43 100644 --- a/third_party/WebKit/Source/devtools/front_end/integration_test_runner/IntegrationTestRunner.js +++ b/third_party/WebKit/Source/devtools/front_end/integration_test_runner/IntegrationTestRunner.js
@@ -21,6 +21,7 @@ TestRunner.HeapProfilerAgent = target.heapProfilerAgent(); TestRunner.InspectorAgent = target.inspectorAgent(); TestRunner.NetworkAgent = target.networkAgent(); + TestRunner.OverlayAgent = target.overlayAgent(); TestRunner.PageAgent = target.pageAgent(); TestRunner.ProfilerAgent = target.profilerAgent(); TestRunner.RuntimeAgent = target.runtimeAgent(); @@ -35,6 +36,7 @@ TestRunner.domDebuggerModel = target.model(SDK.DOMDebuggerModel); TestRunner.cssModel = target.model(SDK.CSSModel); TestRunner.cpuProfilerModel = target.model(SDK.CPUProfilerModel); + TestRunner.overlayModel = target.model(SDK.OverlayModel); TestRunner.serviceWorkerManager = target.model(SDK.ServiceWorkerManager); TestRunner.tracingManager = target.model(SDK.TracingManager); TestRunner.mainTarget = target; @@ -732,6 +734,41 @@ return 'frame'; }; +/** + * @param {string} urlSuffix + * @param {!Workspace.projectTypes=} projectType + * @return {!Promise} + */ +TestRunner.waitForUISourceCode = function(urlSuffix, projectType) { + /** + * @param {!Workspace.UISourceCode} uiSourceCode + * @return {boolean} + */ + function matches(uiSourceCode) { + if (projectType && uiSourceCode.project().type() !== projectType) + return false; + if (!projectType && uiSourceCode.project().type() === Workspace.projectTypes.Service) + return false; + if (urlSuffix && !uiSourceCode.url().endsWith(urlSuffix)) + return false; + return true; + } + + for (var uiSourceCode of Workspace.workspace.uiSourceCodes()) { + if (urlSuffix && matches(uiSourceCode)) + return Promise.resolve(uiSourceCode); + } + + return TestRunner.waitForEvent(Workspace.Workspace.Events.UISourceCodeAdded, Workspace.workspace, matches); +}; + +/** + * @param {!Function} callback + */ +TestRunner.waitForUISourceCodeRemoved = function(callback) { + Workspace.workspace.once(Workspace.Workspace.Events.UISourceCodeRemoved).then(callback); +}; + /** @type {boolean} */ IntegrationTestRunner._startedTest = false;
diff --git a/third_party/WebKit/Source/devtools/front_end/integration_test_runner/PageMockTestRunner.js b/third_party/WebKit/Source/devtools/front_end/integration_test_runner/PageMockTestRunner.js new file mode 100644 index 0000000..fe125dfb --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/integration_test_runner/PageMockTestRunner.js
@@ -0,0 +1,244 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +var id = 0; + +function nextId(prefix) { + return (prefix || '') + ++id; +} + +TestRunner.connectToPage = function(targetName, pageMock, makeMainTarget) { + var mockTarget = SDK.targetManager.createTarget( + nextId('mock-target-'), targetName, pageMock.capabilities(), params => pageMock.createConnection(params)); + + if (makeMainTarget) { + SDK.targetManager._targets = SDK.targetManager._targets.filter(target => target !== mockTarget); + SDK.targetManager._targets.unshift(mockTarget); + } + + return mockTarget; +}; + +TestRunner.PageMock = class { + constructor(url) { + this._url = url; + this._capabilities = SDK.Target.Capability.DOM | SDK.Target.Capability.JS | SDK.Target.Capability.Browser; + this._enabledDomains = new Set(); + + this._mainFrame = + {id: nextId(), loaderId: nextId(), mimeType: 'text/html', securityOrigin: this._url, url: this._url}; + + this._executionContexts = []; + this._executionContexts.push(this._createExecutionContext(this._mainFrame, false)); + this._scripts = []; + this._scriptContents = new Map(); + + this._dispatchMap = { + 'Debugger.enable': this._debuggerEnable, + 'Debugger.getScriptSource': this._debuggerGetScriptSource, + 'Debugger.setBlackboxPatterns': (id, params) => this._sendResponse(id, {}), + 'Runtime.enable': this._runtimeEnable, + 'Page.enable': this._pageEnable, + 'Page.getResourceTree': this._pageGetResourceTree + }; + } + + capabilities() { + return this._capabilities; + } + + disableDOMCapability() { + this._capabilities = this._capabilities & ~SDK.Target.Capability.DOM; + } + + createConnection(params) { + this._enabledDomains.clear(); + this._connection = new MockPageConnection(this, params); + return this._connection; + } + + evalScript(url, content, isContentScript) { + var id = nextId(); + content += '\n//# sourceURL=' + url; + this._scriptContents.set(id, content); + var context = this._executionContexts.find(context => context.auxData.isDefault !== isContentScript); + + if (!context) { + context = this._createExecutionContext(this._mainFrame, isContentScript); + + this._fireEvent('Runtime.executionContextCreated', {context: context}); + } + + var text = new TextUtils.Text(content); + + var script = { + scriptId: id, + url: url, + startLine: 0, + startColumn: 0, + endLine: text.lineCount(), + endColumn: text.lineAt(text.lineCount()).length - 1, + executionContextId: context.id, + hash: String.hashCode(content), + executionContextAuxData: context.auxData, + sourceMapURL: '', + hasSourceURL: true, + isLiveEdit: false, + isModule: false, + length: content.length + }; + + this._scripts.push(script); + this._fireEvent('Debugger.scriptParsed', script); + } + + reload() { + this._fireEvent('Page.frameStartedLoading', {frameId: this._mainFrame.id}); + + for (var context of this._executionContexts) + this._fireEvent('Runtime.executionContextDestroyed', {executionContextId: context.id}); + + + this._scripts = []; + this._scriptContents.clear(); + this._executionContexts = []; + this._fireEvent('Runtime.executionContextsCleared', {}); + this._executionContexts.push(this._createExecutionContext(this._mainFrame, false)); + + for (var context of this._executionContexts) + this._fireEvent('Runtime.executionContextCreated', {context: context}); + + + this._fireEvent('Page.frameNavigated', {frame: this._mainFrame}); + + this._fireEvent('Page.loadEventFired', {timestamp: Date.now() / 1000}); + + this._fireEvent('Page.frameStoppedLoading', {frameId: this._mainFrame.id}); + + this._fireEvent('Page.domContentEventFired', {timestamp: Date.now() / 1000}); + } + + close() { + if (this._connection) { + this._connection.disconnect(); + this._connection = null; + } + } + + _createExecutionContext(frame, isContentScript) { + return { + id: nextId(), + + auxData: {isDefault: !isContentScript, frameId: frame.id}, + + origin: frame.securityOrigin, + name: '' + }; + } + + _debuggerEnable(id, params) { + this._enabledDomains.add('Debugger'); + this._sendResponse(id, {}); + + for (var script of this._scripts) + this._fireEvent('Debugger.scriptParsed', script); + } + + _debuggerGetScriptSource(id, params) { + if (!this._scriptContents.has(params.scriptId)) { + this._sendResponse(id, undefined, {message: 'Can\'t get script content for id ' + params.scriptId, code: 1}); + + return; + } + + var result = {scriptSource: this._scriptContents.get(params.scriptId)}; + + this._sendResponse(id, result); + } + + _runtimeEnable(id, params) { + this._enabledDomains.add('Runtime'); + this._sendResponse(id, {}); + + for (var context of this._executionContexts) + this._fireEvent('Runtime.executionContextCreated', {context: context}); + } + + _pageEnable(id, params) { + this._enabledDomains.add('Page'); + this._sendResponse(id, {}); + } + + _pageGetResourceTree(id, params) { + var result = {frameTree: {frame: this._mainFrame, resources: []}}; + + this._sendResponse(id, result); + } + + _isSupportedDomain(methodName) { + var domain = methodName.split('.')[0]; + + if (domain === 'Page') + return !!(this._capabilities & SDK.Target.Capability.DOM); + + return true; + } + + _dispatch(id, methodName, params, message) { + var handler = (this._isSupportedDomain(methodName) ? this._dispatchMap[methodName] : null); + + if (handler) + return handler.call(this, id, params); + + this._sendResponse( + id, undefined, + {message: 'Can\'t handle command ' + methodName, code: Protocol.InspectorBackend.DevToolsStubErrorCode}); + } + + _sendResponse(id, result, error) { + var message = {id: id, result: result, error: error}; + + this._connection.sendMessageToDevTools(message); + } + + _fireEvent(methodName, params) { + var domain = methodName.split('.')[0]; + + if (!this._enabledDomains.has(domain)) + return; + + var message = {method: methodName, params: params}; + + this._connection.sendMessageToDevTools(message); + } +}; + +var MockPageConnection = class { + constructor(page, params) { + this._page = page; + this._onMessage = params.onMessage; + this._onDisconnect = params.onDisconnect; + } + + sendMessageToDevTools(message) { + setTimeout(() => this._onMessage.call(null, JSON.stringify(message)), 0); + } + + sendMessage(message) { + var json = JSON.parse(message); + this._page._dispatch(json.id, json.method, json.params, message); + } + + disconnect() { + this._onDisconnect.call(null, 'force disconnect'); + this._onDisconnect = null; + this._onMessage = null; + return Promise.resolve(); + } +};
diff --git a/third_party/WebKit/Source/devtools/front_end/integration_test_runner/SyntaxHighlightTestRunner.js b/third_party/WebKit/Source/devtools/front_end/integration_test_runner/SyntaxHighlightTestRunner.js new file mode 100644 index 0000000..4f44a11 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/integration_test_runner/SyntaxHighlightTestRunner.js
@@ -0,0 +1,28 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +TestRunner.dumpSyntaxHighlight = function(str, mimeType) { + var node = document.createElement('span'); + node.textContent = str; + var javascriptSyntaxHighlighter = new UI.SyntaxHighlighter(mimeType); + return javascriptSyntaxHighlighter.syntaxHighlightNode(node).then(dumpSyntax); + + function dumpSyntax() { + var node_parts = []; + + for (var i = 0; i < node.childNodes.length; i++) { + if (node.childNodes[i].getAttribute) + node_parts.push(node.childNodes[i].getAttribute('class')); + else + node_parts.push('*'); + } + + TestRunner.addResult(str + ': ' + node_parts.join(', ')); + } +};
diff --git a/third_party/WebKit/Source/devtools/front_end/integration_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/integration_test_runner/module.json index 511866b..6d8d3747 100644 --- a/third_party/WebKit/Source/devtools/front_end/integration_test_runner/module.json +++ b/third_party/WebKit/Source/devtools/front_end/integration_test_runner/module.json
@@ -2,9 +2,16 @@ "dependencies": [ "test_runner", "sdk", - "network_log" + "network_log", + "workspace" ], "scripts": [ - "IntegrationTestRunner.js" + "IntegrationTestRunner.js", + "PageMockTestRunner.js", + "SyntaxHighlightTestRunner.js" + ], + "skip_compilation": [ + "PageMockTestRunner.js", + "SyntaxHighlightTestRunner.js" ] }
diff --git a/third_party/WebKit/Source/devtools/front_end/layers_test_runner/LayersTestRunner.js b/third_party/WebKit/Source/devtools/front_end/layers_test_runner/LayersTestRunner.js new file mode 100644 index 0000000..64dda2c6 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/layers_test_runner/LayersTestRunner.js
@@ -0,0 +1,157 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +LayersTestRunner.layerTreeModel = function() { + if (!LayersTestRunner._layerTreeModel) + LayersTestRunner._layerTreeModel = TestRunner.mainTarget.model(Layers.LayerTreeModel); + + return LayersTestRunner._layerTreeModel; +}; + +LayersTestRunner.labelForLayer = function(layer) { + var node = layer.nodeForSelfOrAncestor(); + var label = (node ? Components.DOMPresentationUtils.fullQualifiedSelector(node, false) : '<invalid node id>'); + var height = layer.height(); + var width = layer.width(); + + if (height <= 200 && width <= 200) + label += ' ' + height + 'x' + width; + + if (typeof layer.__extraData !== 'undefined') + label += ' (' + layer.__extraData + ')'; + + return label; +}; + +LayersTestRunner.dumpLayerTree = function(prefix, root) { + if (!prefix) + prefix = ''; + + if (!root) { + root = LayersTestRunner.layerTreeModel().layerTree().contentRoot(); + + if (!root) { + TestRunner.addResult('No layer root, perhaps not in the composited mode! '); + TestRunner.completeTest(); + return; + } + } + + TestRunner.addResult(prefix + LayersTestRunner.labelForLayer(root)); + root.children().forEach(LayersTestRunner.dumpLayerTree.bind(LayersTestRunner, prefix + ' ')); +}; + +LayersTestRunner.dumpLayers3DView = function(prefix, root) { + if (!prefix) + prefix = ''; + + if (!root) + root = UI.panels.layers._layers3DView._rotatingContainerElement; + + if (root.__layer) + TestRunner.addResult(prefix + LayersTestRunner.labelForLayer(root.__layer)); + + for (var element = root.firstElementChild; element; element = element.nextSibling) + LayersTestRunner.dumpLayers3DView(prefix + ' ', element); +}; + +LayersTestRunner.evaluateAndRunWhenTreeChanges = function(expression, callback) { + function eventHandler() { + LayersTestRunner.layerTreeModel().removeEventListener(Layers.LayerTreeModel.Events.LayerTreeChanged, eventHandler); + callback(); + } + + TestRunner.evaluateInPage(expression, function() { + LayersTestRunner.layerTreeModel().addEventListener(Layers.LayerTreeModel.Events.LayerTreeChanged, eventHandler); + }); +}; + +LayersTestRunner.findLayerByNodeIdAttribute = function(nodeIdAttribute) { + var result; + + function testLayer(layer) { + var node = layer.node(); + + if (!node) + return false; + + if (!node || node.getAttribute('id') !== nodeIdAttribute) + return false; + + result = layer; + return true; + } + + LayersTestRunner.layerTreeModel().layerTree().forEachLayer(testLayer); + + if (!result) + TestRunner.addResult('ERROR: No layer for ' + nodeIdAttribute); + + return result; +}; + +LayersTestRunner.requestLayers = function(callback) { + LayersTestRunner.layerTreeModel().addEventListener(Layers.LayerTreeModel.Events.LayerTreeChanged, onLayerTreeChanged); + LayersTestRunner.layerTreeModel().enable(); + + function onLayerTreeChanged() { + LayersTestRunner.layerTreeModel().removeEventListener( + Layers.LayerTreeModel.Events.LayerTreeChanged, onLayerTreeChanged); + callback(); + } +}; + +LayersTestRunner.dumpModelScrollRects = function() { + function dumpScrollRectsForLayer(layer) { + if (layer._scrollRects.length > 0) + TestRunner.addObject(layer._scrollRects); + } + + TestRunner.addResult('Model elements dump'); + LayersTestRunner.layerTreeModel().layerTree().forEachLayer(dumpScrollRectsForLayer.bind(this)); +}; + +LayersTestRunner.dumpModelStickyPositionConstraint = function() { + function dumpModelStickyPositionConstraintForLayer(layer) { + var stickyFormatters = { + '_nearestLayerShiftingContainingBlock': 'formatAsTypeNameOrNull', + '_nearestLayerShiftingStickyBox': 'formatAsTypeNameOrNull' + }; + + if (layer._stickyPositionConstraint) + TestRunner.addObject(layer._stickyPositionConstraint, stickyFormatters); + } + + TestRunner.addResult('Model elements dump'); + LayersTestRunner.layerTreeModel().layerTree().forEachLayer(dumpModelStickyPositionConstraintForLayer.bind(this)); +}; + +LayersTestRunner.dispatchMouseEvent = function(eventType, button, element, offsetX, offsetY) { + var totalOffset = element.totalOffset(); + + var eventArguments = { + bubbles: true, + cancelable: true, + view: window, + screenX: totalOffset.left - element.scrollLeft + offsetX, + screenY: totalOffset.top - element.scrollTop + offsetY, + clientX: totalOffset.left + offsetX, + clientY: totalOffset.top + offsetY, + button: button + }; + + if (eventType === 'mouseout') { + eventArguments.screenX = 0; + eventArguments.screenY = 0; + eventArguments.clientX = 0; + eventArguments.clientY = 0; + } + + element.dispatchEvent(new MouseEvent(eventType, eventArguments)); +};
diff --git a/third_party/WebKit/Source/devtools/front_end/layers_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/layers_test_runner/module.json new file mode 100644 index 0000000..a76d127 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/layers_test_runner/module.json
@@ -0,0 +1,14 @@ +{ + "dependencies": [ + "test_runner", + "integration_test_runner", + "layers", + "components" + ], + "scripts": [ + "LayersTestRunner.js" + ], + "skip_compilation": [ + "LayersTestRunner.js" + ] +}
diff --git a/third_party/WebKit/Source/devtools/front_end/network_test_runner/NetworkTestRunner.js b/third_party/WebKit/Source/devtools/front_end/network_test_runner/NetworkTestRunner.js new file mode 100644 index 0000000..eaf0454 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/network_test_runner/NetworkTestRunner.js
@@ -0,0 +1,225 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +NetworkTestRunner.waitForRequestResponse = function(request) { + if (request.responseReceivedTime !== -1) + return Promise.resolve(request); + + return TestRunner.waitForEvent( + SDK.NetworkManager.Events.RequestUpdated, TestRunner.networkManager, + updateRequest => updateRequest === request && request.responseReceivedTime !== -1); +}; + +NetworkTestRunner.waitForNetworkLogViewNodeForRequest = function(request) { + var networkLogView = UI.panels.network._networkLogView; + var node = networkLogView.nodeForRequest(request); + + if (node) + return Promise.resolve(node); + + console.assert(networkLogView._staleRequests.has(request)); + + return TestRunner.addSnifferPromise(networkLogView, '_didRefreshForTest').then(() => { + var node = networkLogView.nodeForRequest(request); + console.assert(node); + return node; + }); +}; + +NetworkTestRunner.waitForWebsocketFrameReceived = function(wsRequest, message) { + for (var frame of wsRequest.frames()) { + if (checkFrame(frame)) + return Promise.resolve(frame); + } + + return TestRunner.waitForEvent(SDK.NetworkRequest.Events.WebsocketFrameAdded, wsRequest, checkFrame); + + function checkFrame(frame) { + return frame.type === SDK.NetworkRequest.WebSocketFrameType.Receive && frame.text === message; + } +}; + +NetworkTestRunner.recordNetwork = function() { + UI.panels.network._networkLogView.setRecording(true); +}; + +NetworkTestRunner.networkRequests = function() { + return Array.from(NetworkLog.networkLog.requests()); +}; + +NetworkTestRunner.dumpNetworkRequests = function() { + var requests = NetworkTestRunner.networkRequests(); + + requests.sort(function(a, b) { + return a.url().localeCompare(b.url()); + }); + + TestRunner.addResult('resources count = ' + requests.length); + + for (i = 0; i < requests.length; i++) + TestRunner.addResult(requests[i].url()); +}; + +NetworkTestRunner.findRequestsByURLPattern = function(urlPattern) { + return NetworkTestRunner.networkRequests().filter(function(value) { + return urlPattern.test(value.url()); + }); +}; + +NetworkTestRunner.makeSimpleXHR = function(method, url, async, callback) { + NetworkTestRunner.makeXHR(method, url, async, undefined, undefined, [], false, undefined, undefined, callback); +}; + +NetworkTestRunner.makeSimpleXHRWithPayload = function(method, url, async, payload, callback) { + NetworkTestRunner.makeXHR(method, url, async, undefined, undefined, [], false, payload, undefined, callback); +}; + +NetworkTestRunner.makeXHR = function( + method, url, async, user, password, headers, withCredentials, payload, type, callback) { + var args = {}; + args.method = method; + args.url = url; + args.async = async; + args.user = user; + args.password = password; + args.headers = headers; + args.withCredentials = withCredentials; + args.payload = payload; + args.type = type; + var jsonArgs = JSON.stringify(args).replace(/\"/g, '\\"'); + + function innerCallback(msg) { + if (msg.messageText.indexOf('XHR loaded') !== -1) { + if (callback) + callback(); + } else { + ConsoleTestRunner.addConsoleSniffer(innerCallback); + } + } + + ConsoleTestRunner.addConsoleSniffer(innerCallback); + TestRunner.evaluateInPage('makeXHRForJSONArguments("' + jsonArgs + '")'); +}; + +NetworkTestRunner.makeFetch = function(url, requestInitializer, callback) { + TestRunner.callFunctionInPageAsync('makeFetch', [url, requestInitializer]).then(callback); +}; + +NetworkTestRunner.makeFetchInWorker = function(url, requestInitializer, callback) { + TestRunner.callFunctionInPageAsync('makeFetchInWorker', [url, requestInitializer]).then(callback); +}; + +NetworkTestRunner.clearNetworkCache = function() { + var networkAgent = TestRunner.NetworkAgent; + var promise = networkAgent.setCacheDisabled(true); + return promise.then(() => networkAgent.setCacheDisabled(false)); +}; + +NetworkTestRunner.HARPropertyFormatters = { + bodySize: 'formatAsTypeName', + compression: 'formatAsTypeName', + connection: 'formatAsTypeName', + headers: 'formatAsTypeName', + headersSize: 'formatAsTypeName', + id: 'formatAsTypeName', + onContentLoad: 'formatAsTypeName', + onLoad: 'formatAsTypeName', + receive: 'formatAsTypeName', + startedDateTime: 'formatAsRecentTime', + time: 'formatAsTypeName', + timings: 'formatAsTypeName', + version: 'formatAsTypeName', + wait: 'formatAsTypeName', + _transferSize: 'formatAsTypeName', + _error: 'skip' +}; + +NetworkTestRunner.HARPropertyFormattersWithSize = JSON.parse(JSON.stringify(NetworkTestRunner.HARPropertyFormatters)); +NetworkTestRunner.HARPropertyFormattersWithSize.size = 'formatAsTypeName'; + +(async function() { + await TestRunner.evaluateInPagePromise(` + var lastXHRIndex = 0; + + function xhrLoadedCallback() { + console.log('XHR loaded: ' + ++lastXHRIndex); + } + + function makeSimpleXHR(method, url, async, callback) { + makeSimpleXHRWithPayload(method, url, async, null, callback); + } + + function makeSimpleXHRWithPayload(method, url, async, payload, callback) { + makeXHR(method, url, async, undefined, undefined, [], false, payload, callback); + } + + function makeXHR(method, url, async, user, password, headers, withCredentials, payload, type, callback) { + var xhr = new XMLHttpRequest(); + + if (type == undefined) + xhr.responseType = ''; + else + xhr.responseType = type; + + xhr.onreadystatechange = function() { + if (xhr.readyState === XMLHttpRequest.DONE) { + if (typeof callback === 'function') + callback(); + } + }; + + xhr.open(method, url, async, user, password); + xhr.withCredentials = withCredentials; + + for (var i = 0; i < headers.length; ++i) + xhr.setRequestHeader(headers[i][0], headers[i][1]); + + xhr.send(payload); + } + + function makeXHRForJSONArguments(jsonArgs) { + var args = JSON.parse(jsonArgs); + + makeXHR( + args.method, + args.url, + args.async, + args.user, + args.password, + args.headers || [], + args.withCredentials, + args.payload, + args.type, + xhrLoadedCallback + ); + } + + function makeFetch(url, requestInitializer) { + return fetch(url, requestInitializer).then(res => { + res.text(); + return res; + }).catch(e => e); + } + + function makeFetchInWorker(url, requestInitializer) { + return new Promise(resolve => { + var worker = new Worker('/inspector/network/resources/fetch-worker.js'); + + worker.onmessage = event => { + resolve(event.data); + }; + + worker.postMessage({ + url: url, + init: requestInitializer + }); + }); + } + `); +})();
diff --git a/third_party/WebKit/Source/devtools/front_end/network_test_runner/ProductRegistryTestRunner.js b/third_party/WebKit/Source/devtools/front_end/network_test_runner/ProductRegistryTestRunner.js new file mode 100644 index 0000000..9f6fb50 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/network_test_runner/ProductRegistryTestRunner.js
@@ -0,0 +1,39 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +NetworkTestRunner.resetProductRegistry = function() { + TestRunner.addResult('Cleared ProductRegistryImpl'); + ProductRegistryImpl._productsByDomainHash.clear(); +}; + +NetworkTestRunner.addProductRegistryEntry = function(domainPattern, productName, type) { + TestRunner.addResult('Adding entry: ' + domainPattern); + var wildCardPosition = domainPattern.indexOf('*'); + var prefix = ''; + + if (wildCardPosition === -1) { + } else if (wildCardPosition === 0) { + prefix = '*'; + console.assert(domainPattern.substr(1, 1) === '.', 'Domain pattern wildcard must be followed by \'.\''); + domainPattern = domainPattern.substr(2); + } else { + prefix = domainPattern.substr(0, wildCardPosition); + console.assert( + domainPattern.substr(wildCardPosition + 1, 1) === '.', 'Domain pattern wildcard must be followed by \'.\''); + domainPattern = domainPattern.substr(wildCardPosition + 2); + } + + console.assert(domainPattern.indexOf('*') === -1, 'Domain pattern may only have 1 wildcard.'); + var prefixes = {}; + + prefixes[prefix] = {product: 0, type: type}; + + ProductRegistryImpl.register( + [productName], [{hash: ProductRegistryImpl._hashForDomain(domainPattern), prefixes: prefixes}]); +};
diff --git a/third_party/WebKit/Source/devtools/front_end/network_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/network_test_runner/module.json new file mode 100644 index 0000000..82029ea --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/network_test_runner/module.json
@@ -0,0 +1,16 @@ +{ + "dependencies": [ + "test_runner", + "integration_test_runner", + "product_registry_impl", + "console_test_runner" + ], + "scripts": [ + "NetworkTestRunner.js", + "ProductRegistryTestRunner.js" + ], + "skip_compilation": [ + "NetworkTestRunner.js", + "ProductRegistryTestRunner.js" + ] +}
diff --git a/third_party/WebKit/Source/devtools/front_end/performance_test_runner/TimelineDataTestRunner.js b/third_party/WebKit/Source/devtools/front_end/performance_test_runner/TimelineDataTestRunner.js new file mode 100644 index 0000000..6f53685 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/performance_test_runner/TimelineDataTestRunner.js
@@ -0,0 +1,5363 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +PerformanceTestRunner.timelineData = function() { + return JSON.stringify([ + { + 'args': {'number': 32}, + + 'cat': '__metadata', + 'name': 'num_cpus', + 'ph': 'M', + 'pid': 3840, + 'tid': 0, + 'ts': 0 + }, + { + 'args': {'sort_index': -5}, + + 'cat': '__metadata', + 'name': 'process_sort_index', + 'ph': 'M', + 'pid': 3840, + 'tid': 12, + 'ts': 0 + }, + { + 'args': {'name': 'Renderer'}, + + 'cat': '__metadata', + 'name': 'process_name', + 'ph': 'M', + 'pid': 3840, + 'tid': 12, + 'ts': 0 + }, + { + 'args': {'sort_index': -1}, + + 'cat': '__metadata', + 'name': 'thread_sort_index', + 'ph': 'M', + 'pid': 3840, + 'tid': 11, + 'ts': 0 + }, + { + 'args': {'sessionId': '9.4'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'TracingStartedInPage', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673092068, + 'tts': 170409 + }, + { + 'args': {'layerTreeId': 1, 'sessionId': '9.4'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'SetLayerTreeId', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673092082, + 'tts': 170421 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673092095, + 'tts': 170434 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673107791, + 'tts': 170482 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673107799, + 'tts': 170490 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 438}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 65, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 64, + 'tid': 9, + 'ts': 1122673107821, + 'tts': 170511 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 27, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 26, + 'tid': 9, + 'ts': 1122673107849, + 'tts': 170539 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 439}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673107869, + 'tts': 170559 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2688936, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673107883, + 'tts': 170573 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673107891, + 'tts': 170581 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673107921, + 'tts': 170612 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673107934, + 'tts': 170624 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673107941, + 'tts': 170631 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673126470, + 'tts': 170708 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673126480, + 'tts': 170717 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 439}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 108, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 107, + 'tid': 9, + 'ts': 1122673126522, + 'tts': 170759 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 47, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 46, + 'tid': 9, + 'ts': 1122673126569, + 'tts': 170806 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 440}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673126606, + 'tts': 170843 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2688952, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673126627, + 'tts': 170864 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673126637, + 'tts': 170874 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673126683, + 'tts': 170920 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673126699, + 'tts': 170936 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673126708, + 'tts': 170944 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673141177, + 'tts': 171002 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673141186, + 'tts': 171010 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 440}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 110, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 109, + 'tid': 9, + 'ts': 1122673141212, + 'tts': 171036 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 46, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 43, + 'tid': 9, + 'ts': 1122673141259, + 'tts': 171084 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 441}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673141293, + 'tts': 171117 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2688968, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673141318, + 'tts': 171142 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673141329, + 'tts': 171154 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673141379, + 'tts': 171204 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673141406, + 'tts': 171231 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673141421, + 'tts': 171246 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673162929, + 'tts': 171304 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673162938, + 'tts': 171313 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 441}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 98, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 97, + 'tid': 9, + 'ts': 1122673162975, + 'tts': 171350 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 41, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 39, + 'tid': 9, + 'ts': 1122673163020, + 'tts': 171395 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 442}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673163051, + 'tts': 171426 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2688984, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673163070, + 'tts': 171445 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673163081, + 'tts': 171455 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673163119, + 'tts': 171493 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673163133, + 'tts': 171508 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673163141, + 'tts': 171516 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673179592, + 'tts': 171569 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673179600, + 'tts': 171576 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 442}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 77, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 76, + 'tid': 9, + 'ts': 1122673179625, + 'tts': 171601 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 31, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 31, + 'tid': 9, + 'ts': 1122673179660, + 'tts': 171635 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 443}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673179683, + 'tts': 171659 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689000, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673179699, + 'tts': 171675 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673179707, + 'tts': 171682 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673179736, + 'tts': 171711 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673179751, + 'tts': 171727 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673179759, + 'tts': 171735 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673196258, + 'tts': 171788 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673196265, + 'tts': 171794 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 443}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 73, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 72, + 'tid': 9, + 'ts': 1122673196291, + 'tts': 171820 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 30, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 29, + 'tid': 9, + 'ts': 1122673196323, + 'tts': 171852 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 444}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673196346, + 'tts': 171875 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689016, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673196361, + 'tts': 171890 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673196370, + 'tts': 171899 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673196402, + 'tts': 171931 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673196417, + 'tts': 171946 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673196425, + 'tts': 171954 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673213043, + 'tts': 172016 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'BeginFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122673107747, + 'tts': 77989 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'RequestMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122673107777, + 'tts': 78018 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'BeginFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122673126358, + 'tts': 78708 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'RequestMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122673126413, + 'tts': 78760 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'BeginFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122673141111, + 'tts': 78880 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'RequestMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122673141133, + 'tts': 78902 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'BeginFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122673162867, + 'tts': 79126 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'RequestMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122673162886, + 'tts': 79145 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'BeginFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122673179534, + 'tts': 79253 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'RequestMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122673179551, + 'tts': 79269 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673313423, + 'tts': 174171 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673313452, + 'tts': 174200 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673313467, + 'tts': 174215 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673329958, + 'tts': 174302 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673329971, + 'tts': 174314 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 451}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 98, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 96, + 'tid': 9, + 'ts': 1122673330000, + 'tts': 174343 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 44, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 41, + 'tid': 9, + 'ts': 1122673330035, + 'tts': 174379 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 452}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673330066, + 'tts': 174409 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689144, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673330092, + 'tts': 174435 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673330106, + 'tts': 174450 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673330151, + 'tts': 174495 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673330180, + 'tts': 174523 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673330194, + 'tts': 174538 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673346680, + 'tts': 174624 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673346692, + 'tts': 174635 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 452}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 98, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 96, + 'tid': 9, + 'ts': 1122673346721, + 'tts': 174664 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 45, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 43, + 'tid': 9, + 'ts': 1122673346756, + 'tts': 174699 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 453}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673346787, + 'tts': 174730 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689160, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673346813, + 'tts': 174756 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673346827, + 'tts': 174770 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673346871, + 'tts': 174814 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673346900, + 'tts': 174843 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673346914, + 'tts': 174857 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673363348, + 'tts': 174943 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673363361, + 'tts': 174954 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 453}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 98, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 95, + 'tid': 9, + 'ts': 1122673363390, + 'tts': 174984 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 45, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 42, + 'tid': 9, + 'ts': 1122673363425, + 'tts': 175019 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 454}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673363456, + 'tts': 175050 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689176, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673363482, + 'tts': 175075 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673363496, + 'tts': 175090 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673363540, + 'tts': 175134 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673363569, + 'tts': 175163 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673363584, + 'tts': 175177 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673380043, + 'tts': 175286 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673380057, + 'tts': 175299 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 454}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 99, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 97, + 'tid': 9, + 'ts': 1122673380086, + 'tts': 175328 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 45, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 42, + 'tid': 9, + 'ts': 1122673380122, + 'tts': 175364 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 455}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673380153, + 'tts': 175396 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689192, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673380179, + 'tts': 175421 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673380194, + 'tts': 175436 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673380238, + 'tts': 175480 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673380266, + 'tts': 175508 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673380281, + 'tts': 175523 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673396686, + 'tts': 175611 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673396699, + 'tts': 175622 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 455}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 99, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 96, + 'tid': 9, + 'ts': 1122673396735, + 'tts': 175659 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 44, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 42, + 'tid': 9, + 'ts': 1122673396771, + 'tts': 175694 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 456}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673396802, + 'tts': 175725 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689208, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673396828, + 'tts': 175751 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673396842, + 'tts': 175765 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673396886, + 'tts': 175810 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673396915, + 'tts': 175838 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673396930, + 'tts': 175853 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673413345, + 'tts': 175940 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673413358, + 'tts': 175952 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'BeginFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674113927, + 'tts': 89784 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'RequestMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674113950, + 'tts': 89806 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'BeginFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674130606, + 'tts': 89979 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'RequestMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674130629, + 'tts': 90001 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'BeginFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674147273, + 'tts': 90157 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'RequestMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674147296, + 'tts': 90179 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'BeginFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674163929, + 'tts': 90337 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'RequestMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674163951, + 'tts': 90358 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673747387, + 'tts': 182445 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 476}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 100, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 97, + 'tid': 9, + 'ts': 1122673747439, + 'tts': 182498 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 45, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 42, + 'tid': 9, + 'ts': 1122673747475, + 'tts': 182534 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 477}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673747507, + 'tts': 182565 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689544, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673747532, + 'tts': 182591 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673747547, + 'tts': 182605 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673747592, + 'tts': 182650 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673747621, + 'tts': 182680 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673747636, + 'tts': 182694 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673764047, + 'tts': 182781 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673764060, + 'tts': 182792 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 477}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 99, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 97, + 'tid': 9, + 'ts': 1122673764089, + 'tts': 182821 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 45, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 42, + 'tid': 9, + 'ts': 1122673764125, + 'tts': 182858 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 478}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673764156, + 'tts': 182889 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689560, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673764182, + 'tts': 182914 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673764196, + 'tts': 182929 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673764241, + 'tts': 182973 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673764268, + 'tts': 183001 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673764283, + 'tts': 183015 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673780702, + 'tts': 183103 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673780715, + 'tts': 183114 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 478}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 106, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 104, + 'tid': 9, + 'ts': 1122673780744, + 'tts': 183143 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 44, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 42, + 'tid': 9, + 'ts': 1122673780787, + 'tts': 183186 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 479}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673780818, + 'tts': 183217 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689576, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673780844, + 'tts': 183243 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673780858, + 'tts': 183257 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673780902, + 'tts': 183302 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673780932, + 'tts': 183331 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673780946, + 'tts': 183346 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673797374, + 'tts': 183434 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673797387, + 'tts': 183445 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 479}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 106, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 104, + 'tid': 9, + 'ts': 1122673797416, + 'tts': 183475 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 45, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 42, + 'tid': 9, + 'ts': 1122673797458, + 'tts': 183517 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 480}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673797489, + 'tts': 183548 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689592, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673797516, + 'tts': 183575 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673797530, + 'tts': 183589 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673797575, + 'tts': 183633 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673797604, + 'tts': 183662 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673797618, + 'tts': 183677 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673814044, + 'tts': 183764 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673814056, + 'tts': 183776 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 480}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 98, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 96, + 'tid': 9, + 'ts': 1122673814086, + 'tts': 183805 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 45, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 43, + 'tid': 9, + 'ts': 1122673814121, + 'tts': 183840 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 481}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673814153, + 'tts': 183872 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689608, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673814178, + 'tts': 183897 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673814193, + 'tts': 183912 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673814237, + 'tts': 183956 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673814265, + 'tts': 183985 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673814280, + 'tts': 183999 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673830696, + 'tts': 184086 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673830709, + 'tts': 184097 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 481}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 99, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 97, + 'tid': 9, + 'ts': 1122673830738, + 'tts': 184126 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 45, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 42, + 'tid': 9, + 'ts': 1122673830774, + 'tts': 184163 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 482}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673830806, + 'tts': 184194 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689624, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673830831, + 'tts': 184219 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673830846, + 'tts': 184234 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673830890, + 'tts': 184278 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673830917, + 'tts': 184305 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673830932, + 'tts': 184320 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122673847325, + 'tts': 184405 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122673847337, + 'tts': 184417 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674030729, + 'tts': 188070 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 493}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 98, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 96, + 'tid': 9, + 'ts': 1122674030758, + 'tts': 188099 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 44, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 42, + 'tid': 9, + 'ts': 1122674030794, + 'tts': 188135 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 494}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674030825, + 'tts': 188166 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689816, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674030850, + 'tts': 188191 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674030864, + 'tts': 188205 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674030908, + 'tts': 188249 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674030937, + 'tts': 188278 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674030951, + 'tts': 188292 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674047345, + 'tts': 188381 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674047358, + 'tts': 188393 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 494}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 98, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 96, + 'tid': 9, + 'ts': 1122674047387, + 'tts': 188422 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 45, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 43, + 'tid': 9, + 'ts': 1122674047422, + 'tts': 188457 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 495}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674047453, + 'tts': 188489 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689832, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674047479, + 'tts': 188514 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674047493, + 'tts': 188528 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674047538, + 'tts': 188573 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674047566, + 'tts': 188601 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674047580, + 'tts': 188615 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674064041, + 'tts': 188723 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674064054, + 'tts': 188735 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 495}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 114, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 112, + 'tid': 9, + 'ts': 1122674064084, + 'tts': 188765 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 60, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 57, + 'tid': 9, + 'ts': 1122674064120, + 'tts': 188801 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 496}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674064166, + 'tts': 188847 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689848, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674064192, + 'tts': 188873 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674064207, + 'tts': 188888 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674064252, + 'tts': 188933 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674064279, + 'tts': 188960 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674064293, + 'tts': 188974 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674080701, + 'tts': 189063 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674080714, + 'tts': 189075 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 496}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 112, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 110, + 'tid': 9, + 'ts': 1122674080743, + 'tts': 189104 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 46, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 44, + 'tid': 9, + 'ts': 1122674080791, + 'tts': 189152 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 497}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674080823, + 'tts': 189185 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689864, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674080849, + 'tts': 189210 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674080864, + 'tts': 189225 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674080908, + 'tts': 189269 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674080936, + 'tts': 189297 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674080950, + 'tts': 189312 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674097365, + 'tts': 189401 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674097378, + 'tts': 189412 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 497}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 97, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 95, + 'tid': 9, + 'ts': 1122674097407, + 'tts': 189441 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 43, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 42, + 'tid': 9, + 'ts': 1122674097443, + 'tts': 189477 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 498}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674097473, + 'tts': 189507 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689880, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674097498, + 'tts': 189532 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674097513, + 'tts': 189547 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674097556, + 'tts': 189591 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674097585, + 'tts': 189619 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674097599, + 'tts': 189634 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674114019, + 'tts': 189724 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674114032, + 'tts': 189735 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 498}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 97, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 95, + 'tid': 9, + 'ts': 1122674114061, + 'tts': 189765 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 45, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 42, + 'tid': 9, + 'ts': 1122674114096, + 'tts': 189800 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 499}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674114127, + 'tts': 189830 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689896, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674114153, + 'tts': 189856 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674114167, + 'tts': 189870 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674114211, + 'tts': 189914 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674114239, + 'tts': 189942 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674114253, + 'tts': 189957 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674130694, + 'tts': 190042 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674130707, + 'tts': 190054 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 499}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 98, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 95, + 'tid': 9, + 'ts': 1122674130736, + 'tts': 190084 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 44, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 42, + 'tid': 9, + 'ts': 1122674130772, + 'tts': 190119 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 500}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674130802, + 'tts': 190150 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689912, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674130828, + 'tts': 190175 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674130842, + 'tts': 190189 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674130887, + 'tts': 190234 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674130914, + 'tts': 190262 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674130929, + 'tts': 190276 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674147364, + 'tts': 190365 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674147377, + 'tts': 190376 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 500}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 111, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 109, + 'tid': 9, + 'ts': 1122674147406, + 'tts': 190406 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 47, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 44, + 'tid': 9, + 'ts': 1122674147452, + 'tts': 190453 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 501}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674147486, + 'tts': 190486 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689928, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674147511, + 'tts': 190511 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674147526, + 'tts': 190526 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674147570, + 'tts': 190570 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674147598, + 'tts': 190598 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674147613, + 'tts': 190613 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674164055, + 'tts': 190720 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674164068, + 'tts': 190732 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 501}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 113, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 111, + 'tid': 9, + 'ts': 1122674164097, + 'tts': 190761 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 46, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 44, + 'tid': 9, + 'ts': 1122674164146, + 'tts': 190810 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 502}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674164178, + 'tts': 190842 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689944, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674164204, + 'tts': 190868 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674164219, + 'tts': 190883 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674164263, + 'tts': 190927 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674164312, + 'tts': 190976 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674164327, + 'tts': 190991 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674180694, + 'tts': 191071 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674180707, + 'tts': 191083 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 502}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 111, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 109, + 'tid': 9, + 'ts': 1122674180736, + 'tts': 191112 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 46, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 43, + 'tid': 9, + 'ts': 1122674180783, + 'tts': 191160 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 503}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674180816, + 'tts': 191192 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689960, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674180841, + 'tts': 191217 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674180855, + 'tts': 191232 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674180899, + 'tts': 191276 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674180928, + 'tts': 191305 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674180943, + 'tts': 191319 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674197354, + 'tts': 191407 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674197367, + 'tts': 191418 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 503}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 98, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 96, + 'tid': 9, + 'ts': 1122674197396, + 'tts': 191447 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 45, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 42, + 'tid': 9, + 'ts': 1122674197431, + 'tts': 191483 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 504}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674197462, + 'tts': 191514 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689976, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674197487, + 'tts': 191539 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674197502, + 'tts': 191553 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674197546, + 'tts': 191598 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674197590, + 'tts': 191642 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674197606, + 'tts': 191657 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674214025, + 'tts': 191747 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674214038, + 'tts': 191759 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 504}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 111, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 110, + 'tid': 9, + 'ts': 1122674214067, + 'tts': 191788 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 45, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 43, + 'tid': 9, + 'ts': 1122674214115, + 'tts': 191836 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 505}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674214147, + 'tts': 191868 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689992, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674214173, + 'tts': 191894 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674214187, + 'tts': 191908 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674214232, + 'tts': 191953 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674214259, + 'tts': 191981 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674214274, + 'tts': 191995 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674230673, + 'tts': 192083 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674230686, + 'tts': 192095 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 505}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 125, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 123, + 'tid': 9, + 'ts': 1122674230716, + 'tts': 192124 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 48, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 46, + 'tid': 9, + 'ts': 1122674230775, + 'tts': 192183 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 506}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674230809, + 'tts': 192217 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2690008, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674230835, + 'tts': 192243 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674230849, + 'tts': 192258 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674230894, + 'tts': 192303 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674230924, + 'tts': 192332 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674230938, + 'tts': 192347 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674247362, + 'tts': 192436 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674247374, + 'tts': 192447 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 506}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 97, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 95, + 'tid': 9, + 'ts': 1122674247403, + 'tts': 192476 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 43, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 41, + 'tid': 9, + 'ts': 1122674247439, + 'tts': 192512 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 507}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674247469, + 'tts': 192543 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2690024, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674247494, + 'tts': 192567 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674247509, + 'tts': 192582 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674247553, + 'tts': 192626 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674247581, + 'tts': 192655 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674247596, + 'tts': 192669 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674264048, + 'tts': 192774 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674264062, + 'tts': 192786 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 507}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 99, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 97, + 'tid': 9, + 'ts': 1122674264091, + 'tts': 192815 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 45, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 42, + 'tid': 9, + 'ts': 1122674264127, + 'tts': 192851 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 508}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674264158, + 'tts': 192883 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2690040, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674264184, + 'tts': 192908 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674264199, + 'tts': 192923 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674264243, + 'tts': 192967 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674264272, + 'tts': 192996 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674264286, + 'tts': 193010 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674280687, + 'tts': 193099 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'BeginFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674180599, + 'tts': 90536 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'RequestMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674180634, + 'tts': 90570 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'BeginFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674197265, + 'tts': 90728 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'RequestMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674197288, + 'tts': 90750 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'BeginFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674213934, + 'tts': 90908 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'RequestMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674213956, + 'tts': 90929 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'BeginFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674230583, + 'tts': 91100 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'RequestMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674230606, + 'tts': 91122 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'BeginFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674247271, + 'tts': 91300 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'RequestMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674247293, + 'tts': 91321 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'BeginFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674263915, + 'tts': 91477 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'RequestMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674263938, + 'tts': 91499 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'BeginFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674280596, + 'tts': 91655 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'RequestMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674280619, + 'tts': 91677 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'BeginFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674297261, + 'tts': 91831 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'RequestMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674297287, + 'tts': 91856 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'BeginFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674313908, + 'tts': 92015 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'RequestMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674313930, + 'tts': 92036 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'BeginFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674330601, + 'tts': 92208 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'RequestMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674330623, + 'tts': 92230 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'BeginFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674347259, + 'tts': 92385 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'RequestMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674347281, + 'tts': 92407 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'BeginFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674363933, + 'tts': 92564 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'RequestMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674363956, + 'tts': 92586 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'BeginFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674380587, + 'tts': 92742 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'RequestMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674380610, + 'tts': 92764 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'BeginFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674397245, + 'tts': 92919 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'RequestMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674397268, + 'tts': 92940 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'BeginFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674413915, + 'tts': 93111 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'RequestMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674413938, + 'tts': 93133 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'BeginFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674430594, + 'tts': 93290 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'RequestMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674430617, + 'tts': 93312 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'BeginFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674447250, + 'tts': 93468 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'RequestMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674447273, + 'tts': 93490 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'BeginFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674463925, + 'tts': 93617 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'RequestMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674463948, + 'tts': 93639 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'BeginFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674480599, + 'tts': 93799 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'RequestMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674480621, + 'tts': 93820 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'BeginFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674497252, + 'tts': 93974 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'RequestMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674497275, + 'tts': 93996 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'BeginFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674513924, + 'tts': 94167 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'RequestMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674513946, + 'tts': 94189 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'BeginFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674530585, + 'tts': 94357 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'RequestMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674530607, + 'tts': 94379 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'BeginFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674547254, + 'tts': 94537 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'RequestMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674547276, + 'tts': 94558 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'BeginFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674563916, + 'tts': 94716 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline.frame', + 'name': 'RequestMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 't', + 'tid': 17, + 'ts': 1122674563954, + 'tts': 94753 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674514204, + 'tts': 198558 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674514232, + 'tts': 198586 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674514246, + 'tts': 198600 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674530672, + 'tts': 198686 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674530685, + 'tts': 198697 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 523}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 97, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 95, + 'tid': 9, + 'ts': 1122674530714, + 'tts': 198727 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 44, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 41, + 'tid': 9, + 'ts': 1122674530749, + 'tts': 198762 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 524}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674530780, + 'tts': 198792 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2693784, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674530805, + 'tts': 198817 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674530820, + 'tts': 198832 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674530864, + 'tts': 198876 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674530892, + 'tts': 198905 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674530907, + 'tts': 198919 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674547345, + 'tts': 199009 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674547358, + 'tts': 199020 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 524}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 98, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 95, + 'tid': 9, + 'ts': 1122674547387, + 'tts': 199050 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 44, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 41, + 'tid': 9, + 'ts': 1122674547423, + 'tts': 199086 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 525}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674547454, + 'tts': 199116 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2693800, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674547479, + 'tts': 199141 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674547493, + 'tts': 199156 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674547538, + 'tts': 199200 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674547566, + 'tts': 199229 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674547581, + 'tts': 199243 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674564053, + 'tts': 199343 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'BeginMainThreadFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674564066, + 'tts': 199355 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 525}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 99, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3834, + 'tdur': 97, + 'tid': 9, + 'ts': 1122674564096, + 'tts': 199384 + }, + { + 'args': { + 'data': + {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'} + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 44, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3834, + 'tdur': 42, + 'tid': 9, + 'ts': 1122674564132, + 'tts': 199420 + }, + { + 'args': {'data': {'frame': '0x1100e70a8000', 'id': 526}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674564162, + 'tts': 199451 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2693816, 'nodes': 7}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674564188, + 'tts': 199477 + }, + { + 'args': {'frame': '0x1100e70a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3834, + 's': 'g', + 'tid': 9, + 'ts': 1122674564203, + 'tts': 199492 + }, + { + 'args': {'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'B', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674564248, + 'tts': 199536 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'CompositeLayers', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674564276, + 'tts': 199565 + }, + { + 'args': {}, + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Program', + 'ph': 'E', + 'pid': 3834, + 'tid': 9, + 'ts': 1122674564291, + 'tts': 199579 + }, + { + 'args': {'number': 32}, + + 'cat': '__metadata', + 'name': 'num_cpus', + 'ph': 'M', + 'pid': 3834, + 'tid': 0, + 'ts': 0 + }, + { + 'args': {'sort_index': -5}, + + 'cat': '__metadata', + 'name': 'process_sort_index', + 'ph': 'M', + 'pid': 3834, + 'tid': 10, + 'ts': 0 + }, + { + 'args': {'name': 'Renderer'}, + + 'cat': '__metadata', + 'name': 'process_name', + 'ph': 'M', + 'pid': 3834, + 'tid': 10, + 'ts': 0 + }, + { + 'args': {'sort_index': -1}, + + 'cat': '__metadata', + 'name': 'thread_sort_index', + 'ph': 'M', + 'pid': 3834, + 'tid': 9, + 'ts': 0 + }, + { + 'args': {'name': 'CrRendererMain'}, + + 'cat': '__metadata', + 'name': 'thread_name', + 'ph': 'M', + 'pid': 3834, + 'tid': 9, + 'ts': 0 + }, + { + 'args': {'name': 'Compositor'}, + + 'cat': '__metadata', + 'name': 'thread_name', + 'ph': 'M', + 'pid': 3834, + 'tid': 17, + 'ts': 0 + }, + { + 'args': {'elementCount': 47}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RecalculateStyles', + 'ph': 'E', + 'pid': 3872, + 'tid': 26, + 'ts': 1122673092850, + 'tts': 827512 + }, + { + 'args': + {'beginData': {'dirtyObjects': 44, 'frame': '0x176b9c2a8000', 'partialLayout': false, 'totalObjects': 261}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Layout', + 'ph': 'B', + 'pid': 3872, + 'tid': 26, + 'ts': 1122673092873, + 'tts': 827535 + }, + { + 'args': {'endData': {'root': [0, 0, 1570, 0, 1570, 1472, 0, 1472], 'rootNode': 2}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'Layout', + 'ph': 'E', + 'pid': 3872, + 'tid': 26, + 'ts': 1122673093523, + 'tts': 828186 + }, + { + 'args': {'data': {'frame': '0x176b9c2a8000', 'id': 12}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 1828, + 'name': 'FireAnimationFrame', + 'ph': 'X', + 'pid': 3872, + 'tdur': 1827, + 'tid': 26, + 'ts': 1122673093558, + 'tts': 828220 + }, + { + 'args': { + 'data': { + 'frame': '0x176b9c2a8000', + 'scriptId': '65', + 'scriptLine': 939, + 'scriptName': 'chrome-devtools://devtools/bundled/ui/UIUtils.js' + } + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 1770, + 'name': 'FunctionCall', + 'ph': 'X', + 'pid': 3872, + 'tdur': 1770, + 'tid': 26, + 'ts': 1122673093604, + 'tts': 828265 + }, + { + 'args': {'frame': '0x176b9c2a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'ScheduleStyleRecalculation', + 'ph': 'I', + 'pid': 3872, + 's': 'g', + 'tid': 26, + 'ts': 1122673094798, + 'tts': 829461 + }, + { + 'args': {'frame': '0x176b9c2a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RecalculateStyles', + 'ph': 'B', + 'pid': 3872, + 'tid': 26, + 'ts': 1122673094958, + 'tts': 829620 + }, + { + 'args': {'elementCount': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RecalculateStyles', + 'ph': 'E', + 'pid': 3872, + 'tid': 26, + 'ts': 1122673094989, + 'tts': 829651 + }, + { + 'args': {'data': {'frame': '0x176b9c2a8000', 'id': 13}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'RequestAnimationFrame', + 'ph': 'I', + 'pid': 3872, + 's': 'g', + 'tid': 26, + 'ts': 1122673095367, + 'tts': 830030 + }, + { + 'args': {'data': {'documents': 1, 'jsEventListeners': 141, 'jsHeapSizeUsed': 15850696, 'nodes': 1705}}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateCounters', + 'ph': 'I', + 'pid': 3872, + 's': 'g', + 'tid': 26, + 'ts': 1122673095384, + 'tts': 830046 + }, + { + 'args': {'frame': '0x176b9c2a8000'}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayerTree', + 'ph': 'I', + 'pid': 3872, + 's': 'g', + 'tid': 26, + 'ts': 1122673095390, + 'tts': 830052 + }, + { + 'args': {'layerId': 11, 'layerTreeId': 1}, + + 'cat': 'disabled-by-default-devtools.timeline', + 'name': 'UpdateLayer', + 'ph': 'B', + 'pid': 3872, + 'tid': 26, + 'ts': 1122673095845, + 'tts': 830507 + }, + { + 'args': { + 'data': { + 'clip': [-15, -15, 1585, -15, 1585, 1487, -15, 1487], + 'frame': '0x176b9c2a8000', + 'layerId': 11, + 'nodeId': 2 + } + }, + + 'cat': 'disabled-by-default-devtools.timeline', + 'dur': 4637, + 'name': 'Paint', + 'ph': 'X', + 'pid': 3872, + 'tdur': 4630, + 'tid': 26, + 'ts': 1122673095897, + 'tts': 830559 + }, + { + 'args': {'name': 'Browser'}, + + 'cat': '__metadata', + 'name': 'process_name', + 'ph': 'M', + 'pid': 3778, + 'tid': 3801, + 'ts': 0 + }, + { + 'args': {'name': 'CrBrowserMain'}, + + 'cat': '__metadata', + 'name': 'thread_name', + 'ph': 'M', + 'pid': 3778, + 'tid': 3778, + 'ts': 0 + } + ]); +};
diff --git a/third_party/WebKit/Source/devtools/front_end/performance_test_runner/TimelineTestRunner.js b/third_party/WebKit/Source/devtools/front_end/performance_test_runner/TimelineTestRunner.js new file mode 100644 index 0000000..2f8442b --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/performance_test_runner/TimelineTestRunner.js
@@ -0,0 +1,408 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +PerformanceTestRunner.timelinePropertyFormatters = { + children: 'formatAsTypeName', + endTime: 'formatAsTypeName', + requestId: 'formatAsTypeName', + startTime: 'formatAsTypeName', + stackTrace: 'formatAsTypeName', + url: 'formatAsURL', + scriptName: 'formatAsTypeName', + scriptId: 'formatAsTypeName', + usedHeapSizeDelta: 'skip', + mimeType: 'formatAsTypeName', + id: 'formatAsTypeName', + timerId: 'formatAsTypeName', + scriptLine: 'formatAsTypeName', + layerId: 'formatAsTypeName', + lineNumber: 'formatAsTypeName', + columnNumber: 'formatAsTypeName', + frameId: 'formatAsTypeName', + frame: 'formatAsTypeName', + page: 'formatAsTypeName', + encodedDataLength: 'formatAsTypeName', + identifier: 'formatAsTypeName', + clip: 'formatAsTypeName', + root: 'formatAsTypeName', + backendNodeId: 'formatAsTypeName', + nodeId: 'formatAsTypeName', + rootNode: 'formatAsTypeName', + finishTime: 'formatAsTypeName', + thread: 'formatAsTypeName', + allottedMilliseconds: 'formatAsTypeName', + timedOut: 'formatAsTypeName', + networkTime: 'formatAsTypeName' +}; + +PerformanceTestRunner.InvalidationFormatters = { + _tracingEvent: 'skip', + cause: 'formatAsInvalidationCause', + frame: 'skip', + invalidatedSelectorId: 'skip', + invalidationList: 'skip', + invalidationSet: 'skip', + linkedRecalcStyleEvent: 'skip', + linkedLayoutEvent: 'skip', + nodeId: 'skip', + paintId: 'skip', + startTime: 'skip' +}; + +TestRunner.formatters.formatAsInvalidationCause = function(cause) { + if (!cause) + return '<undefined>'; + + var stackTrace; + + if (cause.stackTrace && cause.stackTrace.length) { + stackTrace = + TestRunner.formatters.formatAsURL(cause.stackTrace[0].url) + ':' + (cause.stackTrace[0].lineNumber + 1); + } + + return '{reason: ' + cause.reason + ', stackTrace: ' + stackTrace + '}'; +}; + +PerformanceTestRunner.createTracingModel = function(events) { + var model = new SDK.TracingModel(new Bindings.TempFileBackingStorage('tracing')); + model.addEvents(events); + model.tracingComplete(); + return model; +}; + +PerformanceTestRunner.tracingModel = function() { + return UI.panels.timeline._performanceModel.tracingModel(); +}; + +PerformanceTestRunner.invokeWithTracing = function(functionName, callback, additionalCategories, enableJSSampling) { + var categories = + '-*,disabled-by-default-devtools.timeline*,devtools.timeline,' + SDK.TracingModel.TopLevelEventCategory; + + if (additionalCategories) + categories += ',' + additionalCategories; + + var timelinePanel = UI.panels.timeline; + var timelineController = PerformanceTestRunner.timelineController(); + timelinePanel._timelineController = timelineController; + timelineController._startRecordingWithCategories(categories, enableJSSampling).then(tracingStarted); + + function tracingStarted() { + timelinePanel._recordingStarted(); + TestRunner.callFunctionInPageAsync(functionName).then(onPageActionsDone); + } + + function onPageActionsDone() { + PerformanceTestRunner.runWhenTimelineIsReady(callback); + timelineController.stopRecording(); + } +}; + +PerformanceTestRunner.performanceModel = function() { + return UI.panels.timeline._performanceModel; +}; + +PerformanceTestRunner.timelineModel = function() { + return PerformanceTestRunner.performanceModel().timelineModel(); +}; + +PerformanceTestRunner.timelineFrameModel = function() { + return PerformanceTestRunner.performanceModel().frameModel(); +}; + +PerformanceTestRunner.createPerformanceModelWithEvents = function(events) { + var tracingModel = new SDK.TracingModel(new Bindings.TempFileBackingStorage('tracing')); + tracingModel.addEvents(events); + tracingModel.tracingComplete(); + var performanceModel = new Timeline.PerformanceModel(); + performanceModel.setTracingModel(tracingModel); + return performanceModel; +}; + +PerformanceTestRunner.timelineController = function() { + var performanceModel = new Timeline.PerformanceModel(); + UI.panels.timeline._pendingPerformanceModel = performanceModel; + return new Timeline.TimelineController(TestRunner.tracingManager, performanceModel, UI.panels.timeline); +}; + +PerformanceTestRunner.runWhenTimelineIsReady = function(callback) { + TestRunner.addSniffer(UI.panels.timeline, 'loadingComplete', () => callback()); +}; + +PerformanceTestRunner.startTimeline = function(callback) { + var panel = UI.panels.timeline; + TestRunner.addSniffer(panel, '_recordingStarted', callback); + panel._toggleRecording(); +}; + +PerformanceTestRunner.stopTimeline = function(callback) { + PerformanceTestRunner.runWhenTimelineIsReady(callback); + UI.panels.timeline._toggleRecording(); +}; + +PerformanceTestRunner.evaluateWithTimeline = function(actions, doneCallback) { + PerformanceTestRunner.startTimeline(step1); + + function step1() { + TestRunner.evaluateInPage(actions, step2); + } + + function step2() { + PerformanceTestRunner.stopTimeline(doneCallback); + } +}; + +PerformanceTestRunner.invokeAsyncWithTimeline = function(functionName, doneCallback) { + PerformanceTestRunner.startTimeline(step1); + + function step1() { + TestRunner.callFunctionInPageAsync(functionName).then(step2); + } + + function step2() { + PerformanceTestRunner.stopTimeline(TestRunner.safeWrap(doneCallback)); + } +}; + +PerformanceTestRunner.performActionsAndPrint = function(actions, typeName, includeTimeStamps) { + function callback() { + PerformanceTestRunner.printTimelineRecordsWithDetails(typeName); + + if (includeTimeStamps) { + TestRunner.addResult('Timestamp records: '); + PerformanceTestRunner.printTimestampRecords(typeName); + } + + TestRunner.completeTest(); + } + + PerformanceTestRunner.evaluateWithTimeline(actions, callback); +}; + +PerformanceTestRunner.printTimelineRecords = function(name) { + for (let event of PerformanceTestRunner.timelineModel().mainThreadEvents()) { + if (event.name === name) + PerformanceTestRunner.printTraceEventProperties(event); + } +}; + +PerformanceTestRunner.printTimelineRecordsWithDetails = function(name) { + for (let event of PerformanceTestRunner.timelineModel().mainThreadEvents()) { + if (name === event.name) + PerformanceTestRunner.printTraceEventPropertiesWithDetails(event); + } +}; + +PerformanceTestRunner.walkTimelineEventTree = function(callback) { + var performanceModel = PerformanceTestRunner.performanceModel(); + var view = new Timeline.EventsTimelineTreeView(UI.panels.timeline._filters, null); + view.setModel(performanceModel); + var selection = Timeline.TimelineSelection.fromRange( + performanceModel.timelineModel().minimumRecordTime(), performanceModel.timelineModel().maximumRecordTime()); + view.updateContents(selection); + PerformanceTestRunner.walkTimelineEventTreeUnderNode(callback, view._currentTree, 0); +}; + +PerformanceTestRunner.walkTimelineEventTreeUnderNode = function(callback, root, level) { + var event = root.event; + + if (event) + callback(event, level); + + for (var child of root.children().values()) + PerformanceTestRunner.walkTimelineEventTreeUnderNode(callback, child, (level || 0) + 1); +}; + +PerformanceTestRunner.printTimestampRecords = function(typeName) { + var dividers = PerformanceTestRunner.timelineModel().eventDividers(); + + for (var event of dividers) { + if (event.name === typeName) + PerformanceTestRunner.printTraceEventProperties(event); + } +}; + +PerformanceTestRunner.forAllEvents = function(events, callback) { + let eventStack = []; + + for (let event of events) { + while (eventStack.length && eventStack.peekLast().endTime <= event.startTime) + eventStack.pop(); + + callback(event, eventStack); + + if (event.endTime) + eventStack.push(event); + } +}; + +PerformanceTestRunner.printTraceEventProperties = function(traceEvent) { + TestRunner.addResult(traceEvent.name + ' Properties:'); + var data = traceEvent.args['beginData'] || traceEvent.args['data']; + var frameId = data && data['frame']; + + var object = { + data: traceEvent.args['data'] || traceEvent.args, + endTime: traceEvent.endTime || traceEvent.startTime, + frameId: frameId, + stackTrace: TimelineModel.TimelineData.forEvent(traceEvent).stackTrace, + startTime: traceEvent.startTime, + type: traceEvent.name + }; + + for (var field in object) { + if (object[field] === null || object[field] === undefined) + delete object[field]; + } + + TestRunner.addObject(object, PerformanceTestRunner.timelinePropertyFormatters); +}; + +PerformanceTestRunner.printTraceEventPropertiesWithDetails = function(event) { + PerformanceTestRunner.printTraceEventProperties(event); + const details = Timeline.TimelineUIUtils.buildDetailsTextForTraceEvent( + event, SDK.targetManager.mainTarget(), new Components.Linkifier()); + TestRunner.addResult(`Text details for ${event.name}: ${details}`); + + if (TimelineModel.TimelineData.forEvent(event).warning) + TestRunner.addResult(`${event.name} has a warning`); +}; + +PerformanceTestRunner.findTimelineEvent = function(name, index) { + return PerformanceTestRunner.timelineModel().mainThreadEvents().filter(e => e.name === name)[index || 0]; +}; + +PerformanceTestRunner.findChildEvent = function(events, parentIndex, name) { + var endTime = events[parentIndex].endTime; + + for (var i = parentIndex + 1; i < events.length && (!events[i].endTime || events[i].endTime <= endTime); ++i) { + if (events[i].name === name) + return events[i]; + } + + return null; +}; + +PerformanceTestRunner.dumpFrame = function(frame) { + var fieldsToDump = [ + 'cpuTime', 'duration', 'startTime', 'endTime', 'id', 'mainThreadFrameId', 'timeByCategory', 'other', 'scripting', + 'painting', 'rendering', 'committedFrom', 'idle' + ]; + + function formatFields(object) { + var result = {}; + + for (var key in object) { + if (fieldsToDump.indexOf(key) < 0) + continue; + + var value = object[key]; + + if (typeof value === 'number') + value = Number(value.toFixed(7)); + else if (typeof value === 'object' && value) + value = formatFields(value); + + result[key] = value; + } + + return result; + } + + TestRunner.addObject(formatFields(frame)); +}; + +PerformanceTestRunner.dumpInvalidations = function(recordType, index, comment) { + var event = PerformanceTestRunner.findTimelineEvent(recordType, index || 0); + + TestRunner.addArray( + TimelineModel.InvalidationTracker.invalidationEventsFor(event), PerformanceTestRunner.InvalidationFormatters, '', + comment); +}; + +PerformanceTestRunner.dumpFlameChartProvider = function(provider, includeGroups) { + var includeGroupsSet = includeGroups && new Set(includeGroups); + var timelineData = provider.timelineData(); + var stackDepth = provider.maxStackDepth(); + var entriesByLevel = new Multimap(); + + for (let i = 0; i < timelineData.entryLevels.length; ++i) + entriesByLevel.set(timelineData.entryLevels[i], i); + + for (let groupIndex = 0; groupIndex < timelineData.groups.length; ++groupIndex) { + const group = timelineData.groups[groupIndex]; + + if (includeGroupsSet && !includeGroupsSet.has(group.name)) + continue; + + var maxLevel = + (groupIndex + 1 < timelineData.groups.length ? timelineData.groups[groupIndex + 1].firstLevel : stackDepth); + TestRunner.addResult(`Group: ${group.name}`); + + for (let level = group.startLevel; level < maxLevel; ++level) { + TestRunner.addResult(`Level ${level - group.startLevel}`); + var entries = entriesByLevel.get(level); + + for (const index of entries) { + const title = provider.entryTitle(index); + const color = provider.entryColor(index); + TestRunner.addResult(`${title} (${color})`); + } + } + } +}; + +PerformanceTestRunner.dumpTimelineFlameChart = function(includeGroups) { + const provider = UI.panels.timeline._flameChart._mainDataProvider; + TestRunner.addResult('Timeline Flame Chart'); + PerformanceTestRunner.dumpFlameChartProvider(provider, includeGroups); +}; + +PerformanceTestRunner.loadTimeline = function(timelineData) { + var promise = new Promise(fulfill => PerformanceTestRunner.runWhenTimelineIsReady(fulfill)); + + UI.panels.timeline._loadFromFile(new Blob([timelineData], {type: 'text/plain'})); + + return promise; +}; + +(async function() { + await TestRunner.evaluateInPagePromise(` + function wrapCallFunctionForTimeline(f) { + var script = document.createElement('script'); + script.textContent = '(' + f.toString() + ')()\n//# sourceURL=wrapCallFunctionForTimeline.js'; + document.body.appendChild(script); + } + + function generateFrames(count) { + var promise = Promise.resolve(); + + for (let i = count; i > 0; --i) + promise = promise.then(changeBackgroundAndWaitForFrame.bind(null, i)); + + return promise; + + function changeBackgroundAndWaitForFrame(i) { + document.body.style.backgroundColor = (i & 1 ? 'rgb(200, 200, 200)' : 'rgb(240, 240, 240)'); + return waitForFrame(); + } + } + + function waitForFrame() { + var callback; + var promise = new Promise(fulfill => callback = fulfill); + + if (window.testRunner) + testRunner.capturePixelsAsyncThen(() => window.requestAnimationFrame(callback)); + else + window.requestAnimationFrame(callback); + + return promise; + } + `); +})();
diff --git a/third_party/WebKit/Source/devtools/front_end/performance_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/performance_test_runner/module.json new file mode 100644 index 0000000..c3e98e8 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/performance_test_runner/module.json
@@ -0,0 +1,16 @@ +{ + "dependencies": [ + "test_runner", + "integration_test_runner", + "timeline_model", + "timeline" + ], + "scripts": [ + "TimelineTestRunner.js", + "TimelineDataTestRunner.js" + ], + "skip_compilation": [ + "TimelineTestRunner.js", + "TimelineDataTestRunner.js" + ] +}
diff --git a/third_party/WebKit/Source/devtools/front_end/profiler_test_runner/HeapSnapshotTestRunner.js b/third_party/WebKit/Source/devtools/front_end/profiler_test_runner/HeapSnapshotTestRunner.js new file mode 100644 index 0000000..c6a2e2d --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/profiler_test_runner/HeapSnapshotTestRunner.js
@@ -0,0 +1,641 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +ProfilerTestRunner.createHeapSnapshotMockFactories = function() { + ProfilerTestRunner.createJSHeapSnapshotMockObject = function() { + return { + _rootNodeIndex: 0, + _nodeTypeOffset: 0, + _nodeNameOffset: 1, + _nodeEdgeCountOffset: 2, + _nodeFieldCount: 3, + _edgeFieldsCount: 3, + _edgeTypeOffset: 0, + _edgeNameOffset: 1, + _edgeToNodeOffset: 2, + _nodeTypes: ['hidden', 'object'], + _edgeTypes: ['element', 'property', 'shortcut'], + _edgeShortcutType: -1, + _edgeHiddenType: -1, + _edgeElementType: 0, + _realNodesLength: 18, + nodes: new Uint32Array([0, 0, 2, 1, 1, 2, 1, 2, 2, 1, 3, 1, 1, 4, 0, 1, 5, 0]), + containmentEdges: new Uint32Array([2, 6, 3, 1, 7, 6, 0, 1, 6, 1, 8, 9, 1, 9, 9, 1, 10, 12, 1, 11, 15]), + strings: ['', 'A', 'B', 'C', 'D', 'E', 'a', 'b', 'ac', 'bc', 'bd', 'ce'], + _firstEdgeIndexes: new Uint32Array([0, 6, 12, 18, 21, 21, 21]), + createNode: HeapSnapshotWorker.JSHeapSnapshot.prototype.createNode, + createEdge: HeapSnapshotWorker.JSHeapSnapshot.prototype.createEdge, + createRetainingEdge: HeapSnapshotWorker.JSHeapSnapshot.prototype.createRetainingEdge + }; + }; + + ProfilerTestRunner.createHeapSnapshotMockRaw = function() { + return { + snapshot: { + meta: { + node_fields: ['type', 'name', 'id', 'self_size', 'retained_size', 'dominator', 'edge_count'], + node_types: [['hidden', 'object'], '', '', '', '', '', ''], + edge_fields: ['type', 'name_or_index', 'to_node'], + edge_types: [['element', 'property', 'shortcut'], '', ''] + }, + + node_count: 6, + edge_count: 7 + }, + + nodes: [ + 0, 0, 1, 0, 20, 0, 2, 1, 1, 2, 2, 2, 0, 2, 1, 2, 3, 3, 8, 0, 2, + 1, 3, 4, 4, 10, 0, 1, 1, 4, 5, 5, 5, 14, 0, 1, 5, 6, 6, 6, 21, 0 + ], + + edges: [1, 6, 7, 1, 7, 14, 0, 1, 14, 1, 8, 21, 1, 9, 21, 1, 10, 28, 1, 11, 35], + strings: ['', 'A', 'B', 'C', 'D', 'E', 'a', 'b', 'ac', 'bc', 'bd', 'ce'] + }; + }; + + ProfilerTestRunner._postprocessHeapSnapshotMock = function(mock) { + mock.nodes = new Uint32Array(mock.nodes); + mock.edges = new Uint32Array(mock.edges); + return mock; + }; + + ProfilerTestRunner.createHeapSnapshotMock = function() { + return ProfilerTestRunner._postprocessHeapSnapshotMock(ProfilerTestRunner.createHeapSnapshotMockRaw()); + }; + + ProfilerTestRunner.createHeapSnapshotMockWithDOM = function() { + return ProfilerTestRunner._postprocessHeapSnapshotMock({ + snapshot: { + meta: { + node_fields: ['type', 'name', 'id', 'edge_count'], + node_types: [['hidden', 'object', 'synthetic'], '', '', ''], + edge_fields: ['type', 'name_or_index', 'to_node'], + edge_types: [['element', 'hidden', 'internal'], '', ''] + }, + + node_count: 13, + edge_count: 13 + }, + + nodes: [ + 2, 0, 1, 4, 1, 11, 2, 2, 1, 11, 3, 3, 2, 5, 4, 0, 2, 6, 5, 1, 1, 1, 6, 0, 1, 2, + 7, 1, 1, 4, 8, 2, 1, 8, 9, 0, 1, 7, 10, 0, 1, 3, 11, 0, 1, 10, 12, 0, 1, 9, 13, 0 + ], + + edges: [ + 0, 1, 4, 0, 2, 8, 0, 3, 12, 0, 4, 16, 0, 1, 20, 0, 2, 24, 0, 1, + 24, 0, 2, 28, 1, 3, 32, 0, 1, 36, 0, 1, 40, 2, 12, 44, 2, 1, 48 + ], + + strings: ['', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'M', 'N', 'Window', 'native'] + }); + }; + + ProfilerTestRunner.HeapNode = function(name, selfSize, type, id) { + this._type = type || ProfilerTestRunner.HeapNode.Type.object; + this._name = name; + this._selfSize = selfSize || 0; + this._builder = null; + this._edges = {}; + this._edgesCount = 0; + this._id = id; + }; + + ProfilerTestRunner.HeapNode.Type = { + 'hidden': 'hidden', + 'array': 'array', + 'string': 'string', + 'object': 'object', + 'code': 'code', + 'closure': 'closure', + 'regexp': 'regexp', + 'number': 'number', + 'native': 'native', + 'synthetic': 'synthetic' + }; + + ProfilerTestRunner.HeapNode.prototype = { + linkNode: function(node, type, nameOrIndex) { + if (!this._builder) + throw new Error('parent node is not connected to a snapshot'); + + if (!node._builder) + node._setBuilder(this._builder); + + if (nameOrIndex === undefined) + nameOrIndex = this._edgesCount; + + ++this._edgesCount; + + if (nameOrIndex in this._edges) { + throw new Error( + 'Can\'t add edge with the same nameOrIndex. nameOrIndex: ' + nameOrIndex + + ' oldNodeName: ' + this._edges[nameOrIndex]._name + ' newNodeName: ' + node._name); + } + + this._edges[nameOrIndex] = new ProfilerTestRunner.HeapEdge(node, type, nameOrIndex); + }, + + _setBuilder: function(builder) { + if (this._builder) + throw new Error('node reusing is prohibited'); + + this._builder = builder; + this._ordinal = this._builder._registerNode(this); + }, + + _serialize: function(rawSnapshot) { + rawSnapshot.nodes.push(this._builder.lookupNodeType(this._type)); + rawSnapshot.nodes.push(this._builder.lookupOrAddString(this._name)); + rawSnapshot.nodes.push(this._id || this._ordinal * 2 + 1); + rawSnapshot.nodes.push(this._selfSize); + rawSnapshot.nodes.push(0); + rawSnapshot.nodes.push(0); + rawSnapshot.nodes.push(Object.keys(this._edges).length); + + for (var i in this._edges) + this._edges[i]._serialize(rawSnapshot); + } + }; + + ProfilerTestRunner.HeapEdge = function(targetNode, type, nameOrIndex) { + this._targetNode = targetNode; + this._type = type; + this._nameOrIndex = nameOrIndex; + }; + + ProfilerTestRunner.HeapEdge.prototype = { + _serialize: function(rawSnapshot) { + if (!this._targetNode._builder) + throw new Error('Inconsistent state of node: ' + this._name + ' no builder assigned'); + + var builder = this._targetNode._builder; + rawSnapshot.edges.push(builder.lookupEdgeType(this._type)); + rawSnapshot.edges.push( + (typeof this._nameOrIndex === 'string' ? builder.lookupOrAddString(this._nameOrIndex) : this._nameOrIndex)); + rawSnapshot.edges.push(this._targetNode._ordinal * builder.nodeFieldsCount); + } + }; + + ProfilerTestRunner.HeapEdge.Type = { + 'context': 'context', + 'element': 'element', + 'property': 'property', + 'internal': 'internal', + 'hidden': 'hidden', + 'shortcut': 'shortcut', + 'weak': 'weak' + }; + + ProfilerTestRunner.HeapSnapshotBuilder = function() { + this._nodes = []; + this._string2id = {}; + this._strings = []; + this.nodeFieldsCount = 7; + this._nodeTypesMap = {}; + this._nodeTypesArray = []; + + for (var nodeType in ProfilerTestRunner.HeapNode.Type) { + this._nodeTypesMap[nodeType] = this._nodeTypesArray.length; + this._nodeTypesArray.push(nodeType); + } + + this._edgeTypesMap = {}; + this._edgeTypesArray = []; + + for (var edgeType in ProfilerTestRunner.HeapEdge.Type) { + this._edgeTypesMap[edgeType] = this._edgeTypesArray.length; + this._edgeTypesArray.push(edgeType); + } + + this.rootNode = new ProfilerTestRunner.HeapNode('root', 0, 'object'); + this.rootNode._setBuilder(this); + }; + + ProfilerTestRunner.HeapSnapshotBuilder.prototype = { + generateSnapshot: function() { + var rawSnapshot = { + 'snapshot': { + 'meta': { + 'node_fields': ['type', 'name', 'id', 'self_size', 'retained_size', 'dominator', 'edge_count'], + 'node_types': [this._nodeTypesArray, 'string', 'number', 'number', 'number', 'number', 'number'], + 'edge_fields': ['type', 'name_or_index', 'to_node'], + 'edge_types': [this._edgeTypesArray, 'string_or_number', 'node'] + } + }, + + 'nodes': [], + 'edges': [], + 'strings': [] + }; + + for (var i = 0; i < this._nodes.length; ++i) + this._nodes[i]._serialize(rawSnapshot); + + rawSnapshot.strings = this._strings.slice(); + var meta = rawSnapshot.snapshot.meta; + rawSnapshot.snapshot.edge_count = rawSnapshot.edges.length / meta.edge_fields.length; + rawSnapshot.snapshot.node_count = rawSnapshot.nodes.length / meta.node_fields.length; + return rawSnapshot; + }, + + createJSHeapSnapshot: function() { + var parsedSnapshot = ProfilerTestRunner._postprocessHeapSnapshotMock(this.generateSnapshot()); + return new HeapSnapshotWorker.JSHeapSnapshot(parsedSnapshot, new HeapSnapshotWorker.HeapSnapshotProgress()); + }, + + _registerNode: function(node) { + this._nodes.push(node); + return this._nodes.length - 1; + }, + + lookupNodeType: function(typeName) { + if (typeName === undefined) + throw new Error('wrong node type: ' + typeName); + + if (!(typeName in this._nodeTypesMap)) + throw new Error('wrong node type name: ' + typeName); + + return this._nodeTypesMap[typeName]; + }, + + lookupEdgeType: function(typeName) { + if (!(typeName in this._edgeTypesMap)) + throw new Error('wrong edge type name: ' + typeName); + + return this._edgeTypesMap[typeName]; + }, + + lookupOrAddString: function(string) { + if (string in this._string2id) + return this._string2id[string]; + + this._string2id[string] = this._strings.length; + this._strings.push(string); + return this._strings.length - 1; + } + }; + + ProfilerTestRunner.createHeapSnapshot = function(instanceCount, firstId) { + var seed = 881669; + + function pseudoRandom(limit) { + seed = seed * 355109 + 153763 >> 2 & 65535; + return seed % limit; + } + + var builder = new ProfilerTestRunner.HeapSnapshotBuilder(); + var rootNode = builder.rootNode; + var gcRootsNode = new ProfilerTestRunner.HeapNode('(GC roots)', 0, ProfilerTestRunner.HeapNode.Type.synthetic); + rootNode.linkNode(gcRootsNode, ProfilerTestRunner.HeapEdge.Type.element); + var windowNode = new ProfilerTestRunner.HeapNode('Window', 20); + rootNode.linkNode(windowNode, ProfilerTestRunner.HeapEdge.Type.shortcut); + gcRootsNode.linkNode(windowNode, ProfilerTestRunner.HeapEdge.Type.element); + + for (var i = 0; i < instanceCount; ++i) { + var sizeOfB = pseudoRandom(20) + 1; + var nodeB = new ProfilerTestRunner.HeapNode('B', sizeOfB, undefined, firstId++); + windowNode.linkNode(nodeB, ProfilerTestRunner.HeapEdge.Type.element); + var sizeOfA = pseudoRandom(50) + 1; + var nodeA = new ProfilerTestRunner.HeapNode('A', sizeOfA, undefined, firstId++); + nodeB.linkNode(nodeA, ProfilerTestRunner.HeapEdge.Type.property, 'a'); + nodeA.linkNode(nodeA, ProfilerTestRunner.HeapEdge.Type.property, 'a'); + } + + return builder.generateSnapshot(); + }; +}; + +ProfilerTestRunner.createHeapSnapshotMockFactories(); + +ProfilerTestRunner.startProfilerTest = function(callback) { + TestRunner.addResult('Profiler was enabled.'); + ProfilerTestRunner._panelReset = TestRunner.override(UI.panels.heap_profiler, '_reset', function() {}, true); + TestRunner.addSniffer(Profiler.HeapSnapshotView.prototype, 'show', ProfilerTestRunner._snapshotViewShown, true); + + Profiler.HeapSnapshotContainmentDataGrid.prototype.defaultPopulateCount = function() { + return 10; + }; + + Profiler.HeapSnapshotConstructorsDataGrid.prototype.defaultPopulateCount = function() { + return 10; + }; + + Profiler.HeapSnapshotDiffDataGrid.prototype.defaultPopulateCount = function() { + return 5; + }; + + TestRunner.addResult('Detailed heap profiles were enabled.'); + TestRunner.safeWrap(callback)(); +}; + +ProfilerTestRunner.completeProfilerTest = function() { + TestRunner.addResult(''); + TestRunner.addResult('Profiler was disabled.'); + TestRunner.completeTest(); +}; + +ProfilerTestRunner.runHeapSnapshotTestSuite = function(testSuite) { + var testSuiteTests = testSuite.slice(); + var completeTestStack; + + function runner() { + if (!testSuiteTests.length) { + if (completeTestStack) + TestRunner.addResult('FAIL: test already completed at ' + completeTestStack); + + ProfilerTestRunner.completeProfilerTest(); + completeTestStack = new Error().stack; + return; + } + + var nextTest = testSuiteTests.shift(); + TestRunner.addResult(''); + TestRunner.addResult( + 'Running: ' + + /function\s([^(]*)/.exec(nextTest)[1]); + ProfilerTestRunner._panelReset.call(UI.panels.heap_profiler); + TestRunner.safeWrap(nextTest)(runner, runner); + } + + ProfilerTestRunner.startProfilerTest(runner); +}; + +ProfilerTestRunner.assertColumnContentsEqual = function(reference, actual) { + var length = Math.min(reference.length, actual.length); + + for (var i = 0; i < length; ++i) + TestRunner.assertEquals(reference[i], actual[i], 'row ' + i); + + if (reference.length > length) + TestRunner.addResult('extra rows in reference array:\n' + reference.slice(length).join('\n')); + else if (actual.length > length) + TestRunner.addResult('extra rows in actual array:\n' + actual.slice(length).join('\n')); +}; + +ProfilerTestRunner.checkArrayIsSorted = function(contents, sortType, sortOrder) { + function simpleComparator(a, b) { + return (a < b ? -1 : (a > b ? 1 : 0)); + } + + function parseSize(size) { + return parseInt(size.replace(/[\xa0,]/g, ''), 10); + } + + var extractor = { + text: function(data) { + data; + }, + + number: function(data) { + return parseInt(data, 10); + }, + + size: parseSize, + + name: function(data) { + return data; + }, + + id: function(data) { + return parseInt(data, 10); + } + }[sortType]; + + if (!extractor) { + TestRunner.addResult('Invalid sort type: ' + sortType); + return; + } + + var acceptableComparisonResult; + + if (sortOrder === DataGrid.DataGrid.Order.Ascending) { + acceptableComparisonResult = -1; + } else if (sortOrder === DataGrid.DataGrid.Order.Descending) { + acceptableComparisonResult = 1; + } else { + TestRunner.addResult('Invalid sort order: ' + sortOrder); + return; + } + + for (var i = 0; i < contents.length - 1; ++i) { + var a = extractor(contents[i]); + var b = extractor(contents[i + 1]); + var result = simpleComparator(a, b); + + if (result !== 0 && result !== acceptableComparisonResult) { + TestRunner.addResult( + 'Elements ' + i + ' and ' + (i + 1) + ' are out of order: ' + a + ' ' + b + ' (' + sortOrder + ')'); + } + } +}; + +ProfilerTestRunner.clickColumn = function(column, callback) { + callback = TestRunner.safeWrap(callback); + var cell = this._currentGrid()._headerTableHeaders[column.id]; + + var event = { + target: { + enclosingNodeOrSelfWithNodeName: function() { + return cell; + } + } + }; + + function sortingComplete() { + ProfilerTestRunner._currentGrid().removeEventListener( + Profiler.HeapSnapshotSortableDataGrid.Events.SortingComplete, sortingComplete, this); + TestRunner.assertEquals(column.id, this._currentGrid().sortColumnId(), 'unexpected sorting'); + column.sort = this._currentGrid().sortOrder(); + + function callCallback() { + callback(column); + } + + setTimeout(callCallback, 0); + } + + ProfilerTestRunner._currentGrid().addEventListener( + Profiler.HeapSnapshotSortableDataGrid.Events.SortingComplete, sortingComplete, this); + this._currentGrid()._clickInHeaderCell(event); +}; + +ProfilerTestRunner.clickRowAndGetRetainers = function(row, callback) { + callback = TestRunner.safeWrap(callback); + + var event = { + target: { + enclosingNodeOrSelfWithNodeName: function() { + return row._element; + }, + + selectedNode: row + } + }; + + this._currentGrid()._mouseDownInDataTable(event); + var rootNode = ProfilerTestRunner.currentProfileView()._retainmentDataGrid.rootNode(); + rootNode.once(Profiler.HeapSnapshotGridNode.Events.PopulateComplete).then(() => callback(rootNode)); +}; + +ProfilerTestRunner.clickShowMoreButton = function(buttonName, row, callback) { + callback = TestRunner.safeWrap(callback); + var parent = row.parent; + parent.once(Profiler.HeapSnapshotGridNode.Events.PopulateComplete).then(() => setTimeout(() => callback(parent), 0)); + row[buttonName].click(); +}; + +ProfilerTestRunner.columnContents = function(column, row) { + this._currentGrid().updateVisibleNodes(); + var columnOrdinal = ProfilerTestRunner.viewColumns().indexOf(column); + var result = []; + var parent = row || this._currentGrid().rootNode(); + + for (var node = parent.children[0]; node; node = node.traverseNextNode(true, parent, true)) { + if (!node.selectable) + continue; + + var content = node.element().children[columnOrdinal]; + + if (content.firstElementChild) + content = content.firstElementChild; + + result.push(content.textContent); + } + + return result; +}; + +ProfilerTestRunner.countDataRows = function(row, filter) { + var result = 0; + + filter = filter || function(node) { + return node.selectable; + }; + + for (var node = row.children[0]; node; node = node.traverseNextNode(true, row, true)) { + if (filter(node)) + ++result; + } + + return result; +}; + +ProfilerTestRunner.expandRow = function(row, callback) { + callback = TestRunner.safeWrap(callback); + row.once(Profiler.HeapSnapshotGridNode.Events.PopulateComplete).then(() => setTimeout(() => callback(row), 0)); + + (function expand() { + if (row.hasChildren()) + row.expand(); + else + setTimeout(expand, 0); + })(); +}; + +ProfilerTestRunner.findAndExpandGCRoots = function(callback) { + ProfilerTestRunner.findAndExpandRow('(GC roots)', callback); +}; + +ProfilerTestRunner.findAndExpandWindow = function(callback) { + ProfilerTestRunner.findAndExpandRow('Window', callback); +}; + +ProfilerTestRunner.findAndExpandRow = function(name, callback) { + callback = TestRunner.safeWrap(callback); + var row = ProfilerTestRunner.findRow(name); + TestRunner.assertEquals(true, !!row, '"' + name + '" row'); + ProfilerTestRunner.expandRow(row, callback); +}; + +ProfilerTestRunner.findButtonsNode = function(row, startNode) { + for (var node = startNode || row.children[0]; node; node = node.traverseNextNode(true, row, true)) { + if (!node.selectable && node.showNext) + return node; + } + + return null; +}; + +ProfilerTestRunner.findRow = function(name, parent) { + function matcher(x) { + return x._name === name; + } + + return ProfilerTestRunner.findMatchingRow(matcher, parent); +}; + +ProfilerTestRunner.findMatchingRow = function(matcher, parent) { + parent = parent || this._currentGrid().rootNode(); + + for (var node = parent.children[0]; node; node = node.traverseNextNode(true, parent, true)) { + if (matcher(node)) + return node; + } + + return null; +}; + +ProfilerTestRunner.switchToView = function(title, callback) { + callback = TestRunner.safeWrap(callback); + var view = UI.panels.heap_profiler.visibleView; + view._changePerspectiveAndWait(title).then(callback); + ProfilerTestRunner._currentGrid().scrollContainer.style.height = '10000px'; +}; + +ProfilerTestRunner.takeAndOpenSnapshot = function(generator, callback) { + callback = TestRunner.safeWrap(callback); + var snapshot = generator(); + var profileType = Profiler.ProfileTypeRegistry.instance.heapSnapshotProfileType; + + function pushGeneratedSnapshot(reportProgress) { + if (reportProgress) { + profileType._reportHeapSnapshotProgress({data: {done: 50, total: 100, finished: false}}); + + profileType._reportHeapSnapshotProgress({data: {done: 100, total: 100, finished: true}}); + } + + snapshot.snapshot.typeId = 'HEAP'; + + profileType._addHeapSnapshotChunk({data: JSON.stringify(snapshot)}); + + return Promise.resolve(); + } + + TestRunner.override(TestRunner.HeapProfilerAgent, 'takeHeapSnapshot', pushGeneratedSnapshot); + ProfilerTestRunner._takeAndOpenSnapshotCallback = callback; + profileType._takeHeapSnapshot(); +}; + +ProfilerTestRunner.viewColumns = function() { + return ProfilerTestRunner._currentGrid()._columnsArray; +}; + +ProfilerTestRunner.currentProfileView = function() { + return UI.panels.heap_profiler.visibleView; +}; + +ProfilerTestRunner._currentGrid = function() { + return this.currentProfileView()._dataGrid; +}; + +ProfilerTestRunner._snapshotViewShown = function() { + if (ProfilerTestRunner._takeAndOpenSnapshotCallback) { + var callback = ProfilerTestRunner._takeAndOpenSnapshotCallback; + ProfilerTestRunner._takeAndOpenSnapshotCallback = null; + var dataGrid = this._dataGrid; + + function sortingComplete() { + dataGrid.removeEventListener(Profiler.HeapSnapshotSortableDataGrid.Events.SortingComplete, sortingComplete, null); + callback(); + } + + dataGrid.addEventListener(Profiler.HeapSnapshotSortableDataGrid.Events.SortingComplete, sortingComplete, null); + } +};
diff --git a/third_party/WebKit/Source/devtools/front_end/profiler_test_runner/ProfilerTestRunner.js b/third_party/WebKit/Source/devtools/front_end/profiler_test_runner/ProfilerTestRunner.js new file mode 100644 index 0000000..2200015 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/profiler_test_runner/ProfilerTestRunner.js
@@ -0,0 +1,79 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +ProfilerTestRunner.startProfilerTest = function(callback) { + TestRunner.addResult('Profiler was enabled.'); + TestRunner.addSniffer(UI.panels.js_profiler, '_addProfileHeader', ProfilerTestRunner._profileHeaderAdded, true); + TestRunner.addSniffer(Profiler.ProfileView.prototype, 'refresh', ProfilerTestRunner._profileViewRefresh, true); + TestRunner.safeWrap(callback)(); +}; + +ProfilerTestRunner.completeProfilerTest = function() { + TestRunner.addResult(''); + TestRunner.addResult('Profiler was disabled.'); + TestRunner.completeTest(); +}; + +ProfilerTestRunner.runProfilerTestSuite = function(testSuite) { + var testSuiteTests = testSuite.slice(); + + function runner() { + if (!testSuiteTests.length) { + ProfilerTestRunner.completeProfilerTest(); + return; + } + + var nextTest = testSuiteTests.shift(); + TestRunner.addResult(''); + TestRunner.addResult( + 'Running: ' + + /function\s([^(]*)/.exec(nextTest)[1]); + TestRunner.safeWrap(nextTest)(runner, runner); + } + + ProfilerTestRunner.startProfilerTest(runner); +}; + +ProfilerTestRunner.showProfileWhenAdded = function(title) { + ProfilerTestRunner._showProfileWhenAdded = title; +}; + +ProfilerTestRunner._profileHeaderAdded = function(profile) { + if (ProfilerTestRunner._showProfileWhenAdded === profile.title) + UI.panels.js_profiler.showProfile(profile); +}; + +ProfilerTestRunner.waitUntilProfileViewIsShown = function(title, callback) { + callback = TestRunner.safeWrap(callback); + var profilesPanel = UI.panels.js_profiler; + + if (profilesPanel.visibleView && profilesPanel.visibleView.profile && + profilesPanel.visibleView._profileHeader.title === title) + callback(profilesPanel.visibleView); + else + ProfilerTestRunner._waitUntilProfileViewIsShownCallback = {title: title, callback: callback}; + +}; + +ProfilerTestRunner._profileViewRefresh = function() { + if (ProfilerTestRunner._waitUntilProfileViewIsShownCallback && + ProfilerTestRunner._waitUntilProfileViewIsShownCallback.title === this._profileHeader.title) { + var callback = ProfilerTestRunner._waitUntilProfileViewIsShownCallback; + delete ProfilerTestRunner._waitUntilProfileViewIsShownCallback; + callback.callback(this); + } +}; + +ProfilerTestRunner.startSamplingHeapProfiler = function() { + Profiler.SamplingHeapProfileType.instance.startRecordingProfile(); +}; + +ProfilerTestRunner.stopSamplingHeapProfiler = function() { + Profiler.SamplingHeapProfileType.instance.stopRecordingProfile(); +};
diff --git a/third_party/WebKit/Source/devtools/front_end/profiler_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/profiler_test_runner/module.json new file mode 100644 index 0000000..1ea4ac0 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/profiler_test_runner/module.json
@@ -0,0 +1,17 @@ +{ + "dependencies": [ + "test_runner", + "integration_test_runner", + "profiler", + "data_grid", + "heap_snapshot_worker" + ], + "scripts": [ + "HeapSnapshotTestRunner.js", + "ProfilerTestRunner.js" + ], + "skip_compilation": [ + "HeapSnapshotTestRunner.js", + "ProfilerTestRunner.js" + ] +}
diff --git a/third_party/WebKit/Source/devtools/front_end/resources/DOMStorageItemsView.js b/third_party/WebKit/Source/devtools/front_end/resources/DOMStorageItemsView.js index 0a3fae67..2bf85cc8 100644 --- a/third_party/WebKit/Source/devtools/front_end/resources/DOMStorageItemsView.js +++ b/third_party/WebKit/Source/devtools/front_end/resources/DOMStorageItemsView.js
@@ -36,8 +36,8 @@ this.element.classList.add('storage-view', 'table'); var columns = /** @type {!Array<!DataGrid.DataGrid.ColumnDescriptor>} */ ([ - {id: 'key', title: Common.UIString('Key'), sortable: false, editable: true, weight: 50}, - {id: 'value', title: Common.UIString('Value'), sortable: false, editable: true, weight: 50} + {id: 'key', title: Common.UIString('Key'), sortable: false, editable: true, longText: true, weight: 50}, + {id: 'value', title: Common.UIString('Value'), sortable: false, editable: true, longText: true, weight: 50} ]); this._dataGrid = new DataGrid.DataGrid(columns, this._editingCallback.bind(this), this._deleteCallback.bind(this)); this._dataGrid.setStriped(true);
diff --git a/third_party/WebKit/Source/devtools/front_end/sass_test_runner/SASSTestRunner.js b/third_party/WebKit/Source/devtools/front_end/sass_test_runner/SASSTestRunner.js new file mode 100644 index 0000000..9e8d661 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/sass_test_runner/SASSTestRunner.js
@@ -0,0 +1,331 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +var sassSourceMapFactory = null; + +SASSTestRunner.sassSourceMapFactory = function() { + if (!sassSourceMapFactory) + sassSourceMapFactory = new Sass.SASSSourceMapFactory(); + + return sassSourceMapFactory; +}; + +SASSTestRunner.parseSCSS = function(url, text) { + return Sass.SASSSupport.parseSCSS(url, text); +}; + +SASSTestRunner.parseCSS = SASSTestRunner.parseSCSS; + +SASSTestRunner.loadASTMapping = function(header, callback) { + var sourceMapManager = header.cssModel().sourceMapManager(); + var sourceMap = sourceMapManager.sourceMapForClient(header); + + if (sourceMap) { + callback((sourceMap.editable() ? sourceMap : null)); + return; + } + + sourceMapManager.addEventListener(SDK.SourceMapManager.Events.SourceMapAttached, onAttached); + + function onAttached(event) { + if (event.data.client !== header) + return; + + sourceMapManager.removeEventListener(SDK.SourceMapManager.Events.SourceMapAttached, onAttached); + var sourceMap = event.data.sourceMap; + callback((sourceMap.editable() ? sourceMap : null)); + } +}; + +SASSTestRunner.dumpAST = function(ast) { + var lines = [String.sprintf('=== AST === %s', ast.document.url)]; + + for (var i = 0; i < ast.rules.length; ++i) { + var rule = ast.rules[i]; + lines.push(String.sprintf('rule %d', i)); + var ruleLines = dumpRule(rule); + lines = lines.concat(indent(ruleLines)); + } + + lines.push('======'); + TestRunner.addResult(lines.join('\n')); + return ast; + + function dumpRule(rule) { + var lines = []; + + for (var i = 0; i < rule.selectors.length; ++i) { + var selector = rule.selectors[i]; + lines.push(`selector ${i}: "${selector.text}"`); + var selectorLines = dumpTextNode(selector); + lines = lines.concat(indent(selectorLines)); + } + + for (var i = 0; i < rule.properties.length; ++i) { + var property = rule.properties[i]; + lines.push('property ' + i); + var propertyLines = dumpProperty(property); + lines = lines.concat(indent(propertyLines)); + } + + return lines; + } + + function dumpProperty(property) { + var lines = []; + lines.push(String.sprintf('name: "%s"', property.name.text)); + lines = lines.concat(indent(dumpTextNode(property.name))); + lines.push(String.sprintf('value: "%s"', property.value.text)); + lines = lines.concat(indent(dumpTextNode(property.value))); + lines.push(String.sprintf('range: %s', property.range.toString())); + lines.push(String.sprintf('disabled: %s', property.disabled)); + return lines; + } + + function dumpTextNode(textNode) { + return [String.sprintf('range: %s', textNode.range.toString())]; + } +}; + +function indent(lines) { + return lines.map(line => ' ' + line); +} + +SASSTestRunner.dumpASTDiff = function(diff) { + TestRunner.addResult('=== Diff ==='); + var changesPerRule = new Map(); + + for (var change of diff.changes) { + var oldRule = change.oldRule; + var ruleChanges = changesPerRule.get(oldRule); + + if (!ruleChanges) { + ruleChanges = []; + changesPerRule.set(oldRule, ruleChanges); + } + + ruleChanges.push(change); + } + + var T = Sass.SASSSupport.PropertyChangeType; + + for (var rule of changesPerRule.keys()) { + var changes = changesPerRule.get(rule); + var names = []; + var values = []; + + for (var property of rule.properties) { + names.push(str(property.name, ' ')); + values.push(str(property.value)); + } + + for (var i = changes.length - 1; i >= 0; --i) { + var change = changes[i]; + var newProperty = change.newRule.properties[change.newPropertyIndex]; + var oldProperty = change.oldRule.properties[change.oldPropertyIndex]; + + switch (change.type) { + case T.PropertyAdded: + names.splice(change.oldPropertyIndex, 0, str(newProperty.name, '[+] ')); + values.splice(change.oldPropertyIndex, 0, str(newProperty.value)); + break; + case T.PropertyRemoved: + names[change.oldPropertyIndex] = str(oldProperty.name, '[-] '); + break; + case T.PropertyToggled: + names[change.oldPropertyIndex] = str(oldProperty.name, '[T] '); + break; + case T.NameChanged: + names[change.oldPropertyIndex] = str(oldProperty.name, '[M] '); + break; + case T.ValueChanged: + values[change.oldPropertyIndex] = str(oldProperty.value, '[M] '); + break; + } + } + + var selectorText = rule.selectors.map(selector => selector.text).join(','); + TestRunner.addResult('Changes for rule: ' + selectorText); + names = indent(names); + + for (var i = 0; i < names.length; ++i) + TestRunner.addResult(names[i] + ': ' + values[i]); + } + + function str(node, prefix) { + prefix = prefix || ''; + return prefix + node.text.trim(); + } +}; + +SASSTestRunner.validateASTRanges = function(ast) { + var invalidNodes = []; + + for (var rule of ast.rules) { + for (var property of rule.properties) { + validate(property.name); + validate(property.value); + } + } + + if (invalidNodes.length) { + TestRunner.addResult('Bad ranges: ' + invalidNodes.length); + + for (var node of invalidNodes) + TestRunner.addResult(String.sprintf(' - range: %s text: %s', node.range.toString(), node.text)); + } else { + TestRunner.addResult('Ranges OK.'); + } + + return ast; + + function validate(textNode) { + if (textNode.document.text.extract(textNode.range) !== textNode.text) + invalidNodes.push(textNode); + } +}; + +SASSTestRunner.validateMapping = function(mapping) { + TestRunner.addResult('Mapped CSS: ' + mapping._compiledToSource.size); + TestRunner.addResult('Mapped SCSS: ' + mapping._sourceToCompiled.size); + var cssNodes = mapping._compiledToSource.keysArray(); + var staleCSS = 0; + var staleSASS = 0; + + for (var i = 0; i < cssNodes.length; ++i) { + var cssNode = cssNodes[i]; + staleCSS += (cssNode.document !== mapping.compiledModel().document ? 1 : 0); + var sassNode = mapping.toSourceNode(cssNode); + var sassAST = mapping.sourceModels().get(sassNode.document.url); + staleSASS += (sassNode.document !== sassAST.document ? 1 : 0); + } + + if (staleCSS || staleSASS) { + TestRunner.addResult('ERROR: found stale entries'); + TestRunner.addResult(' -stale CSS: ' + staleCSS); + TestRunner.addResult(' -stale SASS: ' + staleSASS); + } else { + TestRunner.addResult('No stale entries found.'); + } +}; + +SASSTestRunner.updateCSSText = function(url, newText) { + var styleSheetIds = TestRunner.cssModel.styleSheetIdsForURL(url); + var promises = styleSheetIds.map(id => TestRunner.cssModel.setStyleSheetText(id, newText, true)); + return Promise.all(promises); +}; + +SASSTestRunner.updateSASSText = function(url, newText) { + var uiSourceCode = Workspace.workspace.uiSourceCodeForURL(url); + uiSourceCode.addRevision(newText); +}; + +SASSTestRunner.runCSSEditTests = function(header, tests) { + var astSourceMap; + SASSTestRunner.loadASTMapping(header, onMapping); + + function onMapping(map) { + astSourceMap = map; + TestRunner.addResult('INITIAL MODELS'); + logASTText(map.compiledModel(), true); + + for (var ast of map.sourceModels().values()) + logASTText(ast, true); + + runTests(); + } + + function runTests() { + if (!tests.length) { + TestRunner.completeTest(); + return; + } + + var test = tests.shift(); + logTestName(test.name); + var text = astSourceMap.compiledModel().document.text.value(); + var edits = test(text); + logSourceEdits(text, edits); + var ranges = edits.map(edit => edit.oldRange); + var texts = edits.map(edit => edit.newText); + astSourceMap.editCompiled(ranges, texts).then(onEditsDone); + } + + function onEditsDone(result) { + if (!result.map) { + TestRunner.addResult('SASSProcessor failed to process edits.'); + runTests(); + return; + } + + logASTText(result.map.compiledModel()); + + for (var sassURL of result.newSources.keys()) { + var ast = result.map.sourceModels().get(sassURL); + logASTText(ast); + } + + runTests(); + } + + function logASTText(ast, avoidIndent, customTitle) { + customTitle = customTitle || ast.document.url.split('/').pop(); + TestRunner.addResult('===== ' + customTitle + ' ====='); + var text = ast.document.text.value().replace(/ /g, '.'); + var lines = text.split('\n'); + + if (!avoidIndent) + lines = indent(lines); + + TestRunner.addResult(lines.join('\n')); + } + + function logTestName(testName) { + var titleText = ' TEST: ' + testName + ' '; + var totalLength = 80; + var prefixLength = (totalLength - titleText.length) / 2 | 0; + var suffixLength = totalLength - titleText.length - prefixLength; + var prefix = new Array(prefixLength).join('-'); + var suffix = new Array(suffixLength).join('-'); + TestRunner.addResult('\n' + prefix + titleText + suffix + '\n'); + } + + function logSourceEdits(text, edits) { + var lines = []; + + for (var i = 0; i < edits.length; ++i) { + var edit = edits[i]; + var range = edit.oldRange; + var line = String.sprintf('{%d, %d, %d, %d}', range.startLine, range.startColumn, range.endLine, range.endColumn); + line += String.sprintf(' \'%s\' => \'%s\'', new TextUtils.Text(text).extract(range), edit.newText); + lines.push(line); + } + + lines = indent(lines); + lines.unshift('Edits:'); + TestRunner.addResult(lines.join('\n')); + } +}; + +SASSTestRunner.createEdit = function(source, pattern, newText, matchNumber) { + matchNumber = matchNumber || 0; + var re = new RegExp(pattern.escapeForRegExp(), 'g'); + var match; + + while ((match = re.exec(source)) !== null && matchNumber) + --matchNumber; + + + if (!match) + return null; + + var sourceRange = new TextUtils.SourceRange(match.index, match[0].length); + var textRange = new TextUtils.Text(source).toTextRange(sourceRange); + return new TextUtils.SourceEdit('', textRange, newText); +};
diff --git a/third_party/WebKit/Source/devtools/front_end/sass_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/sass_test_runner/module.json new file mode 100644 index 0000000..3aace150 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/sass_test_runner/module.json
@@ -0,0 +1,13 @@ +{ + "dependencies": [ + "test_runner", + "integration_test_runner", + "sass" + ], + "scripts": [ + "SASSTestRunner.js" + ], + "skip_compilation": [ + "SASSTestRunner.js" + ] +}
diff --git a/third_party/WebKit/Source/devtools/front_end/security/SecurityModel.js b/third_party/WebKit/Source/devtools/front_end/security/SecurityModel.js index 411c70d..a90a173e 100644 --- a/third_party/WebKit/Source/devtools/front_end/security/SecurityModel.js +++ b/third_party/WebKit/Source/devtools/front_end/security/SecurityModel.js
@@ -58,10 +58,6 @@ return aScore - bScore; } - - showCertificateViewer() { - this._securityAgent.showCertificateViewer(); - } }; SDK.SDKModel.register(Security.SecurityModel, SDK.Target.Capability.Security, false);
diff --git a/third_party/WebKit/Source/devtools/front_end/security/SecurityPanel.js b/third_party/WebKit/Source/devtools/front_end/security/SecurityPanel.js index 3407caa..1cb04de 100644 --- a/third_party/WebKit/Source/devtools/front_end/security/SecurityPanel.js +++ b/third_party/WebKit/Source/devtools/front_end/security/SecurityPanel.js
@@ -38,37 +38,27 @@ /** * @param {string} text - * @param {!Security.SecurityPanel} panel + * @param {string} origin * @return {!Element} */ - static createCertificateViewerButton(text, panel) { - /** - * @param {!Event} e - */ - function showCertificateViewer(e) { + static createCertificateViewerButtonForOrigin(text, origin) { + return UI.createTextButton(text, async e => { e.consume(); - panel.showCertificateViewer(); - } - - return UI.createTextButton(text, showCertificateViewer, 'security-certificate-button'); + var names = await SDK.multitargetNetworkManager.getCertificate(origin); + InspectorFrontendHost.showCertificateViewer(names); + }, 'security-certificate-button'); } /** * @param {string} text - * @param {string} origin + * @param {!Array<string>} names * @return {!Element} */ - static createCertificateViewerButton2(text, origin) { - /** - * @param {!Event} e - */ - function showCertificateViewer(e) { + static createCertificateViewerButtonForCert(text, names) { + return UI.createTextButton(text, e => { e.consume(); - SDK.multitargetNetworkManager.getCertificate(origin).then( - names => InspectorFrontendHost.showCertificateViewer(names)); - } - - return UI.createTextButton(text, showCertificateViewer, 'security-certificate-button'); + InspectorFrontendHost.showCertificateViewer(names); + }, 'security-certificate-button'); } /** @@ -258,10 +248,6 @@ return this._filterRequestCounts.get(filterKey) || 0; } - showCertificateViewer() { - this._securityModel.showCertificateViewer(); - } - /** * @param {!Protocol.Security.SecurityState} stateA * @param {!Protocol.Security.SecurityState} stateB @@ -614,11 +600,10 @@ text.createChild('div', 'security-explanation-title').textContent = explanation.summary; text.createChild('div').textContent = explanation.description; - if (explanation.hasCertificate) { - text.appendChild( - Security.SecurityPanel.createCertificateViewerButton(Common.UIString('View certificate'), this._panel)); + if (explanation.certificate.length) { + text.appendChild(Security.SecurityPanel.createCertificateViewerButtonForCert( + Common.UIString('View certificate'), explanation.certificate)); } - return text; } @@ -682,10 +667,11 @@ if (this._panel.filterRequestCount(Network.NetworkLogView.MixedContentFilterValues.Blocked) > 0) { var explanation = /** @type {!Protocol.Security.SecurityStateExplanation} */ ({ - 'securityState': Protocol.Security.SecurityState.Info, - 'summary': Common.UIString('Blocked mixed content'), - 'description': Common.UIString('Your page requested non-secure resources that were blocked.'), - 'mixedContentType': Protocol.Security.MixedContentType.Blockable + securityState: Protocol.Security.SecurityState.Info, + summary: Common.UIString('Blocked mixed content'), + description: Common.UIString('Your page requested non-secure resources that were blocked.'), + mixedContentType: Protocol.Security.MixedContentType.Blockable, + certificate: [] }); this._addMixedContentExplanation( this._securityExplanationsMain, explanation, Network.NetworkLogView.MixedContentFilterValues.Blocked); @@ -805,9 +791,11 @@ table.addRow(Common.UIString('Valid from'), validFromString); table.addRow(Common.UIString('Valid until'), validUntilString); table.addRow(Common.UIString('Issuer'), originState.securityDetails.issuer); + table.addRow( - '', Security.SecurityPanel.createCertificateViewerButton2( - Common.UIString('Open full certificate details'), origin)); + '', + Security.SecurityPanel.createCertificateViewerButtonForOrigin( + Common.UIString('Open full certificate details'), origin)); if (!originState.securityDetails.signedCertificateTimestampList.length) return;
diff --git a/third_party/WebKit/Source/devtools/front_end/security_test_runner/SecurityTestRunner.js b/third_party/WebKit/Source/devtools/front_end/security_test_runner/SecurityTestRunner.js new file mode 100644 index 0000000..b50fa77 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/security_test_runner/SecurityTestRunner.js
@@ -0,0 +1,28 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +SecurityTestRunner.dumpSecurityPanelSidebarOrigins = function() { + for (var key in Security.SecurityPanelSidebarTree.OriginGroupName) { + var originGroupName = Security.SecurityPanelSidebarTree.OriginGroupName[key]; + var originGroup = Security.SecurityPanel._instance()._sidebarTree._originGroups.get(originGroupName); + + if (originGroup.hidden) + continue; + + TestRunner.addResult('Group: ' + originGroupName); + var originTitles = originGroup.childrenListElement.getElementsByClassName('title'); + + for (var originTitle of originTitles) + TestRunner.dumpDeepInnerHTML(originTitle); + } +}; + +SecurityTestRunner.dispatchRequestFinished = function(request) { + TestRunner.networkManager.dispatchEventToListeners(SDK.NetworkManager.Events.RequestFinished, request); +};
diff --git a/third_party/WebKit/Source/devtools/front_end/security_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/security_test_runner/module.json new file mode 100644 index 0000000..20d36679 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/security_test_runner/module.json
@@ -0,0 +1,13 @@ +{ + "dependencies": [ + "test_runner", + "integration_test_runner", + "security" + ], + "scripts": [ + "SecurityTestRunner.js" + ], + "skip_compilation": [ + "SecurityTestRunner.js" + ] +}
diff --git a/third_party/WebKit/Source/devtools/front_end/sources_test_runner/AutocompleteTestRunner.js b/third_party/WebKit/Source/devtools/front_end/sources_test_runner/AutocompleteTestRunner.js new file mode 100644 index 0000000..8a71653 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/sources_test_runner/AutocompleteTestRunner.js
@@ -0,0 +1,42 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +SourcesTestRunner.dumpSuggestions = function(textEditor, lines) { + var resolve; + var promise = new Promise(fulfill => resolve = fulfill); + var lineNumber = -1, columnNumber; + + for (var i = 0; i < lines.length; ++i) { + var columnNumber = lines[i].indexOf('|'); + + if (columnNumber !== -1) { + lineNumber = i; + break; + } + } + + if (lineNumber === -1) + throw new Error('Test case is invalid: cursor position is not marked with \'|\' symbol.'); + + textEditor.setText(lines.join('\n').replace('|', '')); + textEditor.setSelection(TextUtils.TextRange.createFromLocation(lineNumber, columnNumber)); + TestRunner.addSniffer( + TextEditor.TextEditorAutocompleteController.prototype, '_onSuggestionsShownForTest', suggestionsShown); + textEditor._autocompleteController.autocomplete(); + + function suggestionsShown(words) { + TestRunner.addResult('========= Selection In Editor ========='); + SourcesTestRunner.dumpTextWithSelection(textEditor); + TestRunner.addResult('======= Autocomplete Suggestions ======='); + TestRunner.addResult('[' + words.map(item => item.text).join(', ') + ']'); + resolve(); + } + + return promise; +};
diff --git a/third_party/WebKit/Source/devtools/front_end/sources_test_runner/BreakpointManagerTestRunner.js b/third_party/WebKit/Source/devtools/front_end/sources_test_runner/BreakpointManagerTestRunner.js new file mode 100644 index 0000000..88aec2c --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/sources_test_runner/BreakpointManagerTestRunner.js
@@ -0,0 +1,430 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +SourcesTestRunner.createWorkspace = function() { + SourcesTestRunner.testTargetManager = new SDK.TargetManager(); + SourcesTestRunner.testWorkspace = new Workspace.Workspace(); + SourcesTestRunner.testNetworkProjectManager = + new Bindings.NetworkProjectManager(SourcesTestRunner.testTargetManager, SourcesTestRunner.testWorkspace); + SourcesTestRunner.testResourceMapping = + new Bindings.ResourceMapping(SourcesTestRunner.testTargetManager, SourcesTestRunner.testWorkspace); + SourcesTestRunner.testDebuggerWorkspaceBinding = + new Bindings.DebuggerWorkspaceBinding(SourcesTestRunner.testTargetManager, SourcesTestRunner.testWorkspace); + Bindings.resourceMapping = SourcesTestRunner.testResourceMapping; +}; + +function resourceMappingModelInfoForTarget(target) { + var resourceTreeModel = target.model(SDK.ResourceTreeModel); + var binding = (resourceTreeModel ? SourcesTestRunner.testResourceMapping._modelToInfo.get(resourceTreeModel) : null); + return binding; +} + +SourcesTestRunner.createMockTarget = function(id) { + var capabilities = SDK.Target.Capability.AllForTests; + + var target = SourcesTestRunner.testTargetManager.createTarget( + 'mock-target-id-' + id, 'mock-target-' + id, capabilities & ~SDK.Target.Capability.JS, + params => new SDK.StubConnection(params), null); + + SourcesTestRunner.testNetworkProject = Bindings.NetworkProject.forTarget(target); + SourcesTestRunner.testResourceMappingModelInfo = resourceMappingModelInfoForTarget(target); + target._capabilitiesMask = capabilities; + target._inspectedURL = TestRunner.mainTarget.inspectedURL(); + target.resourceTreeModel = target.model(SDK.ResourceTreeModel); + target.resourceTreeModel._cachedResourcesProcessed = true; + target.resourceTreeModel._frameAttached('42', 0); + target.runtimeModel = target.model(SDK.RuntimeModel); + target.debuggerModel = new SourcesTestRunner.DebuggerModelMock(target); + target._modelByConstructor.set(SDK.DebuggerModel, target.debuggerModel); + SourcesTestRunner.testTargetManager.modelAdded(target, SDK.DebuggerModel, target.debuggerModel); + return target; +}; + +SourcesTestRunner.uiSourceCodes = {}; + +SourcesTestRunner.initializeDefaultMappingOnTarget = function(target) { + var defaultMapping = { + rawLocationToUILocation: function(rawLocation) { + return null; + }, + + uiLocationToRawLocation: function(uiSourceCode, lineNumber) { + if (!SourcesTestRunner.uiSourceCodes[uiSourceCode.url()]) + return null; + + return new SDK.DebuggerModel.Location(target.debuggerModel, uiSourceCode.url(), lineNumber, 0); + }, + + isIdentity: function() { + return true; + } + }; + + target.defaultMapping = defaultMapping; +}; + +SourcesTestRunner.DebuggerModelMock = class extends SDK.SDKModel { + sourceMapManager() { + return this._sourceMapManager; + } + + constructor(target) { + super(target); + this._sourceMapManager = new SDK.SourceMapManager(); + this._target = target; + this._breakpointResolvedEventTarget = new Common.Object(); + this._scripts = {}; + this._breakpoints = {}; + this._debuggerWorkspaceBinding = SourcesTestRunner.testDebuggerWorkspaceBinding; + } + + target() { + return this._target; + } + + runtimeModel() { + return this._target.runtimeModel; + } + + setBeforePausedCallback(callback) { + } + + debuggerEnabled() { + return true; + } + + scriptsForSourceURL(url) { + var script = this._scriptForURL(url); + return (script ? [script] : []); + } + + _addScript(scriptId, url) { + var script = new SDK.Script(this, scriptId, url); + this._scripts[scriptId] = script; + var modelData = this._debuggerWorkspaceBinding._debuggerModelToData.get(this); + + modelData._defaultMapping._parsedScriptSource({data: script}); + + modelData._resourceMapping._parsedScriptSource({data: script}); + } + + _scriptForURL(url) { + for (var scriptId in this._scripts) { + var script = this._scripts[scriptId]; + + if (script.sourceURL === url) + return script; + } + } + + _scheduleSetBeakpointCallback(callback, breakpointId, locations) { + setTimeout(innerCallback.bind(this), 0); + + function innerCallback() { + if (callback) + callback(breakpointId, locations); + + if (window.setBreakpointCallback) { + var savedCallback = window.setBreakpointCallback; + delete window.setBreakpointCallback; + savedCallback(); + } + } + } + + createRawLocation(script, line, column) { + return new SDK.DebuggerModel.Location(this, script.scriptId, line, column); + } + + createRawLocationByURL(url, line, column) { + var script = this._scriptForURL(url); + + if (!script) + return null; + + return new SDK.DebuggerModel.Location(this, script.scriptId, line, column); + } + + setBreakpointByURL(url, lineNumber, columnNumber, condition, callback) { + TestRunner.addResult(' debuggerModel.setBreakpoint(' + [url, lineNumber, condition].join(':') + ')'); + var breakpointId = url + ':' + lineNumber; + + if (this._breakpoints[breakpointId]) { + this._scheduleSetBeakpointCallback(callback, null); + return; + } + + this._breakpoints[breakpointId] = true; + + if (lineNumber >= 2000) { + this._scheduleSetBeakpointCallback(callback, breakpointId, []); + return; + } + + if (lineNumber >= 1000) { + var shiftedLocation = new SDK.DebuggerModel.Location(this, url, lineNumber + 10, columnNumber); + this._scheduleSetBeakpointCallback(callback, breakpointId, [shiftedLocation]); + return; + } + + var locations = []; + var script = this._scriptForURL(url); + + if (script) { + var location = new SDK.DebuggerModel.Location(this, script.scriptId, lineNumber, 0); + locations.push(location); + } + + this._scheduleSetBeakpointCallback(callback, breakpointId, locations); + } + + async removeBreakpoint(breakpointId) { + TestRunner.addResult(' debuggerModel.removeBreakpoint(' + breakpointId + ')'); + delete this._breakpoints[breakpointId]; + } + + setBreakpointsActive() { + } + + scriptForId(scriptId) { + return this._scripts[scriptId]; + } + + reset() { + TestRunner.addResult(' Resetting debugger.'); + this._scripts = {}; + this._debuggerWorkspaceBinding._reset(this); + } + + addBreakpointListener(breakpointId, listener, thisObject) { + this._breakpointResolvedEventTarget.addEventListener(breakpointId, listener, thisObject); + } + + removeBreakpointListener(breakpointId, listener, thisObject) { + this._breakpointResolvedEventTarget.removeEventListener(breakpointId, listener, thisObject); + } + + _breakpointResolved(breakpointId, location) { + this._breakpointResolvedEventTarget.dispatchEventToListeners(breakpointId, location); + } +}; + +SourcesTestRunner.setupLiveLocationSniffers = function() { + TestRunner.addSniffer(Bindings.DebuggerWorkspaceBinding.prototype, 'createLiveLocation', function(rawLocation) { + TestRunner.addResult(' Location created: ' + rawLocation.scriptId + ':' + rawLocation.lineNumber); + }, true); + + TestRunner.addSniffer(Bindings.DebuggerWorkspaceBinding.Location.prototype, 'dispose', function() { + TestRunner.addResult(' Location disposed: ' + this._rawLocation.scriptId + ':' + this._rawLocation.lineNumber); + }, true); +}; + +SourcesTestRunner.addScript = function(target, breakpointManager, url) { + target.debuggerModel._addScript(url, url); + TestRunner.addResult(' Adding script: ' + url); +}; + +SourcesTestRunner.addUISourceCode = function(target, breakpointManager, url, doNotSetSourceMapping, doNotAddScript) { + if (!doNotAddScript) + SourcesTestRunner.addScript(target, breakpointManager, url); + + TestRunner.addResult(' Adding UISourceCode: ' + url); + var resourceMappingModelInfo = resourceMappingModelInfoForTarget(target); + + if (resourceMappingModelInfo._bindings.has(url)) { + resourceMappingModelInfo._bindings.get(url).dispose(); + resourceMappingModelInfo._bindings.delete(url); + } + + var resource = + new SDK.Resource(target, null, url, url, '', '', Common.resourceTypes.Document, 'text/html', null, null); + + resourceMappingModelInfo._resourceAdded({data: resource}); + + uiSourceCode = SourcesTestRunner.testWorkspace.uiSourceCodeForURL(url); + SourcesTestRunner.uiSourceCodes[url] = uiSourceCode; + + if (!doNotSetSourceMapping) + breakpointManager._debuggerWorkspaceBinding.updateLocations(target.debuggerModel.scriptForId(url)); + + + return uiSourceCode; +}; + +SourcesTestRunner.createBreakpointManager = function(targetManager, debuggerWorkspaceBinding, persistentBreakpoints) { + SourcesTestRunner._pendingBreakpointUpdates = 0; + TestRunner.addSniffer( + Bindings.BreakpointManager.ModelBreakpoint.prototype, '_updateInDebugger', updateInDebugger, true); + TestRunner.addSniffer( + Bindings.BreakpointManager.ModelBreakpoint.prototype, '_didUpdateInDebugger', didUpdateInDebugger, true); + + function updateInDebugger() { + SourcesTestRunner._pendingBreakpointUpdates++; + } + + function didUpdateInDebugger() { + SourcesTestRunner._pendingBreakpointUpdates--; + SourcesTestRunner._notifyAfterBreakpointUpdate(); + } + + persistentBreakpoints = persistentBreakpoints || []; + + var setting = { + get: function() { + return persistentBreakpoints; + }, + + set: function(breakpoints) { + persistentBreakpoints = breakpoints; + } + }; + + function breakpointAdded(event) { + var breakpoint = event.data.breakpoint; + var uiLocation = event.data.uiLocation; + + TestRunner.addResult(' breakpointAdded(' + [ + uiLocation.uiSourceCode.url(), uiLocation.lineNumber, uiLocation.columnNumber, breakpoint.condition(), + breakpoint.enabled() + ].join(', ') + ')'); + } + + function breakpointRemoved(event) { + var uiLocation = event.data.uiLocation; + + TestRunner.addResult(' breakpointRemoved(' + [ + uiLocation.uiSourceCode.url(), uiLocation.lineNumber, uiLocation.columnNumber + ].join(', ') + ')'); + } + + var targets = targetManager.targets(); + var mappingForManager; + + for (var i = 0; i < targets.length; ++i) { + SourcesTestRunner.initializeDefaultMappingOnTarget(targets[i]); + + if (!mappingForManager) + mappingForManager = targets[i].defaultMapping; + } + + var breakpointManager = new Bindings.BreakpointManager( + setting, debuggerWorkspaceBinding._workspace, targetManager, debuggerWorkspaceBinding); + breakpointManager.defaultMapping = mappingForManager; + breakpointManager.addEventListener(Bindings.BreakpointManager.Events.BreakpointAdded, breakpointAdded); + breakpointManager.addEventListener(Bindings.BreakpointManager.Events.BreakpointRemoved, breakpointRemoved); + TestRunner.addResult(' Created breakpoints manager'); + SourcesTestRunner.dumpBreakpointStorage(breakpointManager); + return breakpointManager; +}; + +SourcesTestRunner.setBreakpoint = function( + breakpointManager, uiSourceCode, lineNumber, columnNumber, condition, enabled, setBreakpointCallback) { + TestRunner.addResult( + ' Setting breakpoint at ' + uiSourceCode.url() + ':' + lineNumber + ':' + columnNumber + ' enabled:' + enabled + + ' condition:' + condition); + + if (setBreakpointCallback) + window.setBreakpointCallback = setBreakpointCallback; + + return breakpointManager.setBreakpoint(uiSourceCode, lineNumber, columnNumber, condition, enabled); +}; + +SourcesTestRunner.removeBreakpoint = function(breakpointManager, uiSourceCode, lineNumber, columnNumber) { + TestRunner.addResult(' Removing breakpoint at ' + uiSourceCode.url() + ':' + lineNumber + ':' + columnNumber); + breakpointManager.findBreakpoint(uiSourceCode, lineNumber, columnNumber).remove(); +}; + +SourcesTestRunner.dumpBreakpointStorage = function(breakpointManager) { + var breakpoints = breakpointManager._storage._setting.get(); + TestRunner.addResult(' Dumping Storage'); + + for (var i = 0; i < breakpoints.length; ++i) { + TestRunner.addResult( + ' ' + breakpoints[i].url + ':' + breakpoints[i].lineNumber + ' enabled:' + breakpoints[i].enabled + + ' condition:' + breakpoints[i].condition); + } +}; + +SourcesTestRunner.dumpBreakpointLocations = function(breakpointManager) { + var allBreakpointLocations = breakpointManager.allBreakpointLocations(); + TestRunner.addResult(' Dumping Breakpoint Locations'); + var lastUISourceCode = null; + var locations = []; + + function dumpLocations(uiSourceCode, locations) { + locations.sort(function(a, b) { + return a.lineNumber - b.lineNumber; + }); + + TestRunner.addResult(' UISourceCode (url=\'' + uiSourceCode.url() + '\', uri=\'' + uiSourceCode.url() + '\')'); + + for (var i = 0; i < locations.length; ++i) + TestRunner.addResult(' Location: (' + locations[i].lineNumber + ', ' + locations[i].columnNumber + ')'); + } + + for (var i = 0; i < allBreakpointLocations.length; ++i) { + var uiLocation = allBreakpointLocations[i].uiLocation; + var uiSourceCode = uiLocation.uiSourceCode; + + if (lastUISourceCode && lastUISourceCode !== uiSourceCode) { + dumpLocations(uiSourceCode, locations); + locations = []; + } + + lastUISourceCode = uiSourceCode; + locations.push(uiLocation); + } + + if (lastUISourceCode) + dumpLocations(lastUISourceCode, locations); +}; + +SourcesTestRunner.resetBreakpointManager = function(breakpointManager, next) { + TestRunner.addResult(' Resetting breakpoint manager'); + breakpointManager.removeAllBreakpoints(); + breakpointManager.removeProvisionalBreakpointsForTest(); + SourcesTestRunner.uiSourceCodes = {}; + next(); +}; + +SourcesTestRunner.runAfterPendingBreakpointUpdates = function(breakpointManager, callback) { + SourcesTestRunner._pendingBreakpointUpdatesCallback = callback; + SourcesTestRunner._notifyAfterBreakpointUpdate(); +}; + +SourcesTestRunner._notifyAfterBreakpointUpdate = function() { + if (!SourcesTestRunner._pendingBreakpointUpdates && SourcesTestRunner._pendingBreakpointUpdatesCallback) { + var callback = SourcesTestRunner._pendingBreakpointUpdatesCallback; + delete SourcesTestRunner._pendingBreakpointUpdatesCallback; + callback(); + } +}; + +SourcesTestRunner.finishBreakpointTest = function(breakpointManager, next) { + SourcesTestRunner.runAfterPendingBreakpointUpdates(breakpointManager, dump); + + function dump() { + SourcesTestRunner.dumpBreakpointLocations(breakpointManager); + SourcesTestRunner.dumpBreakpointStorage(breakpointManager); + SourcesTestRunner.runAfterPendingBreakpointUpdates(breakpointManager, reset); + } + + function reset() { + SourcesTestRunner.resetBreakpointManager(breakpointManager, didReset); + } + + function didReset() { + SourcesTestRunner.runAfterPendingBreakpointUpdates(breakpointManager, finish); + } + + function finish() { + SourcesTestRunner.dumpBreakpointLocations(breakpointManager); + next(); + } +};
diff --git a/third_party/WebKit/Source/devtools/front_end/sources_test_runner/DebuggerTestRunner.js b/third_party/WebKit/Source/devtools/front_end/sources_test_runner/DebuggerTestRunner.js new file mode 100644 index 0000000..3f52c02 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/sources_test_runner/DebuggerTestRunner.js
@@ -0,0 +1,757 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +SourcesTestRunner.startDebuggerTest = function(callback, quiet) { + console.assert(TestRunner.debuggerModel.debuggerEnabled(), 'Debugger has to be enabled'); + + if (quiet !== undefined) + SourcesTestRunner._quiet = quiet; + + UI.viewManager.showView('sources'); + TestRunner.addSniffer(SDK.DebuggerModel.prototype, '_pausedScript', SourcesTestRunner._pausedScript, true); + TestRunner.addSniffer(SDK.DebuggerModel.prototype, '_resumedScript', SourcesTestRunner._resumedScript, true); + TestRunner.safeWrap(callback)(); +}; + +SourcesTestRunner.startDebuggerTestPromise = function(quiet) { + var cb; + var p = new Promise(fullfill => cb = fullfill); + SourcesTestRunner.startDebuggerTest(cb, quiet); + return p; +}; + +SourcesTestRunner.completeDebuggerTest = function() { + Bindings.breakpointManager.setBreakpointsActive(true); + SourcesTestRunner.resumeExecution(TestRunner.completeTest.bind(TestRunner)); +}; + +(function() { +var origThen = Promise.prototype.then; +var origCatch = Promise.prototype.catch; + +Promise.prototype.then = function() { + var result = origThen.apply(this, arguments); + origThen.call(result, undefined, onUncaughtPromiseReject.bind(null, new Error().stack)); + return result; +}; + +Promise.prototype.catch = function() { + var result = origCatch.apply(this, arguments); + origThen.call(result, undefined, onUncaughtPromiseReject.bind(null, new Error().stack)); + return result; +}; + +function onUncaughtPromiseReject(stack, e) { + var message = typeof e === 'object' && e.stack || e; + TestRunner.addResult('FAIL: Uncaught exception in promise: ' + message + ' ' + stack); + SourcesTestRunner.completeDebuggerTest(); +} +})(); + +SourcesTestRunner.runDebuggerTestSuite = function(testSuite) { + var testSuiteTests = testSuite.slice(); + + function runner() { + if (!testSuiteTests.length) { + SourcesTestRunner.completeDebuggerTest(); + return; + } + + var nextTest = testSuiteTests.shift(); + TestRunner.addResult(''); + TestRunner.addResult( + 'Running: ' + + /function\s([^(]*)/.exec(nextTest)[1]); + TestRunner.safeWrap(nextTest)(runner, runner); + } + + SourcesTestRunner.startDebuggerTest(runner); +}; + +SourcesTestRunner.runTestFunction = function() { + TestRunner.evaluateInPage('scheduleTestFunction()'); + TestRunner.addResult('Set timer for test function.'); +}; + +SourcesTestRunner.runTestFunctionAndWaitUntilPaused = function(callback) { + SourcesTestRunner.runTestFunction(); + SourcesTestRunner.waitUntilPaused(callback); +}; + +SourcesTestRunner.runTestFunctionAndWaitUntilPausedPromise = function() { + return new Promise(SourcesTestRunner.runTestFunctionAndWaitUntilPaused); +}; + +SourcesTestRunner.runAsyncCallStacksTest = function(totalDebuggerStatements, maxAsyncCallStackDepth) { + var defaultMaxAsyncCallStackDepth = 32; + SourcesTestRunner.setQuiet(true); + SourcesTestRunner.startDebuggerTest(step1); + + async function step1() { + await TestRunner.DebuggerAgent.setAsyncCallStackDepth(maxAsyncCallStackDepth || defaultMaxAsyncCallStackDepth); + SourcesTestRunner.runTestFunctionAndWaitUntilPaused(didPause); + } + + var step = 0; + var callStacksOutput = []; + + function didPause(callFrames, reason, breakpointIds, asyncStackTrace) { + ++step; + callStacksOutput.push(SourcesTestRunner.captureStackTraceIntoString(callFrames, asyncStackTrace) + '\n'); + + if (step < totalDebuggerStatements) { + SourcesTestRunner.resumeExecution(SourcesTestRunner.waitUntilPaused.bind(SourcesTestRunner, didPause)); + } else { + TestRunner.addResult('Captured call stacks in no particular order:'); + callStacksOutput.sort(); + TestRunner.addResults(callStacksOutput); + SourcesTestRunner.completeDebuggerTest(); + } + } +}; + +SourcesTestRunner.dumpSourceFrameMessages = function(sourceFrame, dumpFullURL) { + var messages = []; + + for (var bucket of sourceFrame._rowMessageBuckets.values()) { + for (var rowMessage of bucket._messages) { + var message = rowMessage.message(); + messages.push(String.sprintf( + ' %d:%d [%s] %s', message.lineNumber(), message.columnNumber(), message.level(), message.text())); + } + } + + var name = (dumpFullURL ? sourceFrame.uiSourceCode().url() : sourceFrame.uiSourceCode().displayName()); + TestRunner.addResult('SourceFrame ' + name + ': ' + messages.length + ' message(s)'); + TestRunner.addResult(messages.join('\n')); +}; + +SourcesTestRunner.waitUntilPausedNextTime = function(callback) { + SourcesTestRunner._waitUntilPausedCallback = TestRunner.safeWrap(callback); +}; + +SourcesTestRunner.waitUntilPaused = function(callback) { + callback = TestRunner.safeWrap(callback); + + if (SourcesTestRunner._pausedScriptArguments) + callback.apply(callback, SourcesTestRunner._pausedScriptArguments); + else + SourcesTestRunner._waitUntilPausedCallback = callback; +}; + +SourcesTestRunner.waitUntilPausedPromise = function() { + return new Promise(resolve => SourcesTestRunner.waitUntilPaused(resolve)); +}; + +SourcesTestRunner.waitUntilResumedNextTime = function(callback) { + SourcesTestRunner._waitUntilResumedCallback = TestRunner.safeWrap(callback); +}; + +SourcesTestRunner.waitUntilResumed = function(callback) { + callback = TestRunner.safeWrap(callback); + + if (!SourcesTestRunner._pausedScriptArguments) + callback(); + else + SourcesTestRunner._waitUntilResumedCallback = callback; +}; + +SourcesTestRunner.resumeExecution = function(callback) { + if (UI.panels.sources.paused()) + UI.panels.sources._togglePause(); + + SourcesTestRunner.waitUntilResumed(callback); +}; + +SourcesTestRunner.waitUntilPausedAndDumpStackAndResume = function(callback, options) { + SourcesTestRunner.waitUntilPaused(paused); + TestRunner.addSniffer(Sources.SourcesPanel.prototype, '_updateDebuggerButtonsAndStatus', setStatus); + var caption; + var callFrames; + var asyncStackTrace; + + function setStatus() { + var statusElement = this.element.querySelector('.paused-message'); + caption = statusElement.deepTextContent(); + + if (callFrames) + step1(); + } + + function paused(frames, reason, breakpointIds, async) { + callFrames = frames; + asyncStackTrace = async; + + if (typeof caption === 'string') + step1(); + } + + function step1() { + SourcesTestRunner.captureStackTrace(callFrames, asyncStackTrace, options); + TestRunner.addResult(TestRunner.clearSpecificInfoFromStackFrames(caption)); + TestRunner.deprecatedRunAfterPendingDispatches(step2); + } + + function step2() { + SourcesTestRunner.resumeExecution(TestRunner.safeWrap(callback)); + } +}; + +SourcesTestRunner.stepOver = function() { + Promise.resolve().then(function() { + UI.panels.sources._stepOver(); + }); +}; + +SourcesTestRunner.stepInto = function() { + Promise.resolve().then(function() { + UI.panels.sources._stepInto(); + }); +}; + +SourcesTestRunner.stepOut = function() { + Promise.resolve().then(function() { + UI.panels.sources._stepOut(); + }); +}; + +SourcesTestRunner.togglePause = function() { + Promise.resolve().then(function() { + UI.panels.sources._togglePause(); + }); +}; + +SourcesTestRunner.waitUntilPausedAndPerformSteppingActions = function(actions, callback) { + callback = TestRunner.safeWrap(callback); + SourcesTestRunner.waitUntilPaused(didPause); + + function didPause(callFrames, reason, breakpointIds, asyncStackTrace) { + var action = actions.shift(); + + if (action === 'Print') { + SourcesTestRunner.captureStackTrace(callFrames, asyncStackTrace); + TestRunner.addResult(''); + + while (action === 'Print') + action = actions.shift(); + } + + if (!action) { + callback(); + return; + } + + TestRunner.addResult('Executing ' + action + '...'); + + switch (action) { + case 'StepInto': + SourcesTestRunner.stepInto(); + break; + case 'StepOver': + SourcesTestRunner.stepOver(); + break; + case 'StepOut': + SourcesTestRunner.stepOut(); + break; + case 'Resume': + SourcesTestRunner.togglePause(); + break; + default: + TestRunner.addResult('FAIL: Unknown action: ' + action); + callback(); + return; + } + + SourcesTestRunner.waitUntilResumed( + (actions.length ? SourcesTestRunner.waitUntilPaused.bind(SourcesTestRunner, didPause) : callback)); + } +}; + +SourcesTestRunner.captureStackTrace = function(callFrames, asyncStackTrace, options) { + TestRunner.addResult(SourcesTestRunner.captureStackTraceIntoString(callFrames, asyncStackTrace, options)); +}; + +SourcesTestRunner.captureStackTraceIntoString = function(callFrames, asyncStackTrace, options) { + var results = []; + options = options || {}; + + function printCallFrames(callFrames, locationFunction, returnValueFunction) { + var printed = 0; + + for (var i = 0; i < callFrames.length; i++) { + var frame = callFrames[i]; + var location = locationFunction.call(frame); + var script = location.script(); + var uiLocation = Bindings.debuggerWorkspaceBinding.rawLocationToUILocation(location); + var isFramework = Bindings.blackboxManager.isBlackboxedRawLocation(location); + + if (options.dropFrameworkCallFrames && isFramework) + continue; + + var url; + var lineNumber; + + if (uiLocation && uiLocation.uiSourceCode.project().type() !== Workspace.projectTypes.Debugger) { + url = uiLocation.uiSourceCode.name(); + lineNumber = uiLocation.lineNumber + 1; + } else { + url = Bindings.displayNameForURL(script.sourceURL); + lineNumber = location.lineNumber + 1; + } + + var s = ((isFramework ? ' * ' : ' ')) + printed++ + ') ' + frame.functionName + ' (' + url + + ((options.dropLineNumbers ? '' : ':' + lineNumber)) + ')'; + results.push(s); + + if (options.printReturnValue && returnValueFunction && returnValueFunction.call(frame)) + results.push(' <return>: ' + returnValueFunction.call(frame).description); + + if (frame.functionName === 'scheduleTestFunction') { + var remainingFrames = callFrames.length - 1 - i; + + if (remainingFrames) + results.push(' <... skipped remaining frames ...>'); + + break; + } + } + + return printed; + } + + function runtimeCallFramePosition() { + return new SDK.DebuggerModel.Location(debuggerModel, this.scriptId, this.lineNumber, this.columnNumber); + } + + results.push('Call stack:'); + printCallFrames( + callFrames, SDK.DebuggerModel.CallFrame.prototype.location, SDK.DebuggerModel.CallFrame.prototype.returnValue); + + while (asyncStackTrace) { + results.push(' [' + (asyncStackTrace.description || 'Async Call') + ']'); + var debuggerModel = TestRunner.debuggerModel; + var printed = printCallFrames(asyncStackTrace.callFrames, runtimeCallFramePosition); + + if (!printed) + results.pop(); + + asyncStackTrace = asyncStackTrace.parent; + } + + return results.join('\n'); +}; + +SourcesTestRunner.dumpSourceFrameContents = function(sourceFrame) { + TestRunner.addResult('==Source frame contents start=='); + var textEditor = sourceFrame._textEditor; + + for (var i = 0; i < textEditor.linesCount; ++i) + TestRunner.addResult(textEditor.line(i)); + + TestRunner.addResult('==Source frame contents end=='); +}; + +SourcesTestRunner._pausedScript = function(callFrames, reason, auxData, breakpointIds, asyncStackTrace) { + if (!SourcesTestRunner._quiet) + TestRunner.addResult('Script execution paused.'); + + var debuggerModel = this.target().model(SDK.DebuggerModel); + SourcesTestRunner._pausedScriptArguments = [ + SDK.DebuggerModel.CallFrame.fromPayloadArray(debuggerModel, callFrames), reason, breakpointIds, asyncStackTrace, + auxData + ]; + + if (SourcesTestRunner._waitUntilPausedCallback) { + var callback = SourcesTestRunner._waitUntilPausedCallback; + delete SourcesTestRunner._waitUntilPausedCallback; + setTimeout(() => callback.apply(callback, SourcesTestRunner._pausedScriptArguments)); + } +}; + +SourcesTestRunner._resumedScript = function() { + if (!SourcesTestRunner._quiet) + TestRunner.addResult('Script execution resumed.'); + + delete SourcesTestRunner._pausedScriptArguments; + + if (SourcesTestRunner._waitUntilResumedCallback) { + var callback = SourcesTestRunner._waitUntilResumedCallback; + delete SourcesTestRunner._waitUntilResumedCallback; + callback(); + } +}; + +SourcesTestRunner.showUISourceCode = function(uiSourceCode, callback) { + var panel = UI.panels.sources; + panel.showUISourceCode(uiSourceCode); + var sourceFrame = panel.visibleView; + + if (sourceFrame.loaded) + callback(sourceFrame); + else + TestRunner.addSniffer(sourceFrame, 'onTextEditorContentSet', callback && callback.bind(null, sourceFrame)); +}; + +SourcesTestRunner.showUISourceCodePromise = function(uiSourceCode) { + var fulfill; + var promise = new Promise(x => fulfill = x); + SourcesTestRunner.showUISourceCode(uiSourceCode, fulfill); + return promise; +}; + +SourcesTestRunner.showScriptSource = function(scriptName, callback) { + SourcesTestRunner.waitForScriptSource(scriptName, onScriptSource); + + function onScriptSource(uiSourceCode) { + SourcesTestRunner.showUISourceCode(uiSourceCode, callback); + } +}; + +SourcesTestRunner.waitForScriptSource = function(scriptName, callback) { + var panel = UI.panels.sources; + var uiSourceCodes = panel._workspace.uiSourceCodes(); + + for (var i = 0; i < uiSourceCodes.length; ++i) { + if (uiSourceCodes[i].project().type() === Workspace.projectTypes.Service) + continue; + + if (uiSourceCodes[i].name() === scriptName) { + callback(uiSourceCodes[i]); + return; + } + } + + TestRunner.addSniffer( + Sources.SourcesView.prototype, '_addUISourceCode', + SourcesTestRunner.waitForScriptSource.bind(SourcesTestRunner, scriptName, callback)); +}; + +SourcesTestRunner.setBreakpoint = function(sourceFrame, lineNumber, condition, enabled) { + if (!sourceFrame._muted) + sourceFrame._setBreakpoint(lineNumber, 0, condition, enabled); +}; + +SourcesTestRunner.removeBreakpoint = function(sourceFrame, lineNumber) { + sourceFrame._breakpointManager.findBreakpoints(sourceFrame._uiSourceCode, lineNumber)[0].remove(); +}; + +SourcesTestRunner.createNewBreakpoint = function(sourceFrame, lineNumber, condition, enabled) { + var promise = + new Promise(resolve => TestRunner.addSniffer(sourceFrame.__proto__, '_breakpointWasSetForTest', resolve)); + sourceFrame._createNewBreakpoint(lineNumber, condition, enabled); + return promise; +}; + +SourcesTestRunner.toggleBreakpoint = function(sourceFrame, lineNumber, disableOnly) { + if (!sourceFrame._muted) + sourceFrame._toggleBreakpoint(lineNumber, disableOnly); +}; + +SourcesTestRunner.waitBreakpointSidebarPane = function(waitUntilResolved) { + return new Promise( + resolve => TestRunner.addSniffer( + Sources.JavaScriptBreakpointsSidebarPane.prototype, '_didUpdateForTest', resolve)) + .then(checkIfReady); + + function checkIfReady() { + if (!waitUntilResolved) + return; + + for (var breakpoint of Bindings.breakpointManager._allBreakpoints()) { + if (breakpoint._fakePrimaryLocation && breakpoint.enabled()) + return SourcesTestRunner.waitBreakpointSidebarPane(); + } + } +}; + +SourcesTestRunner.breakpointsSidebarPaneContent = function() { + var paneElement = self.runtime.sharedInstance(Sources.JavaScriptBreakpointsSidebarPane).contentElement; + var empty = paneElement.querySelector('.gray-info-message'); + + if (empty) + return TestRunner.textContentWithLineBreaks(empty); + + var entries = Array.from(paneElement.querySelectorAll('.breakpoint-entry')); + return entries.map(TestRunner.textContentWithLineBreaks).join('\n'); +}; + +SourcesTestRunner.dumpBreakpointSidebarPane = function(title) { + TestRunner.addResult('Breakpoint sidebar pane ' + (title || '')); + TestRunner.addResult(SourcesTestRunner.breakpointsSidebarPaneContent()); +}; + +SourcesTestRunner.dumpScopeVariablesSidebarPane = function() { + TestRunner.addResult('Scope variables sidebar pane:'); + var sections = SourcesTestRunner.scopeChainSections(); + + for (var i = 0; i < sections.length; ++i) { + var textContent = TestRunner.textContentWithLineBreaks(sections[i].element); + var text = TestRunner.clearSpecificInfoFromStackFrames(textContent); + + if (text.length > 0) + TestRunner.addResult(text); + + if (!sections[i].objectTreeElement().expanded) + TestRunner.addResult(' <section collapsed>'); + } +}; + +SourcesTestRunner.scopeChainSections = function() { + var children = self.runtime.sharedInstance(Sources.ScopeChainSidebarPane).contentElement.children; + var sections = []; + + for (var i = 0; i < children.length; ++i) + sections.push(children[i]._section); + + return sections; +}; + +SourcesTestRunner.expandScopeVariablesSidebarPane = function(callback) { + var sections = SourcesTestRunner.scopeChainSections(); + + for (var i = 0; i < sections.length - 1; ++i) + sections[i].expand(); + + TestRunner.deprecatedRunAfterPendingDispatches(callback); +}; + +SourcesTestRunner.expandProperties = function(properties, callback) { + var index = 0; + + function expandNextPath() { + if (index === properties.length) { + TestRunner.safeWrap(callback)(); + return; + } + + var parentTreeElement = properties[index++]; + var path = properties[index++]; + SourcesTestRunner._expandProperty(parentTreeElement, path, 0, expandNextPath); + } + + TestRunner.deprecatedRunAfterPendingDispatches(expandNextPath); +}; + +SourcesTestRunner._expandProperty = function(parentTreeElement, path, pathIndex, callback) { + if (pathIndex === path.length) { + TestRunner.addResult('Expanded property: ' + path.join('.')); + callback(); + return; + } + + var name = path[pathIndex++]; + var propertyTreeElement = SourcesTestRunner._findChildPropertyTreeElement(parentTreeElement, name); + + if (!propertyTreeElement) { + TestRunner.addResult('Failed to expand property: ' + path.slice(0, pathIndex).join('.')); + SourcesTestRunner.completeDebuggerTest(); + return; + } + + propertyTreeElement.expand(); + TestRunner.deprecatedRunAfterPendingDispatches( + SourcesTestRunner._expandProperty.bind(SourcesTestRunner, propertyTreeElement, path, pathIndex, callback)); +}; + +SourcesTestRunner._findChildPropertyTreeElement = function(parent, childName) { + var children = parent.children(); + + for (var i = 0; i < children.length; i++) { + var treeElement = children[i]; + var property = treeElement.property; + + if (property.name === childName) + return treeElement; + } +}; + +SourcesTestRunner.setQuiet = function(quiet) { + SourcesTestRunner._quiet = quiet; +}; + +SourcesTestRunner.queryScripts = function(filter) { + var scripts = TestRunner.debuggerModel.scripts(); + return (filter ? scripts.filter(filter) : scripts); +}; + +SourcesTestRunner.createScriptMock = function( + url, startLine, startColumn, isContentScript, source, target, preRegisterCallback) { + target = target || SDK.targetManager.mainTarget(); + var debuggerModel = target.model(SDK.DebuggerModel); + var scriptId = ++SourcesTestRunner._lastScriptId + ''; + var lineCount = source.computeLineEndings().length; + var endLine = startLine + lineCount - 1; + var endColumn = + (lineCount === 1 ? startColumn + source.length : source.length - source.computeLineEndings()[lineCount - 2]); + var hasSourceURL = + !!source.match(/\/\/#\ssourceURL=\s*(\S*?)\s*$/m) || !!source.match(/\/\/@\ssourceURL=\s*(\S*?)\s*$/m); + + var script = new SDK.Script( + debuggerModel, scriptId, url, startLine, startColumn, endLine, endColumn, 0, '', isContentScript, false, + undefined, hasSourceURL, source.length); + + script.requestContent = function() { + var trimmedSource = SDK.Script._trimSourceURLComment(source); + return Promise.resolve(trimmedSource); + }; + + if (preRegisterCallback) + preRegisterCallback(script); + + debuggerModel._registerScript(script); + return script; +}; + +SourcesTestRunner._lastScriptId = 0; + +SourcesTestRunner.checkRawLocation = function(script, lineNumber, columnNumber, location) { + TestRunner.assertEquals(script.scriptId, location.scriptId, 'Incorrect scriptId'); + TestRunner.assertEquals(lineNumber, location.lineNumber, 'Incorrect lineNumber'); + TestRunner.assertEquals(columnNumber, location.columnNumber, 'Incorrect columnNumber'); +}; + +SourcesTestRunner.checkUILocation = function(uiSourceCode, lineNumber, columnNumber, location) { + TestRunner.assertEquals( + uiSourceCode, location.uiSourceCode, + 'Incorrect uiSourceCode, expected \'' + ((uiSourceCode ? uiSourceCode.url() : null)) + '\',' + + ' but got \'' + ((location.uiSourceCode ? location.uiSourceCode.url() : null)) + '\''); + + TestRunner.assertEquals( + lineNumber, location.lineNumber, + 'Incorrect lineNumber, expected \'' + lineNumber + '\', but got \'' + location.lineNumber + '\''); + + TestRunner.assertEquals( + columnNumber, location.columnNumber, + 'Incorrect columnNumber, expected \'' + columnNumber + '\', but got \'' + location.columnNumber + '\''); +}; + +SourcesTestRunner.scriptFormatter = function() { + return self.runtime.allInstances(Sources.SourcesView.EditorAction).then(function(editorActions) { + for (var i = 0; i < editorActions.length; ++i) { + if (editorActions[i] instanceof Sources.ScriptFormatterEditorAction) + return editorActions[i]; + } + + return null; + }); +}; + +SourcesTestRunner.waitForExecutionContextInTarget = function(target, callback) { + var runtimeModel = target.model(SDK.RuntimeModel); + + if (runtimeModel.executionContexts().length) { + callback(runtimeModel.executionContexts()[0]); + return; + } + + runtimeModel.addEventListener(SDK.RuntimeModel.Events.ExecutionContextCreated, contextCreated); + + function contextCreated() { + runtimeModel.removeEventListener(SDK.RuntimeModel.Events.ExecutionContextCreated, contextCreated); + callback(runtimeModel.executionContexts()[0]); + } +}; + +SourcesTestRunner.selectThread = function(target) { + var threadsPane = self.runtime.sharedInstance(Sources.ThreadsSidebarPane); + threadsPane._list.selectItem(target.model(SDK.DebuggerModel)); +}; + +SourcesTestRunner.evaluateOnCurrentCallFrame = function(code) { + return new Promise( + succ => TestRunner.debuggerModel.evaluateOnSelectedCallFrame( + code, 'console', false, true, false, false, TestRunner.safeWrap(succ))); +}; + +SourcesTestRunner.waitJavaScriptSourceFrameBreakpoints = function(sourceFrame, inline) { + return waitUpdate().then(checkIfReady); + + function waitUpdate() { + return new Promise( + resolve => TestRunner.addSniffer(sourceFrame.__proto__, '_breakpointDecorationsUpdatedForTest', resolve)); + } + + function checkIfReady() { + for (var breakpoint of Bindings.breakpointManager._allBreakpoints()) { + if (breakpoint._fakePrimaryLocation && breakpoint.enabled()) + return waitUpdate().then(checkIfReady); + } + + return Promise.resolve(); + } +}; + +SourcesTestRunner.dumpJavaScriptSourceFrameBreakpoints = function(sourceFrame) { + var textEditor = sourceFrame._textEditor; + + for (var lineNumber = 0; lineNumber < textEditor.linesCount; ++lineNumber) { + if (!textEditor.hasLineClass(lineNumber, 'cm-breakpoint')) + continue; + + var disabled = textEditor.hasLineClass(lineNumber, 'cm-breakpoint-disabled'); + var conditional = textEditor.hasLineClass(lineNumber, 'cm-breakpoint-conditional'); + TestRunner.addResult( + 'breakpoint at ' + lineNumber + ((disabled ? ' disabled' : '')) + ((conditional ? ' conditional' : ''))); + var range = new TextUtils.TextRange(lineNumber, 0, lineNumber, textEditor.line(lineNumber).length); + var bookmarks = textEditor.bookmarks(range, Sources.JavaScriptSourceFrame.BreakpointDecoration._bookmarkSymbol); + bookmarks = bookmarks.filter(bookmark => !!bookmark.position()); + bookmarks.sort((bookmark1, bookmark2) => bookmark1.position().startColumn - bookmark2.position().startColumn); + + for (var bookmark of bookmarks) { + var position = bookmark.position(); + var element = bookmark[Sources.JavaScriptSourceFrame.BreakpointDecoration._elementSymbolForTest]; + var disabled = element.classList.contains('cm-inline-disabled'); + var conditional = element.classList.contains('cm-inline-conditional'); + + TestRunner.addResult( + ' inline breakpoint at (' + position.startLine + ', ' + position.startColumn + ')' + + ((disabled ? ' disabled' : '')) + ((conditional ? ' conditional' : ''))); + } + } +}; + +SourcesTestRunner.clickJavaScriptSourceFrameBreakpoint = function(sourceFrame, lineNumber, index, next) { + var textEditor = sourceFrame._textEditor; + var lineLength = textEditor.line(lineNumber).length; + var lineRange = new TextUtils.TextRange(lineNumber, 0, lineNumber, lineLength); + var bookmarks = textEditor.bookmarks(lineRange, Sources.JavaScriptSourceFrame.BreakpointDecoration._bookmarkSymbol); + bookmarks.sort((bookmark1, bookmark2) => bookmark1.position().startColumn - bookmark2.position().startColumn); + var bookmark = bookmarks[index]; + + if (bookmark) { + bookmark[Sources.JavaScriptSourceFrame.BreakpointDecoration._elementSymbolForTest].click(); + } else { + TestRunner.addResult(`Could not click on Javascript breakpoint - lineNumber: ${lineNumber}, index: ${index}`); + next(); + } +}; + +SourcesTestRunner.setEventListenerBreakpoint = function(id, enabled, targetName) { + var pane = self.runtime.sharedInstance(Sources.EventListenerBreakpointsSidebarPane); + + var auxData = {'eventName': id}; + + if (targetName) + auxData.targetName = targetName; + + var breakpoint = SDK.domDebuggerManager.resolveEventListenerBreakpoint(auxData); + + if (breakpoint.enabled() !== enabled) { + pane._breakpoints.get(breakpoint).checkbox.checked = enabled; + pane._breakpointCheckboxClicked(breakpoint); + } +}; + +(async function() { + await TestRunner.evaluateInPagePromise(` + function scheduleTestFunction() { + setTimeout(testFunction, 0); + } + `); +})();
diff --git a/third_party/WebKit/Source/devtools/front_end/sources_test_runner/EditorTestRunner.js b/third_party/WebKit/Source/devtools/front_end/sources_test_runner/EditorTestRunner.js new file mode 100644 index 0000000..59983cc --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/sources_test_runner/EditorTestRunner.js
@@ -0,0 +1,219 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +SourcesTestRunner.createTestEditor = function(clientHeight, textEditorDelegate) { + var textEditor = new SourceFrame.SourcesTextEditor(textEditorDelegate || new SourceFrame.SourcesTextEditorDelegate()); + clientHeight = clientHeight || 100; + textEditor.element.style.height = clientHeight + 'px'; + textEditor.element.style.flex = 'none'; + textEditor.show(UI.inspectorView.element); + return textEditor; +}; + +function textWithSelection(text, selections) { + if (!selections.length) + return text; + + function lineWithCursor(line, column, cursorChar) { + return line.substring(0, column) + cursorChar + line.substring(column); + } + + var lines = text.split('\n'); + selections.sort(TextUtils.TextRange.comparator); + + for (var i = selections.length - 1; i >= 0; --i) { + var selection = selections[i]; + selection = selection.normalize(); + var endCursorChar = (selection.isEmpty() ? '|' : '<'); + lines[selection.endLine] = lineWithCursor(lines[selection.endLine], selection.endColumn, endCursorChar); + + if (!selection.isEmpty()) + lines[selection.startLine] = lineWithCursor(lines[selection.startLine], selection.startColumn, '>'); + } + + return lines.join('\n'); +} + +SourcesTestRunner.dumpTextWithSelection = function(textEditor, dumpWhiteSpaces) { + var text = textWithSelection(textEditor.text(), textEditor.selections()); + + if (dumpWhiteSpaces) + text = text.replace(/ /g, '.'); + + TestRunner.addResult(text); +}; + +SourcesTestRunner.setLineSelections = function(editor, selections) { + var coords = []; + + for (var i = 0; i < selections.length; ++i) { + var selection = selections[i]; + + if (typeof selection.column === 'number') { + selection.from = selection.column; + selection.to = selection.column; + } + + coords.push(new TextUtils.TextRange(selection.line, selection.from, selection.line, selection.to)); + } + + editor.setSelections(coords); +}; + +SourcesTestRunner.typeIn = function(editor, typeText, callback) { + callback = callback || new Function(); + var noop = new Function(); + + for (var charIndex = 0; charIndex < typeText.length; ++charIndex) { + var iterationCallback = (charIndex + 1 === typeText.length ? callback : noop); + + switch (typeText[charIndex]) { + case '\n': + SourcesTestRunner.fakeKeyEvent(editor, 'Enter', null, iterationCallback); + break; + case 'L': + SourcesTestRunner.fakeKeyEvent(editor, 'ArrowLeft', null, iterationCallback); + break; + case 'R': + SourcesTestRunner.fakeKeyEvent(editor, 'ArrowRight', null, iterationCallback); + break; + case 'U': + SourcesTestRunner.fakeKeyEvent(editor, 'ArrowUp', null, iterationCallback); + break; + case 'D': + SourcesTestRunner.fakeKeyEvent(editor, 'ArrowDown', null, iterationCallback); + break; + default: + SourcesTestRunner.fakeKeyEvent(editor, typeText[charIndex], null, iterationCallback); + } + } +}; + +var eventCodes = {Enter: 13, Home: 36, ArrowLeft: 37, ArrowUp: 38, ArrowRight: 39, ArrowDown: 40}; + +function createCodeMirrorFakeEvent(editor, eventType, code, charCode, modifiers) { + function eventPreventDefault() { + this._handled = true; + } + + var event = { + _handled: false, + type: eventType, + keyCode: code, + charCode: charCode, + preventDefault: eventPreventDefault, + stopPropagation: function() {}, + target: editor._codeMirror.display.input.textarea + }; + + if (modifiers) { + for (var i = 0; i < modifiers.length; ++i) + event[modifiers[i]] = true; + } + + return event; +} + +function fakeCodeMirrorKeyEvent(editor, eventType, code, charCode, modifiers) { + var event = createCodeMirrorFakeEvent(editor, eventType, code, charCode, modifiers); + + switch (eventType) { + case 'keydown': + editor._codeMirror.triggerOnKeyDown(event); + break; + case 'keypress': + editor._codeMirror.triggerOnKeyPress(event); + break; + case 'keyup': + editor._codeMirror.triggerOnKeyUp(event); + break; + default: + throw new Error('Unknown KeyEvent type'); + } + + return event._handled; +} + +function fakeCodeMirrorInputEvent(editor, character) { + if (typeof character === 'string') + editor._codeMirror.display.input.textarea.value += character; +} + +SourcesTestRunner.fakeKeyEvent = function(editor, originalCode, modifiers, callback) { + modifiers = modifiers || []; + var code; + var charCode; + + if (originalCode === '\'') { + code = 222; + charCode = 0; + } else if (originalCode === '"') { + code = 222; + modifiers.push('shiftKey'); + charCode = 34; + } else if (originalCode === '(') { + code = '9'.charCodeAt(0); + modifiers.push('shiftKey'); + charCode = originalCode.charCodeAt(0); + } + + var code = code || eventCodes[originalCode] || originalCode; + + if (typeof code === 'string') + code = code.charCodeAt(0); + + if (fakeCodeMirrorKeyEvent(editor, 'keydown', code, charCode, modifiers)) { + callback(); + return; + } + + if (fakeCodeMirrorKeyEvent(editor, 'keypress', code, charCode, modifiers)) { + callback(); + return; + } + + fakeCodeMirrorInputEvent(editor, originalCode); + fakeCodeMirrorKeyEvent(editor, 'keyup', code, charCode, modifiers); + + function callbackWrapper() { + editor._codeMirror.off('inputRead', callbackWrapper); + callback(); + } + + editor._codeMirror.on('inputRead', callbackWrapper); +}; + +SourcesTestRunner.dumpSelectionStats = function(textEditor) { + var listHashMap = {}; + var sortedKeys = []; + var selections = textEditor.selections(); + + for (var i = 0; i < selections.length; ++i) { + var selection = selections[i]; + var text = textEditor.text(selection); + + if (!listHashMap[text]) { + listHashMap[text] = 1; + sortedKeys.push(text); + } else { + ++listHashMap[text]; + } + } + + for (var i = 0; i < sortedKeys.length; ++i) { + var keyName = sortedKeys[i]; + + if (!keyName.length) + keyName = '<Empty string>'; + else + keyName = '\'' + keyName + '\''; + + TestRunner.addResult(keyName + ': ' + listHashMap[sortedKeys[i]]); + } +};
diff --git a/third_party/WebKit/Source/devtools/front_end/sources_test_runner/LiveEditTestRunner.js b/third_party/WebKit/Source/devtools/front_end/sources_test_runner/LiveEditTestRunner.js new file mode 100644 index 0000000..80afde0 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/sources_test_runner/LiveEditTestRunner.js
@@ -0,0 +1,31 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +SourcesTestRunner.replaceInSource = function(sourceFrame, string, replacement) { + sourceFrame._textEditor.setReadOnly(false); + + for (var i = 0; i < sourceFrame._textEditor.linesCount; ++i) { + var line = sourceFrame._textEditor.line(i); + var column = line.indexOf(string); + + if (column === -1) + continue; + + range = new TextUtils.TextRange(i, column, i, column + string.length); + break; + } +}; + +SourcesTestRunner.commitSource = function(sourceFrame) { + sourceFrame.commitEditing(); +}; + +SourcesTestRunner.undoSourceEditing = function(sourceFrame) { + sourceFrame._textEditor.undo(); +};
diff --git a/third_party/WebKit/Source/devtools/front_end/sources_test_runner/SearchTestRunner.js b/third_party/WebKit/Source/devtools/front_end/sources_test_runner/SearchTestRunner.js new file mode 100644 index 0000000..588523a --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/sources_test_runner/SearchTestRunner.js
@@ -0,0 +1,148 @@ +// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +SourcesTestRunner.dumpSearchResults = function(searchResults) { + function comparator(a, b) { + a.url.localeCompare(b.url); + } + + searchResults.sort(comparator); + TestRunner.addResult('Search results: '); + + for (var i = 0; i < searchResults.length; i++) { + TestRunner.addResult( + 'url: ' + searchResults[i].url.replace(/VM\d+/, 'VMXX') + ', matchesCount: ' + searchResults[i].matchesCount); + } + + TestRunner.addResult(''); +}; + +SourcesTestRunner.dumpSearchMatches = function(searchMatches) { + TestRunner.addResult('Search matches: '); + + for (var i = 0; i < searchMatches.length; i++) { + TestRunner.addResult( + 'lineNumber: ' + searchMatches[i].lineNumber + ', line: \'' + searchMatches[i].lineContent + '\''); + } + + TestRunner.addResult(''); +}; + +SourcesTestRunner.runSearchAndDumpResults = function(scope, searchConfig, callback) { + var searchResults = []; + var progress = new Common.Progress(); + scope.performSearch(searchConfig, progress, searchResultCallback, searchFinishedCallback); + + function searchResultCallback(searchResult) { + searchResults.push(searchResult); + } + + function searchFinishedCallback() { + function comparator(searchResultA, searchResultB) { + return searchResultA.uiSourceCode.url().compareTo(searchResultB.uiSourceCode.url()); + } + + searchResults.sort(comparator); + + for (var i = 0; i < searchResults.length; ++i) { + var searchResult = searchResults[i]; + var uiSourceCode = searchResult.uiSourceCode; + var searchMatches = searchResult.searchMatches; + + if (!searchMatches.length) + continue; + + TestRunner.addResult( + 'Search result #' + (i + 1) + ': uiSourceCode.url = ' + uiSourceCode.url().replace(/VM\d+/, 'VMXX')); + + for (var j = 0; j < searchMatches.length; ++j) { + var lineNumber = searchMatches[j].lineNumber; + var lineContent = searchMatches[j].lineContent; + TestRunner.addResult( + ' search match #' + (j + 1) + ': lineNumber = ' + lineNumber + ', lineContent = \'' + lineContent + '\''); + } + } + + callback(); + } +}; + +SourcesTestRunner.replaceAndDumpChange = function(sourceFrame, searchConfig, replacement, replaceAll) { + var modifiers = []; + + if (searchConfig.isRegex) + modifiers.push('regex'); + + if (searchConfig.caseSensitive) + modifiers.push('caseSensitive'); + + if (replaceAll) + modifiers.push('replaceAll'); + + var modifiersString = (modifiers.length ? ' (' + modifiers.join(', ') + ')' : ''); + TestRunner.addResult( + 'Running replace test for /' + searchConfig.query + '/' + replacement + '/ ' + modifiersString + ':'); + editor = sourceFrame._textEditor; + var oldLines = []; + + for (var i = 0; i < editor.linesCount; ++i) + oldLines.push(editor.line(i)); + + var searchableView = UI.panels.sources.sourcesView().searchableView(); + searchableView.showSearchField(); + searchableView._caseSensitiveButton.setToggled(searchConfig.caseSensitive); + searchableView._regexButton.setToggled(searchConfig.isRegex); + searchableView._searchInputElement.value = searchConfig.query; + searchableView._replaceCheckboxElement.checked = true; + searchableView._updateSecondRowVisibility(); + searchableView._replaceInputElement.value = replacement; + searchableView._performSearch(true, true); + + if (replaceAll) + searchableView._replaceAll(); + else + searchableView._replace(); + + var newLines = []; + + for (var i = 0; i < editor.linesCount; ++i) + newLines.push(editor.line(i)); + + for (var i = 0; i < newLines.length; ++i) { + if (oldLines[i] === newLines[i]) + continue; + + var oldLine = oldLines[i]; + var newLine = newLines[i]; + var prefixLength = 0; + + for (var j = 0; j < oldLine.length && j < newLine.length && newLine[j] === oldLine[j]; ++j) + ++prefixLength; + + var postfixLength = 0; + + for (var j = 0; j < oldLine.length && j < newLine.length && + newLine[newLine.length - j - 1] === oldLine[oldLine.length - j - 1]; + ++j) + ++postfixLength; + + var prefix = oldLine.substring(0, prefixLength); + var removed = oldLine.substring(prefixLength, oldLine.length - postfixLength); + var added = newLine.substring(prefixLength, newLine.length - postfixLength); + var postfix = oldLine.substring(oldLine.length - postfixLength); + TestRunner.addResult(' - ' + prefix + '#' + removed + '#' + added + '#' + postfix); + } +}; + +(async function() { + await TestRunner.evaluateInPagePromise(` + if (window.GCController) + GCController.collect(); + `); +})();
diff --git a/third_party/WebKit/Source/devtools/front_end/sources_test_runner/SourcesTestRunner.js b/third_party/WebKit/Source/devtools/front_end/sources_test_runner/SourcesTestRunner.js index ed36909..4b28e95 100644 --- a/third_party/WebKit/Source/devtools/front_end/sources_test_runner/SourcesTestRunner.js +++ b/third_party/WebKit/Source/devtools/front_end/sources_test_runner/SourcesTestRunner.js
@@ -74,41 +74,6 @@ }; /** - * @param {string} urlSuffix - * @param {!Workspace.projectTypes=} projectType - * @return {!Promise} - */ -SourcesTestRunner.waitForUISourceCode = function(urlSuffix, projectType) { - /** - * @param {!Workspace.UISourceCode} uiSourceCode - * @return {boolean} - */ - function matches(uiSourceCode) { - if (projectType && uiSourceCode.project().type() !== projectType) - return false; - if (!projectType && uiSourceCode.project().type() === Workspace.projectTypes.Service) - return false; - if (urlSuffix && !uiSourceCode.url().endsWith(urlSuffix)) - return false; - return true; - } - - for (var uiSourceCode of Workspace.workspace.uiSourceCodes()) { - if (urlSuffix && matches(uiSourceCode)) - return Promise.resolve(uiSourceCode); - } - - return TestRunner.waitForEvent(Workspace.Workspace.Events.UISourceCodeAdded, Workspace.workspace, matches); -}; - -/** - * @param {!Function} callback - */ -SourcesTestRunner.waitForUISourceCodeRemoved = function(callback) { - Workspace.workspace.once(Workspace.Workspace.Events.UISourceCodeRemoved).then(callback); -}; - -/** * @param {string} url * @param {string} content * @param {boolean=} isContentScript @@ -120,5 +85,70 @@ if (isContentScript) content = `testRunner.evaluateScriptInIsolatedWorld(${worldId}, \`${content}\`)`; TestRunner.evaluateInPagePromise(content); - return SourcesTestRunner.waitForUISourceCode(url); + return TestRunner.waitForUISourceCode(url); +}; + +function testSourceMapping(text1, text2, mapping, testToken) { + var originalPosition = text1.indexOf(testToken); + TestRunner.assertTrue(originalPosition !== -1); + var originalLocation = Formatter.Formatter.positionToLocation(text1.computeLineEndings(), originalPosition); + var formattedLocation = mapping.originalToFormatted(originalLocation[0], originalLocation[1]); + var formattedPosition = + Formatter.Formatter.locationToPosition(text2.computeLineEndings(), formattedLocation[0], formattedLocation[1]); + var expectedFormattedPosition = text2.indexOf(testToken); + + if (expectedFormattedPosition === formattedPosition) + TestRunner.addResult(String.sprintf('Correct mapping for <%s>', testToken)); + else + TestRunner.addResult(String.sprintf('ERROR: Wrong mapping for <%s>', testToken)); +} + +SourcesTestRunner.testPrettyPrint = function(mimeType, text, mappingQueries, next) { + new Formatter.ScriptFormatter(mimeType, text, didFormatContent); + + function didFormatContent(formattedSource, mapping) { + TestRunner.addResult('====== 8< ------'); + TestRunner.addResult(formattedSource); + TestRunner.addResult('------ >8 ======'); + + while (mappingQueries && mappingQueries.length) + testSourceMapping(text, formattedSource, mapping, mappingQueries.shift()); + + next(); + } +}; + +SourcesTestRunner.testJavascriptOutline = function(text) { + var fulfill; + var promise = new Promise(x => fulfill = x); + Formatter.formatterWorkerPool().javaScriptOutline(text, onChunk); + var items = []; + return promise; + + function onChunk(isLastChunk, outlineItems) { + items.pushAll(outlineItems); + + if (!isLastChunk) + return; + + TestRunner.addResult('Text:'); + TestRunner.addResult(text.split('\n').map(line => ' ' + line).join('\n')); + TestRunner.addResult('Outline:'); + + for (var item of items) + TestRunner.addResult(' ' + item.name + (item.arguments || '') + ':' + item.line + ':' + item.column); + + fulfill(); + } +}; + +SourcesTestRunner.dumpSwatchPositions = function(sourceFrame, bookmarkType) { + var textEditor = sourceFrame.textEditor; + var markers = textEditor.bookmarks(textEditor.fullRange(), bookmarkType); + + for (var i = 0; i < markers.length; i++) { + var position = markers[i].position(); + var text = markers[i]._marker.widgetNode.firstChild.textContent; + TestRunner.addResult('Line ' + position.startLine + ', Column ' + position.startColumn + ': ' + text); + } };
diff --git a/third_party/WebKit/Source/devtools/front_end/sources_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/sources_test_runner/module.json index 147271d..b9ceb99 100644 --- a/third_party/WebKit/Source/devtools/front_end/sources_test_runner/module.json +++ b/third_party/WebKit/Source/devtools/front_end/sources_test_runner/module.json
@@ -3,9 +3,26 @@ "test_runner", "integration_test_runner", "sources", - "workspace" + "workspace", + "source_frame", + "text_utils" ], "scripts": [ - "SourcesTestRunner.js" + "SourcesTestRunner.js", + "DebuggerTestRunner.js", + "LiveEditTestRunner.js", + "SearchTestRunner.js", + "EditorTestRunner.js", + "AutocompleteTestRunner.js", + "BreakpointManagerTestRunner.js" + ], + "skip_compilation": [ + "DebuggerTestRunner.js", + "LiveEditTestRunner.js", + "SearchTestRunner.js", + "SourcesTestRunner.js", + "EditorTestRunner.js", + "AutocompleteTestRunner.js", + "BreakpointManagerTestRunner.js" ] -} \ No newline at end of file +}
diff --git a/third_party/WebKit/Source/devtools/front_end/test_runner/TestRunner.js b/third_party/WebKit/Source/devtools/front_end/test_runner/TestRunner.js index b03973cb0..d394f2d 100644 --- a/third_party/WebKit/Source/devtools/front_end/test_runner/TestRunner.js +++ b/third_party/WebKit/Source/devtools/front_end/test_runner/TestRunner.js
@@ -11,7 +11,15 @@ const testScriptURL = /** @type {string} */ (Runtime.queryParam('test')); fetch(testScriptURL) .then(data => data.text()) - .then(testScript => eval(`(function test(){${testScript}})()\n//# sourceURL=${testScriptURL}`)) + .then(testScript => { + if (!self.testRunner || Runtime.queryParam('debugFrontend')) { + self.eval(`function test(){${testScript}}\n//# sourceURL=${testScriptURL}`); + TestRunner.addResult = console.log; + TestRunner.completeTest = () => console.log('Test completed'); + return; + } + eval(`(function test(){${testScript}})()\n//# sourceURL=${testScriptURL}`); + }) .catch(error => { TestRunner.addResult(`Unable to execute test script because of error: ${error}`); TestRunner.completeTest(); @@ -22,10 +30,6 @@ TestRunner._results = []; TestRunner.completeTest = function() { - if (!self.testRunner) { - console.log('Test Done'); - return; - } TestRunner.flushResults(); self.testRunner.notifyDone(); }; @@ -54,10 +58,7 @@ * @param {*} text */ TestRunner.addResult = function(text) { - if (self.testRunner) - TestRunner._results.push(String(text)); - else - console.log(text); + TestRunner._results.push(String(text)); }; /** @@ -270,17 +271,6 @@ return buffer; }; -/** - * @param {!Function} testFunction - * @return {!Function} - */ -function debugTest(testFunction) { - self.test = testFunction; - TestRunner.addResult = console.log; - TestRunner.completeTest = () => console.log('Test completed'); - return () => {}; -} - (function() { /** * @param {string|!Event} message
diff --git a/third_party/WebKit/Source/devtools/scripts/compile_frontend.py b/third_party/WebKit/Source/devtools/scripts/compile_frontend.py index 5a783d4..e1d82786 100755 --- a/third_party/WebKit/Source/devtools/scripts/compile_frontend.py +++ b/third_party/WebKit/Source/devtools/scripts/compile_frontend.py
@@ -258,6 +258,8 @@ def check_conditional_dependencies(modules_by_name): errors_found = False for name in modules_by_name: + if 'test_runner' in name: + continue for dep_name in modules_by_name[name].get('dependencies', []): dependency = modules_by_name[dep_name] if dependency.get('experiment') or dependency.get('condition'):
diff --git a/third_party/WebKit/Source/devtools/scripts/migrate_test/glob.js b/third_party/WebKit/Source/devtools/scripts/migrate_test/glob.js new file mode 100644 index 0000000..c5ea1b9 --- /dev/null +++ b/third_party/WebKit/Source/devtools/scripts/migrate_test/glob.js
@@ -0,0 +1,45 @@ +// 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. + +'use strict'; + +const fs = require('fs'); +const path = require('path'); + +const utils = require('../utils'); + +const TESTS_PATH = path.resolve(__dirname, 'tests.txt'); + +function main() { + const files = process.argv.slice(2); + const inputPaths = files.map(p => path.isAbsolute(p) ? p : path.resolve(process.cwd(), p)); + let globbedPaths = []; + for (const p of inputPaths) { + glob(p); + } + let contents = fs.readFileSync(TESTS_PATH, 'utf-8'); + const tests = new Set(contents.split('\n').map(l => l.split(' ')[0])); + for (const p of globbedPaths) { + const relativePath = p.slice(p.indexOf('LayoutTests') + 'LayoutTests'.length + 1); + if (!tests.has(relativePath)) + contents += relativePath + '\n' + } + console.log('contents', contents); + fs.writeFileSync(TESTS_PATH, contents, 'utf-8'); + + + function glob(globPath) { + for (const filename of fs.readdirSync(globPath)) { + const p = path.resolve(globPath, filename); + if (utils.isDir(p) && filename !== 'resources') { + glob(p); + } + if (utils.isFile(p) && p.endsWith('.html')) { + globbedPaths.push(p); + } + } + } +} + +main();
diff --git a/third_party/WebKit/Source/devtools/scripts/migrate_test/migrate_helpers.js b/third_party/WebKit/Source/devtools/scripts/migrate_test/migrate_helpers.js new file mode 100644 index 0000000..4fe0ca9 --- /dev/null +++ b/third_party/WebKit/Source/devtools/scripts/migrate_test/migrate_helpers.js
@@ -0,0 +1,519 @@ +// 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. + +'use strict'; + +const fs = require('fs'); +const path = require('path'); + +const recast = require('recast'); +const types = recast.types; +const b = recast.types.builders; + +const utils = require('../utils'); +const migrateUtils = require('./migrate_utils'); +/** + * propertyToNamespace {[testProperty:string]: {namespace: string, done: boolean}} + * Moved file + * {ETR.something: ETR} + * Existing helper module + * {ConsoleTestRunner.something: CTR} + */ +const BUILD_GN_PATH = path.resolve(__dirname, '..', '..', 'BUILD.gn'); +const DRY_RUN = process.env.DRY_RUN || false; +const FRONT_END_PATH = path.resolve(__dirname, '..', '..', 'front_end'); + +function main() { + const helperPaths = scanHelpers(); + const helpers = mapTestFilesToHelperModules(helperPaths); + transformHelperCode(helpers); + if (DRY_RUN) { + return; + } + updateModuleDescriptors(helpers); + const newModules = new Set(); + const helperFiles = []; + for (const h of helpers) { + newModules.add(h.helperModule); + helperFiles.push(h.newPath); + } + const existingModulesJson = require(path.resolve(FRONT_END_PATH, 'integration_test_runner.json')); + for (const module of existingModulesJson.modules) { + newModules.delete(module.name) + } + updateApplicationDescriptor('integration_test_runner.json', newModules); + updateBuildGN(newModules, helperFiles); + writeNewHelpers(helpers); +} + +function updateBuildGN(newModuleSet, helperFiles) { + let content = fs.readFileSync(BUILD_GN_PATH).toString(); + helperFiles = + helperFiles.map(p => p.split('/').slice(-3).join('/')).filter(p => content.indexOf(p) === -1).map(p => `"${p}",`); + + let newContent = addContentToLinesInSortedOrder({ + content, + startLine: 'all_devtools_files = [', + endLine: ']', + linesToInsert: + [...newModuleSet].map(module => `"front_end/${module}/module.json",`).filter(p => content.indexOf(p) === -1), + }); + + newContent = addContentToLinesInSortedOrder({ + content: newContent, + startLine: 'all_devtools_files = [', + endLine: ']', + linesToInsert: helperFiles, + }); + + fs.writeFileSync(BUILD_GN_PATH, newContent); + + function top(array) { + return array[array.length - 1]; + } + + function addContentToLinesInSortedOrder({content, startLine, endLine, linesToInsert}) { + if (linesToInsert.length === 0) + return content; + let lines = content.split('\n'); + let seenStartLine = false; + let contentStack = linesToInsert.sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase())).reverse(); + for (var i = 0; i < lines.length; i++) { + let line = lines[i].trim(); + let nextLine = lines[i + 1].trim(); + if (line === startLine) + seenStartLine = true; + + if (line === endLine && seenStartLine) + break; + + if (!seenStartLine) + continue; + + const nextContent = top(contentStack) ? top(contentStack).toLowerCase() : ''; + if ((line === startLine || nextContent >= line.toLowerCase()) && + (nextLine === endLine || nextContent <= nextLine.toLowerCase())) + lines.splice(i + 1, 0, contentStack.pop()); + } + if (contentStack.length) + lines.splice(i, 0, ...contentStack); + return lines.join('\n'); + } +} + +function updateApplicationDescriptor(descriptorFileName, newModuleSet) { + let descriptorPath = path.join(FRONT_END_PATH, descriptorFileName); + let newModules = [...newModuleSet]; + if (newModules.length === 0) + return; + let includeNewModules = (acc, line) => { + if (line === ' "modules" : [') { + acc.push(line); + return acc.concat(newModules.map((m, i) => { + // Need spacing to preserve indentation + let string; + string = ` { "name": "${m}" },`; + return string; + })); + } + return acc.concat([line]); + }; + let lines = fs.readFileSync(descriptorPath).toString().split('\n').reduce(includeNewModules, []); + fs.writeFileSync(descriptorPath, lines.join('\n')); +} + +function updateModuleDescriptors(helpers) { + const dependenciesByModule = { + application_test_runner: ['resources', 'console_test_runner', 'sources', 'sources_test_runner'], + audits_test_runner: ['audits'], + bindings_test_runner: ['workspace', 'diff', 'bindings', 'persistence'], + coverage_test_runner: ['coverage', 'sources_test_runner'], + device_mode_test_runner: ['emulation'], + elements_test_runner: ['animation'], + accessibility_test_runner: ['accessibility', 'elements_test_runner'], + extensions_test_runner: ['extensions'], + layers_test_runner: ['layers', 'components'], + network_test_runner: ['product_registry_impl', 'console_test_runner'], + performance_test_runner: ['timeline_model', 'timeline'], + profiler_test_runner: ['profiler', 'data_grid', 'heap_snapshot_worker'], + security_test_runner: ['security'], + sources_test_runner: ['source_frame', 'text_utils'], + sass_test_runner: ['sass'], + }; + + for (const helper of helpers) { + const parentPath = path.dirname(helper.newPath); + if (!utils.isDir(parentPath)) + fs.mkdirSync(parentPath); + const modulePath = path.resolve(parentPath, 'module.json'); + const additionalDependencies = dependenciesByModule[helper.helperModule] || []; + let contents = { + dependencies: ['test_runner', 'integration_test_runner'], + scripts: [], + }; + if (utils.isFile(modulePath)) { + contents = JSON.parse(fs.readFileSync(modulePath, 'utf-8')); + } + contents.dependencies = unique(contents.dependencies.concat(additionalDependencies)); + const filename = path.basename(helper.newPath); + if (contents.scripts.indexOf(filename) === -1) + contents.scripts.push(filename); + contents.skip_compilation = contents.skip_compilation || []; + contents.skip_compilation.push(filename); + fs.writeFileSync(modulePath, stringifyJSON(contents)); + } + + function unique(array) { + const set = new Set(); + for (const el of array) + set.add(el); + return Array.from(set); + } + + function stringifyJSON(obj) { + return unicodeEscape(JSON.stringify(obj, null, 2) + '\n'); + } + + // http://stackoverflow.com/questions/7499473/need-to-escape-non-ascii-characters-in-javascript + function unicodeEscape(string) { + function padWithLeadingZeros(string) { + return new Array(5 - string.length).join('0') + string; + } + + function unicodeCharEscape(charCode) { + return '\\u' + padWithLeadingZeros(charCode.toString(16)); + } + + return string.split('') + .map(function(char) { + var charCode = char.charCodeAt(0); + return charCode > 127 ? unicodeCharEscape(charCode) : char; + }) + .join(''); + } +} + +function transformHelperCode(helpers) { + const boilerplate = `// Copyright 2017 The Chromium Authors. All +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview using private properties isn't a Closure violation in tests. + * @suppress {accessControls} + */ + +`; + + const propertyToNamespace = scrapeTestProperties(helpers); + + for (const helper of helpers) { + const ast = recast.parse(helper.originalContents); + unwrapInitializeFunction(ast); + + recast.visit(ast, { + /** + * Remove all deprecated API calls + */ + visitIdentifier: function(path) { + if (path.parentPath && path.parentPath.value && path.parentPath.value.object && + path.parentPath.value.object.name === 'InspectorTest' && path.value.name !== 'InspectorTest') { + const identifier = path.value.name; + if (identifier === 'preloadPanel' || identifier === 'preloadModule') { + console.log('helper: ', helper.originalPath, recast.print(path.parentPath.parentPath.value).code) + // Removes these types of calls: InspectorTest.preloadPanel("elements"); + path.parentPath.parentPath.prune(); + } + } + return false; + }, + /** + * Skip already ported API calls + */ + visitAssignmentExpression: function(path) { + if (!path.value.left.object) { + return false; + } + const namespace = path.value.left.object.name; + const propertyName = path.value.left.property.name; + if (namespace === 'InspectorTest' && propertyToNamespace.get(propertyName).done) { + // console.log('pruning', propertyName); + path.prune(); + } + this.traverse(path); + }, + }); + + /** + * Migrate all the call sites from InspectorTest to .*TestRunner + */ + recast.visit(ast, { + visitIdentifier: function(path) { + if (path.parentPath && path.parentPath.value && path.parentPath.value.object && + path.parentPath.value.object.name === 'InspectorTest' && path.value.name !== 'InspectorTest') { + if (!propertyToNamespace.get(path.value.name)) { + throw new Error('Could not find identifier for: ' + path.value.name); + } + const newParentIdentifier = propertyToNamespace.get(path.value.name).namespace; + path.parentPath.value.object.name = newParentIdentifier; + } + return false; + } + }); + + /** + * Migrate all the .bind call sites + * Example: SourcesTestRunner.waitUntilPaused.bind(InspectorTest, didPause) + */ + recast.visit(ast, { + visitCallExpression: function(path) { + const node = path.value; + if (node.callee.property && node.callee.property.name === 'bind') { + const code = recast.prettyPrint(node); + if (node.arguments[0].name === 'InspectorTest') { + node.arguments[0].name = node.callee.object.object.name; + } + } + this.traverse(path); + } + }); + + + const existingContents = utils.isFile(helper.newPath) ? fs.readFileSync(helper.newPath) : ''; + if (existingContents) + helper.contents = existingContents + '\n' + print(ast); + else + helper.contents = boilerplate + print(ast); + } + + function unwrapInitializeFunction(ast) { + // Handle function expression + let index = ast.program.body.findIndex( + n => n.type === 'VariableDeclaration' && n.declarations[0].id.name.indexOf('initialize_') !== -1); + if (index > -1) { + const otherNodes = ast.program.body.filter((_, i) => i !== index); + const testFunctionNode = ast.program.body[index]; + ast.program.body = testFunctionNode.declarations[0].init.body.body; + inspectedPageNodes(otherNodes); + return; + } + + // Handle function declaration + index = + ast.program.body.findIndex(n => n.type === 'FunctionDeclaration' && n.id.name.indexOf('initialize_') !== -1); + if (index > -1) { + const otherNodes = ast.program.body.filter((_, i) => i !== index); + const testFunctionNode = ast.program.body[index]; + ast.program.body.splice(index, 1); + ast.program.body = testFunctionNode.body.body; + inspectedPageNodes(otherNodes); + } + + function inspectedPageNodes(otherNodes) { + if (!otherNodes.length) + return; + const code = otherNodes.map(node => print(node)).join('\n').slice(0, -1); + ast.program.body.push(createAwaitExpressionNode(`await TestRunner.evaluateInPagePromise(\` +${code.split('\n').map(x => x.length ? ' ' + x : x).join('\n')} + \`)`)); + } + } +} + +function print(ast) { + /** + * Not using clang-format because certain tests look bad when formatted by it. + * Recast pretty print is smarter about preserving existing spacing. + */ + let code = recast.prettyPrint(ast, {tabWidth: 2, wrapColumn: 120, quote: 'single'}).code; + code = code.replace(/(\/\/\#\s*sourceURL=[\w-]+)\.html/, '$1.js'); + code = code.replace(/\s*\$\$SECRET_IDENTIFIER_FOR_LINE_BREAK\$\$\(\);/g, '\n'); + return code + '\n'; +} + +function scrapeTestProperties(helpers) { + const propertyToNamespace = new Map(); + scrapeOriginalHelpers(propertyToNamespace, helpers); + scrapeMovedHelpers(propertyToNamespace); + + // Manual overrides + propertyToNamespace.set('consoleModel', { + namespace: 'ConsoleModel', + done: true, + }); + propertyToNamespace.set('networkLog', { + namespace: 'NetworkLog', + done: true, + }); + return propertyToNamespace; +} + +function scrapeMovedHelpers(propertyToNamespace) { + const testRunnerPaths = fs.readdirSync(FRONT_END_PATH) + .filter(folder => folder.indexOf('test_runner') !== -1) + .map(folder => path.resolve(FRONT_END_PATH, folder)) + .filter(file => utils.isDir(file)); + + testRunnerPaths.forEach((helperPath) => { + const files = fs.readdirSync(helperPath) + .filter(file => file.indexOf('TestRunner') !== -1) + .map(file => path.resolve(helperPath, file)); + files.forEach(file => scrapeTestHelperIdentifiers(file)); + }); + + function scrapeTestHelperIdentifiers(filePath) { + var content = fs.readFileSync(filePath).toString(); + var lines = content.split('\n'); + for (var line of lines) { + var line = line.trim(); + if (line.indexOf('TestRunner.') === -1) + continue; + var match = line.match(/^\s*(\b\w*TestRunner.[a-z_A-Z0-9]+)\s*(\=[^,}]|[;])/) || + line.match(/^(TestRunner.[a-z_A-Z0-9]+)\s*\=$/); + if (!match) + continue; + var name = match[1]; + var components = name.split('.'); + if (components.length !== 2) + continue; + propertyToNamespace.set(components[1], { + namespace: components[0], + done: true, + }); + } + } +} + +function scrapeOriginalHelpers(propertyToNamespace, helpers) { + const testRunnerPaths = fs.readdirSync(FRONT_END_PATH) + .filter(folder => folder.indexOf('test_runner') !== -1) + .map(folder => path.resolve(FRONT_END_PATH, folder)); + + for (const helper of helpers) { + scrapeTestHelperIdentifiers(helper.originalContents, helper.namespace); + } + + function scrapeTestHelperIdentifiers(content, namespace) { + var lines = content.split('\n'); + for (var line of lines) { + var line = line.trim(); + if (line.indexOf('InspectorTest.') === -1) + continue; + var match = line.match(/^\s*(\b\w*InspectorTest.[a-z_A-Z0-9]+)\s*(\=[^,}]|[;])/) || + line.match(/^(InspectorTest.[a-z_A-Z0-9]+)\s*\=$/); + if (!match) + continue; + var name = match[1]; + var components = name.split('.'); + if (components.length !== 2) + continue; + propertyToNamespace.set(components[1], { + namespace: namespace, + done: false, + }); + } + } +} + +// Causes too much diff in test expectations +// function appendComment(helpers) { +// for (const {originalPath, originalContents, helperModule, filename} of helpers) { +// const comment = `// This file is being deprecated and is moving to front_end/${helperModule}/${filename} +// // Please see crbug.com/667560 for more details\n\n`; +// fs.writeFileSync(originalPath, comment + originalContents); +// } +// } + +function writeNewHelpers(helpers) { + for (const {contents, helperModule, filename} of helpers) { + const modulePath = path.resolve(FRONT_END_PATH, helperModule); + if (!utils.isDir(modulePath)) + fs.mkdirSync(modulePath); + const destPath = path.resolve(modulePath, filename); + fs.writeFileSync(destPath, contents); + } +} + +function mapTestFilesToHelperModules(helperPaths) { + const helpers = new Set(); + for (const p of helperPaths) { + const inputFilename = path.basename(p); + let namespacePrefix = path.basename(p) + .split('-test')[0] + .split('-') + .map(a => a.substring(0, 1).toUpperCase() + a.substring(1)) + .join(''); + let filenamePrefix = namespacePrefix; + + // Already migrated or n/a + if (namespacePrefix === 'Inspector' || namespacePrefix === 'Console' || namespacePrefix === 'Protocol' || + namespacePrefix === 'ExampleFilesetFor') { + continue; + } + + // Needs to be manually migrated + if (namespacePrefix === 'CspInline' || namespacePrefix === 'Stacktrace') + continue; + + const res = migrateUtils.mapTestFilename(inputFilename); + namespacePrefix = res.namespacePrefix; + filenamePrefix = res.filenamePrefix; + + const contents = fs.readFileSync(p, 'utf-8'); + const namespace = namespacePrefix + 'TestRunner'; + const helperModule = namespacePrefix === 'SASS' ? + 'sass_test_runner' : + namespacePrefix === '' ? 'integration_test_runner' : + namespace.replace(/([A-Z])/g, '_$1').replace(/^_/, '').toLowerCase(); + const filename = filenamePrefix + 'TestRunner.js'; + helpers.add({ + originalPath: p, + newPath: path.resolve(FRONT_END_PATH, helperModule, filename), + namespace, + helperModule, + filename, + originalContents: contents, + contents, + }); + } + return helpers; +} + +main(); + +function scanHelpers() { + const paths = []; + + const http_root = path.resolve(__dirname, '..', '..', '..', '..', 'LayoutTests', 'http', 'tests', 'inspector'); + const non_http_root = path.resolve(__dirname, '..', '..', '..', '..', 'LayoutTests', 'inspector'); + scan(http_root); + scan(non_http_root); + + function scan(p) { + const files = fs.readdirSync(p).map(file => path.resolve(p, file)); + for (const file of files) { + if (utils.isDir(file)) + scan(file); + else if ( + file.indexOf('-test.js') !== -1 || file.indexOf('syntax-highlight.js') !== -1 || + file.indexOf('timeline-data.js') !== -1 || file.indexOf('styles-update-links.js') !== -1 || + file.indexOf('breakpoint-manager.js') !== -1 || + file.indexOf('elements-panel-shadow-selection-on-refresh.js') !== -1 || file.indexOf('page-mock.js') !== -1) + paths.push(file); + } + } + + return paths; +} + +/** + * Hack to quickly create an AST node + */ +function createAwaitExpressionNode(code) { + return recast + .parse(`(async function(){ + ${code} + })()`) + .program.body[0]; +} \ No newline at end of file
diff --git a/third_party/WebKit/Source/devtools/scripts/migrate_test/migrate_test.js b/third_party/WebKit/Source/devtools/scripts/migrate_test/migrate_test.js index f9face9..99774b7 100644 --- a/third_party/WebKit/Source/devtools/scripts/migrate_test/migrate_test.js +++ b/third_party/WebKit/Source/devtools/scripts/migrate_test/migrate_test.js
@@ -9,6 +9,7 @@ const cheerio = require('cheerio'); const mkdirp = require('mkdirp'); +const prettier = require('prettier'); const recast = require('recast'); const types = recast.types; const b = recast.types.builders; @@ -24,6 +25,7 @@ const files = process.argv.slice(2); const inputPaths = files.map(p => path.isAbsolute(p) ? p : path.resolve(process.cwd(), p)); const identifierMap = generateTestHelperMap(); + for (const inputPath of inputPaths) { migrateTest(inputPath, identifierMap); } @@ -36,11 +38,12 @@ console.log('Starting to migrate: ', inputPath); const htmlTestFile = fs.readFileSync(inputPath, 'utf-8'); const $ = cheerio.load(htmlTestFile); + const onloadFunctionName = $('body')[0].attribs.onload ? $('body')[0].attribs.onload.slice(0, -2) : ''; const javascriptFixtures = []; const inputCode = $('script:not([src])') .toArray() .map(n => n.children[0].data) - .map(code => processScriptCode(code, javascriptFixtures)) + .map(code => processScriptCode(code, javascriptFixtures, onloadFunctionName)) .filter(x => !!x) .join('\n'); const bodyText = $('body').text().trim(); @@ -56,12 +59,6 @@ helperScripts.push(filename); }); - const testsPath = path.resolve(__dirname, 'tests.txt'); - const newToOldTests = new Map(fs.readFileSync(testsPath, 'utf-8').split('\n').map(line => line.split(' ').reverse())); - const originalTestPath = path.resolve( - __dirname, '..', '..', '..', '..', 'LayoutTests', newToOldTests.get(inputPath.slice(inputPath.indexOf('http/')))); - - const srcResourcePaths = resourceScripts.map(s => path.resolve(path.dirname(originalTestPath), s)); const destResourcePaths = resourceScripts.map(s => path.resolve(path.dirname(inputPath), s)); const relativeResourcePaths = destResourcePaths.map(p => p.slice(p.indexOf('/http/tests') + '/http/tests'.length)); @@ -74,14 +71,17 @@ // Tries to remove it if it has it's own line .replace(bodyText + '\n', '') // Tries to remove it if it's inline - .replace(bodyText, ''); - if (/<p>\s*<\/p>/.test(domFixture)) { - domFixture = undefined; - } - const onloadFunctionName = $('body')[0].attribs.onload.slice(0, -2); + .replace(bodyText, '') + .replace(/<p>\s*<\/p>/, '') + .replace(/<div>\s*<\/div>/, '') + .trim(); + const docType = htmlTestFile.match(/<!DOCTYPE.*>/) ? htmlTestFile.match(/<!DOCTYPE.*>/)[0] : ''; + if (docType) + domFixture = docType + (domFixture.length ? '\n' : '') + domFixture; outputCode = transformTestScript( inputCode, bodyText, identifierMap, testHelpers, javascriptFixtures, getPanel(inputPath), domFixture, onloadFunctionName, relativeResourcePaths); + outputCode = prettier.format(outputCode, {tabWidth: 2, printWidth: 120, singleQuote: true}); } catch (err) { console.log('Unable to migrate: ', inputPath); console.log('ERROR: ', err); @@ -90,13 +90,22 @@ console.log(outputCode); if (!DRY_RUN) { + const testsPath = path.resolve(__dirname, 'tests.txt'); + const newToOldTests = + new Map(fs.readFileSync(testsPath, 'utf-8').split('\n').map(line => line.split(' ').reverse())); + const originalTestPath = path.resolve( + __dirname, '..', '..', '..', '..', 'LayoutTests', + newToOldTests.get(inputPath.slice(inputPath.indexOf('http/')))); + + const srcResourcePaths = resourceScripts.map(s => path.resolve(path.dirname(originalTestPath), s)); + fs.writeFileSync(inputPath, outputCode); - copyResourceScripts(srcResourcePaths, destResourcePaths); + copyResourceScripts(srcResourcePaths, destResourcePaths, inputPath); console.log('Migrated: ', inputPath); } } -function copyResourceScripts(srcResourcePaths, destResourcePaths) { +function copyResourceScripts(srcResourcePaths, destResourcePaths, inputPath) { destResourcePaths.forEach((p, i) => { mkdirp.sync(path.dirname(p)); if (!utils.isFile(p)) { @@ -131,8 +140,8 @@ nonTestNodes.push(node); } - unwrapTestFunctionExpressionIfNecessary(ast); - unwrapTestFunctionDeclarationIfNecessary(ast); + unwrapFunctionExpression(ast, 'test'); + unwrapFunctionDeclaration(ast, 'test'); /** @@ -159,6 +168,24 @@ } }); + /** + * Migrate all the .bind call sites + * Example: SourcesTestRunner.waitUntilPaused.bind(InspectorTest, didPause) + */ + recast.visit(ast, { + visitCallExpression: function(path) { + const node = path.value; + if (node.callee.property && node.callee.property.name === 'bind') { + const code = recast.prettyPrint(node); + if (node.arguments[0].name === 'InspectorTest') { + node.arguments[0].name = node.callee.object.object.name; + } + } + this.traverse(path); + } + }); + + const allTestHelpers = new Set(); for (const helper of explicitTestHelpers) { @@ -181,7 +208,8 @@ for (const helper of allTestHelpers) { headerLines.push(createAwaitExpressionNode(`await TestRunner.loadModule('${helper}');`)); } - headerLines.push(createAwaitExpressionNode(`await TestRunner.showPanel('${panel}');`)); + if (panel) + headerLines.push(createAwaitExpressionNode(`await TestRunner.showPanel('${panel}');`)); if (domFixture) { headerLines.push(createAwaitExpressionNode(`await TestRunner.loadHTML(\` @@ -200,15 +228,15 @@ } let nonTestCode = nonTestNodes.reduce((acc, node) => { - let code = recast.print(node).code.split('\n').map(line => ' ' + line).join('\n'); - if (node.id && node.id.name === onloadFunctionName) { - code = code.replace(' runTest();\n', ''); - code = ` (${code.trimLeft()})();`; - }; + const ast = recast.parse(recast.print(node).code); + unwrapFunctionExpression(ast, onloadFunctionName); + unwrapFunctionDeclaration(ast, onloadFunctionName); + let code = recast.print(ast).code.split('\n').map(line => ' ' + line).join('\n'); + code = code.replace(/\s*runTest\(\);?\s*/, ''); + code = ` ${code.trim()};`; return acc + '\n' + code; }, ''); - - nonTestCode = nonTestCode.startsWith('\n') && nonTestCode.slice(2); + nonTestCode = ' ' + nonTestCode.trimLeft(); if (nonTestCode) { headerLines.push((createAwaitExpressionNode(`await TestRunner.evaluateInPagePromise(\` ${nonTestCode} @@ -238,7 +266,7 @@ * If the <script></script> block doesn't contain a test function * assume that it needs to be serialized */ -function processScriptCode(code, additionalHelperBlocks) { +function processScriptCode(code, javascriptFixtures, onloadFunctionName) { const ast = recast.parse(code); const testFunctionExpression = ast.program.body.find(n => n.type === 'VariableDeclaration' && n.declarations[0].id.name === 'test'); @@ -246,8 +274,16 @@ if (testFunctionExpression || testFunctionDeclaration) { return code; } - const formattedCode = code.trimRight().split('\n').map(line => ' ' + line).join('\n'); - additionalHelperBlocks.push(createAwaitExpressionNode(`await TestRunner.evaluateInPagePromise(\`${formattedCode} + unwrapFunctionExpression(ast, onloadFunctionName); + unwrapFunctionDeclaration(ast, onloadFunctionName); + const formattedCode = recast.print(ast) + .code.trimRight() + .split('\n') + .map(line => ' ' + line) + .join('\n') + .replace(/\s*runTest\(\);?\s*/, ''); + + javascriptFixtures.push(createAwaitExpressionNode(`await TestRunner.evaluateInPagePromise(\`${formattedCode} \`)`)); return; } @@ -256,9 +292,9 @@ * Unwrap test if it's a function expression * var test = function () {...} */ -function unwrapTestFunctionExpressionIfNecessary(ast) { +function unwrapFunctionExpression(ast, functionName) { const index = - ast.program.body.findIndex(n => n.type === 'VariableDeclaration' && n.declarations[0].id.name === 'test'); + ast.program.body.findIndex(n => n.type === 'VariableDeclaration' && n.declarations[0].id.name === functionName); if (index > -1) { const testFunctionNode = ast.program.body[index]; ast.program.body = testFunctionNode.declarations[0].init.body.body; @@ -270,8 +306,8 @@ * Unwrap test if it's a function declaration * function test () {...} */ -function unwrapTestFunctionDeclarationIfNecessary(ast) { - const index = ast.program.body.findIndex(n => n.type === 'FunctionDeclaration' && n.id.name === 'test'); +function unwrapFunctionDeclaration(ast, functionName) { + const index = ast.program.body.findIndex(n => n.type === 'FunctionDeclaration' && n.id.name === functionName); if (index > -1) { const testFunctionNode = ast.program.body[index]; ast.program.body.splice(index, 1); @@ -318,6 +354,8 @@ const components = inputPath.slice(inputPath.indexOf('LayoutTests/')).split('/'); const folder = inputPath.indexOf('LayoutTests/inspector') === -1 ? components[4] : components[2]; + if (folder.endsWith('.html')) + return; const panel = panelByFolder[folder]; if (!panel) { throw new Error('Could not figure out which panel to map folder: ' + folder); @@ -326,24 +364,18 @@ } function mapTestHelpers(testHelpers) { - const SKIP = 'SKIP'; - const testHelperMap = { - 'inspector-test': SKIP, - 'console-test': 'console_test_runner', - 'elements-test': 'elements_test_runner', - 'sources-test': 'sources_test_runner', - }; - const mappedHelpers = []; + const mappedHelpers = new Set(); for (const helper of testHelpers) { - const mappedHelper = testHelperMap[helper]; + const namespace = migrateUtils.mapTestFilename(helper).namespacePrefix + 'TestRunner'; + const mappedHelper = namespace.replace(/([A-Z])/g, '_$1').replace(/^_/, '').toLowerCase(); if (!mappedHelper) { throw Error('Could not map helper ' + helper); } - if (mappedHelper !== SKIP) { - mappedHelpers.push(mappedHelper); + if (mappedHelper !== 'inspector_test_runner') { + mappedHelpers.add(mappedHelper); } } - return mappedHelpers; + return Array.from(mappedHelpers); } function generateTestHelperMap() {
diff --git a/third_party/WebKit/Source/devtools/scripts/migrate_test/migrate_utils.js b/third_party/WebKit/Source/devtools/scripts/migrate_test/migrate_utils.js index be774e4..97d8124 100644 --- a/third_party/WebKit/Source/devtools/scripts/migrate_test/migrate_utils.js +++ b/third_party/WebKit/Source/devtools/scripts/migrate_test/migrate_utils.js
@@ -18,6 +18,92 @@ return out; } + +function mapTestFilename(filename) { + let namespacePrefix = path.basename(filename, '.js') + .split('-test')[0] + .split('-') + .map(a => a.substring(0, 1).toUpperCase() + a.substring(1)) + .join(''); + let filenamePrefix = namespacePrefix; + if (namespacePrefix === 'PageMock') + namespacePrefix = ''; + if (namespacePrefix === 'SyntaxHighlight') + namespacePrefix = ''; + if (namespacePrefix === 'Datagrid') { + namespacePrefix = 'DataGrid'; + filenamePrefix = 'DataGrid'; + } + if (namespacePrefix === 'TimelineData') + namespacePrefix = 'Performance'; + if (namespacePrefix === 'StylesUpdateLinks') + namespacePrefix = 'Elements'; + if (namespacePrefix === 'BreakpointManager') + namespacePrefix = 'Sources'; + if (namespacePrefix === 'ElementsPanelShadowSelectionOnRefresh') + namespacePrefix = 'Elements'; + + if (namespacePrefix === 'ExtensionsNetwork') + namespacePrefix = 'Extensions'; + if (namespacePrefix === 'CspInline') + namespacePrefix = 'CSPInline'; + if (namespacePrefix === 'Debugger') + namespacePrefix = 'Sources'; + if (namespacePrefix === 'Resources') { + namespacePrefix = 'Application'; + } + if (namespacePrefix === 'Appcache') + namespacePrefix = 'Application'; + if (namespacePrefix === 'ResourceTree') + namespacePrefix = 'Application'; + if (namespacePrefix === 'ServiceWorkers') + namespacePrefix = 'Application'; + if (namespacePrefix === 'CacheStorage') + namespacePrefix = 'Application'; + if (namespacePrefix === 'Indexeddb') { + namespacePrefix = 'Application'; + filenamePrefix = 'IndexedDB'; + } + if (namespacePrefix === 'Timeline') + namespacePrefix = 'Performance'; + if (namespacePrefix === 'ProductRegistry') + namespacePrefix = 'Network'; + if (namespacePrefix === 'Editor') + namespacePrefix = 'Sources'; + if (namespacePrefix === 'Search') + namespacePrefix = 'Sources'; + if (namespacePrefix === 'LiveEdit') + namespacePrefix = 'Sources'; + if (namespacePrefix === 'Autocomplete') + namespacePrefix = 'Sources'; + if (namespacePrefix === 'Changes') + namespacePrefix = 'Sources'; + if (namespacePrefix === 'Persistence') + namespacePrefix = 'Bindings'; + if (namespacePrefix === 'IsolatedFilesystem') + namespacePrefix = 'Bindings'; + if (namespacePrefix === 'Automapping') + namespacePrefix = 'Bindings'; + if (namespacePrefix === 'AccessibilityPane') + namespacePrefix = 'Accessibility'; + if (namespacePrefix === 'EditDom') { + namespacePrefix = 'Elements'; + filenamePrefix = 'EditDOM'; + } + if (namespacePrefix === 'SetOuterHtml') { + namespacePrefix = 'Elements'; + filenamePrefix = 'SetOuterHTML'; + } + if (namespacePrefix === 'HeapSnapshot') + namespacePrefix = 'Profiler'; + if (namespacePrefix === 'Sass') { + namespacePrefix = 'SASS' + filenamePrefix = 'SASS' + } + return {namespacePrefix, filenamePrefix}; +} + module.exports = { getOutPath, + mapTestFilename, };
diff --git a/third_party/WebKit/Source/devtools/scripts/migrate_test/move.js b/third_party/WebKit/Source/devtools/scripts/migrate_test/move.js index 21b6270..5bfecfa 100644 --- a/third_party/WebKit/Source/devtools/scripts/migrate_test/move.js +++ b/third_party/WebKit/Source/devtools/scripts/migrate_test/move.js
@@ -15,8 +15,9 @@ const MIGRATE_TEST_PATH = path.resolve(__dirname, 'migrate_test.js'); const TESTS_PATH = path.resolve(__dirname, 'tests.txt'); -const TEST_EXPECTATIONS_PATH = path.resolve(__dirname, '..', '..', '..', '..', 'LayoutTests', 'TestExpectations'); -const FLAG_EXPECTATIONS_PATH = path.resolve(__dirname, '..', '..', '..', '..', 'LayoutTests', 'FlagExpectations'); +const LAYOUT_TESTS_PATH = path.resolve(__dirname, '..', '..', '..', '..', 'LayoutTests'); +const TEST_EXPECTATIONS_PATH = path.resolve(LAYOUT_TESTS_PATH, 'TestExpectations'); +const FLAG_EXPECTATIONS_PATH = path.resolve(LAYOUT_TESTS_PATH, 'FlagExpectations'); function main() { const originalTests = fs.readFileSync(TESTS_PATH, 'utf-8').split('\n').map(line => line.split(' ')[0]); @@ -62,30 +63,78 @@ const newTestPaths = Array.from(oldToNewTestPath.values()).filter(x => x); + const TestExpectationFailureTypes = + ['Crash', 'Failure', 'Rebaseline', 'Skip', 'Timeout', 'WontFix', 'Missing', 'NeedsManualRebaseline']; + + const testsAlreadyExempted = new Set(); + // Update TestExpectations const testExpectations = fs.readFileSync(TEST_EXPECTATIONS_PATH, 'utf-8'); - const updatedTestExpecations = testExpectations.split('\n').map(line => { + let updatedTestExpecations = testExpectations.split('\n').map(line => { for (const [oldTestPath, newTestPath] of oldToNewTestPath) { if (!newTestPath) continue; - if (line.indexOf(oldTestPath) !== -1) + if (line.indexOf(oldTestPath) !== -1) { + if (TestExpectationFailureTypes.some(x => line.indexOf(x) !== -1)) { + testsAlreadyExempted.add(newTestPath); + } return line.replace(oldTestPath, newTestPath); + } + } + return line; + }); + + updatedTestExpecations = updatedTestExpecations.map(line => { + for (const [oldTestPath, newTestPath] of oldToNewTestPath) { + if (!newTestPath) + continue; if (line === '# See crbug.com/667560 for details') { - return line + '\n' + Array.from(newTestPaths).map(x => `crbug.com/667560 ${x} [ Skip ]`).join('\n'); + return line + '\n' + + Array.from(newTestPaths) + .filter(t => !testsAlreadyExempted.has(t)) + .map(x => `crbug.com/667560 ${x} [ Skip ]`) + .join('\n'); } if (line === '### virtual/mojo-loading/http/tests/devtools') { return line + '\n' + - Array.from(newTestPaths).map(x => `crbug.com/667560 virtual/mojo-loading/${x} [ Skip ]`).join('\n'); + Array.from(newTestPaths) + .filter(t => !testsAlreadyExempted.has(t)) + .map(x => `crbug.com/667560 virtual/mojo-loading/${x} [ Skip ]`) + .join('\n'); + } + + // Put mojo tests here so we don't re-enable the test after migrating + if (line === '### Manually fix after migration') { + return line + '\n' + + Array.from(newTestPaths) + .filter(t => testsAlreadyExempted.has(t)) + .map(x => `crbug.com/667560 virtual/mojo-loading/${x} [ Skip ]`) + .join('\n'); } } return line; }); fs.writeFileSync(TEST_EXPECTATIONS_PATH, updatedTestExpecations.join('\n')); + // Update additional test expectations + for (const filename + of ['ASANExpectations', 'LeakExpectations', 'MSANExpectations', 'NeverFixTests', 'SlowTests', 'SmokeTests', + 'StaleTestExpectations']) { + const filePath = path.resolve(LAYOUT_TESTS_PATH, filename); + updateExpectationsFile(filePath); + } + // Update FlagExpectations - for (const folder of fs.readdirSync(FLAG_EXPECTATIONS_PATH)) { - const flagFilePath = path.resolve(FLAG_EXPECTATIONS_PATH, folder); - const expectations = fs.readFileSync(flagFilePath, 'utf-8'); + for (const filename of fs.readdirSync(FLAG_EXPECTATIONS_PATH)) { + const filePath = path.resolve(FLAG_EXPECTATIONS_PATH, filename); + updateExpectationsFile(filePath); + } + + for (const [oldResourcesPath, newResourcesPath] of oldToNewResourcesPath) + utils.copyRecursive(oldResourcesPath, path.dirname(newResourcesPath)); + + function updateExpectationsFile(filePath) { + const expectations = fs.readFileSync(filePath, 'utf-8'); const updatedExpectations = expectations.split('\n').map(line => { for (const [oldTestPath, newTestPath] of oldToNewTestPath) { if (!newTestPath) @@ -96,11 +145,8 @@ } return line; }); - fs.writeFileSync(flagFilePath, updatedExpectations.join('\n')); + fs.writeFileSync(filePath, updatedExpectations.join('\n')); } - - for (const [oldResourcesPath, newResourcesPath] of oldToNewResourcesPath) - utils.copyRecursive(oldResourcesPath, path.dirname(newResourcesPath)); } main();
diff --git a/third_party/WebKit/Source/devtools/scripts/migrate_test/package.json b/third_party/WebKit/Source/devtools/scripts/migrate_test/package.json index a5279aff..8eb135ec 100644 --- a/third_party/WebKit/Source/devtools/scripts/migrate_test/package.json +++ b/third_party/WebKit/Source/devtools/scripts/migrate_test/package.json
@@ -6,6 +6,7 @@ "dependencies": { "cheerio": "^1.0.0-rc.2", "mkdirp": "^0.5.1", + "prettier": "^1.5.3", "recast": "^0.12.6" } }
diff --git a/third_party/WebKit/Source/devtools/scripts/migrate_test/transform.js b/third_party/WebKit/Source/devtools/scripts/migrate_test/transform.js index 2cf305b..a27cb643 100644 --- a/third_party/WebKit/Source/devtools/scripts/migrate_test/transform.js +++ b/third_party/WebKit/Source/devtools/scripts/migrate_test/transform.js
@@ -27,7 +27,7 @@ continue; const fullTestPath = path.resolve(__dirname, '..', '..', '..', '..', 'LayoutTests', testPath); try { - childProcess.execSync(`node ${MIGRATE_SCRIPT_PATH} ${fullTestPath}`) + childProcess.execSync(`node ${MIGRATE_SCRIPT_PATH} ${fullTestPath}`); } catch (err) { console.log(err.stdout.toString()); continue; @@ -56,7 +56,7 @@ updatedTestExpecationLines.push(line); continue; } - if (line === '# ====== DevTools test migration failures until here ======') { + if (line === '### Manually fix after migration') { seenEndSentinel = true; updatedTestExpecationLines.push(line); continue;
diff --git a/third_party/WebKit/Source/devtools/scripts/special_case_namespaces.json b/third_party/WebKit/Source/devtools/scripts/special_case_namespaces.json index a973224..ff555c9 100644 --- a/third_party/WebKit/Source/devtools/scripts/special_case_namespaces.json +++ b/third_party/WebKit/Source/devtools/scripts/special_case_namespaces.json
@@ -4,5 +4,6 @@ "object_ui": "ObjectUI", "perf_ui": "PerfUI", "css_tracker": "CSSTracker", - "har_importer": "HARImporter" + "har_importer": "HARImporter", + "sass_test_runner": "SASSTestRunner" } \ No newline at end of file
diff --git a/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp b/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp index 4aca03a..f4c5e55e 100644 --- a/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp +++ b/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp
@@ -44,10 +44,10 @@ const double BaseRenderingContext2D::kCDeviceScaleFactor = 1.0; BaseRenderingContext2D::BaseRenderingContext2D() - : clip_antialiasing_(kNotAntiAliased), color_management_enabled_(false) { + : clip_antialiasing_(kNotAntiAliased), + color_management_enabled_( + RuntimeEnabledFeatures::ColorCorrectRenderingEnabled()) { state_stack_.push_back(CanvasRenderingContext2DState::Create()); - color_management_enabled_ = - RuntimeEnabledFeatures::ColorCanvasExtensionsEnabled(); } BaseRenderingContext2D::~BaseRenderingContext2D() {}
diff --git a/third_party/WebKit/Source/modules/exported/WebEmbeddedWorkerImpl.cpp b/third_party/WebKit/Source/modules/exported/WebEmbeddedWorkerImpl.cpp index b1f679e0d..50bc156 100644 --- a/third_party/WebKit/Source/modules/exported/WebEmbeddedWorkerImpl.cpp +++ b/third_party/WebKit/Source/modules/exported/WebEmbeddedWorkerImpl.cpp
@@ -53,7 +53,6 @@ #include "modules/serviceworkers/ServiceWorkerGlobalScopeProxy.h" #include "modules/serviceworkers/ServiceWorkerInstalledScriptsManager.h" #include "modules/serviceworkers/ServiceWorkerThread.h" -#include "platform/Histogram.h" #include "platform/RuntimeEnabledFeatures.h" #include "platform/SharedBuffer.h" #include "platform/heap/Handle.h" @@ -340,17 +339,6 @@ } worker_context_client_->WorkerScriptLoaded(); - DEFINE_STATIC_LOCAL(CustomCountHistogram, script_size_histogram, - ("ServiceWorker.ScriptSize", 1000, 5000000, 50)); - script_size_histogram.Count(main_script_loader_->SourceText().length()); - if (main_script_loader_->CachedMetadata()) { - DEFINE_STATIC_LOCAL( - CustomCountHistogram, script_cached_metadata_size_histogram, - ("ServiceWorker.ScriptCachedMetadataSize", 1000, 50000000, 50)); - script_cached_metadata_size_histogram.Count( - main_script_loader_->CachedMetadata()->size()); - } - if (pause_after_download_state_ == kDoPauseAfterDownload) { pause_after_download_state_ = kIsPausedAfterDownload; return;
diff --git a/third_party/WebKit/Source/modules/mediasource/TrackDefault.cpp b/third_party/WebKit/Source/modules/mediasource/TrackDefault.cpp index 19326c2..9c0453f 100644 --- a/third_party/WebKit/Source/modules/mediasource/TrackDefault.cpp +++ b/third_party/WebKit/Source/modules/mediasource/TrackDefault.cpp
@@ -5,9 +5,11 @@ #include "modules/mediasource/TrackDefault.h" #include "bindings/core/v8/ExceptionState.h" +#include "bindings/core/v8/ToV8ForCore.h" #include "core/html/track/AudioTrack.h" #include "core/html/track/TextTrack.h" #include "core/html/track/VideoTrack.h" +#include "platform/bindings/ScriptState.h" namespace blink { @@ -26,6 +28,10 @@ return text; } +ScriptValue TrackDefault::kinds(ScriptState* script_state) const { + return ScriptValue(script_state, ToV8(kinds_, script_state)); +} + TrackDefault* TrackDefault::Create(const AtomicString& type, const String& language, const String& label,
diff --git a/third_party/WebKit/Source/modules/mediasource/TrackDefault.h b/third_party/WebKit/Source/modules/mediasource/TrackDefault.h index c25e151f..6fb1926 100644 --- a/third_party/WebKit/Source/modules/mediasource/TrackDefault.h +++ b/third_party/WebKit/Source/modules/mediasource/TrackDefault.h
@@ -5,12 +5,14 @@ #ifndef TrackDefault_h #define TrackDefault_h +#include "bindings/core/v8/ScriptValue.h" #include "platform/bindings/ScriptWrappable.h" #include "platform/wtf/text/WTFString.h" namespace blink { class ExceptionState; +class ScriptState; class TrackDefault final : public GarbageCollectedFinalized<TrackDefault>, public ScriptWrappable { @@ -35,7 +37,7 @@ String byteStreamTrackID() const { return byte_stream_track_id_; } String language() const { return language_; } String label() const { return label_; } - const Vector<String>& kinds() const { return kinds_; } + ScriptValue kinds(ScriptState*) const; DEFINE_INLINE_TRACE() {}
diff --git a/third_party/WebKit/Source/modules/mediasource/TrackDefault.idl b/third_party/WebKit/Source/modules/mediasource/TrackDefault.idl index 89ae52a..8a8e11a9 100644 --- a/third_party/WebKit/Source/modules/mediasource/TrackDefault.idl +++ b/third_party/WebKit/Source/modules/mediasource/TrackDefault.idl
@@ -16,9 +16,10 @@ readonly attribute DOMString byteStreamTrackID; readonly attribute DOMString language; readonly attribute DOMString label; - // TODO(wolenetz): |kinds| should be [SameObject] FrozenArray<DOMString> or - // a getKinds() method returning sequence<DOMString>. - // https://github.com/w3c/media-source/issues/91 - // https://crbug.com/619665 - readonly attribute DOMString[] kinds; + // TrackDefault was removed from the spec in + // https://github.com/w3c/media-source/pull/138, and the last version to + // have it had getKinds() instead of |kinds|. Use an object here to avoid + // WebIDL arrays (which no longer exist) while not breaking compatibility + // See also: https://crbug.com/619665. + [CallWith=ScriptState] readonly attribute object kinds; };
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScope.cpp b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScope.cpp index 008caf37..3cad3ec 100644 --- a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScope.cpp +++ b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScope.cpp
@@ -120,8 +120,31 @@ ServiceWorkerGlobalScope::~ServiceWorkerGlobalScope() {} -void ServiceWorkerGlobalScope::CountScript(size_t script_size, - size_t cached_metadata_size) { +void ServiceWorkerGlobalScope::CountWorkerScript(size_t script_size, + size_t cached_metadata_size) { + DEFINE_THREAD_SAFE_STATIC_LOCAL( + CustomCountHistogram, script_size_histogram, + ("ServiceWorker.ScriptSize", 1000, 5000000, 50)); + script_size_histogram.Count(script_size); + + if (cached_metadata_size) { + DEFINE_THREAD_SAFE_STATIC_LOCAL( + CustomCountHistogram, script_cached_metadata_size_histogram, + ("ServiceWorker.ScriptCachedMetadataSize", 1000, 50000000, 50)); + script_cached_metadata_size_histogram.Count(cached_metadata_size); + } + + RecordScriptSize(script_size, cached_metadata_size); +} + +void ServiceWorkerGlobalScope::CountImportedScript( + size_t script_size, + size_t cached_metadata_size) { + RecordScriptSize(script_size, cached_metadata_size); +} + +void ServiceWorkerGlobalScope::RecordScriptSize(size_t script_size, + size_t cached_metadata_size) { ++script_count_; script_total_size_ += script_size; script_cached_metadata_total_size_ += cached_metadata_size;
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScope.h b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScope.h index 5d17247b..3fb1cd8 100644 --- a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScope.h +++ b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScope.h
@@ -65,9 +65,12 @@ ~ServiceWorkerGlobalScope() override; bool IsServiceWorkerGlobalScope() const override { return true; } - // Counts an evaluated script and its size. Called for each of the main - // worker script and imported scripts. - void CountScript(size_t script_size, size_t cached_metadata_size); + // Counts an evaluated script and its size. Called for the main worker script. + void CountWorkerScript(size_t script_size, size_t cached_metadata_size); + + // Counts an evaluated script and its size. Called for each of imported + // scripts. + void CountImportedScript(size_t script_size, size_t cached_metadata_size); // Called when the main worker script is evaluated. void DidEvaluateWorkerScript(); @@ -123,6 +126,10 @@ const Vector<char>* meta_data) override; void ExceptionThrown(ErrorEvent*) override; + // Records the |script_size| and |cached_metadata_size| for UMA to measure the + // number of scripts and the total bytes of scripts. + void RecordScriptSize(size_t script_size, size_t cached_metadata_size); + Member<ServiceWorkerClients> clients_; Member<ServiceWorkerRegistration> registration_; bool did_evaluate_script_;
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeProxy.cpp b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeProxy.cpp index b789dc2..4cb7aac 100644 --- a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeProxy.cpp +++ b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeProxy.cpp
@@ -628,14 +628,14 @@ size_t script_size, size_t cached_metadata_size) { DCHECK(WorkerGlobalScope()->IsContextThread()); - WorkerGlobalScope()->CountScript(script_size, cached_metadata_size); + worker_global_scope_->CountWorkerScript(script_size, cached_metadata_size); } void ServiceWorkerGlobalScopeProxy::WillEvaluateImportedScript( size_t script_size, size_t cached_metadata_size) { DCHECK(WorkerGlobalScope()->IsContextThread()); - WorkerGlobalScope()->CountScript(script_size, cached_metadata_size); + worker_global_scope_->CountImportedScript(script_size, cached_metadata_size); } void ServiceWorkerGlobalScopeProxy::DidEvaluateWorkerScript(bool success) {
diff --git a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp index d818073b..04717c6 100644 --- a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp +++ b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
@@ -1462,11 +1462,9 @@ if (isContextLost()) return false; - bool must_clear_now = ClearIfComposited() != kSkipped; - if (!marked_canvas_dirty_ && !must_clear_now) - return false; + if (ClearIfComposited() != kSkipped) + canvas()->ClearCopiedImage(); - canvas()->ClearCopiedImage(); marked_canvas_dirty_ = false; if (!canvas()->GetOrCreateImageBuffer())
diff --git a/third_party/WebKit/Source/platform/bindings/ScopedPersistent.h b/third_party/WebKit/Source/platform/bindings/ScopedPersistent.h index 11e12a0..559b82f 100644 --- a/third_party/WebKit/Source/platform/bindings/ScopedPersistent.h +++ b/third_party/WebKit/Source/platform/bindings/ScopedPersistent.h
@@ -61,7 +61,7 @@ handle_.Reset(isolate, local); } - virtual ~ScopedPersistent() { Clear(); } + ~ScopedPersistent() { Clear(); } ALWAYS_INLINE v8::Local<T> NewLocal(v8::Isolate* isolate) const { return v8::Local<T>::New(isolate, handle_); @@ -85,7 +85,7 @@ bool IsEmpty() const { return handle_.IsEmpty(); } bool IsWeak() const { return handle_.IsWeak(); } - virtual void Set(v8::Isolate* isolate, v8::Local<T> handle) { + void Set(v8::Isolate* isolate, v8::Local<T> handle) { handle_.Reset(isolate, handle); }
diff --git a/third_party/WebKit/Source/platform/bindings/ScriptState.h b/third_party/WebKit/Source/platform/bindings/ScriptState.h index e2e75ee..c6c9e71 100644 --- a/third_party/WebKit/Source/platform/bindings/ScriptState.h +++ b/third_party/WebKit/Source/platform/bindings/ScriptState.h
@@ -125,7 +125,7 @@ // ScriptState::from() must not be called for a context that does not have // valid embedder data in the embedder field. SECURITY_CHECK(script_state); - SECURITY_CHECK(script_state->GetContext() == context); + SECURITY_CHECK(script_state->context_ == context); return script_state; }
diff --git a/third_party/WebKit/Source/platform/blob/BlobDataTest.cpp b/third_party/WebKit/Source/platform/blob/BlobDataTest.cpp index b0bdd75..315de8d 100644 --- a/third_party/WebKit/Source/platform/blob/BlobDataTest.cpp +++ b/third_party/WebKit/Source/platform/blob/BlobDataTest.cpp
@@ -68,6 +68,18 @@ std::move(request)); } + void ReadRange(uint64_t offset, + uint64_t length, + mojo::ScopedDataPipeProducerHandle, + storage::mojom::blink::BlobReaderClientPtr) override { + NOTREACHED(); + } + + void ReadAll(mojo::ScopedDataPipeProducerHandle, + storage::mojom::blink::BlobReaderClientPtr) override { + NOTREACHED(); + } + void GetInternalUUID(GetInternalUUIDCallback callback) override { std::move(callback).Run(uuid_); }
diff --git a/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp b/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp index 64dd7ee3..f7b3175 100644 --- a/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp +++ b/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp
@@ -165,9 +165,16 @@ SkAlphaType alpha_type = (kOpaque == opacity_mode) ? kOpaque_SkAlphaType : kPremul_SkAlphaType; - SkImageInfo info = SkImageInfo::Make( - size.Width(), size.Height(), color_params.GetSkColorType(), alpha_type, - color_params.GetSkColorSpaceForSkSurfaces()); + // If we need color correction for all color spaces, we set the proper color + // space when creating the surface. If color correct rendering is only toward + // SRGB, we leave the surface with no color space. The painting canvas will + // get wrapped with a proper SkColorSpaceXformCanvas in GetOrCreateSurface(). + sk_sp<SkColorSpace> color_space = nullptr; + if (CanvasColorParams::ColorCorrectRenderingInAnyColorSpace()) + color_space = color_params.GetSkColorSpaceForSkSurfaces(); + SkImageInfo info = + SkImageInfo::Make(size.Width(), size.Height(), + color_params.GetSkColorType(), alpha_type, color_space); SkSurfaceProps disable_lcd_props(0, kUnknown_SkPixelGeometry); sk_sp<SkSurface> surface; @@ -363,7 +370,7 @@ *out_mailbox = viz::TextureMailbox(mailbox, sync_token, texture_target, gfx::Size(size_), is_overlay_candidate, secure_output_only); - if (RuntimeEnabledFeatures::ColorCorrectRenderingEnabled()) { + if (CanvasColorParams::ColorCorrectRenderingEnabled()) { gfx::ColorSpace color_space = color_params_.GetGfxColorSpace(); out_mailbox->set_color_space(color_space); image_info->gpu_memory_buffer_->SetColorSpaceForScanout(color_space); @@ -627,8 +634,13 @@ bool surface_is_accelerated; surface_ = CreateSkSurface(gr, size_, msaa_sample_count_, opacity_mode_, color_params_, &surface_is_accelerated); - surface_paint_canvas_ = - WTF::WrapUnique(new SkiaPaintCanvas(surface_->getCanvas())); + if (color_params_.ColorCorrectNoColorSpaceToSRGB()) { + surface_paint_canvas_ = WTF::WrapUnique(new SkiaPaintCanvas( + surface_->getCanvas(), color_params_.GetSkColorSpace())); + } else { + surface_paint_canvas_ = + WTF::WrapUnique(new SkiaPaintCanvas(surface_->getCanvas())); + } if (surface_) { // Always save an initial frame, to support resetting the top level matrix @@ -848,8 +860,7 @@ // be done using target space pixel values. SkCanvas* canvas = GetOrCreateSurface()->getCanvas(); std::unique_ptr<SkCanvas> color_transform_canvas; - if (RuntimeEnabledFeatures::ColorCorrectRenderingEnabled() && - color_params_.UsesOutputSpaceBlending()) { + if (color_params_.ColorCorrectNoColorSpaceToSRGB()) { color_transform_canvas = SkCreateColorSpaceXformCanvas( canvas, color_params_.GetSkColorSpace()); canvas = color_transform_canvas.get();
diff --git a/third_party/WebKit/Source/platform/graphics/CanvasColorParams.cpp b/third_party/WebKit/Source/platform/graphics/CanvasColorParams.cpp index 0c8bc37..3651c40 100644 --- a/third_party/WebKit/Source/platform/graphics/CanvasColorParams.cpp +++ b/third_party/WebKit/Source/platform/graphics/CanvasColorParams.cpp
@@ -4,6 +4,7 @@ #include "platform/graphics/CanvasColorParams.h" +#include "platform/RuntimeEnabledFeatures.h" #include "ui/gfx/color_space.h" namespace blink { @@ -52,6 +53,25 @@ return color_space_ == kLegacyCanvasColorSpace; } +bool CanvasColorParams::ColorCorrectRenderingEnabled() { + return RuntimeEnabledFeatures::ColorCorrectRenderingEnabled(); +} + +bool CanvasColorParams::ColorCorrectRenderingInSRGBOnly() { + return RuntimeEnabledFeatures::ColorCorrectRenderingEnabled() && + !RuntimeEnabledFeatures::ColorCanvasExtensionsEnabled(); +} + +bool CanvasColorParams::ColorCorrectRenderingInAnyColorSpace() { + return RuntimeEnabledFeatures::ColorCorrectRenderingEnabled() && + RuntimeEnabledFeatures::ColorCanvasExtensionsEnabled(); +} + +bool CanvasColorParams::ColorCorrectNoColorSpaceToSRGB() const { + return color_space_ == kLegacyCanvasColorSpace && + RuntimeEnabledFeatures::ColorCorrectRenderingEnabled(); +} + sk_sp<SkColorSpace> CanvasColorParams::GetSkColorSpaceForSkSurfaces() const { switch (color_space_) { case kLegacyCanvasColorSpace:
diff --git a/third_party/WebKit/Source/platform/graphics/CanvasColorParams.h b/third_party/WebKit/Source/platform/graphics/CanvasColorParams.h index 08ea4846..21917ba 100644 --- a/third_party/WebKit/Source/platform/graphics/CanvasColorParams.h +++ b/third_party/WebKit/Source/platform/graphics/CanvasColorParams.h
@@ -41,10 +41,24 @@ void SetCanvasColorSpace(CanvasColorSpace); void SetCanvasPixelFormat(CanvasPixelFormat); - // Returns true if the canvas uses blends output color space values (that is, + // Returns true if the canvas blends output color space values (that is, // not linear space colors). bool UsesOutputSpaceBlending() const; + // Returns true if color correct rendering flag is set. + static bool ColorCorrectRenderingEnabled(); + // Returns true if color correct rendering flag is set but canvas color + // extensions flag is not. + static bool ColorCorrectRenderingInSRGBOnly(); + // Returns true if both color correct rendering and canvas color extensions + // flags are set. This activates the color management pipeline for all color + // spaces. + static bool ColorCorrectRenderingInAnyColorSpace(); + // Returns true if color correct rendering flag is set but color canvas + // extensions flag is not set and the color space stored in CanvasColorParams + // object is null. + bool ColorCorrectNoColorSpaceToSRGB() const; + // The SkColorSpace to use in the SkImageInfo for allocated SkSurfaces. This // is nullptr in legacy rendering mode. sk_sp<SkColorSpace> GetSkColorSpaceForSkSurfaces() const;
diff --git a/third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp b/third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp index 2f0033b..9bc56f8 100644 --- a/third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp +++ b/third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp
@@ -389,6 +389,10 @@ rect.Width(), rect.Height(), color_type, alpha_type, surface_->color_params().GetSkColorSpaceForSkSurfaces()); + // If color correct rendering is enabled but color canvas extensions is not, + // unpremul must be done in gamma encoded color space. + if (CanvasColorParams::ColorCorrectRenderingInSRGBOnly()) + info = info.makeColorSpace(nullptr); snapshot->PaintImageForCurrentFrame().GetSkImage()->readPixels( info, result.Data(), bytes_per_pixel * rect.Width(), rect.X(), rect.Y()); gpu_readback_invoked_in_current_frame_ = true; @@ -445,6 +449,8 @@ source_rect.Width(), source_rect.Height(), surface_->color_params().GetSkColorType(), alpha_type, surface_->color_params().GetSkColorSpaceForSkSurfaces()); + if (info.colorType() == kN32_SkColorType) + info = info.makeColorType(kRGBA_8888_SkColorType); } else { info = SkImageInfo::Make(source_rect.Width(), source_rect.Height(), kRGBA_8888_SkColorType, alpha_type);
diff --git a/third_party/WebKit/Source/platform/graphics/StrokeData.cpp b/third_party/WebKit/Source/platform/graphics/StrokeData.cpp index 2c909df..f8f4d81 100644 --- a/third_party/WebKit/Source/platform/graphics/StrokeData.cpp +++ b/third_party/WebKit/Source/platform/graphics/StrokeData.cpp
@@ -117,7 +117,6 @@ SkScalar intervals[2] = {0, gap + dash_width - kEpsilon}; flags->setPathEffect(SkDashPathEffect::Make(intervals, 2, 0)); } else { - // TODO(schenney): WavyStroke https://crbug.com/229574 flags->setPathEffect(0); } }
diff --git a/third_party/WebKit/Source/platform/graphics/UnacceleratedImageBufferSurface.cpp b/third_party/WebKit/Source/platform/graphics/UnacceleratedImageBufferSurface.cpp index 0cf4c68..67ce3f140 100644 --- a/third_party/WebKit/Source/platform/graphics/UnacceleratedImageBufferSurface.cpp +++ b/third_party/WebKit/Source/platform/graphics/UnacceleratedImageBufferSurface.cpp
@@ -30,7 +30,6 @@ #include "platform/graphics/UnacceleratedImageBufferSurface.h" -#include "platform/RuntimeEnabledFeatures.h" #include "platform/graphics/StaticBitmapImage.h" #include "platform/graphics/skia/SkiaUtils.h" #include "platform/wtf/PassRefPtr.h" @@ -47,23 +46,30 @@ SkAlphaType alpha_type = (kOpaque == opacity_mode) ? kOpaque_SkAlphaType : kPremul_SkAlphaType; SkImageInfo info = SkImageInfo::Make( - size.Width(), size.Height(), color_params.GetSkColorType(), alpha_type, - color_params.GetSkColorSpaceForSkSurfaces()); + size.Width(), size.Height(), color_params.GetSkColorType(), alpha_type); + // In legacy mode the backing SkSurface should not have any color space. + // If color correct rendering is enabled only for SRGB, still the backing + // surface should not have any color space and the treatment of legacy data + // as SRGB will be managed by wrapping the internal SkCanvas inside a + // SkColorSpaceXformCanvas. If color correct rendering is enbaled for other + // color spaces, we set the color space properly. + if (CanvasColorParams::ColorCorrectRenderingInAnyColorSpace()) + info = info.makeColorSpace(color_params.GetSkColorSpaceForSkSurfaces()); + SkSurfaceProps disable_lcd_props(0, kUnknown_SkPixelGeometry); surface_ = SkSurface::MakeRaster( info, kOpaque == opacity_mode ? 0 : &disable_lcd_props); - if (!surface_) return; + sk_sp<SkColorSpace> xform_canvas_color_space = nullptr; + if (color_params.ColorCorrectNoColorSpaceToSRGB()) + xform_canvas_color_space = color_params.GetSkColorSpace(); + canvas_ = WTF::WrapUnique( + new SkiaPaintCanvas(surface_->getCanvas(), xform_canvas_color_space)); + // Always save an initial frame, to support resetting the top level matrix // and clip. - canvas_ = WTF::WrapUnique(new SkiaPaintCanvas( - surface_->getCanvas(), - RuntimeEnabledFeatures::ColorCorrectRenderingEnabled() && - color_params.UsesOutputSpaceBlending() - ? color_params.GetSkColorSpace() - : nullptr)); canvas_->save(); if (initialization_mode == kInitializeImagePixels)
diff --git a/third_party/WebKit/Source/platform/graphics/gpu/AcceleratedImageBufferSurface.cpp b/third_party/WebKit/Source/platform/graphics/gpu/AcceleratedImageBufferSurface.cpp index aa3402e..899cf4f 100644 --- a/third_party/WebKit/Source/platform/graphics/gpu/AcceleratedImageBufferSurface.cpp +++ b/third_party/WebKit/Source/platform/graphics/gpu/AcceleratedImageBufferSurface.cpp
@@ -30,7 +30,6 @@ #include "platform/graphics/gpu/AcceleratedImageBufferSurface.h" -#include "platform/RuntimeEnabledFeatures.h" #include "platform/graphics/AcceleratedStaticBitmapImage.h" #include "platform/graphics/gpu/SharedGpuContext.h" #include "platform/graphics/skia/SkiaUtils.h" @@ -57,8 +56,16 @@ SkAlphaType alpha_type = (kOpaque == opacity_mode) ? kOpaque_SkAlphaType : kPremul_SkAlphaType; SkImageInfo info = SkImageInfo::Make( - size.Width(), size.Height(), color_params.GetSkColorType(), alpha_type, - color_params.GetSkColorSpaceForSkSurfaces()); + size.Width(), size.Height(), color_params.GetSkColorType(), alpha_type); + // In legacy mode the backing SkSurface should not have any color space. + // If color correct rendering is enabled only for SRGB, still the backing + // surface should not have any color space and the treatment of legacy data + // as SRGB will be managed by wrapping the internal SkCanvas inside a + // SkColorSpaceXformCanvas. If color correct rendering is enbaled for other + // color spaces, we set the color space properly. + if (CanvasColorParams::ColorCorrectRenderingInAnyColorSpace()) + info = info.makeColorSpace(color_params.GetSkColorSpaceForSkSurfaces()); + SkSurfaceProps disable_lcd_props(0, kUnknown_SkPixelGeometry); surface_ = SkSurface::MakeRenderTarget( gr_context, SkBudgeted::kYes, info, 0 /* sampleCount */, @@ -66,12 +73,11 @@ if (!surface_) return; - canvas_ = WTF::WrapUnique(new SkiaPaintCanvas( - surface_->getCanvas(), - RuntimeEnabledFeatures::ColorCorrectRenderingEnabled() && - color_params.UsesOutputSpaceBlending() - ? color_params.GetSkColorSpace() - : nullptr)); + sk_sp<SkColorSpace> xform_canvas_color_space = nullptr; + if (color_params.ColorCorrectNoColorSpaceToSRGB()) + xform_canvas_color_space = color_params.GetSkColorSpace(); + canvas_ = WTF::WrapUnique( + new SkiaPaintCanvas(surface_->getCanvas(), xform_canvas_color_space)); Clear(); // Always save an initial frame, to support resetting the top level matrix
diff --git a/third_party/WebKit/Source/platform/heap/HeapAllocator.h b/third_party/WebKit/Source/platform/heap/HeapAllocator.h index 42dd648..117d9ba1 100644 --- a/third_party/WebKit/Source/platform/heap/HeapAllocator.h +++ b/third_party/WebKit/Source/platform/heap/HeapAllocator.h
@@ -329,23 +329,22 @@ // Use the payload size as recorded by the heap to determine how many // elements to finalize. size_t length = header->PayloadSize() / sizeof(T); - T* buffer = reinterpret_cast<T*>(pointer); + char* payload = static_cast<char*>(pointer); #ifdef ANNOTATE_CONTIGUOUS_CONTAINER + ANNOTATE_CHANGE_SIZE(payload, length * sizeof(T), 0, length * sizeof(T)); +#endif // As commented above, HeapVectorBacking calls finalizers for unused slots // (which are already zeroed out). - ANNOTATE_CHANGE_SIZE(buffer, length, 0, length); -#endif if (std::is_polymorphic<T>::value) { - char* pointer = reinterpret_cast<char*>(buffer); for (unsigned i = 0; i < length; ++i) { - char* element = pointer + i * sizeof(T); + char* element = payload + i * sizeof(T); if (blink::VTableInitialized(element)) reinterpret_cast<T*>(element)->~T(); } } else { - for (unsigned i = 0; i < length; ++i) { + T* buffer = reinterpret_cast<T*>(payload); + for (unsigned i = 0; i < length; ++i) buffer[i].~T(); - } } }
diff --git a/third_party/WebKit/Source/platform/network/HTTPParsers.cpp b/third_party/WebKit/Source/platform/network/HTTPParsers.cpp index 39c96cd..3d0015b 100644 --- a/third_party/WebKit/Source/platform/network/HTTPParsers.cpp +++ b/third_party/WebKit/Source/platform/network/HTTPParsers.cpp
@@ -835,8 +835,8 @@ HeaderFieldTokenizer tokenizer(headerValue); while (!tokenizer.IsConsumed()) { - StringView metric; - if (!tokenizer.ConsumeToken(Mode::kNormal, metric)) { + StringView name; + if (!tokenizer.ConsumeToken(Mode::kNormal, name)) { break; } @@ -853,7 +853,7 @@ } headers->push_back(WTF::MakeUnique<ServerTimingHeader>( - metric.ToString(), value, description)); + name.ToString(), value, description)); if (!tokenizer.Consume(',')) { break;
diff --git a/third_party/WebKit/Source/platform/network/HTTPParsers.h b/third_party/WebKit/Source/platform/network/HTTPParsers.h index b52261c..cd6fff7b 100644 --- a/third_party/WebKit/Source/platform/network/HTTPParsers.h +++ b/third_party/WebKit/Source/platform/network/HTTPParsers.h
@@ -84,12 +84,12 @@ }; struct ServerTimingHeader { - String metric; - double value; + String name; + double duration; String description; - ServerTimingHeader(String metric, double value, String description) - : metric(metric), value(value), description(description) {} + ServerTimingHeader(String name, double duration, String description) + : name(name), duration(duration), description(description) {} }; using ServerTimingHeaderVector = Vector<std::unique_ptr<ServerTimingHeader>>; @@ -158,11 +158,11 @@ ResourceResponse*, size_t* end); -// Parses a header value containing JSON data, according to +// Parses a header duration containing JSON data, according to // https://tools.ietf.org/html/draft-ietf-httpbis-jfv-01 // Returns an empty unique_ptr if the header cannot be parsed as JSON. JSON // strings which represent object nested deeper than |maxParseDepth| will also -// cause an empty return value. +// cause an empty return duration. PLATFORM_EXPORT std::unique_ptr<JSONArray> ParseJSONHeader(const String& header, int max_parse_depth);
diff --git a/third_party/WebKit/Source/platform/network/HTTPParsersTest.cpp b/third_party/WebKit/Source/platform/network/HTTPParsersTest.cpp index 436ffa4..ffd03ea 100644 --- a/third_party/WebKit/Source/platform/network/HTTPParsersTest.cpp +++ b/third_party/WebKit/Source/platform/network/HTTPParsersTest.cpp
@@ -501,8 +501,8 @@ unsigned i = 0; for (const auto& header : *results) { Vector<String> expectedResult = expectedResults[i++]; - EXPECT_EQ(header->metric, expectedResult[0]); - EXPECT_EQ(header->value, expectedResult[1].ToDouble()); + EXPECT_EQ(header->name, expectedResult[0]); + EXPECT_EQ(header->duration, expectedResult[1].ToDouble()); EXPECT_EQ(header->description, expectedResult[2]); } }
diff --git a/third_party/WebKit/Source/platform/scheduler/BUILD.gn b/third_party/WebKit/Source/platform/scheduler/BUILD.gn index 7a26319..2ac5798 100644 --- a/third_party/WebKit/Source/platform/scheduler/BUILD.gn +++ b/third_party/WebKit/Source/platform/scheduler/BUILD.gn
@@ -88,6 +88,8 @@ "renderer/render_widget_scheduling_state.cc", "renderer/render_widget_signals.cc", "renderer/render_widget_signals.h", + "renderer/renderer_metrics_helper.cc", + "renderer/renderer_metrics_helper.h", "renderer/renderer_scheduler.cc", "renderer/renderer_scheduler_impl.cc", "renderer/renderer_scheduler_impl.h", @@ -187,6 +189,7 @@ "renderer/deadline_task_runner_unittest.cc", "renderer/idle_time_estimator_unittest.cc", "renderer/render_widget_signals_unittest.cc", + "renderer/renderer_metrics_helper_unittest.cc", "renderer/renderer_scheduler_impl_unittest.cc", "renderer/task_cost_estimator_unittest.cc", "renderer/task_duration_metric_reporter_unittest.cc",
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_metrics_helper.cc b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_metrics_helper.cc new file mode 100644 index 0000000..0680913 --- /dev/null +++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_metrics_helper.cc
@@ -0,0 +1,359 @@ +// 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 "platform/scheduler/renderer/renderer_metrics_helper.h" + +#include "base/bind.h" +#include "base/metrics/histogram_macros.h" +#include "platform/scheduler/renderer/renderer_scheduler_impl.h" +#include "public/platform/scheduler/renderer_process_type.h" + +namespace blink { +namespace scheduler { + +#define TASK_DURATION_METRIC_NAME "RendererScheduler.TaskDurationPerQueueType2" +#define TASK_COUNT_METRIC_NAME "RendererScheduler.TaskCountPerQueueType" +#define MAIN_THREAD_LOAD_METRIC_NAME "RendererScheduler.RendererMainThreadLoad5" +#define EXTENSIONS_MAIN_THREAD_LOAD_METRIC_NAME \ + MAIN_THREAD_LOAD_METRIC_NAME ".Extension" + +namespace { + +constexpr base::TimeDelta kThreadLoadTrackerReportingInterval = + base::TimeDelta::FromSeconds(1); +// Threshold for discarding ultra-long tasks. Is it assumed that ultra-long +// tasks are reporting glitches (e.g. system falling asleep in the middle +// of the task). +constexpr base::TimeDelta kLongTaskDiscardingThreshold = + base::TimeDelta::FromSeconds(30); +constexpr base::TimeDelta kLongIdlePeriodDiscardingThreshold = + base::TimeDelta::FromMinutes(3); + +} // namespace + +RendererMetricsHelper::RendererMetricsHelper( + RendererSchedulerImpl* renderer_scheduler, + base::TimeTicks now, + bool renderer_backgrounded) + : renderer_scheduler_(renderer_scheduler), + main_thread_load_tracker( + now, + base::Bind(&RendererMetricsHelper::RecordMainThreadTaskLoad, + base::Unretained(this)), + kThreadLoadTrackerReportingInterval), + background_main_thread_load_tracker( + now, + base::Bind(&RendererMetricsHelper::RecordBackgroundMainThreadTaskLoad, + base::Unretained(this)), + kThreadLoadTrackerReportingInterval), + foreground_main_thread_load_tracker( + now, + base::Bind(&RendererMetricsHelper::RecordForegroundMainThreadTaskLoad, + base::Unretained(this)), + kThreadLoadTrackerReportingInterval), + task_duration_reporter(TASK_DURATION_METRIC_NAME), + foreground_task_duration_reporter(TASK_DURATION_METRIC_NAME + ".Foreground"), + foreground_first_minute_task_duration_reporter(TASK_DURATION_METRIC_NAME + ".Foreground.FirstMinute"), + foreground_second_minute_task_duration_reporter( + TASK_DURATION_METRIC_NAME ".Foreground.SecondMinute"), + foreground_third_minute_task_duration_reporter(TASK_DURATION_METRIC_NAME + ".Foreground.ThirdMinute"), + foreground_after_third_minute_task_duration_reporter( + TASK_DURATION_METRIC_NAME ".Foreground.AfterThirdMinute"), + background_task_duration_reporter(TASK_DURATION_METRIC_NAME + ".Background"), + background_first_minute_task_duration_reporter(TASK_DURATION_METRIC_NAME + ".Background.FirstMinute"), + background_second_minute_task_duration_reporter( + TASK_DURATION_METRIC_NAME ".Background.SecondMinute"), + background_third_minute_task_duration_reporter(TASK_DURATION_METRIC_NAME + ".Background.ThirdMinute"), + background_fourth_minute_task_duration_reporter( + TASK_DURATION_METRIC_NAME ".Background.FourthMinute"), + background_fifth_minute_task_duration_reporter(TASK_DURATION_METRIC_NAME + ".Background.FifthMinute"), + background_after_fifth_minute_task_duration_reporter( + TASK_DURATION_METRIC_NAME ".Background.AfterFifthMinute"), + hidden_task_duration_reporter(TASK_DURATION_METRIC_NAME ".Hidden"), + visible_task_duration_reporter(TASK_DURATION_METRIC_NAME ".Visible"), + hidden_music_task_duration_reporter(TASK_DURATION_METRIC_NAME + ".HiddenMusic") { + main_thread_load_tracker.Resume(now); + if (renderer_backgrounded) { + background_main_thread_load_tracker.Resume(now); + } else { + foreground_main_thread_load_tracker.Resume(now); + } +} + +RendererMetricsHelper::~RendererMetricsHelper() {} + +void RendererMetricsHelper::OnRendererForegrounded(base::TimeTicks now) { + foreground_main_thread_load_tracker.Resume(now); + background_main_thread_load_tracker.Pause(now); +} + +void RendererMetricsHelper::OnRendererBackgrounded(base::TimeTicks now) { + foreground_main_thread_load_tracker.Pause(now); + background_main_thread_load_tracker.Resume(now); +} + +void RendererMetricsHelper::OnRendererShutdown(base::TimeTicks now) { + foreground_main_thread_load_tracker.RecordIdle(now); + background_main_thread_load_tracker.RecordIdle(now); + main_thread_load_tracker.RecordIdle(now); +} + +namespace { + +// Calculates the length of the intersection of two given time intervals. +base::TimeDelta DurationOfIntervalOverlap(base::TimeTicks start1, + base::TimeTicks end1, + base::TimeTicks start2, + base::TimeTicks end2) { + DCHECK_LE(start1, end1); + DCHECK_LE(start2, end2); + return std::max(std::min(end1, end2) - std::max(start1, start2), + base::TimeDelta()); +} + +} // namespace + +void RendererMetricsHelper::RecordTaskMetrics( + MainThreadTaskQueue::QueueType queue_type, + base::TimeTicks start_time, + base::TimeTicks end_time) { + base::TimeDelta duration = end_time - start_time; + if (duration > kLongTaskDiscardingThreshold) + return; + + // Discard anomalously long idle periods. + if (last_reported_task_ && start_time - last_reported_task_.value() > + kLongIdlePeriodDiscardingThreshold) { + main_thread_load_tracker.Reset(end_time); + foreground_main_thread_load_tracker.Reset(end_time); + background_main_thread_load_tracker.Reset(end_time); + return; + } + + last_reported_task_ = end_time; + + UMA_HISTOGRAM_CUSTOM_COUNTS("RendererScheduler.TaskTime2", + duration.InMicroseconds(), 1, 1000 * 1000, 50); + + // We want to measure thread time here, but for efficiency reasons + // we stick with wall time. + main_thread_load_tracker.RecordTaskTime(start_time, end_time); + foreground_main_thread_load_tracker.RecordTaskTime(start_time, end_time); + background_main_thread_load_tracker.RecordTaskTime(start_time, end_time); + + UMA_HISTOGRAM_ENUMERATION( + TASK_COUNT_METRIC_NAME, static_cast<int>(queue_type), + static_cast<int>(MainThreadTaskQueue::QueueType::COUNT)); + + if (duration >= base::TimeDelta::FromMilliseconds(16)) { + UMA_HISTOGRAM_ENUMERATION( + TASK_COUNT_METRIC_NAME ".LongerThan16ms", static_cast<int>(queue_type), + static_cast<int>(MainThreadTaskQueue::QueueType::COUNT)); + } + + if (duration >= base::TimeDelta::FromMilliseconds(50)) { + UMA_HISTOGRAM_ENUMERATION( + TASK_COUNT_METRIC_NAME ".LongerThan50ms", static_cast<int>(queue_type), + static_cast<int>(MainThreadTaskQueue::QueueType::COUNT)); + } + + if (duration >= base::TimeDelta::FromMilliseconds(100)) { + UMA_HISTOGRAM_ENUMERATION( + TASK_COUNT_METRIC_NAME ".LongerThan100ms", static_cast<int>(queue_type), + static_cast<int>(MainThreadTaskQueue::QueueType::COUNT)); + } + + if (duration >= base::TimeDelta::FromMilliseconds(150)) { + UMA_HISTOGRAM_ENUMERATION( + TASK_COUNT_METRIC_NAME ".LongerThan150ms", static_cast<int>(queue_type), + static_cast<int>(MainThreadTaskQueue::QueueType::COUNT)); + } + + if (duration >= base::TimeDelta::FromSeconds(1)) { + UMA_HISTOGRAM_ENUMERATION( + TASK_COUNT_METRIC_NAME ".LongerThan1s", static_cast<int>(queue_type), + static_cast<int>(MainThreadTaskQueue::QueueType::COUNT)); + } + + task_duration_reporter.RecordTask(queue_type, duration); + + if (renderer_scheduler_->main_thread_only().renderer_backgrounded) { + background_task_duration_reporter.RecordTask(queue_type, duration); + + // Collect detailed breakdown for first five minutes given that we stop + // timers on mobile after five minutes. + base::TimeTicks backgrounded_at = + renderer_scheduler_->main_thread_only().background_status_changed_at; + + background_first_minute_task_duration_reporter.RecordTask( + queue_type, DurationOfIntervalOverlap( + start_time, end_time, backgrounded_at, + backgrounded_at + base::TimeDelta::FromMinutes(1))); + + background_second_minute_task_duration_reporter.RecordTask( + queue_type, DurationOfIntervalOverlap( + start_time, end_time, + backgrounded_at + base::TimeDelta::FromMinutes(1), + backgrounded_at + base::TimeDelta::FromMinutes(2))); + + background_third_minute_task_duration_reporter.RecordTask( + queue_type, DurationOfIntervalOverlap( + start_time, end_time, + backgrounded_at + base::TimeDelta::FromMinutes(2), + backgrounded_at + base::TimeDelta::FromMinutes(3))); + + background_fourth_minute_task_duration_reporter.RecordTask( + queue_type, DurationOfIntervalOverlap( + start_time, end_time, + backgrounded_at + base::TimeDelta::FromMinutes(3), + backgrounded_at + base::TimeDelta::FromMinutes(4))); + + background_fifth_minute_task_duration_reporter.RecordTask( + queue_type, DurationOfIntervalOverlap( + start_time, end_time, + backgrounded_at + base::TimeDelta::FromMinutes(4), + backgrounded_at + base::TimeDelta::FromMinutes(5))); + + background_after_fifth_minute_task_duration_reporter.RecordTask( + queue_type, + DurationOfIntervalOverlap( + start_time, end_time, + backgrounded_at + base::TimeDelta::FromMinutes(5), + std::max(backgrounded_at + base::TimeDelta::FromMinutes(5), + end_time))); + } else { + foreground_task_duration_reporter.RecordTask(queue_type, duration); + + // For foreground tabs we do not expect such a notable difference as it is + // the case with background tabs, so we limit breakdown to three minutes. + base::TimeTicks foregrounded_at = + renderer_scheduler_->main_thread_only().background_status_changed_at; + + foreground_first_minute_task_duration_reporter.RecordTask( + queue_type, DurationOfIntervalOverlap( + start_time, end_time, foregrounded_at, + foregrounded_at + base::TimeDelta::FromMinutes(1))); + + foreground_second_minute_task_duration_reporter.RecordTask( + queue_type, DurationOfIntervalOverlap( + start_time, end_time, + foregrounded_at + base::TimeDelta::FromMinutes(1), + foregrounded_at + base::TimeDelta::FromMinutes(2))); + + foreground_third_minute_task_duration_reporter.RecordTask( + queue_type, DurationOfIntervalOverlap( + start_time, end_time, + foregrounded_at + base::TimeDelta::FromMinutes(2), + foregrounded_at + base::TimeDelta::FromMinutes(3))); + + foreground_after_third_minute_task_duration_reporter.RecordTask( + queue_type, + DurationOfIntervalOverlap( + start_time, end_time, + foregrounded_at + base::TimeDelta::FromMinutes(3), + std::max(foregrounded_at + base::TimeDelta::FromMinutes(3), + end_time))); + } + + if (renderer_scheduler_->main_thread_only().renderer_hidden) { + hidden_task_duration_reporter.RecordTask(queue_type, duration); + + if (renderer_scheduler_->ShouldDisableThrottlingBecauseOfAudio( + start_time)) { + hidden_music_task_duration_reporter.RecordTask(queue_type, duration); + } + } else { + visible_task_duration_reporter.RecordTask(queue_type, duration); + } +} + +void RendererMetricsHelper::RecordMainThreadTaskLoad(base::TimeTicks time, + double load) { + int load_percentage = static_cast<int>(load * 100); + DCHECK_LE(load_percentage, 100); + + UMA_HISTOGRAM_PERCENTAGE(MAIN_THREAD_LOAD_METRIC_NAME, load_percentage); + + if (renderer_scheduler_->main_thread_only().process_type == + RendererProcessType::kExtensionRenderer) { + UMA_HISTOGRAM_PERCENTAGE(EXTENSIONS_MAIN_THREAD_LOAD_METRIC_NAME, + load_percentage); + } + + TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), + "RendererScheduler.RendererMainThreadLoad", load_percentage); +} + +void RendererMetricsHelper::RecordForegroundMainThreadTaskLoad( + base::TimeTicks time, + double load) { + int load_percentage = static_cast<int>(load * 100); + DCHECK_LE(load_percentage, 100); + + switch (renderer_scheduler_->main_thread_only().process_type) { + case RendererProcessType::kExtensionRenderer: + UMA_HISTOGRAM_PERCENTAGE(EXTENSIONS_MAIN_THREAD_LOAD_METRIC_NAME + ".Foreground", + load_percentage); + break; + case RendererProcessType::kRenderer: + UMA_HISTOGRAM_PERCENTAGE(MAIN_THREAD_LOAD_METRIC_NAME ".Foreground", + load_percentage); + + if (time - renderer_scheduler_->main_thread_only() + .background_status_changed_at > + base::TimeDelta::FromMinutes(1)) { + UMA_HISTOGRAM_PERCENTAGE(MAIN_THREAD_LOAD_METRIC_NAME + ".Foreground.AfterFirstMinute", + load_percentage); + } + break; + } + + TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), + "RendererScheduler.RendererMainThreadLoad.Foreground", + load_percentage); +} + +void RendererMetricsHelper::RecordBackgroundMainThreadTaskLoad( + base::TimeTicks time, + double load) { + int load_percentage = static_cast<int>(load * 100); + DCHECK_LE(load_percentage, 100); + + switch (renderer_scheduler_->main_thread_only().process_type) { + case RendererProcessType::kExtensionRenderer: + UMA_HISTOGRAM_PERCENTAGE(EXTENSIONS_MAIN_THREAD_LOAD_METRIC_NAME + ".Background", + load_percentage); + break; + case RendererProcessType::kRenderer: + UMA_HISTOGRAM_PERCENTAGE(MAIN_THREAD_LOAD_METRIC_NAME ".Background", + load_percentage); + + if (time - renderer_scheduler_->main_thread_only() + .background_status_changed_at > + base::TimeDelta::FromMinutes(1)) { + UMA_HISTOGRAM_PERCENTAGE(MAIN_THREAD_LOAD_METRIC_NAME + ".Background.AfterFirstMinute", + load_percentage); + } + break; + } + + TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), + "RendererScheduler.RendererMainThreadLoad.Background", + load_percentage); +} + +} // namespace scheduler +} // namespace blink
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_metrics_helper.h b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_metrics_helper.h new file mode 100644 index 0000000..6ad79c03 --- /dev/null +++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_metrics_helper.h
@@ -0,0 +1,75 @@ +// 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 THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_RENDERER_METRICS_HELPER_H_ +#define THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_RENDERER_METRICS_HELPER_H_ + +#include "base/macros.h" +#include "base/time/time.h" +#include "platform/PlatformExport.h" +#include "platform/scheduler/base/thread_load_tracker.h" +#include "platform/scheduler/renderer/main_thread_task_queue.h" +#include "platform/scheduler/renderer/task_duration_metric_reporter.h" + +namespace blink { +namespace scheduler { + +class RendererSchedulerImpl; + +// Helper class to take care of metrics on behalf of RendererScheduler. +// This class should be used only on the main thread. +class PLATFORM_EXPORT RendererMetricsHelper { + public: + RendererMetricsHelper(RendererSchedulerImpl* renderer_scheduler, + base::TimeTicks now, + bool renderer_backgrounded); + ~RendererMetricsHelper(); + + void RecordTaskMetrics(MainThreadTaskQueue::QueueType queue_type, + base::TimeTicks start_time, + base::TimeTicks end_time); + + void OnRendererForegrounded(base::TimeTicks now); + void OnRendererBackgrounded(base::TimeTicks now); + void OnRendererShutdown(base::TimeTicks now); + + void RecordMainThreadTaskLoad(base::TimeTicks time, double load); + void RecordForegroundMainThreadTaskLoad(base::TimeTicks time, double load); + void RecordBackgroundMainThreadTaskLoad(base::TimeTicks time, double load); + + private: + RendererSchedulerImpl* renderer_scheduler_; // NOT OWNED + + base::Optional<base::TimeTicks> last_reported_task_; + + ThreadLoadTracker main_thread_load_tracker; + ThreadLoadTracker background_main_thread_load_tracker; + ThreadLoadTracker foreground_main_thread_load_tracker; + + TaskDurationMetricReporter task_duration_reporter; + TaskDurationMetricReporter foreground_task_duration_reporter; + TaskDurationMetricReporter foreground_first_minute_task_duration_reporter; + TaskDurationMetricReporter foreground_second_minute_task_duration_reporter; + TaskDurationMetricReporter foreground_third_minute_task_duration_reporter; + TaskDurationMetricReporter + foreground_after_third_minute_task_duration_reporter; + TaskDurationMetricReporter background_task_duration_reporter; + TaskDurationMetricReporter background_first_minute_task_duration_reporter; + TaskDurationMetricReporter background_second_minute_task_duration_reporter; + TaskDurationMetricReporter background_third_minute_task_duration_reporter; + TaskDurationMetricReporter background_fourth_minute_task_duration_reporter; + TaskDurationMetricReporter background_fifth_minute_task_duration_reporter; + TaskDurationMetricReporter + background_after_fifth_minute_task_duration_reporter; + TaskDurationMetricReporter hidden_task_duration_reporter; + TaskDurationMetricReporter visible_task_duration_reporter; + TaskDurationMetricReporter hidden_music_task_duration_reporter; + + DISALLOW_COPY_AND_ASSIGN(RendererMetricsHelper); +}; + +} // namespace scheduler +} // namespace blink + +#endif // THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_RENDERER_METRICS_HELPER_H_
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_metrics_helper_unittest.cc b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_metrics_helper_unittest.cc new file mode 100644 index 0000000..18e7557 --- /dev/null +++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_metrics_helper_unittest.cc
@@ -0,0 +1,176 @@ +// 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 "platform/scheduler/renderer/renderer_metrics_helper.h" + +#include "base/macros.h" +#include "base/memory/ptr_util.h" +#include "base/test/histogram_tester.h" +#include "base/test/simple_test_tick_clock.h" +#include "components/viz/test/ordered_simple_task_runner.h" +#include "platform/scheduler/base/test_time_source.h" +#include "platform/scheduler/child/scheduler_tqm_delegate_for_test.h" +#include "platform/scheduler/renderer/renderer_scheduler_impl.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace blink { +namespace scheduler { + +using QueueType = MainThreadTaskQueue::QueueType; +using testing::ElementsAre; +using base::Bucket; + +class RendererMetricsHelperTest : public ::testing::Test { + public: + RendererMetricsHelperTest() {} + ~RendererMetricsHelperTest() {} + + void SetUp() { + histogram_tester_.reset(new base::HistogramTester()); + clock_ = base::MakeUnique<base::SimpleTestTickClock>(); + mock_task_runner_ = + make_scoped_refptr(new cc::OrderedSimpleTaskRunner(clock_.get(), true)); + delegate_ = SchedulerTqmDelegateForTest::Create( + mock_task_runner_, base::MakeUnique<TestTimeSource>(clock_.get())); + scheduler_ = base::MakeUnique<RendererSchedulerImpl>(delegate_); + metrics_helper_ = &scheduler_->main_thread_only().metrics_helper; + } + + void TearDown() { + scheduler_->Shutdown(); + scheduler_.reset(); + } + + void RunTask(MainThreadTaskQueue::QueueType queue_type, + base::TimeTicks start, + base::TimeDelta duration) { + DCHECK_LE(clock_->NowTicks(), start); + clock_->SetNowTicks(start + duration); + metrics_helper_->RecordTaskMetrics(queue_type, start, start + duration); + } + + base::TimeTicks Microseconds(int microseconds) { + return base::TimeTicks() + base::TimeDelta::FromMicroseconds(microseconds); + } + + base::TimeTicks Milliseconds(int milliseconds) { + return base::TimeTicks() + base::TimeDelta::FromMilliseconds(milliseconds); + } + + std::unique_ptr<base::SimpleTestTickClock> clock_; + scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_; + scoped_refptr<SchedulerTqmDelegate> delegate_; + std::unique_ptr<RendererSchedulerImpl> scheduler_; + RendererMetricsHelper* metrics_helper_; // NOT OWNED + std::unique_ptr<base::HistogramTester> histogram_tester_; + + DISALLOW_COPY_AND_ASSIGN(RendererMetricsHelperTest); +}; + +TEST_F(RendererMetricsHelperTest, Metrics) { + // QueueType::DEFAULT is checking sub-millisecond task aggregation, + // FRAME_* tasks are checking normal task aggregation and other + // queue types have a single task. + RunTask(QueueType::DEFAULT, Milliseconds(1), + base::TimeDelta::FromMicroseconds(700)); + RunTask(QueueType::DEFAULT, Milliseconds(2), + base::TimeDelta::FromMicroseconds(700)); + RunTask(QueueType::DEFAULT, Milliseconds(3), + base::TimeDelta::FromMicroseconds(700)); + + RunTask(QueueType::DEFAULT_LOADING, Milliseconds(200), + base::TimeDelta::FromMilliseconds(20)); + RunTask(QueueType::CONTROL, Milliseconds(400), + base::TimeDelta::FromMilliseconds(30)); + RunTask(QueueType::DEFAULT_TIMER, Milliseconds(600), + base::TimeDelta::FromMilliseconds(5)); + RunTask(QueueType::FRAME_LOADING, Milliseconds(800), + base::TimeDelta::FromMilliseconds(70)); + RunTask(QueueType::FRAME_UNTHROTTLED, Milliseconds(1000), + base::TimeDelta::FromMilliseconds(20)); + RunTask(QueueType::COMPOSITOR, Milliseconds(1200), + base::TimeDelta::FromMilliseconds(25)); + RunTask(QueueType::TEST, Milliseconds(1600), + base::TimeDelta::FromMilliseconds(85)); + + scheduler_->SetRendererBackgrounded(true); + + RunTask(QueueType::CONTROL, Milliseconds(2000), + base::TimeDelta::FromMilliseconds(25)); + RunTask(QueueType::FRAME_TIMER, Milliseconds(2600), + base::TimeDelta::FromMilliseconds(175)); + RunTask(QueueType::UNTHROTTLED, Milliseconds(2800), + base::TimeDelta::FromMilliseconds(25)); + RunTask(QueueType::FRAME_LOADING, Milliseconds(3000), + base::TimeDelta::FromMilliseconds(35)); + RunTask(QueueType::FRAME_TIMER, Milliseconds(3200), + base::TimeDelta::FromMilliseconds(5)); + RunTask(QueueType::COMPOSITOR, Milliseconds(3400), + base::TimeDelta::FromMilliseconds(20)); + RunTask(QueueType::IDLE, Milliseconds(3600), + base::TimeDelta::FromMilliseconds(50)); + RunTask(QueueType::FRAME_LOADING_CONTROL, Milliseconds(4000), + base::TimeDelta::FromMilliseconds(5)); + RunTask(QueueType::CONTROL, Milliseconds(4200), + base::TimeDelta::FromMilliseconds(20)); + RunTask(QueueType::FRAME_TIMER, Milliseconds(4400), + base::TimeDelta::FromMilliseconds(115)); + RunTask(QueueType::FRAME_UNTHROTTLED, Milliseconds(4600), + base::TimeDelta::FromMilliseconds(175)); + RunTask(QueueType::IDLE, Milliseconds(5000), + base::TimeDelta::FromMilliseconds(1600)); + + std::vector<base::Bucket> expected_samples = { + {static_cast<int>(QueueType::CONTROL), 75}, + {static_cast<int>(QueueType::DEFAULT), 2}, + {static_cast<int>(QueueType::DEFAULT_LOADING), 20}, + {static_cast<int>(QueueType::DEFAULT_TIMER), 5}, + {static_cast<int>(QueueType::UNTHROTTLED), 25}, + {static_cast<int>(QueueType::FRAME_LOADING), 105}, + {static_cast<int>(QueueType::FRAME_TIMER), 295}, + {static_cast<int>(QueueType::FRAME_UNTHROTTLED), 195}, + {static_cast<int>(QueueType::COMPOSITOR), 45}, + {static_cast<int>(QueueType::IDLE), 1650}, + {static_cast<int>(QueueType::TEST), 85}, + {static_cast<int>(QueueType::FRAME_LOADING_CONTROL), 5}}; + EXPECT_THAT(histogram_tester_->GetAllSamples( + "RendererScheduler.TaskDurationPerQueueType2"), + testing::ContainerEq(expected_samples)); + + EXPECT_THAT( + histogram_tester_->GetAllSamples( + "RendererScheduler.TaskDurationPerQueueType2.Foreground"), + ElementsAre(Bucket(static_cast<int>(QueueType::CONTROL), 30), + Bucket(static_cast<int>(QueueType::DEFAULT), 2), + Bucket(static_cast<int>(QueueType::DEFAULT_LOADING), 20), + Bucket(static_cast<int>(QueueType::DEFAULT_TIMER), 5), + Bucket(static_cast<int>(QueueType::FRAME_LOADING), 70), + Bucket(static_cast<int>(QueueType::FRAME_UNTHROTTLED), 20), + Bucket(static_cast<int>(QueueType::COMPOSITOR), 25), + Bucket(static_cast<int>(QueueType::TEST), 85))); + + EXPECT_THAT( + histogram_tester_->GetAllSamples( + "RendererScheduler.TaskDurationPerQueueType2.Background"), + ElementsAre( + Bucket(static_cast<int>(QueueType::CONTROL), 45), + Bucket(static_cast<int>(QueueType::UNTHROTTLED), 25), + Bucket(static_cast<int>(QueueType::FRAME_LOADING), 35), + Bucket(static_cast<int>(QueueType::FRAME_TIMER), 295), + Bucket(static_cast<int>(QueueType::FRAME_UNTHROTTLED), 175), + Bucket(static_cast<int>(QueueType::COMPOSITOR), 20), + Bucket(static_cast<int>(QueueType::IDLE), 1650), + Bucket(static_cast<int>(QueueType::FRAME_LOADING_CONTROL), 5))); +} + +// TODO(crbug.com/754656): Add tests for NthMinute and AfterNthMinute +// histograms. + +// TODO(crbug.com/754656): Add tests for TaskDuration.Hidden/Visible histograms. + +// TODO(crbug.com/754656): Add tests for non-TaskDuration histograms. + +} // namespace scheduler +} // namespace blink
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc index a5ddef26..9769f9f 100644 --- a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc +++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc
@@ -45,20 +45,11 @@ // Amount of idle time left in a frame (as a ratio of the vsync interval) above // which main thread compositing can be considered fast. const double kFastCompositingIdleTimeThreshold = .2; -constexpr base::TimeDelta kThreadLoadTrackerReportingInterval = - base::TimeDelta::FromSeconds(1); // We do not throttle anything while audio is played and shortly after that. constexpr base::TimeDelta kThrottlingDelayAfterAudioIsPlayed = base::TimeDelta::FromSeconds(5); constexpr base::TimeDelta kQueueingTimeWindowDuration = base::TimeDelta::FromSeconds(1); -// Threshold for discarding ultra-long tasks. It is assumed that ultra-long -// tasks are reporting glitches (e.g. system falling asleep in the middle -// of the task). -constexpr base::TimeDelta kLongTaskDiscardingThreshold = - base::TimeDelta::FromSeconds(30); -constexpr base::TimeDelta kLongIdlePeriodDiscardingThreshold = - base::TimeDelta::FromMinutes(3); } // namespace @@ -164,12 +155,6 @@ DCHECK(main_thread_only().was_shutdown); } -#define TASK_DURATION_METRIC_NAME "RendererScheduler.TaskDurationPerQueueType2" -#define TASK_COUNT_METRIC_NAME "RendererScheduler.TaskCountPerQueueType" -#define MAIN_THREAD_LOAD_METRIC_NAME "RendererScheduler.RendererMainThreadLoad5" -#define EXTENSIONS_MAIN_THREAD_LOAD_METRIC_NAME \ - MAIN_THREAD_LOAD_METRIC_NAME ".Extension" - RendererSchedulerImpl::MainThreadOnly::MainThreadOnly( RendererSchedulerImpl* renderer_scheduler_impl, const scoped_refptr<MainThreadTaskQueue>& compositor_task_runner, @@ -185,21 +170,6 @@ time_source, kShortIdlePeriodDurationSampleCount, kShortIdlePeriodDurationPercentile), - main_thread_load_tracker( - now, - base::Bind(&RendererSchedulerImpl::RecordMainThreadTaskLoad, - base::Unretained(renderer_scheduler_impl)), - kThreadLoadTrackerReportingInterval), - background_main_thread_load_tracker( - now, - base::Bind(&RendererSchedulerImpl::RecordBackgroundMainThreadTaskLoad, - base::Unretained(renderer_scheduler_impl)), - kThreadLoadTrackerReportingInterval), - foreground_main_thread_load_tracker( - now, - base::Bind(&RendererSchedulerImpl::RecordForegroundMainThreadTaskLoad, - base::Unretained(renderer_scheduler_impl)), - kThreadLoadTrackerReportingInterval), current_use_case(UseCase::NONE), timer_queue_pause_count(0), navigation_task_expected_count(0), @@ -227,39 +197,8 @@ background_status_changed_at(now), rail_mode_observer(nullptr), wake_up_budget_pool(nullptr), - task_duration_reporter(TASK_DURATION_METRIC_NAME), - foreground_task_duration_reporter(TASK_DURATION_METRIC_NAME - ".Foreground"), - foreground_first_minute_task_duration_reporter(TASK_DURATION_METRIC_NAME - ".Foreground.FirstMinute"), - foreground_second_minute_task_duration_reporter( - TASK_DURATION_METRIC_NAME ".Foreground.SecondMinute"), - foreground_third_minute_task_duration_reporter(TASK_DURATION_METRIC_NAME - ".Foreground.ThirdMinute"), - foreground_after_third_minute_task_duration_reporter( - TASK_DURATION_METRIC_NAME ".Foreground.AfterThirdMinute"), - background_task_duration_reporter(TASK_DURATION_METRIC_NAME - ".Background"), - background_first_minute_task_duration_reporter(TASK_DURATION_METRIC_NAME - ".Background.FirstMinute"), - background_second_minute_task_duration_reporter( - TASK_DURATION_METRIC_NAME ".Background.SecondMinute"), - background_third_minute_task_duration_reporter(TASK_DURATION_METRIC_NAME - ".Background.ThirdMinute"), - background_fourth_minute_task_duration_reporter( - TASK_DURATION_METRIC_NAME ".Background.FourthMinute"), - background_fifth_minute_task_duration_reporter(TASK_DURATION_METRIC_NAME - ".Background.FifthMinute"), - background_after_fifth_minute_task_duration_reporter( - TASK_DURATION_METRIC_NAME ".Background.AfterFifthMinute"), - hidden_task_duration_reporter(TASK_DURATION_METRIC_NAME ".Hidden"), - visible_task_duration_reporter(TASK_DURATION_METRIC_NAME ".Visible"), - hidden_music_task_duration_reporter(TASK_DURATION_METRIC_NAME - ".HiddenMusic"), - process_type(RendererProcessType::kRenderer) { - main_thread_load_tracker.Resume(now); - foreground_main_thread_load_tracker.Resume(now); -} + metrics_helper(renderer_scheduler_impl, now, renderer_backgrounded), + process_type(RendererProcessType::kRenderer) {} RendererSchedulerImpl::MainThreadOnly::~MainThreadOnly() {} @@ -283,8 +222,7 @@ void RendererSchedulerImpl::Shutdown() { base::TimeTicks now = tick_clock()->NowTicks(); - main_thread_only().background_main_thread_load_tracker.RecordIdle(now); - main_thread_only().foreground_main_thread_load_tracker.RecordIdle(now); + main_thread_only().metrics_helper.OnRendererShutdown(now); task_queue_throttler_.reset(); helper_.Shutdown(); @@ -612,11 +550,9 @@ base::TimeTicks now = tick_clock()->NowTicks(); if (backgrounded) { - main_thread_only().foreground_main_thread_load_tracker.Pause(now); - main_thread_only().background_main_thread_load_tracker.Resume(now); + main_thread_only().metrics_helper.OnRendererBackgrounded(now); } else { - main_thread_only().foreground_main_thread_load_tracker.Resume(now); - main_thread_only().background_main_thread_load_tracker.Pause(now); + main_thread_only().metrics_helper.OnRendererForegrounded(now); } } @@ -1969,271 +1905,8 @@ task_queue_throttler()->OnTaskRunTimeReported(queue, start, end); // TODO(altimin): Per-page metrics should also be considered. - RecordTaskMetrics(queue->queue_type(), start, end); -} - -namespace { - -// Calculates the length of the intersection of two given time intervals. -base::TimeDelta DurationOfIntervalOverlap(base::TimeTicks start1, - base::TimeTicks end1, - base::TimeTicks start2, - base::TimeTicks end2) { - DCHECK_LE(start1, end1); - DCHECK_LE(start2, end2); - return std::max(std::min(end1, end2) - std::max(start1, start2), - base::TimeDelta()); -} - -} // namespace - -void RendererSchedulerImpl::RecordTaskMetrics( - MainThreadTaskQueue::QueueType queue_type, - base::TimeTicks start_time, - base::TimeTicks end_time) { - base::TimeDelta duration = end_time - start_time; - if (duration > kLongTaskDiscardingThreshold) - return; - - // Discard anomalously long idle periods. - if (main_thread_only().last_reported_task && - start_time - main_thread_only().last_reported_task.value() > - kLongIdlePeriodDiscardingThreshold) { - main_thread_only().main_thread_load_tracker.Reset(end_time); - main_thread_only().foreground_main_thread_load_tracker.Reset(end_time); - main_thread_only().background_main_thread_load_tracker.Reset(end_time); - return; - } - - main_thread_only().last_reported_task = end_time; - - UMA_HISTOGRAM_CUSTOM_COUNTS("RendererScheduler.TaskTime2", - duration.InMicroseconds(), 1, 1000 * 1000, 50); - - // We want to measure thread time here, but for efficiency reasons - // we stick with wall time. - main_thread_only().main_thread_load_tracker.RecordTaskTime(start_time, - end_time); - main_thread_only().foreground_main_thread_load_tracker.RecordTaskTime( - start_time, end_time); - main_thread_only().background_main_thread_load_tracker.RecordTaskTime( - start_time, end_time); - - UMA_HISTOGRAM_ENUMERATION( - TASK_COUNT_METRIC_NAME, static_cast<int>(queue_type), - static_cast<int>(MainThreadTaskQueue::QueueType::COUNT)); - - if (duration >= base::TimeDelta::FromMilliseconds(16)) { - UMA_HISTOGRAM_ENUMERATION( - TASK_COUNT_METRIC_NAME ".LongerThan16ms", static_cast<int>(queue_type), - static_cast<int>(MainThreadTaskQueue::QueueType::COUNT)); - } - - if (duration >= base::TimeDelta::FromMilliseconds(50)) { - UMA_HISTOGRAM_ENUMERATION( - TASK_COUNT_METRIC_NAME ".LongerThan50ms", static_cast<int>(queue_type), - static_cast<int>(MainThreadTaskQueue::QueueType::COUNT)); - } - - if (duration >= base::TimeDelta::FromMilliseconds(100)) { - UMA_HISTOGRAM_ENUMERATION( - TASK_COUNT_METRIC_NAME ".LongerThan100ms", static_cast<int>(queue_type), - static_cast<int>(MainThreadTaskQueue::QueueType::COUNT)); - } - - if (duration >= base::TimeDelta::FromMilliseconds(150)) { - UMA_HISTOGRAM_ENUMERATION( - TASK_COUNT_METRIC_NAME ".LongerThan150ms", static_cast<int>(queue_type), - static_cast<int>(MainThreadTaskQueue::QueueType::COUNT)); - } - - if (duration >= base::TimeDelta::FromSeconds(1)) { - UMA_HISTOGRAM_ENUMERATION( - TASK_COUNT_METRIC_NAME ".LongerThan1s", static_cast<int>(queue_type), - static_cast<int>(MainThreadTaskQueue::QueueType::COUNT)); - } - - main_thread_only().task_duration_reporter.RecordTask(queue_type, duration); - - if (main_thread_only().renderer_backgrounded) { - main_thread_only().background_task_duration_reporter.RecordTask(queue_type, - duration); - - // Collect detailed breakdown for first five minutes given that we stop - // timers on mobile after five minutes. - base::TimeTicks backgrounded_at = - main_thread_only().background_status_changed_at; - - main_thread_only() - .background_first_minute_task_duration_reporter.RecordTask( - queue_type, DurationOfIntervalOverlap( - start_time, end_time, backgrounded_at, - backgrounded_at + base::TimeDelta::FromMinutes(1))); - - main_thread_only() - .background_second_minute_task_duration_reporter.RecordTask( - queue_type, DurationOfIntervalOverlap( - start_time, end_time, - backgrounded_at + base::TimeDelta::FromMinutes(1), - backgrounded_at + base::TimeDelta::FromMinutes(2))); - - main_thread_only() - .background_third_minute_task_duration_reporter.RecordTask( - queue_type, DurationOfIntervalOverlap( - start_time, end_time, - backgrounded_at + base::TimeDelta::FromMinutes(2), - backgrounded_at + base::TimeDelta::FromMinutes(3))); - - main_thread_only() - .background_fourth_minute_task_duration_reporter.RecordTask( - queue_type, DurationOfIntervalOverlap( - start_time, end_time, - backgrounded_at + base::TimeDelta::FromMinutes(3), - backgrounded_at + base::TimeDelta::FromMinutes(4))); - - main_thread_only() - .background_fifth_minute_task_duration_reporter.RecordTask( - queue_type, DurationOfIntervalOverlap( - start_time, end_time, - backgrounded_at + base::TimeDelta::FromMinutes(4), - backgrounded_at + base::TimeDelta::FromMinutes(5))); - - main_thread_only() - .background_after_fifth_minute_task_duration_reporter.RecordTask( - queue_type, - DurationOfIntervalOverlap( - start_time, end_time, - backgrounded_at + base::TimeDelta::FromMinutes(5), - std::max(backgrounded_at + base::TimeDelta::FromMinutes(5), - end_time))); - } else { - main_thread_only().foreground_task_duration_reporter.RecordTask(queue_type, - duration); - - // For foreground tabs we do not expect such a notable difference as it is - // the case with background tabs, so we limit breakdown to three minutes. - base::TimeTicks foregrounded_at = - main_thread_only().background_status_changed_at; - - main_thread_only() - .foreground_first_minute_task_duration_reporter.RecordTask( - queue_type, DurationOfIntervalOverlap( - start_time, end_time, foregrounded_at, - foregrounded_at + base::TimeDelta::FromMinutes(1))); - - main_thread_only() - .foreground_second_minute_task_duration_reporter.RecordTask( - queue_type, DurationOfIntervalOverlap( - start_time, end_time, - foregrounded_at + base::TimeDelta::FromMinutes(1), - foregrounded_at + base::TimeDelta::FromMinutes(2))); - - main_thread_only() - .foreground_third_minute_task_duration_reporter.RecordTask( - queue_type, DurationOfIntervalOverlap( - start_time, end_time, - foregrounded_at + base::TimeDelta::FromMinutes(2), - foregrounded_at + base::TimeDelta::FromMinutes(3))); - - main_thread_only() - .foreground_after_third_minute_task_duration_reporter.RecordTask( - queue_type, - DurationOfIntervalOverlap( - start_time, end_time, - foregrounded_at + base::TimeDelta::FromMinutes(3), - std::max(foregrounded_at + base::TimeDelta::FromMinutes(3), - end_time))); - } - - if (main_thread_only().renderer_hidden) { - main_thread_only().hidden_task_duration_reporter.RecordTask(queue_type, - duration); - - if (ShouldDisableThrottlingBecauseOfAudio(start_time)) { - main_thread_only().hidden_music_task_duration_reporter.RecordTask( - queue_type, duration); - } - } else { - main_thread_only().visible_task_duration_reporter.RecordTask(queue_type, - duration); - } -} - -void RendererSchedulerImpl::RecordMainThreadTaskLoad(base::TimeTicks time, - double load) { - int load_percentage = static_cast<int>(load * 100); - DCHECK_LE(load_percentage, 100); - - UMA_HISTOGRAM_PERCENTAGE(MAIN_THREAD_LOAD_METRIC_NAME, load_percentage); - - if (main_thread_only().process_type == - RendererProcessType::kExtensionRenderer) { - UMA_HISTOGRAM_PERCENTAGE(EXTENSIONS_MAIN_THREAD_LOAD_METRIC_NAME, - load_percentage); - } - - TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), - "RendererScheduler.RendererMainThreadLoad", load_percentage); -} - -void RendererSchedulerImpl::RecordForegroundMainThreadTaskLoad( - base::TimeTicks time, - double load) { - int load_percentage = static_cast<int>(load * 100); - DCHECK_LE(load_percentage, 100); - - switch (main_thread_only().process_type) { - case RendererProcessType::kExtensionRenderer: - UMA_HISTOGRAM_PERCENTAGE(EXTENSIONS_MAIN_THREAD_LOAD_METRIC_NAME - ".Foreground", - load_percentage); - break; - case RendererProcessType::kRenderer: - UMA_HISTOGRAM_PERCENTAGE(MAIN_THREAD_LOAD_METRIC_NAME ".Foreground", - load_percentage); - - if (time - main_thread_only().background_status_changed_at > - base::TimeDelta::FromMinutes(1)) { - UMA_HISTOGRAM_PERCENTAGE(MAIN_THREAD_LOAD_METRIC_NAME - ".Foreground.AfterFirstMinute", - load_percentage); - } - break; - } - - TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), - "RendererScheduler.RendererMainThreadLoad.Foreground", - load_percentage); -} - -void RendererSchedulerImpl::RecordBackgroundMainThreadTaskLoad( - base::TimeTicks time, - double load) { - int load_percentage = static_cast<int>(load * 100); - DCHECK_LE(load_percentage, 100); - - switch (main_thread_only().process_type) { - case RendererProcessType::kExtensionRenderer: - UMA_HISTOGRAM_PERCENTAGE(EXTENSIONS_MAIN_THREAD_LOAD_METRIC_NAME - ".Background", - load_percentage); - break; - case RendererProcessType::kRenderer: - UMA_HISTOGRAM_PERCENTAGE(MAIN_THREAD_LOAD_METRIC_NAME ".Background", - load_percentage); - - if (time - main_thread_only().background_status_changed_at > - base::TimeDelta::FromMinutes(1)) { - UMA_HISTOGRAM_PERCENTAGE(MAIN_THREAD_LOAD_METRIC_NAME - ".Background.AfterFirstMinute", - load_percentage); - } - break; - } - - TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), - "RendererScheduler.RendererMainThreadLoad.Background", - load_percentage); + main_thread_only().metrics_helper.RecordTaskMetrics(queue->queue_type(), + start, end); } void RendererSchedulerImpl::OnBeginNestedRunLoop() {
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.h b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.h index d314ef9..eb11315 100644 --- a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.h +++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.h
@@ -14,10 +14,10 @@ #include "base/synchronization/lock.h" #include "base/trace_event/trace_log.h" #include "device/base/synchronization/shared_memory_seqlock_buffer.h" +#include "platform/PlatformExport.h" #include "platform/scheduler/base/pollable_thread_safe_flag.h" #include "platform/scheduler/base/queueing_time_estimator.h" #include "platform/scheduler/base/task_time_observer.h" -#include "platform/scheduler/base/thread_load_tracker.h" #include "platform/scheduler/child/idle_canceled_delayed_task_sweeper.h" #include "platform/scheduler/child/idle_helper.h" #include "platform/scheduler/renderer/deadline_task_runner.h" @@ -25,8 +25,8 @@ #include "platform/scheduler/renderer/main_thread_scheduler_helper.h" #include "platform/scheduler/renderer/main_thread_task_queue.h" #include "platform/scheduler/renderer/render_widget_signals.h" +#include "platform/scheduler/renderer/renderer_metrics_helper.h" #include "platform/scheduler/renderer/task_cost_estimator.h" -#include "platform/scheduler/renderer/task_duration_metric_reporter.h" #include "platform/scheduler/renderer/user_model.h" #include "platform/scheduler/renderer/web_view_scheduler_impl.h" #include "public/platform/scheduler/renderer/renderer_scheduler.h" @@ -253,9 +253,12 @@ scoped_refptr<base::SingleThreadTaskRunner> TimerTaskRunner() override; private: - friend class RendererSchedulerImplTest; - friend class RendererSchedulerImplForTest; friend class RenderWidgetSchedulingState; + friend class RendererMetricsHelper; + + friend class RendererMetricsHelperTest; + friend class RendererSchedulerImplForTest; + friend class RendererSchedulerImplTest; FRIEND_TEST_ALL_PREFIXES(RendererSchedulerImplTest, Tracing); enum class ExpensiveTaskPolicy { RUN, BLOCK, THROTTLE }; @@ -505,14 +508,6 @@ void AddQueueToWakeUpBudgetPool(MainThreadTaskQueue* queue); - void RecordTaskMetrics(MainThreadTaskQueue::QueueType queue_type, - base::TimeTicks start_time, - base::TimeTicks end_time); - - void RecordMainThreadTaskLoad(base::TimeTicks time, double load); - void RecordForegroundMainThreadTaskLoad(base::TimeTicks time, double load); - void RecordBackgroundMainThreadTaskLoad(base::TimeTicks time, double load); - MainThreadSchedulerHelper helper_; IdleHelper idle_helper_; IdleCanceledDelayedTaskSweeper idle_canceled_delayed_task_sweeper_; @@ -560,9 +555,6 @@ TaskCostEstimator loading_task_cost_estimator; TaskCostEstimator timer_task_cost_estimator; IdleTimeEstimator idle_time_estimator; - ThreadLoadTracker main_thread_load_tracker; - ThreadLoadTracker background_main_thread_load_tracker; - ThreadLoadTracker foreground_main_thread_load_tracker; UseCase current_use_case; Policy current_policy; base::TimeTicks current_policy_expiration_time; @@ -601,25 +593,7 @@ std::set<WebViewSchedulerImpl*> web_view_schedulers; // Not owned. RAILModeObserver* rail_mode_observer; // Not owned. WakeUpBudgetPool* wake_up_budget_pool; // Not owned. - base::Optional<base::TimeTicks> last_reported_task; - TaskDurationMetricReporter task_duration_reporter; - TaskDurationMetricReporter foreground_task_duration_reporter; - TaskDurationMetricReporter foreground_first_minute_task_duration_reporter; - TaskDurationMetricReporter foreground_second_minute_task_duration_reporter; - TaskDurationMetricReporter foreground_third_minute_task_duration_reporter; - TaskDurationMetricReporter - foreground_after_third_minute_task_duration_reporter; - TaskDurationMetricReporter background_task_duration_reporter; - TaskDurationMetricReporter background_first_minute_task_duration_reporter; - TaskDurationMetricReporter background_second_minute_task_duration_reporter; - TaskDurationMetricReporter background_third_minute_task_duration_reporter; - TaskDurationMetricReporter background_fourth_minute_task_duration_reporter; - TaskDurationMetricReporter background_fifth_minute_task_duration_reporter; - TaskDurationMetricReporter - background_after_fifth_minute_task_duration_reporter; - TaskDurationMetricReporter hidden_task_duration_reporter; - TaskDurationMetricReporter visible_task_duration_reporter; - TaskDurationMetricReporter hidden_music_task_duration_reporter; + RendererMetricsHelper metrics_helper; RendererProcessType process_type; };
diff --git a/third_party/WebKit/public/BUILD.gn b/third_party/WebKit/public/BUILD.gn index 7799699..d675526 100644 --- a/third_party/WebKit/public/BUILD.gn +++ b/third_party/WebKit/public/BUILD.gn
@@ -82,6 +82,12 @@ ] } + java_cpp_enum("blink_cursor_type_java_enums_srcjar") { + sources = [ + "./platform/WebCursorInfo.h", + ] + } + android_library("blink_headers_java") { deps = [ "//third_party/android_tools:android_support_annotations_java", @@ -474,7 +480,6 @@ "web/WebColorChooser.h", "web/WebColorChooserClient.h", "web/WebColorSuggestion.h", - "web/WebCompositionUnderline.h", "web/WebConsoleMessage.h", "web/WebContextFeatures.h", "web/WebContextMenuData.h", @@ -528,6 +533,7 @@ "web/WebIconURL.h", "web/WebImageCache.h", "web/WebImageDecoder.h", + "web/WebImeTextSpan.h", "web/WebInputElement.h", "web/WebInputMethodController.h", "web/WebKit.h",
diff --git a/third_party/WebKit/public/platform/WebCursorInfo.h b/third_party/WebKit/public/platform/WebCursorInfo.h index 68eb2ed..d00e276 100644 --- a/third_party/WebKit/public/platform/WebCursorInfo.h +++ b/third_party/WebKit/public/platform/WebCursorInfo.h
@@ -44,6 +44,9 @@ class Cursor; struct WebCursorInfo { + // A Java counterpart will be generated for this enum. + // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.blink_public.web + // GENERATED_JAVA_CLASS_NAME_OVERRIDE: WebCursorInfoType enum Type { kTypePointer, kTypeCross,
diff --git a/third_party/WebKit/public/web/WebFrameOwnerProperties.h b/third_party/WebKit/public/web/WebFrameOwnerProperties.h index 64e9916..d1d0470f 100644 --- a/third_party/WebKit/public/web/WebFrameOwnerProperties.h +++ b/third_party/WebKit/public/web/WebFrameOwnerProperties.h
@@ -27,8 +27,6 @@ WebString required_csp; public: - WebVector<WebFeaturePolicyFeature> allowed_features; - WebFrameOwnerProperties() : scrolling_mode(ScrollingMode::kAuto), margin_width(-1), @@ -38,16 +36,14 @@ is_display_none(false) {} #if INSIDE_BLINK - WebFrameOwnerProperties( - const WebString& name, - ScrollbarMode scrolling_mode, - int margin_width, - int margin_height, - bool allow_fullscreen, - bool allow_payment_request, - bool is_display_none, - const WebString& required_csp, - const WebVector<WebFeaturePolicyFeature>& allowed_features) + WebFrameOwnerProperties(const WebString& name, + ScrollbarMode scrolling_mode, + int margin_width, + int margin_height, + bool allow_fullscreen, + bool allow_payment_request, + bool is_display_none, + const WebString& required_csp) : name(name), scrolling_mode(static_cast<ScrollingMode>(scrolling_mode)), margin_width(margin_width), @@ -55,8 +51,7 @@ allow_fullscreen(allow_fullscreen), allow_payment_request(allow_payment_request), is_display_none(is_display_none), - required_csp(required_csp), - allowed_features(allowed_features) {} + required_csp(required_csp) {} #endif };
diff --git a/third_party/WebKit/public/web/WebCompositionUnderline.h b/third_party/WebKit/public/web/WebImeTextSpan.h similarity index 80% rename from third_party/WebKit/public/web/WebCompositionUnderline.h rename to third_party/WebKit/public/web/WebImeTextSpan.h index 0b7f83e..53b1314 100644 --- a/third_party/WebKit/public/web/WebCompositionUnderline.h +++ b/third_party/WebKit/public/web/WebImeTextSpan.h
@@ -28,41 +28,37 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef WebCompositionUnderline_h -#define WebCompositionUnderline_h +#ifndef WebImeTextSpan_h +#define WebImeTextSpan_h #include "public/platform/WebColor.h" namespace blink { -// Class WebCompositionUnderline is intended to be used with WebWidget's +// Class WebImeTextSpan is intended to be used with WebWidget's // setComposition() method. -struct WebCompositionUnderline { - WebCompositionUnderline() +struct WebImeTextSpan { + WebImeTextSpan() : start_offset(0), end_offset(0), color(0), thick(false), background_color(0) {} - WebCompositionUnderline(unsigned s, - unsigned e, - WebColor c, - bool t, - WebColor bc) + WebImeTextSpan(unsigned s, unsigned e, WebColor c, bool t, WebColor bc) : start_offset(s), end_offset(e), color(c), thick(t), background_color(bc) {} - bool operator<(const WebCompositionUnderline& other) const { + bool operator<(const WebImeTextSpan& other) const { return start_offset != other.start_offset ? start_offset < other.start_offset : end_offset < other.end_offset; } - // Need to update IPC_STRUCT_TRAITS_BEGIN(blink::WebCompositionUnderline) + // Need to update IPC_STRUCT_TRAITS_BEGIN(blink::WebImeTextSpan) // if members change. unsigned start_offset; unsigned end_offset;
diff --git a/third_party/WebKit/public/web/WebInputMethodController.h b/third_party/WebKit/public/web/WebInputMethodController.h index d95ee7e..161d47f 100644 --- a/third_party/WebKit/public/web/WebInputMethodController.h +++ b/third_party/WebKit/public/web/WebInputMethodController.h
@@ -5,9 +5,9 @@ #ifndef WebInputMethodController_h #define WebInputMethodController_h -#include "public/platform/WebTextInputInfo.h" -#include "WebCompositionUnderline.h" +#include "WebImeTextSpan.h" #include "WebWidget.h" +#include "public/platform/WebTextInputInfo.h" namespace blink { @@ -31,19 +31,18 @@ // text will be canceled. |replacementRange| (when not null) is the range in // current text which should be replaced by |text|. Returns true if the // composition text was set successfully. - virtual bool SetComposition( - const WebString& text, - const WebVector<WebCompositionUnderline>& underlines, - const WebRange& replacement_range, - int selection_start, - int selection_end) = 0; + virtual bool SetComposition(const WebString& text, + const WebVector<WebImeTextSpan>& ime_text_spans, + const WebRange& replacement_range, + int selection_start, + int selection_end) = 0; // Called to inform the controller to delete the ongoing composition if any, // insert |text|, and move the caret according to |relativeCaretPosition|. // |replacementRange| (when not null) is the range in current text which // should be replaced by |text|. virtual bool CommitText(const WebString& text, - const WebVector<WebCompositionUnderline>& underlines, + const WebVector<WebImeTextSpan>& ime_text_spans, const WebRange& replacement_range, int relative_caret_position) = 0;
diff --git a/third_party/WebKit/public/web/WebLocalFrame.h b/third_party/WebKit/public/web/WebLocalFrame.h index b9ef892..d14a18de 100644 --- a/third_party/WebKit/public/web/WebLocalFrame.h +++ b/third_party/WebKit/public/web/WebLocalFrame.h
@@ -8,10 +8,10 @@ #include <memory> #include <set> -#include "WebCompositionUnderline.h" #include "WebFrame.h" #include "WebFrameLoadType.h" #include "WebHistoryItem.h" +#include "WebImeTextSpan.h" #include "public/platform/WebCachePolicy.h" #include "public/platform/WebFocusType.h" #include "public/platform/WebSize.h" @@ -503,7 +503,7 @@ virtual bool SetCompositionFromExistingText( int composition_start, int composition_end, - const WebVector<WebCompositionUnderline>& underlines) = 0; + const WebVector<WebImeTextSpan>& ime_text_spans) = 0; virtual void ExtendSelectionAndDelete(int before, int after) = 0; virtual void SetCaretVisible(bool) = 0;
diff --git a/third_party/WebKit/public/web/WebPlugin.h b/third_party/WebKit/public/web/WebPlugin.h index ff9fe31..1db7778 100644 --- a/third_party/WebKit/public/web/WebPlugin.h +++ b/third_party/WebKit/public/web/WebPlugin.h
@@ -47,7 +47,7 @@ class WebDragData; class WebPluginContainer; class WebURLResponse; -struct WebCompositionUnderline; +struct WebImeTextSpan; struct WebCursorInfo; struct WebPrintParams; struct WebPrintPresetOptions; @@ -170,12 +170,11 @@ // Sets composition text from input method, and returns true if the // composition is set successfully. If |replacementRange| is not null, the // text inside |replacementRange| will be replaced by |text| - virtual bool SetComposition( - const WebString& text, - const WebVector<WebCompositionUnderline>& underlines, - const WebRange& replacement_range, - int selection_start, - int selection_end) { + virtual bool SetComposition(const WebString& text, + const WebVector<WebImeTextSpan>& ime_text_spans, + const WebRange& replacement_range, + int selection_start, + int selection_end) { return false; } @@ -183,7 +182,7 @@ // moves the caret according to relativeCaretPosition. If |replacementRange| // is not null, the text inside |replacementRange| will be replaced by |text|. virtual bool CommitText(const WebString& text, - const WebVector<WebCompositionUnderline>& underlines, + const WebVector<WebImeTextSpan>& ime_text_spans, const WebRange& replacement_range, int relative_caret_position) { return false;
diff --git a/third_party/WebKit/public/web/WebWidget.h b/third_party/WebKit/public/web/WebWidget.h index 2a34655..bf139ef3 100644 --- a/third_party/WebKit/public/web/WebWidget.h +++ b/third_party/WebKit/public/web/WebWidget.h
@@ -41,7 +41,7 @@ #include "public/platform/WebRect.h" #include "public/platform/WebSize.h" #include "public/platform/WebTextInputInfo.h" -#include "public/web/WebCompositionUnderline.h" +#include "public/web/WebImeTextSpan.h" #include "public/web/WebRange.h" #include "public/web/WebTextDirection.h"
diff --git a/third_party/bazel/desugar/BUILD.gn b/third_party/bazel/desugar/BUILD.gn new file mode 100644 index 0000000..bff746ab --- /dev/null +++ b/third_party/bazel/desugar/BUILD.gn
@@ -0,0 +1,11 @@ +# 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. + +import("//build/config/android/rules.gni") + +# Provides runtime support for desugar transformations. +java_prebuilt("desugar_runtime_java") { + supports_android = true + jar_path = "Desugar-runtime.jar" +}
diff --git a/third_party/bazel/desugar/Desugar-runtime.jar b/third_party/bazel/desugar/Desugar-runtime.jar new file mode 100644 index 0000000..b04c6b83 --- /dev/null +++ b/third_party/bazel/desugar/Desugar-runtime.jar Binary files differ
diff --git a/third_party/bazel/desugar/README.chromium b/third_party/bazel/desugar/README.chromium index 82432884..368566f 100644 --- a/third_party/bazel/desugar/README.chromium +++ b/third_party/bazel/desugar/README.chromium
@@ -14,8 +14,10 @@ such as lambda experssions for Chrome on Android. Local Modifications: -Desugar.jar is the "Desugar_deploy.jar" target defined in -[bazel]src/tools/android/java/com/google/devtools/build/android/desugar/BUILD +* Desugar.jar is the "Desugar_deploy.jar" target defined in + [bazel]src/tools/android/java/com/google/devtools/build/android/desugar/BUILD +* Desugar-runtime.jar is derived from Desugar.jar (refer to update + instructions). Update instructions (requires @google.com account for uploading): - Check out Bazel from https://github.com/bazelbuild/bazel @@ -30,4 +32,7 @@ $ download_from_google_storage --config - Upload new jar to gcloud. In third_party/bazel/desugar, run $ upload_to_google_storage.py -b chromium-android-tools/bazel/desugar Desugar.jar - +- Update Desugar-runtime.jar: +$ unzip Desugar.jar "com/google/devtools/build/android/desugar/runtime*" +$ zip -rD0 Desugar-runtime.jar com +$ rm -r com
diff --git a/third_party/gvr-android-sdk/BUILD.gn b/third_party/gvr-android-sdk/BUILD.gn index 223ba74b..5fac13b4 100644 --- a/third_party/gvr-android-sdk/BUILD.gn +++ b/third_party/gvr-android-sdk/BUILD.gn
@@ -7,12 +7,14 @@ android_aar_prebuilt("controller_test_api_java") { aar_path = "test-libraries/controller_test_api.aar" proguard_configs = [ "test-libraries/proguard.txt" ] + + # Jar includes conflicting copies of Desugar-runtime.jar classes. + jar_excluded_patterns = [ "*ThrowableExtension*.class" ] } android_aar_prebuilt("gvr_common_java") { aar_path = "common_library.aar" proguard_configs = [ "proguard-gvr-chromium.txt" ] - ignore_manifest = true # Ignored because manifest merging is not supported (http://crbug.com/643967) ignore_native_libraries = true # Ignore unused auto generated classes. Proguard will not strip them automatically because they
diff --git a/third_party/gvr-android-sdk/test-apks/daydream_home/apk_version_history.txt b/third_party/gvr-android-sdk/test-apks/daydream_home/apk_version_history.txt index 9200f48..f70d4aa 100644 --- a/third_party/gvr-android-sdk/test-apks/daydream_home/apk_version_history.txt +++ b/third_party/gvr-android-sdk/test-apks/daydream_home/apk_version_history.txt
@@ -7,3 +7,4 @@ v1.5 a02e2f95aa6f741f2be0ae03a4829e21fd749cf3 v1.6 43b876df3398687dfa1ae059ef2f64009c76254e v1.7 d5c72438acffe723e7717c45deedd8431bc613e7 +v1.8 cbc81aa4db5986f25d2c967f9b1e247cf07cd75e
diff --git a/third_party/gvr-android-sdk/test-apks/daydream_home/daydream_home_current.apk.sha1 b/third_party/gvr-android-sdk/test-apks/daydream_home/daydream_home_current.apk.sha1 index 31836cd7..11fa641 100644 --- a/third_party/gvr-android-sdk/test-apks/daydream_home/daydream_home_current.apk.sha1 +++ b/third_party/gvr-android-sdk/test-apks/daydream_home/daydream_home_current.apk.sha1
@@ -1 +1 @@ -d5c72438acffe723e7717c45deedd8431bc613e7 \ No newline at end of file +cbc81aa4db5986f25d2c967f9b1e247cf07cd75e \ No newline at end of file
diff --git a/third_party/gvr-android-sdk/test-apks/vr_services/apk_version_history.txt b/third_party/gvr-android-sdk/test-apks/vr_services/apk_version_history.txt index 4831ae6..2b7c0f5c 100644 --- a/third_party/gvr-android-sdk/test-apks/vr_services/apk_version_history.txt +++ b/third_party/gvr-android-sdk/test-apks/vr_services/apk_version_history.txt
@@ -10,3 +10,4 @@ v1.5 5d6d55728c7c728cef5416f37b0b71615719474e v1.6 abcdae2281956a76aa3b98d2e8f05a1975170dd0 v1.7 fcfa178173a2c0cab9c7d51829c2ee76ab66e1d9 +v1.8 f8f45ebf1963c5f9862218baca120ea974b87a08
diff --git a/third_party/gvr-android-sdk/test-apks/vr_services/vr_services_current.apk.sha1 b/third_party/gvr-android-sdk/test-apks/vr_services/vr_services_current.apk.sha1 index fb68207..c4102cfa 100644 --- a/third_party/gvr-android-sdk/test-apks/vr_services/vr_services_current.apk.sha1 +++ b/third_party/gvr-android-sdk/test-apks/vr_services/vr_services_current.apk.sha1
@@ -1 +1 @@ -fcfa178173a2c0cab9c7d51829c2ee76ab66e1d9 \ No newline at end of file +f8f45ebf1963c5f9862218baca120ea974b87a08 \ No newline at end of file
diff --git a/third_party/libxml/README.chromium b/third_party/libxml/README.chromium index 2622116c..db88d143 100644 --- a/third_party/libxml/README.chromium +++ b/third_party/libxml/README.chromium
@@ -1,6 +1,6 @@ Name: libxml URL: http://xmlsoft.org -Version: 3939178e4cb797417ff033b1e04ab4b038e224d9 +Version: 27f310d453b7e2e71847e5910a0961753aacdbd1 License: MIT License File: src/Copyright Security Critical: yes
diff --git a/third_party/libxml/src/ChangeLog b/third_party/libxml/src/ChangeLog index ef6cb8e..896fbbb 100644 --- a/third_party/libxml/src/ChangeLog +++ b/third_party/libxml/src/ChangeLog
@@ -1929,7 +1929,7 @@ * tree.c: Fixed xmlGetNodePath() to generate the node test "*" for elements in the default namespace, rather than generating - an unprefixed named node test and loosing the namespace + an unprefixed named node test and losing the namespace information. Fri Jun 9 21:45:02 CEST 2006 Kasimier Buchcik <libxml2-cvs@cazic.net> @@ -2305,7 +2305,7 @@ * tree.c: Simplified usage of the internal xmlNsMap. Added a "strict" lookup for namespaces based on a prefix. Fixed a namespace processing issue in the clone-node function, which - occured if a @ctxt argument was given. + occurred if a @ctxt argument was given. Fri Mar 3 17:44:10 CET 2006 Rob Richards <rrichards@ctindustries.net> @@ -3951,7 +3951,7 @@ * README: updated * debugXML.c: fix a bug raised by bill on IRC * relaxng.c: fix a leak in weird circumstances - * runsuite.c Makefile.am: standalone test tool agaisnt + * runsuite.c Makefile.am: standalone test tool against the regression suites, work in progress Tue Jun 28 08:30:26 CEST 2005 Daniel Veillard <daniel@veillard.com> @@ -4356,7 +4356,7 @@ * xmlschemas.c: Added substitution group constraints; changed the build of the pre-computed substitution groups. Channeled errors during xsi assembling of schemas to the validation - context. Fixed a big memory leak, which occured when using + context. Fixed a big memory leak, which occurred when using IDCs: the precomputed value of attributes was not freed if the attribute did not resolve to an IDC field (discovered with the help of Randy J. Ray's schema, posted to the @@ -4551,7 +4551,7 @@ Mon Mar 21 21:09:07 CET 2005 Kasimier Buchcik <libxml2-cvs@cazic.net> - * xmlschemas.c: Fixed a segfault, which occured during bubbling + * xmlschemas.c: Fixed a segfault, which occurred during bubbling of IDC nodes (bug #170779 and #170778, reported by GUY Fabrice): a variable was missed to be reset in a loop. Deactivated bubbling, if not referenced by a keyref. @@ -11220,7 +11220,7 @@ * test/xsdtest/xsdtest.xml uri.c: after and exchange with James Clark it appeared I had bug in URI parsing code ... * relaxng.c include/libxml/relaxng.h: completely revamped error - reporting to not loose message from optional parts. + reporting to not lose message from optional parts. * xmllint.c: added timing for RNG validation steps * result/relaxng/*: updated the result, all error messages changed @@ -13182,7 +13182,7 @@ xmlNewCharEncodingHandler as requested in #89415 * python/generator.py python/setup.py.in: applied cleanup patches from Marc-Andre Lemburg - * tree.c: fixing bug #89332 on a specific case of loosing + * tree.c: fixing bug #89332 on a specific case of losing the XML-1.0 namespace on xml:xxx attributes Wed Jul 31 23:27:42 2002 Aleksey Sanin <aleksey@aleksey.com> @@ -15356,7 +15356,7 @@ Sat Oct 6 15:07:14 CEST 2001 Daniel Veillard <daniel@veillard.com> - * xpath.c: fixing #61673 part I, do not loose doc information + * xpath.c: fixing #61673 part I, do not lose doc information when copying result value trees. Sat Oct 6 11:58:58 CEST 2001 Daniel Veillard <daniel@veillard.com> @@ -15970,7 +15970,7 @@ Mon Jul 9 22:06:53 CEST 2001 Daniel Veillard <Daniel.Veillard@imag.fr> * valid.c: fixed "Internal: MIXED struct bad" when #CDATA elements - validation occured on content with element child + validation occurred on content with element child Mon Jul 9 17:59:08 CEST 2001 Daniel Veillard <Daniel.Veillard@imag.fr>
diff --git a/third_party/libxml/src/HTMLparser.c b/third_party/libxml/src/HTMLparser.c index 22ec576..e4f816e 100644 --- a/third_party/libxml/src/HTMLparser.c +++ b/third_party/libxml/src/HTMLparser.c
@@ -6278,7 +6278,8 @@ */ htmlDocPtr -htmlSAXParseDoc(xmlChar *cur, const char *encoding, htmlSAXHandlerPtr sax, void *userData) { +htmlSAXParseDoc(const xmlChar *cur, const char *encoding, + htmlSAXHandlerPtr sax, void *userData) { htmlDocPtr ret; htmlParserCtxtPtr ctxt; @@ -6317,7 +6318,7 @@ */ htmlDocPtr -htmlParseDoc(xmlChar *cur, const char *encoding) { +htmlParseDoc(const xmlChar *cur, const char *encoding) { return(htmlSAXParseDoc(cur, encoding, NULL, NULL)); }
diff --git a/third_party/libxml/src/Makefile.am b/third_party/libxml/src/Makefile.am index 51b253e..efc92121 100644 --- a/third_party/libxml/src/Makefile.am +++ b/third_party/libxml/src/Makefile.am
@@ -10,10 +10,10 @@ AM_CFLAGS = $(THREAD_CFLAGS) $(Z_CFLAGS) $(LZMA_CFLAGS) -noinst_PROGRAMS=testSchemas testRelax testSAX testHTML testXPath testURI \ - testThreads testC14N testAutomata testRegexp \ - testReader testapi testModule runtest runsuite testchar \ - testdict runxmlconf testrecurse testlimits +check_PROGRAMS=testSchemas testRelax testSAX testHTML testXPath testURI \ + testThreads testC14N testAutomata testRegexp \ + testReader testapi testModule runtest runsuite testchar \ + testdict runxmlconf testrecurse testlimits bin_PROGRAMS = xmllint xmlcatalog @@ -202,7 +202,8 @@ #testOOM_DEPENDENCIES = $(DEPS) #testOOM_LDADD= $(LDADDS) -runtests: +runtests: runtest$(EXEEXT) testrecurse$(EXEEXT) testapi$(EXEEXT) \ + testchar$(EXEEXT) testdict$(EXEEXT) runxmlconf$(EXEEXT) [ -d test ] || $(LN_S) $(srcdir)/test . [ -d result ] || $(LN_S) $(srcdir)/result . $(CHECKER) ./runtest$(EXEEXT) && \ @@ -843,6 +844,21 @@ if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done) + @echo "## SAX2 callbacks regression tests with entity substitution" + -@(for i in $(srcdir)/test/* ; do \ + name=`basename $$i`; \ + if [ ! -d $$i ] ; then \ + if [ ! -f $(srcdir)/result/noent/$$name.sax2 ] ; then \ + echo New test file $$name ; \ + $(CHECKER) $(top_builddir)/testSAX --sax2 --noent $$i > $(srcdir)/result/noent/$$name.sax2 2> /dev/null ; \ + grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ + else \ + log=`$(CHECKER) $(top_builddir)/testSAX --sax2 --noent $$i > result.$$name 2> /dev/null ; \ + grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ + diff $(srcdir)/result/noent/$$name.sax2 result.$$name` ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ + rm result.$$name ; \ + fi ; fi ; done) Validtests : xmllint$(EXEEXT) @(echo > .memdump)
diff --git a/third_party/libxml/src/Makefile.in b/third_party/libxml/src/Makefile.in index b9e3056..d47a2cc2 100644 --- a/third_party/libxml/src/Makefile.in +++ b/third_party/libxml/src/Makefile.in
@@ -91,7 +91,7 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -noinst_PROGRAMS = testSchemas$(EXEEXT) testRelax$(EXEEXT) \ +check_PROGRAMS = testSchemas$(EXEEXT) testRelax$(EXEEXT) \ testSAX$(EXEEXT) testHTML$(EXEEXT) testXPath$(EXEEXT) \ testURI$(EXEEXT) testThreads$(EXEEXT) testC14N$(EXEEXT) \ testAutomata$(EXEEXT) testRegexp$(EXEEXT) testReader$(EXEEXT) \ @@ -189,7 +189,7 @@ testdso_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(testdso_la_LDFLAGS) $(LDFLAGS) -o $@ -PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) +PROGRAMS = $(bin_PROGRAMS) am_runsuite_OBJECTS = runsuite.$(OBJEXT) runsuite_OBJECTS = $(am_runsuite_OBJECTS) am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) $(top_builddir)/libxml2.la \ @@ -1020,8 +1020,8 @@ echo " rm -f" $$list; \ rm -f $$list -clean-noinstPROGRAMS: - @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ @@ -1728,6 +1728,7 @@ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-recursive all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(SCRIPTS) $(MANS) $(DATA) \ @@ -1775,8 +1776,8 @@ -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-recursive -clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \ - clean-libtool clean-noinstLTLIBRARIES clean-noinstPROGRAMS \ +clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \ + clean-libLTLIBRARIES clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-recursive @@ -1855,14 +1856,14 @@ uninstall-man: uninstall-man1 uninstall-man3 -.MAKE: $(am__recursive_targets) all check install install-am \ +.MAKE: $(am__recursive_targets) all check check-am install install-am \ install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-binPROGRAMS \ - clean-cscope clean-generic clean-libLTLIBRARIES clean-libtool \ - clean-noinstLTLIBRARIES clean-noinstPROGRAMS cscope \ - cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ + clean-checkPROGRAMS clean-cscope clean-generic \ + clean-libLTLIBRARIES clean-libtool clean-noinstLTLIBRARIES \ + cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ dist-gzip dist-hook dist-lzip dist-shar dist-tarZ dist-xz \ dist-zip distcheck distclean distclean-compile \ distclean-generic distclean-hdr distclean-libtool \ @@ -1904,7 +1905,8 @@ #testOOM_DEPENDENCIES = $(DEPS) #testOOM_LDADD= $(LDADDS) -runtests: +runtests: runtest$(EXEEXT) testrecurse$(EXEEXT) testapi$(EXEEXT) \ + testchar$(EXEEXT) testdict$(EXEEXT) runxmlconf$(EXEEXT) [ -d test ] || $(LN_S) $(srcdir)/test . [ -d result ] || $(LN_S) $(srcdir)/result . $(CHECKER) ./runtest$(EXEEXT) && \ @@ -2545,6 +2547,21 @@ if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done) + @echo "## SAX2 callbacks regression tests with entity substitution" + -@(for i in $(srcdir)/test/* ; do \ + name=`basename $$i`; \ + if [ ! -d $$i ] ; then \ + if [ ! -f $(srcdir)/result/noent/$$name.sax2 ] ; then \ + echo New test file $$name ; \ + $(CHECKER) $(top_builddir)/testSAX --sax2 --noent $$i > $(srcdir)/result/noent/$$name.sax2 2> /dev/null ; \ + grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ + else \ + log=`$(CHECKER) $(top_builddir)/testSAX --sax2 --noent $$i > result.$$name 2> /dev/null ; \ + grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ + diff $(srcdir)/result/noent/$$name.sax2 result.$$name` ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ + rm result.$$name ; \ + fi ; fi ; done) Validtests : xmllint$(EXEEXT) @(echo > .memdump)
diff --git a/third_party/libxml/src/SAX2.c b/third_party/libxml/src/SAX2.c index 0f0ad2a..af2dd14 100644 --- a/third_party/libxml/src/SAX2.c +++ b/third_party/libxml/src/SAX2.c
@@ -2311,7 +2311,7 @@ } else { /* * any out of memory error would already have been raised - * but we can't be garanteed it's the actual error due to the + * but we can't be guaranteed it's the actual error due to the * API, best is to skip in this case */ continue;
diff --git a/third_party/libxml/src/buf.c b/third_party/libxml/src/buf.c index 3b7601855..21cb9d8 100644 --- a/third_party/libxml/src/buf.c +++ b/third_party/libxml/src/buf.c
@@ -49,7 +49,7 @@ size_t use; /* The buffer size used */ size_t size; /* The buffer size */ xmlBufferPtr buffer; /* wrapper for an old buffer */ - int error; /* an error code if a failure occured */ + int error; /* an error code if a failure occurred */ }; #ifdef WITH_BUFFER_COMPAT @@ -701,7 +701,7 @@ * used in the buffer. It does not account for the terminating zero * usually needed * - * Returns the amount or 0 if none or an error occured + * Returns the amount or 0 if none or an error occurred */ size_t
diff --git a/third_party/libxml/src/dict.c b/third_party/libxml/src/dict.c index c0585fe..7b005eb 100644 --- a/third_party/libxml/src/dict.c +++ b/third_party/libxml/src/dict.c
@@ -533,7 +533,7 @@ * * Create a new dictionary * - * Returns the newly created dictionary, or NULL if an error occured. + * Returns the newly created dictionary, or NULL if an error occurred. */ xmlDictPtr xmlDictCreate(void) { @@ -580,7 +580,7 @@ * new dictionary, then in @sub, and if not found are created in the * new dictionary. * - * Returns the newly created dictionary, or NULL if an error occured. + * Returns the newly created dictionary, or NULL if an error occurred. */ xmlDictPtr xmlDictCreateSub(xmlDictPtr sub) { @@ -699,7 +699,7 @@ } else { /* * we don't have much ways to alert from herei - * result is loosing an entry and unicity garantee + * result is losing an entry and unicity guarantee */ ret = -1; }
diff --git a/third_party/libxml/src/encoding.c b/third_party/libxml/src/encoding.c index e49c7f898..cd019c5 100644 --- a/third_party/libxml/src/encoding.c +++ b/third_party/libxml/src/encoding.c
@@ -354,8 +354,14 @@ { int len; - if ((out == NULL) || (inb == NULL) || (outlen == NULL) || (inlenb == NULL)) + if ((out == NULL) || (outlen == NULL) || (inlenb == NULL)) return(-1); + if (inb == NULL) { + /* inb == NULL means output is initialized. */ + *outlen = 0; + *inlenb = 0; + return(0); + } if (*outlen > *inlenb) { len = *inlenb; } else { @@ -1904,6 +1910,61 @@ * * ************************************************************************/ +static int +xmlEncInputChunk(xmlCharEncodingHandler *handler, unsigned char *out, + int *outlen, const unsigned char *in, int *inlen) { + int ret; + + if (handler->input != NULL) { + ret = handler->input(out, outlen, in, inlen); + } +#ifdef LIBXML_ICONV_ENABLED + else if (handler->iconv_in != NULL) { + ret = xmlIconvWrapper(handler->iconv_in, out, outlen, in, inlen); + } +#endif /* LIBXML_ICONV_ENABLED */ +#ifdef LIBXML_ICU_ENABLED + else if (handler->uconv_in != NULL) { + ret = xmlUconvWrapper(handler->uconv_in, 1, out, outlen, in, inlen); + } +#endif /* LIBXML_ICU_ENABLED */ + else { + *outlen = 0; + *inlen = 0; + ret = -2; + } + + return(ret); +} + +/* Returns -4 if no output function was found. */ +static int +xmlEncOutputChunk(xmlCharEncodingHandler *handler, unsigned char *out, + int *outlen, const unsigned char *in, int *inlen) { + int ret; + + if (handler->output != NULL) { + ret = handler->output(out, outlen, in, inlen); + } +#ifdef LIBXML_ICONV_ENABLED + else if (handler->iconv_out != NULL) { + ret = xmlIconvWrapper(handler->iconv_out, out, outlen, in, inlen); + } +#endif /* LIBXML_ICONV_ENABLED */ +#ifdef LIBXML_ICU_ENABLED + else if (handler->uconv_out != NULL) { + ret = xmlUconvWrapper(handler->uconv_out, 0, out, outlen, in, inlen); + } +#endif /* LIBXML_ICU_ENABLED */ + else { + *outlen = 0; + *inlen = 0; + ret = -4; + } + + return(ret); +} + /** * xmlCharEncFirstLineInt: * @handler: char enconding transformation data structure @@ -1922,7 +1983,7 @@ int xmlCharEncFirstLineInt(xmlCharEncodingHandler *handler, xmlBufferPtr out, xmlBufferPtr in, int len) { - int ret = -2; + int ret; int written; int toconv; @@ -1953,33 +2014,13 @@ written = out->size - out->use - 1; } - if (handler->input != NULL) { - ret = handler->input(&out->content[out->use], &written, - in->content, &toconv); - xmlBufferShrink(in, toconv); - out->use += written; - out->content[out->use] = 0; - } -#ifdef LIBXML_ICONV_ENABLED - else if (handler->iconv_in != NULL) { - ret = xmlIconvWrapper(handler->iconv_in, &out->content[out->use], - &written, in->content, &toconv); - xmlBufferShrink(in, toconv); - out->use += written; - out->content[out->use] = 0; - if (ret == -1) ret = -3; - } -#endif /* LIBXML_ICONV_ENABLED */ -#ifdef LIBXML_ICU_ENABLED - else if (handler->uconv_in != NULL) { - ret = xmlUconvWrapper(handler->uconv_in, 1, &out->content[out->use], - &written, in->content, &toconv); - xmlBufferShrink(in, toconv); - out->use += written; - out->content[out->use] = 0; - if (ret == -1) ret = -3; - } -#endif /* LIBXML_ICU_ENABLED */ + ret = xmlEncInputChunk(handler, &out->content[out->use], &written, + in->content, &toconv); + xmlBufferShrink(in, toconv); + out->use += written; + out->content[out->use] = 0; + if (ret == -1) ret = -3; + #ifdef DEBUG_ENCODING switch (ret) { case 0: @@ -2049,7 +2090,7 @@ int xmlCharEncFirstLineInput(xmlParserInputBufferPtr input, int len) { - int ret = -2; + int ret; size_t written; size_t toconv; int c_in; @@ -2091,32 +2132,13 @@ c_in = toconv; c_out = written; - if (input->encoder->input != NULL) { - ret = input->encoder->input(xmlBufEnd(out), &c_out, - xmlBufContent(in), &c_in); - xmlBufShrink(in, c_in); - xmlBufAddLen(out, c_out); - } -#ifdef LIBXML_ICONV_ENABLED - else if (input->encoder->iconv_in != NULL) { - ret = xmlIconvWrapper(input->encoder->iconv_in, xmlBufEnd(out), - &c_out, xmlBufContent(in), &c_in); - xmlBufShrink(in, c_in); - xmlBufAddLen(out, c_out); - if (ret == -1) - ret = -3; - } -#endif /* LIBXML_ICONV_ENABLED */ -#ifdef LIBXML_ICU_ENABLED - else if (input->encoder->uconv_in != NULL) { - ret = xmlUconvWrapper(input->encoder->uconv_in, 1, xmlBufEnd(out), - &c_out, xmlBufContent(in), &c_in); - xmlBufShrink(in, c_in); - xmlBufAddLen(out, c_out); - if (ret == -1) - ret = -3; - } -#endif /* LIBXML_ICU_ENABLED */ + ret = xmlEncInputChunk(input->encoder, xmlBufEnd(out), &c_out, + xmlBufContent(in), &c_in); + xmlBufShrink(in, c_in); + xmlBufAddLen(out, c_out); + if (ret == -1) + ret = -3; + switch (ret) { case 0: #ifdef DEBUG_ENCODING @@ -2175,7 +2197,7 @@ int xmlCharEncInput(xmlParserInputBufferPtr input, int flush) { - int ret = -2; + int ret; size_t written; size_t toconv; int c_in; @@ -2208,32 +2230,13 @@ c_in = toconv; c_out = written; - if (input->encoder->input != NULL) { - ret = input->encoder->input(xmlBufEnd(out), &c_out, - xmlBufContent(in), &c_in); - xmlBufShrink(in, c_in); - xmlBufAddLen(out, c_out); - } -#ifdef LIBXML_ICONV_ENABLED - else if (input->encoder->iconv_in != NULL) { - ret = xmlIconvWrapper(input->encoder->iconv_in, xmlBufEnd(out), - &c_out, xmlBufContent(in), &c_in); - xmlBufShrink(in, c_in); - xmlBufAddLen(out, c_out); - if (ret == -1) - ret = -3; - } -#endif /* LIBXML_ICONV_ENABLED */ -#ifdef LIBXML_ICU_ENABLED - else if (input->encoder->uconv_in != NULL) { - ret = xmlUconvWrapper(input->encoder->uconv_in, 1, xmlBufEnd(out), - &c_out, xmlBufContent(in), &c_in); - xmlBufShrink(in, c_in); - xmlBufAddLen(out, c_out); - if (ret == -1) - ret = -3; - } -#endif /* LIBXML_ICU_ENABLED */ + ret = xmlEncInputChunk(input->encoder, xmlBufEnd(out), &c_out, + xmlBufContent(in), &c_in); + xmlBufShrink(in, c_in); + xmlBufAddLen(out, c_out); + if (ret == -1) + ret = -3; + switch (ret) { case 0: #ifdef DEBUG_ENCODING @@ -2294,7 +2297,7 @@ xmlCharEncInFunc(xmlCharEncodingHandler * handler, xmlBufferPtr out, xmlBufferPtr in) { - int ret = -2; + int ret; int written; int toconv; @@ -2313,35 +2316,14 @@ xmlBufferGrow(out, out->size + toconv * 2); written = out->size - out->use - 1; } - if (handler->input != NULL) { - ret = handler->input(&out->content[out->use], &written, - in->content, &toconv); - xmlBufferShrink(in, toconv); - out->use += written; - out->content[out->use] = 0; - } -#ifdef LIBXML_ICONV_ENABLED - else if (handler->iconv_in != NULL) { - ret = xmlIconvWrapper(handler->iconv_in, &out->content[out->use], - &written, in->content, &toconv); - xmlBufferShrink(in, toconv); - out->use += written; - out->content[out->use] = 0; - if (ret == -1) - ret = -3; - } -#endif /* LIBXML_ICONV_ENABLED */ -#ifdef LIBXML_ICU_ENABLED - else if (handler->uconv_in != NULL) { - ret = xmlUconvWrapper(handler->uconv_in, 1, &out->content[out->use], - &written, in->content, &toconv); - xmlBufferShrink(in, toconv); - out->use += written; - out->content[out->use] = 0; - if (ret == -1) - ret = -3; - } -#endif /* LIBXML_ICU_ENABLED */ + ret = xmlEncInputChunk(handler, &out->content[out->use], &written, + in->content, &toconv); + xmlBufferShrink(in, toconv); + out->use += written; + out->content[out->use] = 0; + if (ret == -1) + ret = -3; + switch (ret) { case 0: #ifdef DEBUG_ENCODING @@ -2405,7 +2387,7 @@ int xmlCharEncOutput(xmlOutputBufferPtr output, int init) { - int ret = -2; + int ret; size_t written; size_t writtentot = 0; size_t toconv; @@ -2413,7 +2395,6 @@ int c_out; xmlBufPtr in; xmlBufPtr out; - int charref_len = 0; if ((output == NULL) || (output->encoder == NULL) || (output->buffer == NULL) || (output->conv == NULL)) @@ -2433,26 +2414,10 @@ if (init) { c_in = 0; c_out = written; - if (output->encoder->output != NULL) { - ret = output->encoder->output(xmlBufEnd(out), &c_out, - NULL, &c_in); - if (ret > 0) /* Gennady: check return value */ - xmlBufAddLen(out, c_out); - } -#ifdef LIBXML_ICONV_ENABLED - else if (output->encoder->iconv_out != NULL) { - ret = xmlIconvWrapper(output->encoder->iconv_out, xmlBufEnd(out), - &c_out, NULL, &c_in); - xmlBufAddLen(out, c_out); - } -#endif /* LIBXML_ICONV_ENABLED */ -#ifdef LIBXML_ICU_ENABLED - else if (output->encoder->uconv_out != NULL) { - ret = xmlUconvWrapper(output->encoder->uconv_out, 0, xmlBufEnd(out), - &c_out, NULL, &c_in); - xmlBufAddLen(out, c_out); - } -#endif /* LIBXML_ICU_ENABLED */ + /* TODO: Check return value. */ + xmlEncOutputChunk(output->encoder, xmlBufEnd(out), &c_out, + NULL, &c_in); + xmlBufAddLen(out, c_out); #ifdef DEBUG_ENCODING xmlGenericError(xmlGenericErrorContext, "initialized encoder\n"); @@ -2477,57 +2442,17 @@ c_in = toconv; c_out = written; - if (output->encoder->output != NULL) { - ret = output->encoder->output(xmlBufEnd(out), &c_out, - xmlBufContent(in), &c_in); + ret = xmlEncOutputChunk(output->encoder, xmlBufEnd(out), &c_out, + xmlBufContent(in), &c_in); + xmlBufShrink(in, c_in); + xmlBufAddLen(out, c_out); + writtentot += c_out; + if (ret == -1) { if (c_out > 0) { - xmlBufShrink(in, c_in); - xmlBufAddLen(out, c_out); - writtentot += c_out; + /* Can be a limitation of iconv or uconv */ + goto retry; } - } -#ifdef LIBXML_ICONV_ENABLED - else if (output->encoder->iconv_out != NULL) { - ret = xmlIconvWrapper(output->encoder->iconv_out, xmlBufEnd(out), - &c_out, xmlBufContent(in), &c_in); - xmlBufShrink(in, c_in); - xmlBufAddLen(out, c_out); - writtentot += c_out; - if (ret == -1) { - if (c_out > 0) { - /* - * Can be a limitation of iconv - */ - charref_len = 0; - goto retry; - } - ret = -3; - } - } -#endif /* LIBXML_ICONV_ENABLED */ -#ifdef LIBXML_ICU_ENABLED - else if (output->encoder->uconv_out != NULL) { - ret = xmlUconvWrapper(output->encoder->uconv_out, 0, xmlBufEnd(out), - &c_out, xmlBufContent(in), &c_in); - xmlBufShrink(in, c_in); - xmlBufAddLen(out, c_out); - writtentot += c_out; - if (ret == -1) { - if (c_out > 0) { - /* - * Can be a limitation of uconv - */ - charref_len = 0; - goto retry; - } - ret = -3; - } - } -#endif /* LIBXML_ICU_ENABLED */ - else { - xmlEncodingErr(XML_I18N_NO_OUTPUT, - "xmlCharEncOutFunc: no output function !\n", NULL); - return(-1); + ret = -3; } if (ret >= 0) output += ret; @@ -2555,47 +2480,44 @@ c_in, c_out, (int) xmlBufUse(in)); #endif break; + case -4: + xmlEncodingErr(XML_I18N_NO_OUTPUT, + "xmlCharEncOutFunc: no output function !\n", NULL); + ret = -1; + break; case -2: { + xmlChar charref[20]; int len = (int) xmlBufUse(in); xmlChar *content = xmlBufContent(in); - int cur; + int cur, charrefLen; cur = xmlGetUTF8Char(content, &len); - if ((charref_len != 0) && (c_out < charref_len)) { - /* - * We attempted to insert a character reference and failed. - * Undo what was written and skip the remaining charref. - */ - xmlBufErase(out, c_out); - writtentot -= c_out; - xmlBufShrink(in, charref_len - c_out); - charref_len = 0; - - ret = -1; + if (cur <= 0) break; - } else if (cur > 0) { - xmlChar charref[20]; #ifdef DEBUG_ENCODING - xmlGenericError(xmlGenericErrorContext, - "handling output conversion error\n"); - xmlGenericError(xmlGenericErrorContext, - "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n", - content[0], content[1], - content[2], content[3]); + xmlGenericError(xmlGenericErrorContext, + "handling output conversion error\n"); + xmlGenericError(xmlGenericErrorContext, + "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n", + content[0], content[1], + content[2], content[3]); #endif - /* - * Removes the UTF8 sequence, and replace it by a charref - * and continue the transcoding phase, hoping the error - * did not mangle the encoder state. - */ - charref_len = snprintf((char *) &charref[0], sizeof(charref), - "&#%d;", cur); - xmlBufShrink(in, len); - xmlBufAddHead(in, charref, -1); + /* + * Removes the UTF8 sequence, and replace it by a charref + * and continue the transcoding phase, hoping the error + * did not mangle the encoder state. + */ + charrefLen = snprintf((char *) &charref[0], sizeof(charref), + "&#%d;", cur); + xmlBufShrink(in, len); + xmlBufGrow(out, charrefLen * 4); + c_out = xmlBufAvail(out) - 1; + c_in = charrefLen; + ret = xmlEncOutputChunk(output->encoder, xmlBufEnd(out), &c_out, + charref, &c_in); - goto retry; - } else { + if ((ret < 0) || (c_in != charrefLen)) { char buf[50]; snprintf(&buf[0], 49, "0x%02X 0x%02X 0x%02X 0x%02X", @@ -2607,8 +2529,12 @@ buf); if (xmlBufGetAllocationScheme(in) != XML_BUFFER_ALLOC_IMMUTABLE) content[0] = ' '; + break; } - break; + + xmlBufAddLen(out, c_out); + writtentot += c_out; + goto retry; } } return(ret); @@ -2636,12 +2562,11 @@ int xmlCharEncOutFunc(xmlCharEncodingHandler *handler, xmlBufferPtr out, xmlBufferPtr in) { - int ret = -2; + int ret; int written; int writtentot = 0; int toconv; int output = 0; - int charref_len = 0; if (handler == NULL) return(-1); if (out == NULL) return(-1); @@ -2658,31 +2583,11 @@ */ if (in == NULL) { toconv = 0; - if (handler->output != NULL) { - ret = handler->output(&out->content[out->use], &written, - NULL, &toconv); - if (ret >= 0) { /* Gennady: check return value */ - out->use += written; - out->content[out->use] = 0; - } - } -#ifdef LIBXML_ICONV_ENABLED - else if (handler->iconv_out != NULL) { - ret = xmlIconvWrapper(handler->iconv_out, &out->content[out->use], - &written, NULL, &toconv); - out->use += written; - out->content[out->use] = 0; - } -#endif /* LIBXML_ICONV_ENABLED */ -#ifdef LIBXML_ICU_ENABLED - else if (handler->uconv_out != NULL) { - ret = xmlUconvWrapper(handler->uconv_out, 0, - &out->content[out->use], - &written, NULL, &toconv); - out->use += written; - out->content[out->use] = 0; - } -#endif /* LIBXML_ICU_ENABLED */ + /* TODO: Check return value. */ + xmlEncOutputChunk(handler, &out->content[out->use], &written, + NULL, &toconv); + out->use += written; + out->content[out->use] = 0; #ifdef DEBUG_ENCODING xmlGenericError(xmlGenericErrorContext, "initialized encoder\n"); @@ -2700,61 +2605,18 @@ xmlBufferGrow(out, toconv * 4); written = out->size - out->use - 1; } - if (handler->output != NULL) { - ret = handler->output(&out->content[out->use], &written, - in->content, &toconv); - if (written > 0) { - xmlBufferShrink(in, toconv); - out->use += written; - writtentot += written; - } - out->content[out->use] = 0; - } -#ifdef LIBXML_ICONV_ENABLED - else if (handler->iconv_out != NULL) { - ret = xmlIconvWrapper(handler->iconv_out, &out->content[out->use], - &written, in->content, &toconv); - xmlBufferShrink(in, toconv); - out->use += written; - writtentot += written; - out->content[out->use] = 0; - if (ret == -1) { - if (written > 0) { - /* - * Can be a limitation of iconv - */ - charref_len = 0; - goto retry; - } - ret = -3; - } - } -#endif /* LIBXML_ICONV_ENABLED */ -#ifdef LIBXML_ICU_ENABLED - else if (handler->uconv_out != NULL) { - ret = xmlUconvWrapper(handler->uconv_out, 0, - &out->content[out->use], - &written, in->content, &toconv); - xmlBufferShrink(in, toconv); - out->use += written; - writtentot += written; - out->content[out->use] = 0; - if (ret == -1) { - if (written > 0) { - /* - * Can be a limitation of iconv - */ - charref_len = 0; - goto retry; - } - ret = -3; - } - } -#endif /* LIBXML_ICU_ENABLED */ - else { - xmlEncodingErr(XML_I18N_NO_OUTPUT, - "xmlCharEncOutFunc: no output function !\n", NULL); - return(-1); + ret = xmlEncOutputChunk(handler, &out->content[out->use], &written, + in->content, &toconv); + xmlBufferShrink(in, toconv); + out->use += written; + writtentot += written; + out->content[out->use] = 0; + if (ret == -1) { + if (written > 0) { + /* Can be a limitation of iconv or uconv */ + goto retry; + } + ret = -3; } if (ret >= 0) output += ret; @@ -2782,47 +2644,44 @@ toconv, written, in->use); #endif break; + case -4: + xmlEncodingErr(XML_I18N_NO_OUTPUT, + "xmlCharEncOutFunc: no output function !\n", NULL); + ret = -1; + break; case -2: { + xmlChar charref[20]; int len = in->use; const xmlChar *utf = (const xmlChar *) in->content; - int cur; + int cur, charrefLen; cur = xmlGetUTF8Char(utf, &len); - if ((charref_len != 0) && (written < charref_len)) { - /* - * We attempted to insert a character reference and failed. - * Undo what was written and skip the remaining charref. - */ - out->use -= written; - writtentot -= written; - xmlBufferShrink(in, charref_len - written); - charref_len = 0; - - ret = -1; + if (cur <= 0) break; - } else if (cur > 0) { - xmlChar charref[20]; #ifdef DEBUG_ENCODING - xmlGenericError(xmlGenericErrorContext, - "handling output conversion error\n"); - xmlGenericError(xmlGenericErrorContext, - "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n", - in->content[0], in->content[1], - in->content[2], in->content[3]); + xmlGenericError(xmlGenericErrorContext, + "handling output conversion error\n"); + xmlGenericError(xmlGenericErrorContext, + "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n", + in->content[0], in->content[1], + in->content[2], in->content[3]); #endif - /* - * Removes the UTF8 sequence, and replace it by a charref - * and continue the transcoding phase, hoping the error - * did not mangle the encoder state. - */ - charref_len = snprintf((char *) &charref[0], sizeof(charref), - "&#%d;", cur); - xmlBufferShrink(in, len); - xmlBufferAddHead(in, charref, -1); + /* + * Removes the UTF8 sequence, and replace it by a charref + * and continue the transcoding phase, hoping the error + * did not mangle the encoder state. + */ + charrefLen = snprintf((char *) &charref[0], sizeof(charref), + "&#%d;", cur); + xmlBufferShrink(in, len); + xmlBufferGrow(out, charrefLen * 4); + written = out->size - out->use - 1; + toconv = charrefLen; + ret = xmlEncOutputChunk(handler, &out->content[out->use], &written, + charref, &toconv); - goto retry; - } else { + if ((ret < 0) || (toconv != charrefLen)) { char buf[50]; snprintf(&buf[0], 49, "0x%02X 0x%02X 0x%02X 0x%02X", @@ -2834,8 +2693,13 @@ buf); if (in->alloc != XML_BUFFER_ALLOC_IMMUTABLE) in->content[0] = ' '; + break; } - break; + + out->use += written; + writtentot += written; + out->content[out->use] = 0; + goto retry; } } return(ret); @@ -2954,54 +2818,20 @@ int ret; - if (handler->output != NULL) { - do { - toconv = in->end - cur; - written = 32000; - ret = handler->output(&convbuf[0], &written, - cur, &toconv); - if (ret == -1) return(-1); - unused += written; - cur += toconv; - } while (ret == -2); -#ifdef LIBXML_ICONV_ENABLED - } else if (handler->iconv_out != NULL) { - do { - toconv = in->end - cur; - written = 32000; - ret = xmlIconvWrapper(handler->iconv_out, &convbuf[0], - &written, cur, &toconv); - if (ret < 0) { - if (written > 0) - ret = -2; - else - return(-1); - } - unused += written; - cur += toconv; - } while (ret == -2); -#endif -#ifdef LIBXML_ICU_ENABLED - } else if (handler->uconv_out != NULL) { - do { - toconv = in->end - cur; - written = 32000; - ret = xmlUconvWrapper(handler->uconv_out, 0, &convbuf[0], - &written, cur, &toconv); - if (ret < 0) { - if (written > 0) - ret = -2; - else - return(-1); - } - unused += written; - cur += toconv; - } while (ret == -2); -#endif - } else { - /* could not find a converter */ - return(-1); - } + do { + toconv = in->end - cur; + written = 32000; + ret = xmlEncOutputChunk(handler, &convbuf[0], &written, + cur, &toconv); + if (ret < 0) { + if (written > 0) + ret = -2; + else + return(-1); + } + unused += written; + cur += toconv; + } while (ret == -2); } if (in->buf->rawconsumed < unused) return(-1);
diff --git a/third_party/libxml/src/error.c b/third_party/libxml/src/error.c index 9606f13..50e9e6f8 100644 --- a/third_party/libxml/src/error.c +++ b/third_party/libxml/src/error.c
@@ -853,7 +853,7 @@ * Get the last global error registered. This is per thread if compiled * with thread support. * - * Returns NULL if no error occured or a pointer to the error + * Returns NULL if no error occurred or a pointer to the error */ xmlErrorPtr xmlGetLastError(void) @@ -910,7 +910,7 @@ * * Get the last parsing error registered. * - * Returns NULL if no error occured or a pointer to the error + * Returns NULL if no error occurred or a pointer to the error */ xmlErrorPtr xmlCtxtGetLastError(void *ctx)
diff --git a/third_party/libxml/src/hash.c b/third_party/libxml/src/hash.c index f9a20172..5dcaeb40 100644 --- a/third_party/libxml/src/hash.c +++ b/third_party/libxml/src/hash.c
@@ -168,7 +168,7 @@ * * Create a new xmlHashTablePtr. * - * Returns the newly created object, or NULL if an error occured. + * Returns the newly created object, or NULL if an error occurred. */ xmlHashTablePtr xmlHashCreate(int size) { @@ -202,7 +202,7 @@ * * Create a new xmlHashTablePtr which will use @dict as the internal dictionary * - * Returns the newly created object, or NULL if an error occured. + * Returns the newly created object, or NULL if an error occurred. */ xmlHashTablePtr xmlHashCreateDict(int size, xmlDictPtr dict) {
diff --git a/third_party/libxml/src/include/libxml/HTMLparser.h b/third_party/libxml/src/include/libxml/HTMLparser.h index 551186cb..1d4fec2 100644 --- a/third_party/libxml/src/include/libxml/HTMLparser.h +++ b/third_party/libxml/src/include/libxml/HTMLparser.h
@@ -115,12 +115,12 @@ XMLPUBFUN int XMLCALL htmlParseDocument(htmlParserCtxtPtr ctxt); XMLPUBFUN htmlDocPtr XMLCALL - htmlSAXParseDoc (xmlChar *cur, + htmlSAXParseDoc (const xmlChar *cur, const char *encoding, htmlSAXHandlerPtr sax, void *userData); XMLPUBFUN htmlDocPtr XMLCALL - htmlParseDoc (xmlChar *cur, + htmlParseDoc (const xmlChar *cur, const char *encoding); XMLPUBFUN htmlDocPtr XMLCALL htmlSAXParseFile(const char *filename,
diff --git a/third_party/libxml/src/include/libxml/schemasInternals.h b/third_party/libxml/src/include/libxml/schemasInternals.h index c7cf552..6fb71139 100644 --- a/third_party/libxml/src/include/libxml/schemasInternals.h +++ b/third_party/libxml/src/include/libxml/schemasInternals.h
@@ -3,7 +3,7 @@ * Description: internal interfaces for the XML Schemas handling * and schema validity checking * The Schemas development is a Work In Progress. - * Some of those interfaces are not garanteed to be API or ABI stable ! + * Some of those interfaces are not guaranteed to be API or ABI stable ! * * Copy: See Copyright for the status of this software. *
diff --git a/third_party/libxml/src/include/libxml/xmlreader.h b/third_party/libxml/src/include/libxml/xmlreader.h index 2c99e3a7..e8a8bcc9 100644 --- a/third_party/libxml/src/include/libxml/xmlreader.h +++ b/third_party/libxml/src/include/libxml/xmlreader.h
@@ -393,7 +393,7 @@ * @arg: the user argument * @msg: the message * @severity: the severity of the error - * @locator: a locator indicating where the error occured + * @locator: a locator indicating where the error occurred * * Signature of an error callback from a reader parser */
diff --git a/third_party/libxml/src/libxml.m4 b/third_party/libxml/src/libxml.m4 index 68cd824..2d7a6f5 100644 --- a/third_party/libxml/src/libxml.m4 +++ b/third_party/libxml/src/libxml.m4
@@ -170,7 +170,7 @@ echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" ], [ echo "*** The test program failed to compile or link. See the file config.log for the" - echo "*** exact error that occured. This usually means LIBXML was incorrectly installed" + echo "*** exact error that occurred. This usually means LIBXML was incorrectly installed" echo "*** or that you have moved LIBXML since it was installed. In the latter case, you" echo "*** may want to edit the xml2-config script: $XML2_CONFIG" ]) CPPFLAGS="$ac_save_CPPFLAGS"
diff --git a/third_party/libxml/src/libxml2.spec b/third_party/libxml/src/libxml2.spec index 404a758..52151de 100644 --- a/third_party/libxml/src/libxml2.spec +++ b/third_party/libxml/src/libxml2.spec
@@ -194,6 +194,6 @@ %endif # with_python3 %changelog -* Wed Jun 14 2017 Daniel Veillard <veillard@redhat.com> +* Thu Aug 10 2017 Daniel Veillard <veillard@redhat.com> - upstream release 2.9.4 see http://xmlsoft.org/news.html
diff --git a/third_party/libxml/src/list.c b/third_party/libxml/src/list.c index d33d928..caa833313 100644 --- a/third_party/libxml/src/list.c +++ b/third_party/libxml/src/list.c
@@ -347,7 +347,7 @@ * * Remove the first instance associated to data in the list * - * Returns 1 if a deallocation occured, or 0 if not found + * Returns 1 if a deallocation occurred, or 0 if not found */ int xmlListRemoveFirst(xmlListPtr l, void *data) @@ -372,7 +372,7 @@ * * Remove the last instance associated to data in the list * - * Returns 1 if a deallocation occured, or 0 if not found + * Returns 1 if a deallocation occurred, or 0 if not found */ int xmlListRemoveLast(xmlListPtr l, void *data)
diff --git a/third_party/libxml/src/nanohttp.c b/third_party/libxml/src/nanohttp.c index 373425de..b911f9c4 100644 --- a/third_party/libxml/src/nanohttp.c +++ b/third_party/libxml/src/nanohttp.c
@@ -1534,7 +1534,8 @@ xmlGenericError(xmlGenericErrorContext, "\nRedirect to: %s\n", ctxt->location); #endif - while ( xmlNanoHTTPRecv(ctxt) > 0 ) ; + while ( xmlNanoHTTPRecv(ctxt) > 0 ) + ; if (nbRedirects < XML_NANO_HTTP_MAX_REDIR) { nbRedirects++; if (redirURL != NULL)
diff --git a/third_party/libxml/src/parser.c b/third_party/libxml/src/parser.c index ac50643..1299cb3 100644 --- a/third_party/libxml/src/parser.c +++ b/third_party/libxml/src/parser.c
@@ -2049,10 +2049,8 @@ #define SKIP(val) do { \ ctxt->nbChars += (val),ctxt->input->cur += (val),ctxt->input->col+=(val); \ - if (*ctxt->input->cur == '%') xmlParserHandlePEReference(ctxt); \ - if ((*ctxt->input->cur == 0) && \ - (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) \ - xmlPopInput(ctxt); \ + if (*ctxt->input->cur == 0) \ + xmlParserInputGrow(ctxt->input, INPUT_CHUNK); \ } while (0) #define SKIPL(val) do { \ @@ -2064,10 +2062,8 @@ ctxt->nbChars++; \ ctxt->input->cur++; \ } \ - if (*ctxt->input->cur == '%') xmlParserHandlePEReference(ctxt); \ - if ((*ctxt->input->cur == 0) && \ - (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) \ - xmlPopInput(ctxt); \ + if (*ctxt->input->cur == 0) \ + xmlParserInputGrow(ctxt->input, INPUT_CHUNK); \ } while (0) #define SHRINK if ((ctxt->progressive == 0) && \ @@ -2077,10 +2073,9 @@ static void xmlSHRINK (xmlParserCtxtPtr ctxt) { xmlParserInputShrink(ctxt->input); - if ((*ctxt->input->cur == 0) && - (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) - xmlPopInput(ctxt); - } + if (*ctxt->input->cur == 0) + xmlParserInputGrow(ctxt->input, INPUT_CHUNK); +} #define GROW if ((ctxt->progressive == 0) && \ (ctxt->input->end - ctxt->input->cur < INPUT_CHUNK)) \ @@ -2105,9 +2100,8 @@ xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, "cur index out of bound"); return; } - if ((ctxt->input->cur != NULL) && (*ctxt->input->cur == 0) && - (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) - xmlPopInput(ctxt); + if ((ctxt->input->cur != NULL) && (*ctxt->input->cur == 0)) + xmlParserInputGrow(ctxt->input, INPUT_CHUNK); } #define SKIP_BLANKS xmlSkipBlankChars(ctxt) @@ -2176,26 +2170,35 @@ } ctxt->input->cur = cur; } else { - int cur; - do { - cur = CUR; - while ((IS_BLANK_CH(cur) && /* CHECKED tstblanks.xml */ - (ctxt->instate != XML_PARSER_EOF))) { + int expandPE = ((ctxt->external != 0) || (ctxt->inputNr != 1)); + + while (1) { + if (IS_BLANK_CH(CUR)) { /* CHECKED tstblanks.xml */ NEXT; - cur = CUR; - res++; - } - while ((cur == 0) && (ctxt->inputNr > 1) && - (ctxt->instate != XML_PARSER_COMMENT)) { - xmlPopInput(ctxt); - cur = CUR; - } - /* - * Need to handle support of entities branching here - */ - if (*ctxt->input->cur == '%') xmlParserHandlePEReference(ctxt); - } while ((IS_BLANK(cur)) && /* CHECKED tstblanks.xml */ - (ctxt->instate != XML_PARSER_EOF)); + } else if (CUR == '%') { + /* + * Need to handle support of entities branching here + */ + if ((expandPE == 0) || (IS_BLANK_CH(NXT(1))) || (NXT(1) == 0)) + break; + xmlParsePEReference(ctxt); + } else if (CUR == 0) { + if (ctxt->inputNr <= 1) + break; + xmlPopInput(ctxt); + } else { + break; + } + + /* + * Also increase the counter when entering or exiting a PERef. + * The spec says: "When a parameter-entity reference is recognized + * in the DTD and included, its replacement text MUST be enlarged + * by the attachment of one leading and one following space (#x20) + * character." + */ + res++; + } } return(res); } @@ -2221,10 +2224,13 @@ if (xmlParserDebugEntities) xmlGenericError(xmlGenericErrorContext, "Popping input %d\n", ctxt->inputNr); + if ((ctxt->inputNr > 1) && (ctxt->inSubset == 0) && + (ctxt->instate != XML_PARSER_EOF)) + xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, + "Unfinished entity outside the DTD"); xmlFreeInputStream(inputPop(ctxt)); - if ((*ctxt->input->cur == 0) && - (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) - return(xmlPopInput(ctxt)); + if (*ctxt->input->cur == 0) + xmlParserInputGrow(ctxt->input, INPUT_CHUNK); return(CUR); } @@ -2250,6 +2256,13 @@ xmlGenericError(xmlGenericErrorContext, "Pushing input %d : %.30s\n", ctxt->inputNr+1, input->cur); } + if (((ctxt->inputNr > 40) && ((ctxt->options & XML_PARSE_HUGE) == 0)) || + (ctxt->inputNr > 1024)) { + xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL); + while (ctxt->inputNr > 1) + xmlFreeInputStream(inputPop(ctxt)); + return(-1); + } ret = inputPush(ctxt, input); if (ctxt->instate == XML_PARSER_EOF) return(-1); @@ -2455,57 +2468,6 @@ } /** - * xmlNewBlanksWrapperInputStream: - * @ctxt: an XML parser context - * @entity: an Entity pointer - * - * Create a new input stream for wrapping - * blanks around a PEReference - * - * Returns the new input stream or NULL - */ - -static void deallocblankswrapper (xmlChar *str) {xmlFree(str);} - -static xmlParserInputPtr -xmlNewBlanksWrapperInputStream(xmlParserCtxtPtr ctxt, xmlEntityPtr entity) { - xmlParserInputPtr input; - xmlChar *buffer; - size_t length; - if (entity == NULL) { - xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, - "xmlNewBlanksWrapperInputStream entity\n"); - return(NULL); - } - if (xmlParserDebugEntities) - xmlGenericError(xmlGenericErrorContext, - "new blanks wrapper for entity: %s\n", entity->name); - input = xmlNewInputStream(ctxt); - if (input == NULL) { - return(NULL); - } - length = xmlStrlen(entity->name) + 5; - buffer = xmlMallocAtomic(length); - if (buffer == NULL) { - xmlErrMemory(ctxt, NULL); - xmlFree(input); - return(NULL); - } - buffer [0] = ' '; - buffer [1] = '%'; - buffer [length-3] = ';'; - buffer [length-2] = ' '; - buffer [length-1] = 0; - memcpy(buffer + 2, entity->name, length - 5); - input->free = deallocblankswrapper; - input->base = buffer; - input->cur = buffer; - input->length = length; - input->end = &buffer[length]; - return(input); -} - -/** * xmlParserHandlePEReference: * @ctxt: the parser context * @@ -2539,11 +2501,6 @@ */ void xmlParserHandlePEReference(xmlParserCtxtPtr ctxt) { - const xmlChar *name; - xmlEntityPtr entity = NULL; - xmlParserInputPtr input; - - if (RAW != '%') return; switch(ctxt->instate) { case XML_PARSER_CDATA_SECTION: return; @@ -2598,128 +2555,7 @@ return; } - NEXT; - name = xmlParseName(ctxt); - if (xmlParserDebugEntities) - xmlGenericError(xmlGenericErrorContext, - "PEReference: %s\n", name); - if (name == NULL) { - xmlFatalErr(ctxt, XML_ERR_PEREF_NO_NAME, NULL); - } else { - if (RAW == ';') { - NEXT; - if ((ctxt->sax != NULL) && (ctxt->sax->getParameterEntity != NULL)) - entity = ctxt->sax->getParameterEntity(ctxt->userData, name); - if (ctxt->instate == XML_PARSER_EOF) - return; - if (entity == NULL) { - - /* - * [ WFC: Entity Declared ] - * In a document without any DTD, a document with only an - * internal DTD subset which contains no parameter entity - * references, or a document with "standalone='yes'", ... - * ... The declaration of a parameter entity must precede - * any reference to it... - */ - if ((ctxt->standalone == 1) || - ((ctxt->hasExternalSubset == 0) && - (ctxt->hasPErefs == 0))) { - xmlFatalErrMsgStr(ctxt, XML_ERR_UNDECLARED_ENTITY, - "PEReference: %%%s; not found\n", name); - } else { - /* - * [ VC: Entity Declared ] - * In a document with an external subset or external - * parameter entities with "standalone='no'", ... - * ... The declaration of a parameter entity must precede - * any reference to it... - */ - if ((ctxt->validate) && (ctxt->vctxt.error != NULL)) { - xmlValidityError(ctxt, XML_WAR_UNDECLARED_ENTITY, - "PEReference: %%%s; not found\n", - name, NULL); - } else - xmlWarningMsg(ctxt, XML_WAR_UNDECLARED_ENTITY, - "PEReference: %%%s; not found\n", - name, NULL); - ctxt->valid = 0; - } - xmlParserEntityCheck(ctxt, 0, NULL, 0); - } else if (ctxt->input->free != deallocblankswrapper) { - input = xmlNewBlanksWrapperInputStream(ctxt, entity); - if (xmlPushInput(ctxt, input) < 0) - return; - } else { - if ((entity->etype == XML_INTERNAL_PARAMETER_ENTITY) || - (entity->etype == XML_EXTERNAL_PARAMETER_ENTITY)) { - xmlChar start[4]; - xmlCharEncoding enc; - - /* - * Note: external parameter entities will not be loaded, it - * is not required for a non-validating parser, unless the - * option of validating, or substituting entities were - * given. Doing so is far more secure as the parser will - * only process data coming from the document entity by - * default. - */ - if ((entity->etype == XML_EXTERNAL_PARAMETER_ENTITY) && - ((ctxt->options & XML_PARSE_NOENT) == 0) && - ((ctxt->options & XML_PARSE_DTDVALID) == 0) && - ((ctxt->options & XML_PARSE_DTDLOAD) == 0) && - ((ctxt->options & XML_PARSE_DTDATTR) == 0) && - (ctxt->replaceEntities == 0) && - (ctxt->validate == 0)) - return; - - /* - * handle the extra spaces added before and after - * c.f. http://www.w3.org/TR/REC-xml#as-PE - * this is done independently. - */ - input = xmlNewEntityInputStream(ctxt, entity); - if (xmlPushInput(ctxt, input) < 0) - return; - - /* - * Get the 4 first bytes and decode the charset - * if enc != XML_CHAR_ENCODING_NONE - * plug some encoding conversion routines. - * Note that, since we may have some non-UTF8 - * encoding (like UTF16, bug 135229), the 'length' - * is not known, but we can calculate based upon - * the amount of data in the buffer. - */ - GROW - if (ctxt->instate == XML_PARSER_EOF) - return; - if ((ctxt->input->end - ctxt->input->cur)>=4) { - start[0] = RAW; - start[1] = NXT(1); - start[2] = NXT(2); - start[3] = NXT(3); - enc = xmlDetectCharEncoding(start, 4); - if (enc != XML_CHAR_ENCODING_NONE) { - xmlSwitchEncoding(ctxt, enc); - } - } - - if ((entity->etype == XML_EXTERNAL_PARAMETER_ENTITY) && - (CMP5(CUR_PTR, '<', '?', 'x', 'm', 'l' )) && - (IS_BLANK_CH(NXT(5)))) { - xmlParseTextDecl(ctxt); - } - } else { - xmlFatalErrMsgStr(ctxt, XML_ERR_ENTITY_IS_PARAMETER, - "PEReference: %s is not a parameter entity\n", - name); - } - } - } else { - xmlFatalErr(ctxt, XML_ERR_PEREF_SEMICOL_MISSING, NULL); - } - } + xmlParsePEReference(ctxt); } /* @@ -3937,11 +3773,6 @@ } COPY_BUF(l,buf,len,c); NEXTL(l); - /* - * Pop-up of finished entities. - */ - while ((RAW == 0) && (ctxt->inputNr > 1)) /* non input consuming */ - xmlPopInput(ctxt); GROW; c = CUR_CHAR(l); @@ -4603,7 +4434,7 @@ if (*in == ']') { if ((in[1] == ']') && (in[2] == '>')) { xmlFatalErr(ctxt, XML_ERR_MISPLACED_CDATA_END, NULL); - ctxt->input->cur = in; + ctxt->input->cur = in + 1; return; } in++; @@ -4756,7 +4587,7 @@ } } } - if ((cur != 0) && (!IS_CHAR(cur))) { + if ((ctxt->input->cur < ctxt->input->end) && (!IS_CHAR(cur))) { /* Generate the error and skip the offending character */ xmlFatalErrMsgInt(ctxt, XML_ERR_INVALID_CHAR, "PCDATA invalid Char value %d\n", @@ -4796,22 +4627,20 @@ *publicID = NULL; if (CMP6(CUR_PTR, 'S', 'Y', 'S', 'T', 'E', 'M')) { SKIP(6); - if (!IS_BLANK_CH(CUR)) { + if (SKIP_BLANKS == 0) { xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, "Space required after 'SYSTEM'\n"); } - SKIP_BLANKS; URI = xmlParseSystemLiteral(ctxt); if (URI == NULL) { xmlFatalErr(ctxt, XML_ERR_URI_REQUIRED, NULL); } } else if (CMP6(CUR_PTR, 'P', 'U', 'B', 'L', 'I', 'C')) { SKIP(6); - if (!IS_BLANK_CH(CUR)) { + if (SKIP_BLANKS == 0) { xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, "Space required after 'PUBLIC'\n"); } - SKIP_BLANKS; *publicID = xmlParsePubidLiteral(ctxt); if (*publicID == NULL) { xmlFatalErr(ctxt, XML_ERR_PUBID_REQUIRED, NULL); @@ -4820,26 +4649,20 @@ /* * We don't handle [83] so "S SystemLiteral" is required. */ - if (!IS_BLANK_CH(CUR)) { + if (SKIP_BLANKS == 0) { xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, "Space required after the Public Identifier\n"); } } else { /* * We handle [83] so we return immediately, if - * "S SystemLiteral" is not detected. From a purely parsing - * point of view that's a nice mess. + * "S SystemLiteral" is not detected. We skip blanks if no + * system literal was found, but this is harmless since we must + * be at the end of a NotationDecl. */ - const xmlChar *ptr; - GROW; - - ptr = CUR_PTR; - if (!IS_BLANK_CH(*ptr)) return(NULL); - - while (IS_BLANK_CH(*ptr)) ptr++; /* TODO: dangerous, fix ! */ - if ((*ptr != '\'') && (*ptr != '"')) return(NULL); + if (SKIP_BLANKS == 0) return(NULL); + if ((CUR != '\'') && (CUR != '"')) return(NULL); } - SKIP_BLANKS; URI = xmlParseSystemLiteral(ctxt); if (URI == NULL) { xmlFatalErr(ctxt, XML_ERR_URI_REQUIRED, NULL); @@ -4969,7 +4792,8 @@ } else { if (inputid != ctxt->input->id) { xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY, - "Comment doesn't start and stop in the same entity\n"); + "Comment doesn't start and stop in the same" + " entity\n"); } NEXT; if ((ctxt->sax != NULL) && (ctxt->sax->comment != NULL) && @@ -5117,7 +4941,8 @@ if (in[2] == '>') { if (ctxt->input->id != inputid) { xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY, - "comment doesn't start and stop in the same entity\n"); + "comment doesn't start and stop in the" + " same entity\n"); } SKIP(3); if ((ctxt->sax != NULL) && (ctxt->sax->comment != NULL) && @@ -5285,7 +5110,7 @@ int count = 0; if ((RAW == '<') && (NXT(1) == '?')) { - xmlParserInputPtr input = ctxt->input; + int inputid = ctxt->input->id; state = ctxt->instate; ctxt->instate = XML_PARSER_PI; /* @@ -5301,9 +5126,10 @@ target = xmlParsePITarget(ctxt); if (target != NULL) { if ((RAW == '?') && (NXT(1) == '>')) { - if (input != ctxt->input) { + if (inputid != ctxt->input->id) { xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY, - "PI declaration doesn't start and stop in the same entity\n"); + "PI declaration doesn't start and stop in" + " the same entity\n"); } SKIP(2); @@ -5324,12 +5150,10 @@ ctxt->instate = state; return; } - cur = CUR; - if (!IS_BLANK(cur)) { + if (SKIP_BLANKS == 0) { xmlFatalErrMsgStr(ctxt, XML_ERR_SPACE_REQUIRED, "ParsePI: PI %s space expected\n", target); } - SKIP_BLANKS; cur = CUR_CHAR(l); while (IS_CHAR(cur) && /* checked */ ((cur != '?') || (NXT(1) != '>'))) { @@ -5385,9 +5209,10 @@ xmlFatalErrMsgStr(ctxt, XML_ERR_PI_NOT_FINISHED, "ParsePI: PI %s never end ...\n", target); } else { - if (input != ctxt->input) { - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, - "PI declaration doesn't start and stop in the same entity\n"); + if (inputid != ctxt->input->id) { + xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY, + "PI declaration doesn't start and stop in" + " the same entity\n"); } SKIP(2); @@ -5443,32 +5268,30 @@ xmlChar *Systemid; if (CMP10(CUR_PTR, '<', '!', 'N', 'O', 'T', 'A', 'T', 'I', 'O', 'N')) { - xmlParserInputPtr input = ctxt->input; + int inputid = ctxt->input->id; SHRINK; SKIP(10); - if (!IS_BLANK_CH(CUR)) { + if (SKIP_BLANKS == 0) { xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, "Space required after '<!NOTATION'\n"); return; } - SKIP_BLANKS; name = xmlParseName(ctxt); if (name == NULL) { xmlFatalErr(ctxt, XML_ERR_NOTATION_NOT_STARTED, NULL); return; } - if (!IS_BLANK_CH(CUR)) { - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, - "Space required after the NOTATION name'\n"); - return; - } if (xmlStrchr(name, ':') != NULL) { xmlNsErr(ctxt, XML_NS_ERR_COLON, "colons are forbidden from notation names '%s'\n", name, NULL, NULL); } - SKIP_BLANKS; + if (SKIP_BLANKS == 0) { + xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, + "Space required after the NOTATION name'\n"); + return; + } /* * Parse the IDs. @@ -5477,9 +5300,10 @@ SKIP_BLANKS; if (RAW == '>') { - if (input != ctxt->input) { - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, - "Notation declaration doesn't start and stop in the same entity\n"); + if (inputid != ctxt->input->id) { + xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY, + "Notation declaration doesn't start and stop" + " in the same entity\n"); } NEXT; if ((ctxt->sax != NULL) && (!ctxt->disableSAX) && @@ -5523,23 +5347,20 @@ const xmlChar *ndata = NULL; int isParameter = 0; xmlChar *orig = NULL; - int skipped; /* GROW; done in the caller */ if (CMP8(CUR_PTR, '<', '!', 'E', 'N', 'T', 'I', 'T', 'Y')) { - xmlParserInputPtr input = ctxt->input; + int inputid = ctxt->input->id; SHRINK; SKIP(8); - skipped = SKIP_BLANKS; - if (skipped == 0) { + if (SKIP_BLANKS == 0) { xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, "Space required after '<!ENTITY'\n"); } if (RAW == '%') { NEXT; - skipped = SKIP_BLANKS; - if (skipped == 0) { + if (SKIP_BLANKS == 0) { xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, "Space required after '%%'\n"); } @@ -5557,8 +5378,7 @@ "colons are forbidden from entities names '%s'\n", name, NULL, NULL); } - skipped = SKIP_BLANKS; - if (skipped == 0) { + if (SKIP_BLANKS == 0) { xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, "Space required after the entity name\n"); } @@ -5669,18 +5489,16 @@ xmlFreeURI(uri); } } - if ((RAW != '>') && (!IS_BLANK_CH(CUR))) { + if ((RAW != '>') && (SKIP_BLANKS == 0)) { xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, "Space required before 'NDATA'\n"); } - SKIP_BLANKS; if (CMP5(CUR_PTR, 'N', 'D', 'A', 'T', 'A')) { SKIP(5); - if (!IS_BLANK_CH(CUR)) { + if (SKIP_BLANKS == 0) { xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, "Space required after 'NDATA'\n"); } - SKIP_BLANKS; ndata = xmlParseName(ctxt); if ((ctxt->sax != NULL) && (!ctxt->disableSAX) && (ctxt->sax->unparsedEntityDecl != NULL)) @@ -5726,9 +5544,10 @@ "xmlParseEntityDecl: entity %s not terminated\n", name); xmlHaltParser(ctxt); } else { - if (input != ctxt->input) { + if (inputid != ctxt->input->id) { xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY, - "Entity declaration doesn't start and stop in the same entity\n"); + "Entity declaration doesn't start and stop in" + " the same entity\n"); } NEXT; } @@ -5811,11 +5630,10 @@ if (CMP6(CUR_PTR, '#', 'F', 'I', 'X', 'E', 'D')) { SKIP(6); val = XML_ATTRIBUTE_FIXED; - if (!IS_BLANK_CH(CUR)) { + if (SKIP_BLANKS == 0) { xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, "Space required after '#FIXED'\n"); } - SKIP_BLANKS; } ret = xmlParseAttValue(ctxt); ctxt->instate = XML_PARSER_DTD; @@ -5987,12 +5805,11 @@ xmlParseEnumeratedType(xmlParserCtxtPtr ctxt, xmlEnumerationPtr *tree) { if (CMP8(CUR_PTR, 'N', 'O', 'T', 'A', 'T', 'I', 'O', 'N')) { SKIP(8); - if (!IS_BLANK_CH(CUR)) { + if (SKIP_BLANKS == 0) { xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, "Space required after 'NOTATION'\n"); return(0); } - SKIP_BLANKS; *tree = xmlParseNotationType(ctxt); if (*tree == NULL) return(0); return(XML_ATTRIBUTE_NOTATION); @@ -6096,14 +5913,13 @@ xmlEnumerationPtr tree; if (CMP9(CUR_PTR, '<', '!', 'A', 'T', 'T', 'L', 'I', 'S', 'T')) { - xmlParserInputPtr input = ctxt->input; + int inputid = ctxt->input->id; SKIP(9); - if (!IS_BLANK_CH(CUR)) { + if (SKIP_BLANKS == 0) { xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, "Space required after '<!ATTLIST'\n"); } - SKIP_BLANKS; elemName = xmlParseName(ctxt); if (elemName == NULL) { xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED, @@ -6126,12 +5942,11 @@ break; } GROW; - if (!IS_BLANK_CH(CUR)) { + if (SKIP_BLANKS == 0) { xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, "Space required after the attribute name\n"); break; } - SKIP_BLANKS; type = xmlParseAttributeType(ctxt, &tree); if (type <= 0) { @@ -6139,14 +5954,13 @@ } GROW; - if (!IS_BLANK_CH(CUR)) { + if (SKIP_BLANKS == 0) { xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, "Space required after the attribute type\n"); if (tree != NULL) xmlFreeEnumeration(tree); break; } - SKIP_BLANKS; def = xmlParseDefaultDecl(ctxt, &defaultValue); if (def <= 0) { @@ -6161,7 +5975,7 @@ GROW; if (RAW != '>') { - if (!IS_BLANK_CH(CUR)) { + if (SKIP_BLANKS == 0) { xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, "Space required after the attribute default value\n"); if (defaultValue != NULL) @@ -6170,7 +5984,6 @@ xmlFreeEnumeration(tree); break; } - SKIP_BLANKS; } if ((ctxt->sax != NULL) && (!ctxt->disableSAX) && (ctxt->sax->attributeDecl != NULL)) @@ -6192,10 +6005,10 @@ GROW; } if (RAW == '>') { - if (input != ctxt->input) { - xmlValidityError(ctxt, XML_ERR_ENTITY_BOUNDARY, - "Attribute list declaration doesn't start and stop in the same entity\n", - NULL, NULL); + if (inputid != ctxt->input->id) { + xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY, + "Attribute list declaration doesn't start and" + " stop in the same entity\n"); } NEXT; } @@ -6232,10 +6045,10 @@ SKIP_BLANKS; SHRINK; if (RAW == ')') { - if ((ctxt->validate) && (ctxt->input->id != inputchk)) { - xmlValidityError(ctxt, XML_ERR_ENTITY_BOUNDARY, -"Element content declaration doesn't start and stop in the same entity\n", - NULL, NULL); + if (ctxt->input->id != inputchk) { + xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY, + "Element content declaration doesn't start and" + " stop in the same entity\n"); } NEXT; ret = xmlNewDocElementContent(ctxt->myDoc, NULL, XML_ELEMENT_CONTENT_PCDATA); @@ -6291,10 +6104,10 @@ } if (ret != NULL) ret->ocur = XML_ELEMENT_CONTENT_MULT; - if ((ctxt->validate) && (ctxt->input->id != inputchk)) { - xmlValidityError(ctxt, XML_ERR_ENTITY_BOUNDARY, -"Element content declaration doesn't start and stop in the same entity\n", - NULL, NULL); + if (ctxt->input->id != inputchk) { + xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY, + "Element content declaration doesn't start and" + " stop in the same entity\n"); } SKIP(2); } else { @@ -6534,10 +6347,10 @@ if (last != NULL) last->parent = cur; } - if ((ctxt->validate) && (ctxt->input->id != inputchk)) { - xmlValidityError(ctxt, XML_ERR_ENTITY_BOUNDARY, -"Element content declaration doesn't start and stop in the same entity\n", - NULL, NULL); + if (ctxt->input->id != inputchk) { + xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY, + "Element content declaration doesn't start and stop in" + " the same entity\n"); } NEXT; if (RAW == '?') { @@ -6710,28 +6523,24 @@ /* GROW; done in the caller */ if (CMP9(CUR_PTR, '<', '!', 'E', 'L', 'E', 'M', 'E', 'N', 'T')) { - xmlParserInputPtr input = ctxt->input; + int inputid = ctxt->input->id; SKIP(9); - if (!IS_BLANK_CH(CUR)) { + if (SKIP_BLANKS == 0) { xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, "Space required after 'ELEMENT'\n"); return(-1); } - SKIP_BLANKS; name = xmlParseName(ctxt); if (name == NULL) { xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED, "xmlParseElementDecl: no name for Element\n"); return(-1); } - while ((RAW == 0) && (ctxt->inputNr > 1)) - xmlPopInput(ctxt); - if (!IS_BLANK_CH(CUR)) { + if (SKIP_BLANKS == 0) { xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, "Space required after the element name\n"); } - SKIP_BLANKS; if (CMP5(CUR_PTR, 'E', 'M', 'P', 'T', 'Y')) { SKIP(5); /* @@ -6763,12 +6572,6 @@ } SKIP_BLANKS; - /* - * Pop-up of finished entities. - */ - while ((RAW == 0) && (ctxt->inputNr > 1)) - xmlPopInput(ctxt); - SKIP_BLANKS; if (RAW != '>') { xmlFatalErr(ctxt, XML_ERR_GT_REQUIRED, NULL); @@ -6776,9 +6579,10 @@ xmlFreeDocElementContent(ctxt->myDoc, content); } } else { - if (input != ctxt->input) { + if (inputid != ctxt->input->id) { xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY, - "Element declaration doesn't start and stop in the same entity\n"); + "Element declaration doesn't start and stop in" + " the same entity\n"); } NEXT; @@ -6831,9 +6635,9 @@ return; } else { if (ctxt->input->id != id) { - xmlValidityError(ctxt, XML_ERR_ENTITY_BOUNDARY, - "All markup of the conditional section is not in the same entity\n", - NULL, NULL); + xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY, + "All markup of the conditional section is not" + " in the same entity\n"); } NEXT; } @@ -6846,6 +6650,8 @@ "Entering INCLUDE Conditional Section\n"); } + SKIP_BLANKS; + GROW; while (((RAW != 0) && ((RAW != ']') || (NXT(1) != ']') || (NXT(2) != '>'))) && (ctxt->instate != XML_PARSER_EOF)) { const xmlChar *check = CUR_PTR; @@ -6853,18 +6659,11 @@ if ((RAW == '<') && (NXT(1) == '!') && (NXT(2) == '[')) { xmlParseConditionalSections(ctxt); - } else if (IS_BLANK_CH(CUR)) { - NEXT; - } else if (RAW == '%') { - xmlParsePEReference(ctxt); } else xmlParseMarkupDecl(ctxt); - /* - * Pop-up of finished entities. - */ - while ((RAW == 0) && (ctxt->inputNr > 1)) - xmlPopInput(ctxt); + SKIP_BLANKS; + GROW; if ((CUR_PTR == check) && (cons == ctxt->input->consumed)) { xmlFatalErr(ctxt, XML_ERR_EXT_SUBSET_NOT_FINISHED, NULL); @@ -6894,9 +6693,9 @@ return; } else { if (ctxt->input->id != id) { - xmlValidityError(ctxt, XML_ERR_ENTITY_BOUNDARY, - "All markup of the conditional section is not in the same entity\n", - NULL, NULL); + xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY, + "All markup of the conditional section is not" + " in the same entity\n"); } NEXT; } @@ -6958,9 +6757,9 @@ xmlFatalErr(ctxt, XML_ERR_CONDSEC_NOT_FINISHED, NULL); } else { if (ctxt->input->id != id) { - xmlValidityError(ctxt, XML_ERR_ENTITY_BOUNDARY, - "All markup of the conditional section is not in the same entity\n", - NULL, NULL); + xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY, + "All markup of the conditional section is not in" + " the same entity\n"); } if ((ctxt-> instate != XML_PARSER_EOF) && ((ctxt->input->cur + 3) <= ctxt->input->end)) @@ -7028,13 +6827,6 @@ return; /* - * This is only for internal subset. On external entities, - * the replacement is done before parsing stage - */ - if ((ctxt->external == 0) && (ctxt->inputNr == 1)) - xmlParsePEReference(ctxt); - - /* * Conditional sections are allowed from entities included * by PE References in the internal subset. */ @@ -7071,11 +6863,10 @@ return; } - if (!IS_BLANK_CH(CUR)) { + if (SKIP_BLANKS == 0) { xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, "Space needed after '<?xml'\n"); } - SKIP_BLANKS; /* * We may have the VersionInfo here. @@ -7084,7 +6875,7 @@ if (version == NULL) version = xmlCharStrdup(XML_DEFAULT_VERSION); else { - if (!IS_BLANK_CH(CUR)) { + if (SKIP_BLANKS == 0) { xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, "Space needed here\n"); } @@ -7175,27 +6966,19 @@ ctxt->instate = XML_PARSER_DTD; ctxt->external = 1; + SKIP_BLANKS; while (((RAW == '<') && (NXT(1) == '?')) || ((RAW == '<') && (NXT(1) == '!')) || - (RAW == '%') || IS_BLANK_CH(CUR)) { + (RAW == '%')) { const xmlChar *check = CUR_PTR; unsigned int cons = ctxt->input->consumed; GROW; if ((RAW == '<') && (NXT(1) == '!') && (NXT(2) == '[')) { xmlParseConditionalSections(ctxt); - } else if (IS_BLANK_CH(CUR)) { - NEXT; - } else if (RAW == '%') { - xmlParsePEReference(ctxt); } else xmlParseMarkupDecl(ctxt); - - /* - * Pop-up of finished entities. - */ - while ((RAW == 0) && (ctxt->inputNr > 1)) - xmlPopInput(ctxt); + SKIP_BLANKS; if ((CUR_PTR == check) && (cons == ctxt->input->consumed)) { xmlFatalErr(ctxt, XML_ERR_EXT_SUBSET_NOT_FINISHED, NULL); @@ -7429,6 +7212,9 @@ } if (ent->checked == 0) ent->checked = 2; + + /* Prevent entity from being parsed and expanded twice (Bug 760367). */ + was_checked = 0; } else if (ent->checked != 1) { ctxt->nbentities += ent->checked / 2; } @@ -8071,12 +7857,14 @@ NEXT; name = xmlParseName(ctxt); if (name == NULL) { - xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED, - "xmlParsePEReference: no name\n"); + xmlFatalErrMsg(ctxt, XML_ERR_PEREF_NO_NAME, "PEReference: no name\n"); return; } + if (xmlParserDebugEntities) + xmlGenericError(xmlGenericErrorContext, + "PEReference: %s\n", name); if (RAW != ';') { - xmlFatalErr(ctxt, XML_ERR_ENTITYREF_SEMICOL_MISSING, NULL); + xmlFatalErr(ctxt, XML_ERR_PEREF_SEMICOL_MISSING, NULL); return; } @@ -8118,10 +7906,15 @@ * ... The declaration of a parameter entity must * precede any reference to it... */ - xmlWarningMsg(ctxt, XML_WAR_UNDECLARED_ENTITY, - "PEReference: %%%s; not found\n", - name, NULL); - ctxt->valid = 0; + if ((ctxt->validate) && (ctxt->vctxt.error != NULL)) { + xmlValidityError(ctxt, XML_WAR_UNDECLARED_ENTITY, + "PEReference: %%%s; not found\n", + name, NULL); + } else + xmlWarningMsg(ctxt, XML_WAR_UNDECLARED_ENTITY, + "PEReference: %%%s; not found\n", + name, NULL); + ctxt->valid = 0; } xmlParserEntityCheck(ctxt, 0, NULL, 0); } else { @@ -8133,11 +7926,10 @@ xmlWarningMsg(ctxt, XML_WAR_UNDECLARED_ENTITY, "Internal: %%%s; is not a parameter entity\n", name, NULL); - } else if (ctxt->input->free != deallocblankswrapper) { - input = xmlNewBlanksWrapperInputStream(ctxt, entity); - if (xmlPushInput(ctxt, input) < 0) - return; } else { + xmlChar start[4]; + xmlCharEncoding enc; + if ((entity->etype == XML_EXTERNAL_PARAMETER_ENTITY) && ((ctxt->options & XML_PARSE_NOENT) == 0) && ((ctxt->options & XML_PARSE_DTDVALID) == 0) && @@ -8147,28 +7939,41 @@ (ctxt->validate == 0)) return; - /* - * TODO !!! - * handle the extra spaces added before and after - * c.f. http://www.w3.org/TR/REC-xml#as-PE - */ input = xmlNewEntityInputStream(ctxt, entity); - if (xmlPushInput(ctxt, input) < 0) + if (xmlPushInput(ctxt, input) < 0) { + xmlFreeInputStream(input); return; - if ((entity->etype == XML_EXTERNAL_PARAMETER_ENTITY) && - (CMP5(CUR_PTR, '<', '?', 'x', 'm', 'l')) && - (IS_BLANK_CH(NXT(5)))) { - xmlParseTextDecl(ctxt); - if (ctxt->errNo == - XML_ERR_UNSUPPORTED_ENCODING) { - /* - * The XML REC instructs us to stop parsing - * right here - */ - xmlHaltParser(ctxt); - return; - } - } + } + + if (entity->etype == XML_EXTERNAL_PARAMETER_ENTITY) { + /* + * Get the 4 first bytes and decode the charset + * if enc != XML_CHAR_ENCODING_NONE + * plug some encoding conversion routines. + * Note that, since we may have some non-UTF8 + * encoding (like UTF16, bug 135229), the 'length' + * is not known, but we can calculate based upon + * the amount of data in the buffer. + */ + GROW + if (ctxt->instate == XML_PARSER_EOF) + return; + if ((ctxt->input->end - ctxt->input->cur)>=4) { + start[0] = RAW; + start[1] = NXT(1); + start[2] = NXT(2); + start[3] = NXT(3); + enc = xmlDetectCharEncoding(start, 4); + if (enc != XML_CHAR_ENCODING_NONE) { + xmlSwitchEncoding(ctxt, enc); + } + } + + if ((CMP5(CUR_PTR, '<', '?', 'x', 'm', 'l')) && + (IS_BLANK_CH(NXT(5)))) { + xmlParseTextDecl(ctxt); + } + } } } ctxt->hasPErefs = 1; @@ -8490,7 +8295,8 @@ * PEReferences. * Subsequence (markupdecl | PEReference | S)* */ - while ((RAW != ']') && (ctxt->instate != XML_PARSER_EOF)) { + while (((RAW != ']') || (ctxt->inputNr > 1)) && + (ctxt->instate != XML_PARSER_EOF)) { const xmlChar *check = CUR_PTR; unsigned int cons = ctxt->input->consumed; @@ -8498,16 +8304,13 @@ xmlParseMarkupDecl(ctxt); xmlParsePEReference(ctxt); - /* - * Pop-up of finished entities. - */ - while ((RAW == 0) && (ctxt->inputNr > 1)) - xmlPopInput(ctxt); - if ((CUR_PTR == check) && (cons == ctxt->input->consumed)) { xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, "xmlParseInternalSubset: error detected in Markup declaration\n"); - break; + if (ctxt->inputNr > 1) + xmlPopInput(ctxt); + else + break; } } if (RAW == ']') { @@ -8585,7 +8388,7 @@ ctxt->instate = XML_PARSER_CONTENT; } else { xmlFatalErrMsgStr(ctxt, XML_ERR_ATTRIBUTE_WITHOUT_VALUE, - "Specification mandate value for attribute %s\n", name); + "Specification mandates value for attribute %s\n", name); return(NULL); } @@ -8742,11 +8545,10 @@ GROW if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>')))) break; - if (!IS_BLANK_CH(RAW)) { + if (SKIP_BLANKS == 0) { xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, "attributes construct error\n"); } - SKIP_BLANKS; if ((cons == ctxt->input->consumed) && (q == CUR_PTR) && (attname == NULL) && (attvalue == NULL)) { xmlFatalErrMsg(ctxt, XML_ERR_INTERNAL_ERROR, @@ -9318,7 +9120,7 @@ ctxt->instate = XML_PARSER_CONTENT; } else { xmlFatalErrMsgStr(ctxt, XML_ERR_ATTRIBUTE_WITHOUT_VALUE, - "Specification mandate value for attribute %s\n", + "Specification mandates value for attribute %s\n", name); return (NULL); } @@ -9401,7 +9203,7 @@ xmlChar *attvalue; const xmlChar **atts = ctxt->atts; int maxatts = ctxt->maxatts; - int nratts, nbatts, nbdef; + int nratts, nbatts, nbdef, inputid; int i, j, nbNs, attval; unsigned long cur; int nsNr = ctxt->nsNr; @@ -9418,6 +9220,7 @@ */ SHRINK; cur = ctxt->input->cur - ctxt->input->base; + inputid = ctxt->input->id; nbatts = 0; nratts = 0; nbdef = 0; @@ -9621,12 +9424,11 @@ break; if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>')))) break; - if (!IS_BLANK_CH(RAW)) { + if (SKIP_BLANKS == 0) { xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, "attributes construct error\n"); break; } - SKIP_BLANKS; if ((cons == ctxt->input->consumed) && (q == CUR_PTR) && (attname == NULL) && (attvalue == NULL)) { xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, @@ -9636,6 +9438,13 @@ GROW; } + if (ctxt->input->id != inputid) { + xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, + "Unexpected change of input\n"); + localname = NULL; + goto done; + } + /* Reconstruct attribute value pointers. */ for (i = 0, j = 0; j < nratts; i += 5, j++) { if (atts[i+2] != NULL) { @@ -9794,6 +9603,7 @@ nsname, 0, NULL, nbatts / 5, nbdef, atts); } +done: /* * Free up attribute allocated strings if needed */ @@ -10072,11 +9882,6 @@ } GROW; - /* - * Pop-up of finished entities. - */ - while ((RAW == 0) && (ctxt->inputNr > 1)) - xmlPopInput(ctxt); SHRINK; if ((cons == ctxt->input->consumed) && (test == CUR_PTR)) { @@ -11229,7 +11034,7 @@ * Check that the block of characters is okay as SCdata content [20] * * Returns the number of bytes to pass if okay, a negative index where an - * UTF-8 error occured otherwise + * UTF-8 error occurred otherwise */ static int xmlCheckCdataPush(const xmlChar *utf, int len, int complete) { @@ -11371,13 +11176,6 @@ if ((ctxt->errNo != XML_ERR_OK) && (ctxt->disableSAX == 1)) return(0); - - /* - * Pop-up of finished entities. - */ - while ((RAW == 0) && (ctxt->inputNr > 1)) - xmlPopInput(ctxt); - if (ctxt->input == NULL) break; if (ctxt->input->buf == NULL) avail = ctxt->input->length - @@ -11728,11 +11526,6 @@ ctxt->checkIndex = 0; xmlParseCharData(ctxt, 0); } - /* - * Pop-up of finished entities. - */ - while ((RAW == 0) && (ctxt->inputNr > 1)) - xmlPopInput(ctxt); if ((cons == ctxt->input->consumed) && (test == CUR_PTR)) { xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, "detected an error in element content\n"); @@ -12675,6 +12468,8 @@ return; ctxt->instate = XML_PARSER_EOF; ctxt->disableSAX = 1; + while (ctxt->inputNr > 1) + xmlFreeInputStream(inputPop(ctxt)); if (ctxt->input != NULL) { /* * in case there was a specific allocation deallocate before @@ -12686,6 +12481,7 @@ } ctxt->input->cur = BAD_CAST""; ctxt->input->base = ctxt->input->cur; + ctxt->input->end = ctxt->input->cur; } } @@ -13454,7 +13250,7 @@ /* * And record the last error if any */ - if (ctxt->lastError.code != XML_ERR_OK) + if ((oldctxt != NULL) && (ctxt->lastError.code != XML_ERR_OK)) xmlCopyError(&ctxt->lastError, &oldctxt->lastError); if (sax != NULL)
diff --git a/third_party/libxml/src/parserInternals.c b/third_party/libxml/src/parserInternals.c index 475d35b..eb902398 100644 --- a/third_party/libxml/src/parserInternals.c +++ b/third_party/libxml/src/parserInternals.c
@@ -435,8 +435,6 @@ if ((*ctxt->input->cur == 0) && (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) { - if ((ctxt->instate != XML_PARSER_COMMENT)) - xmlPopInput(ctxt); return; } @@ -523,8 +521,6 @@ ctxt->input->cur++; ctxt->nbChars++; - if (*ctxt->input->cur == 0) - xmlParserInputGrow(ctxt->input, INPUT_CHUNK); } else { /* * Assume it's a fixed length encoding (1) with @@ -538,14 +534,9 @@ ctxt->input->col++; ctxt->input->cur++; ctxt->nbChars++; - if (*ctxt->input->cur == 0) - xmlParserInputGrow(ctxt->input, INPUT_CHUNK); } - if ((*ctxt->input->cur == '%') && (!ctxt->html)) - xmlParserHandlePEReference(ctxt); - if ((*ctxt->input->cur == 0) && - (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) - xmlPopInput(ctxt); + if (*ctxt->input->cur == 0) + xmlParserInputGrow(ctxt->input, INPUT_CHUNK); return; encoding_error: /* @@ -1244,11 +1235,7 @@ input->buf->rawconsumed += use - xmlBufUse(input->buf->raw); } return (0); - } else if (input->length == 0) { - /* - * When parsing a static memory array one must know the - * size to be able to convert the buffer. - */ + } else { xmlErrInternal(ctxt, "switching encoding : no input\n", NULL); return (-1); }
diff --git a/third_party/libxml/src/runtest.c b/third_party/libxml/src/runtest.c index dcf1405d..714de275 100644 --- a/third_party/libxml/src/runtest.c +++ b/third_party/libxml/src/runtest.c
@@ -23,6 +23,7 @@ #include <fcntl.h> #include <libxml/parser.h> +#include <libxml/parserInternals.h> #include <libxml/tree.h> #include <libxml/uri.h> @@ -1677,7 +1678,6 @@ static xmlSAXHandlerPtr debugHTMLSAXHandler = &debugHTMLSAXHandlerStruct; #endif /* LIBXML_HTML_ENABLED */ -#ifdef LIBXML_SAX1_ENABLED /** * saxParseTest: * @filename: the file to parse @@ -1718,7 +1718,15 @@ ret = 0; } else #endif - ret = xmlSAXUserParseFile(emptySAXHandler, NULL, filename); + { + xmlParserCtxtPtr ctxt = xmlCreateFileParserCtxt(filename); + memcpy(ctxt->sax, emptySAXHandler, sizeof(xmlSAXHandler)); + xmlCtxtUseOptions(ctxt, options); + xmlParseDocument(ctxt); + ret = ctxt->wellFormed ? 0 : ctxt->errNo; + xmlFreeDoc(ctxt->myDoc); + xmlFreeParserCtxt(ctxt); + } if (ret == XML_WAR_UNDECLARED_ENTITY) { fprintf(SAXdebug, "xmlSAXUserParseFile returned error %d\n", ret); ret = 0; @@ -1734,10 +1742,19 @@ ret = 0; } else #endif - if (options & XML_PARSE_SAX1) { - ret = xmlSAXUserParseFile(debugSAXHandler, NULL, filename); - } else { - ret = xmlSAXUserParseFile(debugSAX2Handler, NULL, filename); + { + xmlParserCtxtPtr ctxt = xmlCreateFileParserCtxt(filename); + if (options & XML_PARSE_SAX1) { + memcpy(ctxt->sax, debugSAXHandler, sizeof(xmlSAXHandler)); + options -= XML_PARSE_SAX1; + } else { + memcpy(ctxt->sax, debugSAX2Handler, sizeof(xmlSAXHandler)); + } + xmlCtxtUseOptions(ctxt, options); + xmlParseDocument(ctxt); + ret = ctxt->wellFormed ? 0 : ctxt->errNo; + xmlFreeDoc(ctxt->myDoc); + xmlFreeParserCtxt(ctxt); } if (ret == XML_WAR_UNDECLARED_ENTITY) { fprintf(SAXdebug, "xmlSAXUserParseFile returned error %d\n", ret); @@ -1761,7 +1778,6 @@ return(ret); } -#endif /************************************************************************ * * @@ -2147,7 +2163,8 @@ } static int streamProcessTest(const char *filename, const char *result, const char *err, - xmlTextReaderPtr reader, const char *rng, int options) { + xmlTextReaderPtr reader, const char *rng, + int options ATTRIBUTE_UNUSED) { int ret; char *temp = NULL; FILE *t = NULL; @@ -3922,7 +3939,7 @@ return(c14nCommonTest(filename, 0, XML_C14N_1_1, "1-1-without-comments")); } #endif -#if defined(LIBXML_THREAD_ENABLED) && defined(LIBXML_CATALOG_ENABLED) && defined (LIBXML_SAX1_ENABLED) +#if defined(LIBXML_THREAD_ENABLED) && defined(LIBXML_CATALOG_ENABLED) /************************************************************************ * * * Catalog and threads test * @@ -3969,7 +3986,11 @@ xmlDoValidityCheckingDefaultValue = 1; xmlGenericErrorContext = stderr; } +#ifdef LIBXML_SAX1_ENABLED myDoc = xmlParseFile(filename); +#else + myDoc = xmlReadFile(filename, NULL, XML_WITH_CATALOG); +#endif if (myDoc) { xmlFreeDoc(myDoc); } else { @@ -4243,10 +4264,13 @@ { "SAX1 callbacks regression tests" , saxParseTest, "./test/*", "result/", ".sax", NULL, XML_PARSE_SAX1 }, +#endif { "SAX2 callbacks regression tests" , saxParseTest, "./test/*", "result/", ".sax2", NULL, 0 }, -#endif + { "SAX2 callbacks regression tests with entity substitution" , + saxParseTest, "./test/*", "result/noent/", ".sax2", NULL, + XML_PARSE_NOENT }, #ifdef LIBXML_PUSH_ENABLED { "XML push regression tests" , pushParseTest, "./test/*", "result/", "", NULL, @@ -4261,12 +4285,10 @@ pushParseTest, "./test/HTML/*", "result/HTML/", "", ".err", XML_PARSE_HTML }, #endif -#ifdef LIBXML_SAX1_ENABLED { "HTML SAX regression tests" , saxParseTest, "./test/HTML/*", "result/HTML/", ".sax", NULL, XML_PARSE_HTML }, #endif -#endif #ifdef LIBXML_VALID_ENABLED { "Valid documents regression tests" , errParseTest, "./test/VCM/*", NULL, NULL, NULL, @@ -4369,7 +4391,7 @@ c14n11WithoutCommentTest, "./test/c14n/1-1-without-comments/*.xml", NULL, NULL, NULL, 0 }, #endif -#if defined(LIBXML_THREAD_ENABLED) && defined(LIBXML_CATALOG_ENABLED) && defined(LIBXML_SAX1_ENABLED) +#if defined(LIBXML_THREAD_ENABLED) && defined(LIBXML_CATALOG_ENABLED) { "Catalog and Threads regression tests" , threadsTest, NULL, NULL, NULL, NULL, 0 },
diff --git a/third_party/libxml/src/testThreads.c b/third_party/libxml/src/testThreads.c index bff5391..2ef70a7 100644 --- a/third_party/libxml/src/testThreads.c +++ b/third_party/libxml/src/testThreads.c
@@ -3,7 +3,7 @@ #include <stdlib.h> #include <stdio.h> -#if defined(LIBXML_THREAD_ENABLED) && defined(LIBXML_CATALOG_ENABLED) && defined(LIBXML_SAX1_ENABLED) +#if defined(LIBXML_THREAD_ENABLED) && defined(LIBXML_CATALOG_ENABLED) #include <libxml/globals.h> #include <libxml/threads.h> #include <libxml/parser.h> @@ -61,7 +61,11 @@ xmlDoValidityCheckingDefaultValue = 1; xmlGenericErrorContext = stderr; } +#ifdef LIBXML_SAX1_ENABLED myDoc = xmlParseFile(filename); +#else + myDoc = xmlReadFile(filename, NULL, XML_WITH_CATALOG); +#endif if (myDoc) { xmlFreeDoc(myDoc); } else {
diff --git a/third_party/libxml/src/threads.c b/third_party/libxml/src/threads.c index b9d6cae..8c57263 100644 --- a/third_party/libxml/src/threads.c +++ b/third_party/libxml/src/threads.c
@@ -50,43 +50,23 @@ #if defined(__GNUC__) && defined(__GLIBC__) #ifdef linux #if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || (__GNUC__ > 3) -extern int pthread_once (pthread_once_t *__once_control, - void (*__init_routine) (void)) - __attribute((weak)); -extern void *pthread_getspecific (pthread_key_t __key) - __attribute((weak)); -extern int pthread_setspecific (pthread_key_t __key, - __const void *__pointer) - __attribute((weak)); -extern int pthread_key_create (pthread_key_t *__key, - void (*__destr_function) (void *)) - __attribute((weak)); -extern int pthread_key_delete (pthread_key_t __key) - __attribute((weak)); -extern int pthread_mutex_init () - __attribute((weak)); -extern int pthread_mutex_destroy () - __attribute((weak)); -extern int pthread_mutex_lock () - __attribute((weak)); -extern int pthread_mutex_unlock () - __attribute((weak)); -extern int pthread_cond_init () - __attribute((weak)); -extern int pthread_cond_destroy () - __attribute((weak)); -extern int pthread_cond_wait () - __attribute((weak)); -extern int pthread_equal () - __attribute((weak)); -extern pthread_t pthread_self () - __attribute((weak)); -extern int pthread_key_create () - __attribute((weak)); -extern int pthread_key_delete () - __attribute((weak)); -extern int pthread_cond_signal () - __attribute((weak)); +#pragma weak pthread_once +#pragma weak pthread_getspecific +#pragma weak pthread_setspecific +#pragma weak pthread_key_create +#pragma weak pthread_key_delete +#pragma weak pthread_mutex_init +#pragma weak pthread_mutex_destroy +#pragma weak pthread_mutex_lock +#pragma weak pthread_mutex_unlock +#pragma weak pthread_cond_init +#pragma weak pthread_cond_destroy +#pragma weak pthread_cond_wait +#pragma weak pthread_equal +#pragma weak pthread_self +#pragma weak pthread_key_create +#pragma weak pthread_key_delete +#pragma weak pthread_cond_signal #endif #endif /* linux */ #endif /* defined(__GNUC__) && defined(__GLIBC__) */
diff --git a/third_party/libxml/src/tree.c b/third_party/libxml/src/tree.c index e154ec0..572185e 100644 --- a/third_party/libxml/src/tree.c +++ b/third_party/libxml/src/tree.c
@@ -254,10 +254,10 @@ * * [NS 7] LocalPart ::= NCName * - * Returns NULL if not a QName, otherwise the local part, and prefix - * is updated to get the Prefix if any. + * Returns NULL if the name doesn't have a prefix. Otherwise, returns the + * local part, and prefix is updated to get the Prefix. Both the return value + * and the prefix must be freed by the caller. */ - xmlChar * xmlSplitQName2(const xmlChar *name, xmlChar **prefix) { int len = 0;
diff --git a/third_party/libxml/src/valid.c b/third_party/libxml/src/valid.c index c51ea29..4df09e4 100644 --- a/third_party/libxml/src/valid.c +++ b/third_party/libxml/src/valid.c
@@ -5738,7 +5738,7 @@ xmlElementPtr elemDecl; /* - * Check the new element agaisnt the content model of the new elem. + * Check the new element against the content model of the new elem. */ if (state->elemDecl != NULL) { elemDecl = state->elemDecl; @@ -5830,7 +5830,7 @@ xmlElementPtr elemDecl; /* - * Check the new element agaisnt the content model of the new elem. + * Check the new element against the content model of the new elem. */ if (state->elemDecl != NULL) { elemDecl = state->elemDecl; @@ -5904,7 +5904,7 @@ xmlElementPtr elemDecl; /* - * Check the new element agaisnt the content model of the new elem. + * Check the new element against the content model of the new elem. */ if (state->elemDecl != NULL) { elemDecl = state->elemDecl;
diff --git a/third_party/libxml/src/xmlIO.c b/third_party/libxml/src/xmlIO.c index 8c6509dd..c699d52 100644 --- a/third_party/libxml/src/xmlIO.c +++ b/third_party/libxml/src/xmlIO.c
@@ -1286,7 +1286,7 @@ * * Read @len bytes to @buffer from the compressed I/O channel. * - * Returns the number of bytes written + * Returns the number of bytes read. */ static int xmlGzfileRead (void * context, char * buffer, int len) { @@ -1876,7 +1876,7 @@ */ void * -xmlIOHTTPOpenW(const char *post_uri, int compression) +xmlIOHTTPOpenW(const char *post_uri, int compression ATTRIBUTE_UNUSED) { xmlIOHTTPWriteCtxtPtr ctxt = NULL;
diff --git a/third_party/libxml/src/xmlmemory.c b/third_party/libxml/src/xmlmemory.c index 58de2eda..64003959 100644 --- a/third_party/libxml/src/xmlmemory.c +++ b/third_party/libxml/src/xmlmemory.c
@@ -111,7 +111,7 @@ #define MAX_SIZE_T ((size_t)-1) -#define CLIENT_2_HDR(a) ((MEMHDR *) (((char *) (a)) - RESERVE_SIZE)) +#define CLIENT_2_HDR(a) ((void *) (((char *) (a)) - RESERVE_SIZE)) #define HDR_2_CLIENT(a) ((void *) (((char *) (a)) + RESERVE_SIZE))
diff --git a/third_party/libxml/src/xmlreader.c b/third_party/libxml/src/xmlreader.c index f285790b..34c4c6b 100644 --- a/third_party/libxml/src/xmlreader.c +++ b/third_party/libxml/src/xmlreader.c
@@ -3982,7 +3982,7 @@ * pattern. The caller must also use xmlTextReaderCurrentDoc() to * keep an handle on the resulting document once parsing has finished * - * Returns a positive number in case of success and -1 in case of error + * Returns a non-negative number in case of success and -1 in case of error */ int xmlTextReaderPreservePattern(xmlTextReaderPtr reader, const xmlChar *pattern,
diff --git a/third_party/libxml/src/xmlstring.c b/third_party/libxml/src/xmlstring.c index 9e704a9..780c6435 100644 --- a/third_party/libxml/src/xmlstring.c +++ b/third_party/libxml/src/xmlstring.c
@@ -440,8 +440,8 @@ * first bytes of @add. Note that if @len < 0 then this is an API error * and NULL will be returned. * - * Returns a new xmlChar *, the original @cur is reallocated if needed - * and should not be freed + * Returns a new xmlChar *, the original @cur is reallocated and should + * not be freed. */ xmlChar * @@ -519,7 +519,8 @@ * encoded in UTF-8 or an encoding with 8bit based chars, we assume * a termination mark of '0'. * - * Returns a new xmlChar * containing the concatenated string. + * Returns a new xmlChar * containing the concatenated string. The original + * @cur is reallocated and should not be freed. */ xmlChar * xmlStrcat(xmlChar *cur, const xmlChar *add) { @@ -822,7 +823,7 @@ * @len: the number of characters in the array * * storage size of an UTF8 string - * the behaviour is not garanteed if the input string is not UTF-8 + * the behaviour is not guaranteed if the input string is not UTF-8 * * Returns the storage size of * the first 'len' characters of ARRAY
diff --git a/third_party/mach_override/README.chromium b/third_party/mach_override/README.chromium index 4c72b62..9206bde9 100644 --- a/third_party/mach_override/README.chromium +++ b/third_party/mach_override/README.chromium
@@ -18,4 +18,4 @@ Local Modifications: Sped up allocation of branch island memory via usage of vm_region to skip already allocated pages; add diagnostics for allocation - attempts. + attempts. Catch allocation attempts on restricted pages.
diff --git a/third_party/mach_override/chromium.patch b/third_party/mach_override/chromium.patch index f125e1c..8a6abee 100644 --- a/third_party/mach_override/chromium.patch +++ b/third_party/mach_override/chromium.patch
@@ -1,5 +1,5 @@ diff --git a/third_party/mach_override/mach_override.c b/third_party/mach_override/mach_override.c -index 85a75e5c2067..0232359582d4 100644 +index 85a75e5c2067..ca68c0e90e61 100644 --- a/third_party/mach_override/mach_override.c +++ b/third_party/mach_override/mach_override.c @@ -8,6 +8,7 @@ @@ -27,10 +27,11 @@ char kIslandTemplate[] = { // kOriginalInstructionsSize nop instructions so that we -@@ -94,6 +96,14 @@ typedef struct { +@@ -93,6 +95,14 @@ typedef struct { + int allocatedHigh; } BranchIsland; - /************************** ++/************************** +* +* Statistics +* @@ -38,10 +39,9 @@ +static volatile int64_t __attribute__((__aligned__((sizeof(int64_t))))) + g_mach_override_allocation_attempts = 0; + -+/************************** + /************************** * * Funky Protos - * @@ -101,6 +111,10 @@ typedef struct { #pragma mark - #pragma mark (Funky Protos) @@ -113,7 +113,8 @@ err = vm_allocate( task_self, &page, PAGE_SIZE, 0 ); if( err == err_none ) allocated = 1; - else if( err == KERN_NO_SPACE ) { +- else if( err == KERN_NO_SPACE ) { ++ else if( err == KERN_NO_SPACE || err == KERN_INVALID_ADDRESS) { #if defined(__x86_64__) - page -= PAGE_SIZE; + // This memory region is not suitable, skip it:
diff --git a/third_party/mach_override/mach_override.c b/third_party/mach_override/mach_override.c index 0232359..ca68c0e 100644 --- a/third_party/mach_override/mach_override.c +++ b/third_party/mach_override/mach_override.c
@@ -443,7 +443,7 @@ err = vm_allocate( task_self, &page, PAGE_SIZE, 0 ); if( err == err_none ) allocated = 1; - else if( err == KERN_NO_SPACE ) { + else if( err == KERN_NO_SPACE || err == KERN_INVALID_ADDRESS) { #if defined(__x86_64__) // This memory region is not suitable, skip it: vm_size_t region_size;
diff --git a/tools/clang/base_bind_rewriters/BaseBindRewriters.cpp b/tools/clang/base_bind_rewriters/BaseBindRewriters.cpp index 5d4fc132..e74db14 100644 --- a/tools/clang/base_bind_rewriters/BaseBindRewriters.cpp +++ b/tools/clang/base_bind_rewriters/BaseBindRewriters.cpp
@@ -1,9 +1,6 @@ // Copyright 2016 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// -// This file containts a clang tool to update base::Bind() callers: -// * Remove unneeded scoped_refptr<>::get() on method binding. #include <assert.h> #include <algorithm> @@ -45,14 +42,16 @@ : replacements_(replacements) {} StatementMatcher GetMatcher() { - auto is_once_callback = hasType(classTemplateSpecializationDecl( - hasName("::base::Callback"), - hasTemplateArgument(1, equalsIntegralValue("0")), - hasTemplateArgument(2, equalsIntegralValue("0")))); - auto is_repeating_callback = hasType(classTemplateSpecializationDecl( - hasName("::base::Callback"), - hasTemplateArgument(1, equalsIntegralValue("1")), - hasTemplateArgument(2, equalsIntegralValue("1")))); + auto is_once_callback = + hasType(hasCanonicalType(hasDeclaration(classTemplateSpecializationDecl( + hasName("::base::Callback"), + hasTemplateArgument(1, equalsIntegralValue("0")), + hasTemplateArgument(2, equalsIntegralValue("0")))))); + auto is_repeating_callback = + hasType(hasCanonicalType(hasDeclaration(classTemplateSpecializationDecl( + hasName("::base::Callback"), + hasTemplateArgument(1, equalsIntegralValue("1")), + hasTemplateArgument(2, equalsIntegralValue("1")))))); auto bind_call = callExpr(callee(namedDecl(hasName("::base::Bind")))).bind("target");
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py index b59765eb3..ec2963c 100755 --- a/tools/clang/scripts/update.py +++ b/tools/clang/scripts/update.py
@@ -27,7 +27,7 @@ # Do NOT CHANGE this if you don't know what you're doing -- see # https://chromium.googlesource.com/chromium/src/+/master/docs/updating_clang.md # Reverting problematic clang rolls is safe, though. -CLANG_REVISION = '309984' +CLANG_REVISION = '310694' use_head_revision = 'LLVM_FORCE_HEAD_REVISION' in os.environ if use_head_revision:
diff --git a/tools/idl_parser/idl_parser_test.py b/tools/idl_parser/idl_parser_test.py index 8460568..0eed650 100755 --- a/tools/idl_parser/idl_parser_test.py +++ b/tools/idl_parser/idl_parser_test.py
@@ -9,6 +9,7 @@ from idl_lexer import IDLLexer from idl_parser import IDLParser, ParseFile + def ParseCommentTest(comment): comment = comment.strip() comments = comment.split(None, 1) @@ -16,6 +17,7 @@ class WebIDLParser(unittest.TestCase): + def setUp(self): self.parser = IDLParser(IDLLexer(), mute_error=True) self.filenames = glob.glob('test_parser/*_web.idl') @@ -36,7 +38,8 @@ if check == 'TREE': quick = '\n'.join(node.Tree()) lineno = node.GetProperty('LINENO') - msg = 'Mismatched tree at line %d:\n%sVS\n%s' % (lineno, value, quick) + msg = 'Mismatched tree at line %d:\n%sVS\n%s' % ( + lineno, value, quick) self.assertEqual(value, quick, msg) def testExpectedNodes(self): @@ -51,6 +54,7 @@ class TestImplements(unittest.TestCase): + def setUp(self): self.parser = IDLParser(IDLLexer(), mute_error=True) @@ -98,5 +102,37 @@ error_message) +class TestEnums(unittest.TestCase): + + def setUp(self): + self.parser = IDLParser(IDLLexer(), mute_error=True) + + def _ParseEnums(self, idl_text): + filenode = self.parser.ParseText( + filename='', data=idl_text) + self.assertEqual(1, len(filenode.GetChildren())) + return filenode.GetChildren()[0] + + def testBasic(self): + idl_text = 'enum MealType { "rice", "noodles", "other" };' + node = self._ParseEnums(idl_text) + children = node.GetChildren() + self.assertEqual('Enum', node.GetClass()) + self.assertEqual(3, len(children)) + self.assertEqual('EnumItem', children[0].GetClass()) + self.assertEqual('rice', children[0].GetName()) + self.assertEqual('EnumItem', children[1].GetClass()) + self.assertEqual('noodles', children[1].GetName()) + self.assertEqual('EnumItem', children[2].GetClass()) + self.assertEqual('other', children[2].GetName()) + + def testErrorMissingName(self): + idl_txt = 'enum {"rice","noodles","other"};' + node = self._ParseEnums(idl_txt) + self.assertEqual('Error', node.GetClass()) + error_message = node.GetName() + self.assertEqual('Enum missing name.', error_message) + + if __name__ == '__main__': unittest.main(verbosity=2)
diff --git a/tools/idl_parser/test_parser/enum_web.idl b/tools/idl_parser/test_parser/enum_web.idl index ef0abaf..da84cb7 100644 --- a/tools/idl_parser/test_parser/enum_web.idl +++ b/tools/idl_parser/test_parser/enum_web.idl
@@ -26,29 +26,6 @@ */ /** TREE - *Enum(MealType1) - * EnumItem(rice) - * EnumItem(noodles) - * EnumItem(other) -*/ -enum MealType1 { - /** BUILD EnumItem (rice) */ - "rice", - /** BUILD EnumItem (noodles) */ - "noodles", - /** BUILD EnumItem(other) */ - "other" -}; - -/** BUILD Error(Enum missing name.) */ -/** ERROR Enum missing name. */ -enum { - "rice", - "noodles", - "other" -}; - -/** TREE *Enum(MealType2) * EnumItem(rice) * EnumItem(noodles)
diff --git a/tools/json_schema_compiler/test/features_generation_unittest.cc b/tools/json_schema_compiler/test/features_generation_unittest.cc index 28a90ed..81ab003 100644 --- a/tools/json_schema_compiler/test/features_generation_unittest.cc +++ b/tools/json_schema_compiler/test/features_generation_unittest.cc
@@ -35,7 +35,7 @@ explicit FeatureComparator(const std::string& name); ~FeatureComparator(); - void CompareFeature(SimpleFeature* feature); + void CompareFeature(const SimpleFeature* feature); std::string name; std::vector<std::string> blacklist; @@ -66,7 +66,7 @@ FeatureComparator::~FeatureComparator() {} -void FeatureComparator::CompareFeature(SimpleFeature* feature) { +void FeatureComparator::CompareFeature(const SimpleFeature* feature) { ASSERT_TRUE(feature); EXPECT_EQ(name, feature->name()); ExpectVectorsEqual(blacklist, feature->blacklist(), name); @@ -95,22 +95,22 @@ CompilerTestFeatureProvider provider; auto GetAsSimpleFeature = [&provider](const std::string& name) { - Feature* feature = provider.GetFeature(name); + const Feature* feature = provider.GetFeature(name); // Shame we can't test this more safely, but if our feature is declared as // the wrong class, things should blow up in a spectacular fashion. - return static_cast<SimpleFeature*>(feature); + return static_cast<const SimpleFeature*>(feature); }; auto GetAsComplexFeature = [&provider](const std::string& name) { - Feature* feature = provider.GetFeature(name); + const Feature* feature = provider.GetFeature(name); // Shame we can't test this more safely, but if our feature is declared as // the wrong class, things should blow up in a spectacular fashion. - return static_cast<ComplexFeature*>(feature); + return static_cast<const ComplexFeature*>(feature); }; // Check some simple features for accuracy. { - SimpleFeature* feature = GetAsSimpleFeature("alpha"); + const SimpleFeature* feature = GetAsSimpleFeature("alpha"); FeatureComparator comparator("alpha"); comparator.dependencies = {"permission:alpha"}; comparator.contexts = {Feature::BLESSED_EXTENSION_CONTEXT}; @@ -120,7 +120,7 @@ comparator.CompareFeature(feature); } { - SimpleFeature* feature = GetAsSimpleFeature("beta"); + const SimpleFeature* feature = GetAsSimpleFeature("beta"); FeatureComparator comparator("beta"); comparator.contexts = {Feature::BLESSED_EXTENSION_CONTEXT}; comparator.channel.reset( @@ -134,7 +134,7 @@ comparator.CompareFeature(feature); } { - SimpleFeature* feature = GetAsSimpleFeature("gamma"); + const SimpleFeature* feature = GetAsSimpleFeature("gamma"); FeatureComparator comparator("gamma"); comparator.channel.reset( new version_info::Channel(version_info::Channel::BETA)); @@ -157,7 +157,7 @@ { // Features that specify 'noparent' should not inherit features from any // other feature. - SimpleFeature* feature = GetAsSimpleFeature("gamma.unparented"); + const SimpleFeature* feature = GetAsSimpleFeature("gamma.unparented"); FeatureComparator comparator("gamma.unparented"); comparator.blacklist = {"ddd"}; comparator.contexts = {Feature::UNBLESSED_EXTENSION_CONTEXT}; @@ -166,7 +166,7 @@ comparator.CompareFeature(feature); } { - ComplexFeature* complex_feature = + const ComplexFeature* complex_feature = GetAsComplexFeature("gamma.complex_unparented"); FeatureComparator comparator("gamma.complex_unparented"); comparator.contexts = {Feature::UNBLESSED_EXTENSION_CONTEXT}; @@ -178,7 +178,7 @@ comparator.CompareFeature(static_cast<SimpleFeature*>(feature.get())); } { - SimpleFeature* feature = GetAsSimpleFeature("delta"); + const SimpleFeature* feature = GetAsSimpleFeature("delta"); FeatureComparator comparator("delta"); comparator.contexts = {Feature::BLESSED_EXTENSION_CONTEXT, Feature::WEBUI_CONTEXT}; @@ -190,7 +190,7 @@ comparator.CompareFeature(feature); } { - SimpleFeature* feature = GetAsSimpleFeature("allEnum"); + const SimpleFeature* feature = GetAsSimpleFeature("allEnum"); FeatureComparator comparator("allEnum"); comparator.contexts = {Feature::BLESSED_EXTENSION_CONTEXT, Feature::BLESSED_WEB_PAGE_CONTEXT, @@ -210,7 +210,7 @@ } { // Omega is imported from a second .json file. - SimpleFeature* feature = GetAsSimpleFeature("omega"); + const SimpleFeature* feature = GetAsSimpleFeature("omega"); FeatureComparator comparator("omega"); comparator.contexts = {Feature::WEB_PAGE_CONTEXT}; comparator.channel.reset( @@ -220,24 +220,24 @@ } { // Features specifying 'nocompile' should not be generated at all. - SimpleFeature* feature = GetAsSimpleFeature("uncompiled"); + const SimpleFeature* feature = GetAsSimpleFeature("uncompiled"); EXPECT_FALSE(feature); } // Test complex features. { - ComplexFeature* feature = GetAsComplexFeature("complex"); + const ComplexFeature* feature = GetAsComplexFeature("complex"); ASSERT_TRUE(feature); EXPECT_EQ(2u, feature->features_.size()); // Find the default parent. This is a little tedious because it might not // be guaranteed that the default_parent is in a specific index, but it // specifies channel as 'stable'. - SimpleFeature* default_parent = nullptr; - SimpleFeature* other_parent = nullptr; + const SimpleFeature* default_parent = nullptr; + const SimpleFeature* other_parent = nullptr; { - SimpleFeature* parent1 = + const SimpleFeature* parent1 = static_cast<SimpleFeature*>(feature->features_[0].get()); - SimpleFeature* parent2 = + const SimpleFeature* parent2 = static_cast<SimpleFeature*>(feature->features_[1].get()); if (parent1->channel() == version_info::Channel::STABLE) { default_parent = parent1; @@ -257,7 +257,7 @@ comparator.CompareFeature(default_parent); // Check the child of the complex feature. It should inherit its // properties from the default parent. - SimpleFeature* child_feature = GetAsSimpleFeature("complex.child"); + const SimpleFeature* child_feature = GetAsSimpleFeature("complex.child"); comparator.name = "complex.child"; comparator.platforms = {Feature::WIN_PLATFORM}; comparator.dependencies = {"permission:complex.child"}; @@ -277,7 +277,7 @@ // Test API aliases. { - SimpleFeature* feature = GetAsSimpleFeature("alias"); + const SimpleFeature* feature = GetAsSimpleFeature("alias"); FeatureComparator comparator("alias"); comparator.contexts = {Feature::BLESSED_EXTENSION_CONTEXT}; comparator.channel.reset( @@ -286,7 +286,7 @@ comparator.CompareFeature(feature); } { - SimpleFeature* feature = GetAsSimpleFeature("alias_source"); + const SimpleFeature* feature = GetAsSimpleFeature("alias_source"); FeatureComparator comparator("alias_source"); comparator.contexts = {Feature::BLESSED_EXTENSION_CONTEXT}; comparator.channel.reset( @@ -295,37 +295,37 @@ comparator.CompareFeature(feature); } { - Feature* feature = provider.GetFeature("complex_alias"); + const Feature* feature = provider.GetFeature("complex_alias"); ASSERT_EQ("", feature->alias()); ASSERT_EQ("complex_alias_source", feature->source()); } { - Feature* feature = provider.GetFeature("complex_alias_source"); + const Feature* feature = provider.GetFeature("complex_alias_source"); ASSERT_EQ("complex_alias", feature->alias()); ASSERT_EQ("", feature->source()); } { - Feature* feature = provider.GetFeature("parent_source"); + const Feature* feature = provider.GetFeature("parent_source"); ASSERT_EQ("parent_source_alias", feature->alias()); ASSERT_EQ("", feature->source()); } { - Feature* feature = provider.GetFeature("parent_source.child"); + const Feature* feature = provider.GetFeature("parent_source.child"); ASSERT_EQ("parent_source_alias", feature->alias()); ASSERT_EQ("", feature->source()); } { - Feature* feature = provider.GetFeature("parent_source.child_source"); + const Feature* feature = provider.GetFeature("parent_source.child_source"); ASSERT_EQ("parent_source_child_alias", feature->alias()); ASSERT_EQ("", feature->source()); } { - Feature* feature = provider.GetFeature("alias_parent"); + const Feature* feature = provider.GetFeature("alias_parent"); ASSERT_EQ("", feature->alias()); ASSERT_EQ("", feature->source()); } { - Feature* feature = provider.GetFeature("alias_parent.child"); + const Feature* feature = provider.GetFeature("alias_parent.child"); ASSERT_EQ("", feature->alias()); ASSERT_EQ("child_source", feature->source()); }
diff --git a/tools/luci-go/linux64/isolate.sha1 b/tools/luci-go/linux64/isolate.sha1 index acecc79..f923147 100644 --- a/tools/luci-go/linux64/isolate.sha1 +++ b/tools/luci-go/linux64/isolate.sha1
@@ -1 +1 @@ -21410c557b49620e8a44ec0f861f94605bdc6d5c +48ffe036be8eff7d39ebbdbb705bd26f0ec6f404
diff --git a/tools/luci-go/mac64/isolate.sha1 b/tools/luci-go/mac64/isolate.sha1 index 16a7dd6a..328cc06 100644 --- a/tools/luci-go/mac64/isolate.sha1 +++ b/tools/luci-go/mac64/isolate.sha1
@@ -1 +1 @@ -1966687828a068eee4c5da45bbb8afd91cddda6f +f0d9ea71e7059a164962658b588286ebf262c5dd
diff --git a/tools/luci-go/win64/isolate.exe.sha1 b/tools/luci-go/win64/isolate.exe.sha1 index 6f5491d..8038c79 100644 --- a/tools/luci-go/win64/isolate.exe.sha1 +++ b/tools/luci-go/win64/isolate.exe.sha1
@@ -1 +1 @@ -35482264cea0f9b9dd2efe0a01620557fc15b7c1 +40790017e9b7856009c36768bf9244a4182ad5d1
diff --git a/tools/mb/docs/user_guide.md b/tools/mb/docs/user_guide.md index d31ea67..0abb235 100644 --- a/tools/mb/docs/user_guide.md +++ b/tools/mb/docs/user_guide.md
@@ -167,6 +167,18 @@ This is mostly useful as a presubmit check and for verifying changes to the config file. +### `mb gerrit-buildbucket-config` + +Generates a gerrit buildbucket configuration file and prints it to +stdout. This file contains the list of trybots shown in gerrit's UI. + +The master copy of the buildbucket.config file lives +in a separate branch of the chromium repository. Run `mb +gerrit-buildbucket-config > buildbucket.config.new && git fetch origin +refs/meta/config:refs/remotes/origin/meta/config && git checkout +-t -b meta_config origin/meta/config && mv buildbucket.config.new +buildbucket.config` to update the file. + ## Isolates and Swarming `mb gen` is also responsible for generating the `.isolate` and
diff --git a/tools/mb/mb.py b/tools/mb/mb.py index 6905bcc..90c42bf 100755 --- a/tools/mb/mb.py +++ b/tools/mb/mb.py
@@ -56,6 +56,7 @@ self.sep = os.sep self.args = argparse.Namespace() self.configs = {} + self.luci_tryservers = {} self.masters = {} self.mixins = {} @@ -235,6 +236,14 @@ ' do compiles') subp.set_defaults(func=self.CmdAudit) + subp = subps.add_parser('gerrit-buildbucket-config', + help='Print buildbucket.config for gerrit ' + '(see MB user guide)') + subp.add_argument('-f', '--config-file', metavar='PATH', + default=self.default_config, + help='path to config file (default is %(default)s)') + subp.set_defaults(func=self.CmdBuildbucket) + subp = subps.add_parser('help', help='Get help on a subcommand.') subp.add_argument(nargs='?', action='store', dest='subcommand', @@ -368,6 +377,25 @@ return ret + def CmdBuildbucket(self): + self.ReadConfigFile() + + self.Print('# This file was generated using ' + '"tools/mb/mb.py gerrit-buildbucket-config".') + + for luci_tryserver in sorted(self.luci_tryservers): + self.Print('[bucket "luci.%s"]' % luci_tryserver) + for bot in sorted(self.luci_tryservers[luci_tryserver]): + self.Print('\tbuilder = %s' % bot) + + for master in sorted(self.masters): + if master.startswith('tryserver.'): + self.Print('[bucket "master.%s"]' % master) + for bot in sorted(self.masters[master]): + self.Print('\tbuilder = %s' % bot) + + return 0 + def CmdValidate(self, print_ok=True): errs = [] @@ -674,6 +702,7 @@ (self.args.config_file, e)) self.configs = contents['configs'] + self.luci_tryservers = contents.get('luci_tryservers', {}) self.masters = contents['masters'] self.mixins = contents['mixins']
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index 063438b..32c68f6 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -525,6 +525,7 @@ 'cast_shell_audio_linux': 'cast_audio_release_trybot', 'chromeos_amd64-generic_chromium_compile_only_ng': 'cros_chrome_sdk', 'chromeos_daisy_chromium_compile_only_ng': 'cros_chrome_sdk', + 'chromium_presubmit': 'presubmit', 'closure_compilation': 'closure_compilation', 'fuchsia': 'release_trybot_fuchsia', 'fuchsia_compile': 'release_trybot_fuchsia', @@ -1415,6 +1416,11 @@ 'ozone_linux', 'release_trybot', ], + 'presubmit': [ + # The chromium_presubmit bot does not use mb. + 'error', + ], + 'release_afl_asan': [ 'release', 'afl', 'asan', 'chromeos_codecs', 'pdf_xfa', 'disable_nacl', ], @@ -1995,4 +2001,8 @@ 'gn_args': 'target_cpu="x86"', }, }, + + 'luci_tryservers': { + 'chromium.try': [ 'LUCI linux_chromium_rel_ng' ], + }, }
diff --git a/tools/mb/mb_unittest.py b/tools/mb/mb_unittest.py index 29b75cf..73c3e9c 100755 --- a/tools/mb/mb_unittest.py +++ b/tools/mb/mb_unittest.py
@@ -220,6 +220,28 @@ } """ +TRYSERVER_CONFIG = """\ +{ + 'masters': { + 'not_a_tryserver': { + 'fake_builder': 'fake_config', + }, + 'tryserver.chromium.linux': { + 'try_builder': 'fake_config', + }, + 'tryserver.chromium.mac': { + 'try_builder2': 'fake_config', + }, + }, + 'luci_tryservers': { + 'luci_tryserver1': ['luci_builder1'], + 'luci_tryserver2': ['luci_builder2'], + }, + 'configs': {}, + 'mixins': {}, +} +""" + class UnitTest(unittest.TestCase): def fake_mbw(self, files=None, win32=False): @@ -555,6 +577,22 @@ "LLVM_FORCE_HEAD_REVISION=1\n" "python build/gyp_chromium -G output_dir=_path_\n")) + def test_buildbucket(self): + mbw = self.fake_mbw() + mbw.files[mbw.default_config] = TRYSERVER_CONFIG + self.check(['gerrit-buildbucket-config'], mbw=mbw, + ret=0, + out=('# This file was generated using ' + '"tools/mb/mb.py gerrit-buildbucket-config".\n' + '[bucket "luci.luci_tryserver1"]\n' + '\tbuilder = luci_builder1\n' + '[bucket "luci.luci_tryserver2"]\n' + '\tbuilder = luci_builder2\n' + '[bucket "master.tryserver.chromium.linux"]\n' + '\tbuilder = try_builder\n' + '[bucket "master.tryserver.chromium.mac"]\n' + '\tbuilder = try_builder2\n')) + if __name__ == '__main__': unittest.main()
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 3b98f244..5cb67fc 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -2626,6 +2626,7 @@ <!-- Generated from components/guest_view/browser/bad_message.h --> <int value="0" label="GVM_EMBEDDER_FORBIDDEN_ACCESS_TO_GUEST"/> + <int value="1" label="GVM_INVALID_GUESTVIEW_TYPE"/> </enum> <enum name="BadMessageReasonNaCl"> @@ -22641,6 +22642,23 @@ <int value="4" label="Success"/> </enum> +<enum name="LockScreenActionAvailability"> + <int value="0" label="Available"/> + <int value="1" label="Not available - no action handler app"/> + <int value="2" label="Not available - app with no lock screen support"/> + <int value="3" label="Not available - action not enabled on lock screen"/> + <int value="4" label="Not available - disallowed by policy"/> +</enum> + +<enum name="LockScreenAppSessionState"> + <int value="0" label="Not launched"/> + <int value="1" label="Launching"/> + <int value="2" label="App window created"/> + <int value="3" label="App window shown"/> + <int value="4" label="App window in foreground"/> + <int value="5" label="App window in background"/> +</enum> + <enum name="LockScreenDataItemOperationResult"> <int value="0" label="Success"/> <int value="1" label="Operation failed"/> @@ -22651,6 +22669,22 @@ <int value="6" label="Wrong encryption key"/> </enum> +<enum name="LockScreenNoteTakingExitReason"> + <int value="0" label="Session was unlocked"/> + <int value="1" label="Session shutdown"/> + <int value="2" label="Screen turned off"/> + <int value="3" label="Device suspended"/> + <int value="4" label="App window closed"/> + <int value="5" label="Lock screen note taking disabled"/> +</enum> + +<enum name="LockScreenNoteTakingUnlockUIAction"> + <int value="0" label="User unlocked the session"/> + <int value="1" label="Session unlock was cancelled"/> + <int value="2" label="Device shut down"/> + <int value="3" label="User signed out"/> +</enum> + <enum name="LockScreenProgress"> <int value="0" label="Start screen lock"/> <int value="1" label="Enter password correctly"/> @@ -22670,6 +22704,7 @@ <int value="-2143328006" label="enable-fill-on-account-select-no-highlighting"/> <int value="-2143113994" label="enable-ephemeral-apps-in-webstore"/> + <int value="-2141661938" label="AnimatedAppMenuIcon:enabled"/> <int value="-2134717874" label="Multidevice:disabled"/> <int value="-2134333982" label="ShowArcFilesApp:enabled"/> <int value="-2134244069" label="HttpFormWarning:enabled"/> @@ -23505,6 +23540,7 @@ <int value="506680761" label="WebNFC:disabled"/> <int value="510814146" label="OfflineBookmarks:enabled"/> <int value="513356954" label="InstantTethering:disabled"/> + <int value="517568645" label="AnimatedAppMenuIcon:disabled"/> <int value="535131384" label="OmniboxTailSuggestions:enabled"/> <int value="535976218" label="enable-plugin-power-saver"/> <int value="538468149" label="OfflinePagesCT:enabled"/> @@ -27021,6 +27057,14 @@ <int value="6" label="Unknown"/> </enum> +<enum name="NewLockScreenNoteRequestType"> + <int value="0" label="System tray action"/> + <int value="1" label="Lock screen - button tap"/> + <int value="2" label="Lock screen - swipe gesture"/> + <int value="3" label="Lock screen - button activated by keyboard"/> + <int value="4" label="Stylus ejected"/> +</enum> + <enum name="NewTabPageActionAndroid"> <obsolete> Deprecated as of 01/2017. Replaced by NewTabPageActionAndroid2.
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index 375f689..56edb6b 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -1803,6 +1803,120 @@ </summary> </histogram> +<histogram base="true" name="Apps.LockScreen.NoteTakingApp.AppWindowLifeTime" + units="ms"> + <owner>tbarzic@chromium.org</owner> + <owner>tbuckley@chromium.org</owner> + <summary> + The amount of time a lock screen enabled app window spent in a certain state + during the app window activity. The state to which the histogram refers to + is defined by the suffix. The metric is logged upon leaving the associated + state. + </summary> +</histogram> + +<histogram name="Apps.LockScreen.NoteTakingApp.AvailabilityOnScreenLock" + enum="LockScreenActionAvailability"> + <owner>tbarzic@chromium.org</owner> + <owner>tbuckley@chromium.org</owner> + <summary> + The note taking action availability state on the lock screen, recorded when + the user session is locked. + </summary> +</histogram> + +<histogram name="Apps.LockScreen.NoteTakingApp.FinalAppSessionState" + enum="LockScreenAppSessionState"> + <owner>tbarzic@chromium.org</owner> + <owner>tbuckley@chromium.org</owner> + <summary> + The state in which lock screen enabled note taking app was when the note + taking session ended. + </summary> +</histogram> + +<histogram name="Apps.LockScreen.NoteTakingApp.LaunchDurationAtLaunchCancel" + units="ms"> + <owner>tbarzic@chromium.org</owner> + <owner>tbuckley@chromium.org</owner> + <summary> + The amount time a lock screen app had been launching when the app launch was + canceled. Logged if the lock screen app session ends before the lock screen + app window is shown. + </summary> +</histogram> + +<histogram name="Apps.LockScreen.NoteTakingApp.LaunchRequestOrdinalNumber"> + <owner>tbarzic@chromium.org</owner> + <owner>tbuckley@chromium.org</owner> + <summary> + Ordinal number of a note taking app launch request from a lock screen within + a lock screen session. If a note taking app is launched n times during a + single lock screen session, this histogram will be reported with values 1 + through n. The launch counter is reset on screen unlock. + </summary> +</histogram> + +<histogram name="Apps.LockScreen.NoteTakingApp.LaunchRequestReason" + enum="NewLockScreenNoteRequestType"> + <owner>tbarzic@chromium.org</owner> + <owner>tbuckley@chromium.org</owner> + <summary> + The user action that launched note taking from the lock screen. + </summary> +</histogram> + +<histogram name="Apps.LockScreen.NoteTakingApp.LockScreenInstallationDuration" + units="ms"> + <owner>tbarzic@chromium.org</owner> + <owner>tbuckley@chromium.org</owner> + <summary> + Amount of time needed to install a copy of a lock screen note taking app + into lock screen apps profile. + </summary> +</histogram> + +<histogram name="Apps.LockScreen.NoteTakingApp.NoteTakingExitReason" + enum="LockScreenNoteTakingExitReason"> + <owner>tbarzic@chromium.org</owner> + <owner>tbuckley@chromium.org</owner> + <summary> + The reason the note taking on lock screen was ended (and lock screen app + window was closed). + </summary> +</histogram> + +<histogram name="Apps.LockScreen.NoteTakingApp.TimeToLoadAppWindowContents" + units="ms"> + <owner>tbarzic@chromium.org</owner> + <owner>tbuckley@chromium.org</owner> + <summary> + The amount of time needed to load a note taking app window contents on the + lock screen - i.e. the time passed from the user requesting an app launch to + the app window contents being loaded. + </summary> +</histogram> + +<histogram name="Apps.LockScreen.NoteTakingApp.TimeToShowWindow" units="ms"> + <owner>tbarzic@chromium.org</owner> + <owner>tbuckley@chromium.org</owner> + <summary> + The amount of time needed to launch a note taking app window from the lock + screen - i.e. the time passed from the user requesting an app launch to the + app window appearing on the screen. + </summary> +</histogram> + +<histogram name="Apps.LockScreen.NoteTakingApp.UnlockUIAction" + enum="LockScreenNoteTakingUnlockUIAction"> + <owner>tbarzic@chromium.org</owner> + <owner>tbuckley@chromium.org</owner> + <summary> + The action the user took on the lock screen UI shown when lock screen app + window is in background, shown under the lock screen. + </summary> +</histogram> + <histogram name="Apps.NoteTakingApp.DefaultLaunchResult" enum="NoteTakingAppLaunchResult"> <owner>derat@chromium.org</owner> @@ -53133,6 +53247,9 @@ </histogram> <histogram name="Parser.AppendBytesDelay" units="ms"> + <obsolete> + Deprecated Aug 2017 + </obsolete> <owner>csharrison@chromium.org</owner> <summary> The delay from when bytes are received on the main thread to when the @@ -53160,6 +53277,9 @@ </histogram> <histogram name="Parser.PeakPendingChunkCount" units="chunks"> + <obsolete> + Deprecated Aug 2017 + </obsolete> <owner>csharrison@chromium.org</owner> <summary> The maximum number of pending Chunks in the ParsedChunkQueue after the @@ -53168,6 +53288,9 @@ </histogram> <histogram name="Parser.PeakPendingTokenCount" units="tokens"> + <obsolete> + Deprecated Aug 2017 + </obsolete> <owner>csharrison@chromium.org</owner> <summary> The maximum number of pending tokens in the ParsedChunkQueue after the @@ -94223,6 +94346,16 @@ <affected-histogram name="Apps.LockScreen.DataItemStorage.OperationResult"/> </histogram_suffixes> +<histogram_suffixes name="LockScreenNoteTakingAppWindowState" separator="."> + <suffix name="Foreground" + label="The app window is in foreground (on top of the lock screen)"/> + <suffix name="Background" + label="The app window is in background (behind the lock screen)"/> + <suffix name="TotalActive" + label="The total amount of time an app window was active on lock screen"/> + <affected-histogram name="Apps.LockScreen.NoteTakingApp.AppWindowLifeTime"/> +</histogram_suffixes> + <histogram_suffixes name="LowMemoryMargin" separator="_"> <suffix name="default" label="Low memory margin set to the system default"/> <suffix name="off" label="Low memory notification disabled"/>
diff --git a/tools/perf/benchmark.csv b/tools/perf/benchmark.csv index db4f23a..91defb5 100644 --- a/tools/perf/benchmark.csv +++ b/tools/perf/benchmark.csv
@@ -10,6 +10,7 @@ blink_perf.dom,"jbroman@chromium.org, yukishiino@chromium.org, haraken@chromium.org", blink_perf.events,hayato@chromium.org, blink_perf.layout,eae@chromium.org, +blink_perf.owp_storage,dmurph@chromium.org, blink_perf.paint,wangxianzhu@chromium.org, blink_perf.parser,"jbroman@chromium.org, yukishiino@chromium.org, haraken@chromium.org", blink_perf.shadow_dom,hayato@chromium.org, @@ -51,8 +52,8 @@ power.steady_state,, power.trivial_pages,erikchen@chromium.org, power.typical_10_mobile,perezju@chromium.org, -rasterize_and_record_micro.partial_invalidation,, -rasterize_and_record_micro.top_25,, +rasterize_and_record_micro.partial_invalidation,"vmpstr@chromium.org, wkorman@chromium.org",Internals>Compositing>Rasterization +rasterize_and_record_micro.top_25,"vmpstr@chromium.org, wkorman@chromium.org",Internals>Compositing>Rasterization resource_sizes,"agrieve@chromium.org, rnephew@chromium.org, perezju@chromium.org", scheduler.tough_scheduling_cases,"skyostil@chromium.org, brianderson@chromium.org", service_worker.service_worker,horo@chromium.org,
diff --git a/tools/perf/benchmarks/blink_perf.py b/tools/perf/benchmarks/blink_perf.py index 2016be9e6..122785e 100644 --- a/tools/perf/benchmarks/blink_perf.py +++ b/tools/perf/benchmarks/blink_perf.py
@@ -358,7 +358,10 @@ def GetExpectations(self): class StoryExpectations(story.expectations.StoryExpectations): def SetExpectations(self): - pass # Nothing disabled. + self.DisableStory('structured-clone-long-string-deserialize.html', + [story.expectations.ALL_ANDROID], 'crbug.com/733655') + self.DisableStory('structured-clone-long-string-serialize.html', + [story.expectations.ALL_ANDROID], 'crbug.com/733655') return StoryExpectations() @@ -444,6 +447,19 @@ return Expectations() +@benchmark.Owner(emails=['dmurph@chromium.org']) +@benchmark.Disabled('all') +class BlinkPerfOWPStorage(_BlinkPerfBenchmark): + tag = 'owp_storage' + subdir = 'OWPStorage' + + def GetExpectations(self): + class StoryExpectations(story.expectations.StoryExpectations): + def SetExpectations(self): + pass # Nothing disabled. + return StoryExpectations() + + @benchmark.Owner(emails=['wangxianzhu@chromium.org']) class BlinkPerfPaint(_BlinkPerfBenchmark): tag = 'paint'
diff --git a/tools/perf/benchmarks/memory.py b/tools/perf/benchmarks/memory.py index 5722153..472b0b2 100644 --- a/tools/perf/benchmarks/memory.py +++ b/tools/perf/benchmarks/memory.py
@@ -132,6 +132,11 @@ return False @classmethod + def ShouldTearDownStateAfterEachStorySetRun(cls): + # Browser will now be closed as instructed by the shared state. + return False + + @classmethod def ValueCanBeAddedPredicate(cls, value, is_first_result): return DefaultValueCanBeAddedPredicateForMemoryMeasurement(value)
diff --git a/tools/perf/benchmarks/rasterize_and_record_micro.py b/tools/perf/benchmarks/rasterize_and_record_micro.py index 1a8ece57..c950055 100644 --- a/tools/perf/benchmarks/rasterize_and_record_micro.py +++ b/tools/perf/benchmarks/rasterize_and_record_micro.py
@@ -6,6 +6,7 @@ from measurements import rasterize_and_record_micro import page_sets +from telemetry import benchmark from telemetry import story @@ -43,6 +44,9 @@ options.record_repeat, options.timeout, options.report_detailed_results) +@benchmark.Owner( + emails=['vmpstr@chromium.org', 'wkorman@chromium.org'], + component='Internals>Compositing>Rasterization') class RasterizeAndRecordMicroTop25(_RasterizeAndRecordMicro): """Measures rasterize and record performance on the top 25 web pages. @@ -59,11 +63,14 @@ self.DisableStory('http://www.cnn.com', [story.expectations.ALL], 'crbug.com/528472') self.DisableStory('https://mail.google.com/mail/', - [story.expectations.ALL_LINUX], + [story.expectations.ALL], 'crbug.com/747021') return StoryExpectations() +@benchmark.Owner( + emails=['vmpstr@chromium.org', 'wkorman@chromium.org'], + component='Internals>Compositing>Rasterization') class RasterizeAndRecordMicroPartialInvalidation(_RasterizeAndRecordMicro): """Measures rasterize and record performance for partial inval. on big pages.
diff --git a/tools/perf/benchmarks/service_worker.py b/tools/perf/benchmarks/service_worker.py index a6845ea..58e3faa 100644 --- a/tools/perf/benchmarks/service_worker.py +++ b/tools/perf/benchmarks/service_worker.py
@@ -202,5 +202,7 @@ def GetExpectations(self): class StoryExpectations(story.expectations.StoryExpectations): def SetExpectations(self): - pass # Nothing disabled. + self.DisableStory('http://localhost:8091/index.html', + [story.expectations.ANDROID_WEBVIEW], + 'crbug.com/653924') return StoryExpectations()
diff --git a/tools/perf/benchmarks/smoothness.py b/tools/perf/benchmarks/smoothness.py index 2cbc6f5..a790149 100644 --- a/tools/perf/benchmarks/smoothness.py +++ b/tools/perf/benchmarks/smoothness.py
@@ -439,7 +439,82 @@ def GetExpectations(self): class StoryExpectations(story_module.expectations.StoryExpectations): def SetExpectations(self): - pass # Nothing. + self.DisableStory('https://www.google.com/#hl=en&q=barack+obama', + [story_module.expectations.ALL_ANDROID, + story_module.expectations.ALL_WIN], + 'crbug.com/631015') + self.DisableStory('https://mail.google.com/mail/', + [story_module.expectations.ALL_ANDROID, + story_module.expectations.ALL_WIN], + 'crbug.com/631015') + self.DisableStory('https://www.google.com/calendar/', + [story_module.expectations.ALL_ANDROID, + story_module.expectations.ALL_WIN], + 'crbug.com/631015') + self.DisableStory('https://www.google.com/search?q=cats&tbm=isch', + [story_module.expectations.ALL_ANDROID, + story_module.expectations.ALL_WIN], + 'crbug.com/631015') + self.DisableStory('http://www.youtube.com', + [story_module.expectations.ALL_ANDROID, + story_module.expectations.ALL_WIN], + 'crbug.com/631015') + self.DisableStory('Blogger', + [story_module.expectations.ALL_ANDROID, + story_module.expectations.ALL_WIN], + 'crbug.com/631015') + self.DisableStory('Facebook', + [story_module.expectations.ALL_ANDROID, + story_module.expectations.ALL_WIN], + 'crbug.com/631015') + self.DisableStory('LinkedIn', + [story_module.expectations.ALL_ANDROID, + story_module.expectations.ALL_WIN], + 'crbug.com/631015') + self.DisableStory('Wikipedia (1 tab)', + [story_module.expectations.ALL_ANDROID, + story_module.expectations.ALL_WIN], + 'crbug.com/631015') + self.DisableStory('Twitter', + [story_module.expectations.ALL_ANDROID, + story_module.expectations.ALL_WIN], + 'crbug.com/631015') + self.DisableStory('ESPN', + [story_module.expectations.ALL_ANDROID, + story_module.expectations.ALL_WIN], + 'crbug.com/631015') + self.DisableStory('http://news.yahoo.com', + [story_module.expectations.ALL_ANDROID, + story_module.expectations.ALL_WIN], + 'crbug.com/631015') + self.DisableStory('http://www.cnn.com', + [story_module.expectations.ALL_ANDROID, + story_module.expectations.ALL_WIN], + 'crbug.com/631015') + self.DisableStory('Weather.com', + [story_module.expectations.ALL_ANDROID, + story_module.expectations.ALL_WIN], + 'crbug.com/631015') + self.DisableStory('http://www.amazon.com', + [story_module.expectations.ALL_ANDROID, + story_module.expectations.ALL_WIN], + 'crbug.com/631015') + self.DisableStory('http://www.ebay.com', + [story_module.expectations.ALL_ANDROID, + story_module.expectations.ALL_WIN], + 'crbug.com/631015') + self.DisableStory('http://games.yahoo.com', + [story_module.expectations.ALL_ANDROID, + story_module.expectations.ALL_WIN], + 'crbug.com/631015') + self.DisableStory('http://booking.com', + [story_module.expectations.ALL_ANDROID, + story_module.expectations.ALL_WIN], + 'crbug.com/631015') + self.DisableStory('http://sports.yahoo.com/', + [story_module.expectations.ALL_ANDROID, + story_module.expectations.ALL_WIN], + 'crbug.com/631015') return StoryExpectations() @@ -480,9 +555,63 @@ return 'smoothness.gpu_rasterization.tough_pinch_zoom_cases' def GetExpectations(self): + class StoryExpectations(story_module.expectations.StoryExpectations): + def SetExpectations(self): - pass # Nothing. + self.DisableStory('https://www.google.com/#hl=en&q=barack+obama', + [story_module.expectations.ALL_ANDROID], + 'crbug.com/610021') + self.DisableStory('https://mail.google.com/mail/', + [story_module.expectations.ALL_ANDROID], + 'crbug.com/610021') + self.DisableStory('https://www.google.com/calendar/', + [story_module.expectations.ALL_ANDROID], + 'crbug.com/610021') + self.DisableStory('https://www.google.com/search?q=cats&tbm=isch', + [story_module.expectations.ALL_ANDROID], + 'crbug.com/610021') + self.DisableStory('http://www.youtube.com', + [story_module.expectations.ALL_ANDROID], + 'crbug.com/610021') + self.DisableStory('Blogger', [story_module.expectations.ALL_ANDROID], + 'crbug.com/610021') + self.DisableStory('Facebook', [story_module.expectations.ALL_ANDROID], + 'crbug.com/610021') + self.DisableStory('LinkedIn', [story_module.expectations.ALL_ANDROID], + 'crbug.com/610021') + self.DisableStory('Wikipedia (1 tab)', + [story_module.expectations.ALL_ANDROID], + 'crbug.com/610021') + self.DisableStory('Twitter', [story_module.expectations.ALL_ANDROID], + 'crbug.com/610021') + self.DisableStory('ESPN', [story_module.expectations.ALL_ANDROID], + 'crbug.com/610021') + self.DisableStory('http://news.yahoo.com', + [story_module.expectations.ALL_ANDROID], + 'crbug.com/610021') + self.DisableStory('http://www.cnn.com', + [story_module.expectations.ALL_ANDROID], + 'crbug.com/610021') + self.DisableStory('Weather.com', + [story_module.expectations.ALL_ANDROID], + 'crbug.com/610021') + self.DisableStory('http://www.amazon.com', + [story_module.expectations.ALL_ANDROID], + 'crbug.com/610021') + self.DisableStory('http://www.ebay.com', + [story_module.expectations.ALL_ANDROID], + 'crbug.com/610021') + self.DisableStory('http://games.yahoo.com', + [story_module.expectations.ALL_ANDROID], + 'crbug.com/610021') + self.DisableStory('http://booking.com', + [story_module.expectations.ALL_ANDROID], + 'crbug.com/610021') + self.DisableStory('http://sports.yahoo.com/', + [story_module.expectations.ALL_ANDROID], + 'crbug.com/610021') + return StoryExpectations()
diff --git a/tools/perf/contrib/memory_extras/memory_extras.py b/tools/perf/contrib/memory_extras/memory_extras.py index abf810c06..33751abd 100644 --- a/tools/perf/contrib/memory_extras/memory_extras.py +++ b/tools/perf/contrib/memory_extras/memory_extras.py
@@ -18,18 +18,26 @@ on a webview-based browser (a stand in for the Search app), and loading pages on a select browser. """ - page_set = page_sets.DualBrowserStorySet options = {'pageset_repeat': 5} @classmethod def Name(cls): return 'memory.dual_browser_test' + def CreateStorySet(self, options): + del options + return page_sets.DualBrowserStorySet() + @classmethod def ShouldTearDownStateAfterEachStoryRun(cls): return False @classmethod + def ShouldTearDownStateAfterEachStorySetRun(cls): + # Browser will now be closed as instructed by the shared state. + return False + + @classmethod def ValueCanBeAddedPredicate(cls, value, is_first_result): # TODO(crbug.com/610962): Remove this stopgap when the perf dashboard # is able to cope with the data load generated by TBMv2 metrics. @@ -49,13 +57,16 @@ Same as memory.dual_browser_test, but the test is run for 60 iterations and the browser is *not* restarted between page set repeats. """ - page_set = page_sets.DualBrowserStorySet options = {'pageset_repeat': 60} @classmethod def Name(cls): return 'memory.long_running_dual_browser_test' + def CreateStorySet(self, options): + del options + return page_sets.DualBrowserStorySet(long_running=True) + @classmethod def ShouldTearDownStateAfterEachStoryRun(cls): return False
diff --git a/tools/perf/page_sets/data/kraken.json b/tools/perf/page_sets/data/kraken.json index a9b1d44..550d051e 100644 --- a/tools/perf/page_sets/data/kraken.json +++ b/tools/perf/page_sets/data/kraken.json
@@ -1,7 +1,7 @@ { "archives": { "http://krakenbenchmark.mozilla.org/kraken-1.1/driver.html": { - "DEFAULT": "kraken_000.wpr" + "DEFAULT": "kraken_000.wprgo" } }, "description": "Describes the Web Page Replay archives for a story set. Don't edit by hand! Use record_wpr for updating.",
diff --git a/tools/perf/page_sets/data/kraken_000.wpr.sha1 b/tools/perf/page_sets/data/kraken_000.wpr.sha1 deleted file mode 100644 index 5b47e88..0000000 --- a/tools/perf/page_sets/data/kraken_000.wpr.sha1 +++ /dev/null
@@ -1 +0,0 @@ -c096ee93213072a013e1799e07e1337cc2a2e806 \ No newline at end of file
diff --git a/tools/perf/page_sets/data/kraken_000.wprgo.sha1 b/tools/perf/page_sets/data/kraken_000.wprgo.sha1 new file mode 100644 index 0000000..dc6a6463f --- /dev/null +++ b/tools/perf/page_sets/data/kraken_000.wprgo.sha1
@@ -0,0 +1 @@ +cdf2ba76caaf50bddf279601dbc268c3aee99a3f \ No newline at end of file
diff --git a/tools/perf/page_sets/data/oortonline.json b/tools/perf/page_sets/data/oortonline.json index 77c5982e..4ca5c7e7 100644 --- a/tools/perf/page_sets/data/oortonline.json +++ b/tools/perf/page_sets/data/oortonline.json
@@ -1,7 +1,7 @@ { "archives": { "http://oortonline.gl/#run": { - "DEFAULT": "oortonline_000.wpr" + "DEFAULT": "oortonline_000.wprgo" } }, "description": "Describes the Web Page Replay archives for a story set. Don't edit by hand! Use record_wpr for updating.",
diff --git a/tools/perf/page_sets/data/oortonline_000.wpr.sha1 b/tools/perf/page_sets/data/oortonline_000.wpr.sha1 deleted file mode 100644 index 8131fd8..0000000 --- a/tools/perf/page_sets/data/oortonline_000.wpr.sha1 +++ /dev/null
@@ -1 +0,0 @@ -b89e7b2fbbc545d60c5b061ec83c65175e59d284 \ No newline at end of file
diff --git a/tools/perf/page_sets/data/oortonline_000.wprgo.sha1 b/tools/perf/page_sets/data/oortonline_000.wprgo.sha1 new file mode 100644 index 0000000..b462b7e --- /dev/null +++ b/tools/perf/page_sets/data/oortonline_000.wprgo.sha1
@@ -0,0 +1 @@ +911b8a870ce29bed1adcded2e35b6be648660f42 \ No newline at end of file
diff --git a/tools/perf/page_sets/data/speedometer.json b/tools/perf/page_sets/data/speedometer.json index 125b78c..c6912cf3c 100644 --- a/tools/perf/page_sets/data/speedometer.json +++ b/tools/perf/page_sets/data/speedometer.json
@@ -1,7 +1,7 @@ { "archives": { "http://browserbench.org/Speedometer/": { - "DEFAULT": "speedometer_000.wpr" + "DEFAULT": "speedometer_000.wprgo" } }, "description": "Describes the Web Page Replay archives for a story set. Don't edit by hand! Use record_wpr for updating.",
diff --git a/tools/perf/page_sets/data/speedometer_000.wpr.sha1 b/tools/perf/page_sets/data/speedometer_000.wpr.sha1 deleted file mode 100644 index 5388525..0000000 --- a/tools/perf/page_sets/data/speedometer_000.wpr.sha1 +++ /dev/null
@@ -1 +0,0 @@ -d9a5aa1403c33b623aafdcaa3be65a3edc568499 \ No newline at end of file
diff --git a/tools/perf/page_sets/data/speedometer_000.wprgo.sha1 b/tools/perf/page_sets/data/speedometer_000.wprgo.sha1 new file mode 100644 index 0000000..13e4893 --- /dev/null +++ b/tools/perf/page_sets/data/speedometer_000.wprgo.sha1
@@ -0,0 +1 @@ +962642b357699cdf4aca5c51ea37f9a3faec339d \ No newline at end of file
diff --git a/tools/perf/page_sets/data/v8_top_25.json b/tools/perf/page_sets/data/v8_top_25.json index 3df5c96..64a5b172 100644 --- a/tools/perf/page_sets/data/v8_top_25.json +++ b/tools/perf/page_sets/data/v8_top_25.json
@@ -1,109 +1,109 @@ { "archives": { "http://edition.cnn.com": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" }, "http://hi.wikipedia.org/wiki/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" }, "http://inbox.google.com": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" }, "http://maps.google.co.jp/maps/search/restaurant+tokyo": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" }, "http://meta.discourse.org": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" }, "http://pollouer.muc/Speedometer/CustomRunner.html?angular": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" }, "http://pollouer.muc/Speedometer/CustomRunner.html?backbone": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" }, "http://pollouer.muc/Speedometer/CustomRunner.html?ember": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" }, "http://pollouer.muc/Speedometer/CustomRunner.html?jquery": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" }, "http://pollouer.muc/Speedometer/CustomRunner.html?vanilla": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" }, "http://reddit.musicplayer.io": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" }, "http://weibo.com": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" }, "http://world.taobao.com": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" }, "http://www.amazon.com/s/?field-keywords=v8": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" }, "http://www.baidu.com/s?wd=v8": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" }, "http://www.bing.com/search?q=v8+engine": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" }, "http://www.ebay.fr/sch/i.html?_nkw=v8": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" }, "http://www.instagram.com/archdigest": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" }, "http://www.msn.com/ar-ae": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" }, "http://www.pinterest.com/categories/popular": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" }, "http://www.qq.com": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" }, "http://www.reddit.com": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" }, "http://www.sina.com.cn": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" }, "http://www.twitter.com/taylorswift13": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" }, "http://www.wikiwand.com/en/hill": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" }, "http://www.yahoo.co.jp": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" }, "http://yandex.ru/search/?text=v8": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" }, "https://adwords.google.com": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" }, "https://cdn.ampproject.org/c/www.bbc.co.uk/news/amp/37344292#log=3": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" }, "https://en.wikipedia.org/w/index.php?title=Barack_Obama&veaction=edit": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" }, "https://www.facebook.com/shakira": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" }, "https://www.google.de/search?q=v8": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" }, "https://www.linkedin.com/m/": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" }, "https://www.youtube.com": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" }, "https://www.youtube.com/watch?v=_kZsOISarzg": { - "DEFAULT": "v8_top_25_000.wpr" + "DEFAULT": "v8_top_25_000.wprgo" } }, "description": "Describes the Web Page Replay archives for a story set. Don't edit by hand! Use record_wpr for updating.",
diff --git a/tools/perf/page_sets/data/v8_top_25_000.wpr.sha1 b/tools/perf/page_sets/data/v8_top_25_000.wpr.sha1 deleted file mode 100644 index 791ed2c..0000000 --- a/tools/perf/page_sets/data/v8_top_25_000.wpr.sha1 +++ /dev/null
@@ -1 +0,0 @@ -f15edfe658462c60bd651d46f476008296af42e1 \ No newline at end of file
diff --git a/tools/perf/page_sets/data/v8_top_25_000.wprgo.sha1 b/tools/perf/page_sets/data/v8_top_25_000.wprgo.sha1 new file mode 100644 index 0000000..4c354c74 --- /dev/null +++ b/tools/perf/page_sets/data/v8_top_25_000.wprgo.sha1
@@ -0,0 +1 @@ +69afbb4fc7875bfef69f4134f0e981fa492f4181 \ No newline at end of file
diff --git a/tools/perf/page_sets/desktop_memory.py b/tools/perf/page_sets/desktop_memory.py index 59f9005..aef9de34d 100644 --- a/tools/perf/page_sets/desktop_memory.py +++ b/tools/perf/page_sets/desktop_memory.py
@@ -6,17 +6,24 @@ from telemetry.page import page as page_module from telemetry.page import shared_page_state -from telemetry import story +from telemetry import story as story_module _DUMP_WAIT_TIME = 3 _ITERATIONS = 10 + +class DesktopMemorySharedState(shared_page_state.SharedDesktopPageState): + def ShouldStopBrowserAfterStoryRun(self, story): + del story + return False # Keep the same browser instance open across stories. + + class DesktopMemoryPage(page_module.Page): def __init__(self, url, page_set): super(DesktopMemoryPage, self).__init__( url=url, page_set=page_set, - shared_page_state_class=shared_page_state.SharedDesktopPageState, + shared_page_state_class=DesktopMemorySharedState, name=url) def _DumpMemory(self, action_runner, phase): @@ -45,7 +52,7 @@ self._DumpMemory(action_runner, 'post') -class DesktopMemoryPageSet(story.StorySet): +class DesktopMemoryPageSet(story_module.StorySet): """ Desktop sites with interesting memory characteristics """
diff --git a/tools/perf/page_sets/dual_browser_story.py b/tools/perf/page_sets/dual_browser_story.py index e50fbe7..6ba5f2f 100644 --- a/tools/perf/page_sets/dual_browser_story.py +++ b/tools/perf/page_sets/dual_browser_story.py
@@ -179,6 +179,11 @@ self._current_story.Run(self) def DidRunStory(self, _): + if (not self._story_set.long_running and + self._story_set[-1] == self._current_story): + # In long_running mode we never close the browsers; otherwise we close + # them only after the last story in the set runs. + self._CloseAllBrowsers() self._current_story = None def TakeMemoryMeasurement(self): @@ -238,10 +243,11 @@ class DualBrowserStorySet(story_module.StorySet): """A story set that switches back and forth between two browsers.""" - def __init__(self): + def __init__(self, long_running=False): super(DualBrowserStorySet, self).__init__( archive_data_file='data/dual_browser_story.json', cloud_storage_bucket=story_module.PARTNER_BUCKET) + self.long_running = long_running for query, url in zip(SEARCH_QUERIES, URL_LIST): # Stories that run on the android-webview browser.
diff --git a/tools/perf/page_sets/memory_top_10_mobile.py b/tools/perf/page_sets/memory_top_10_mobile.py index 260af357..0a7239d 100644 --- a/tools/perf/page_sets/memory_top_10_mobile.py +++ b/tools/perf/page_sets/memory_top_10_mobile.py
@@ -6,13 +6,25 @@ from telemetry.page import page as page_module from telemetry.page import shared_page_state -from telemetry import story +from telemetry import story as story_module from devil.android.sdk import keyevent # pylint: disable=import-error from page_sets import top_10_mobile +class Top10MobileSharedState(shared_page_state.SharedMobilePageState): + def __init__(self, test, finder_options, story_set): + super(Top10MobileSharedState, self).__init__( + test, finder_options, story_set) + self._story_set = story_set + + def ShouldStopBrowserAfterStoryRun(self, story): + # Close the browser after the last story in the set. + # TODO(crbug.com/750055): Switch to close after each background page. + return self._story_set[-1] == story + + class MemoryMeasurementPage(page_module.Page): """Abstract class for measuring memory on a story unit.""" @@ -21,7 +33,7 @@ def __init__(self, story_set, name, url): super(MemoryMeasurementPage, self).__init__( page_set=story_set, name=name, url=url, - shared_page_state_class=shared_page_state.SharedMobilePageState, + shared_page_state_class=Top10MobileSharedState, grouping_keys={'phase': self._PHASE}) @@ -61,14 +73,14 @@ keyevent.KEYCODE_BACK) -class MemoryTop10Mobile(story.StorySet): +class MemoryTop10Mobile(story_module.StorySet): """User story to measure foreground/background memory in top 10 mobile.""" DETERMINISTIC_MODE = True def __init__(self): super(MemoryTop10Mobile, self).__init__( archive_data_file='data/memory_top_10_mobile.json', - cloud_storage_bucket=story.PARTNER_BUCKET) + cloud_storage_bucket=story_module.PARTNER_BUCKET) for url in top_10_mobile.URL_LIST: # We name pages so their foreground/background counterparts are easy
diff --git a/tools/perf/scripts_smoke_unittest.py b/tools/perf/scripts_smoke_unittest.py index c6d0fa6..da2e82a 100644 --- a/tools/perf/scripts_smoke_unittest.py +++ b/tools/perf/scripts_smoke_unittest.py
@@ -6,9 +6,11 @@ import os import subprocess import sys -from telemetry.testing import options_for_unittests import unittest +from telemetry import decorators +from telemetry.testing import options_for_unittests + class ScriptsSmokeTest(unittest.TestCase): @@ -58,6 +60,7 @@ self.assertEquals(return_code, 0, stdout) self.assertIn('kraken', stdout) + @decorators.Disabled('chromeos') # crbug.com/754913 def testRunTelemetryBenchmarkAsGoogletest(self): options = options_for_unittests.GetCopy() browser_type = options.browser_type
diff --git a/tools/perf/unowned_benchmarks.txt b/tools/perf/unowned_benchmarks.txt index b3d2d7f..2a892f4 100644 --- a/tools/perf/unowned_benchmarks.txt +++ b/tools/perf/unowned_benchmarks.txt
@@ -2,8 +2,6 @@ load_library_perf_tests power.idle_platform power.steady_state -rasterize_and_record_micro.partial_invalidation -rasterize_and_record_micro.top_25 smoothness.tough_image_decode_cases start_with_ext.cold.blank_page start_with_ext.warm.blank_page
diff --git a/tools/unused-symbols-report.py b/tools/unused-symbols-report.py index 900bf16e..993e436b 100755 --- a/tools/unused-symbols-report.py +++ b/tools/unused-symbols-report.py
@@ -42,7 +42,8 @@ sym = sym.replace('std::basic_string<wchar_t, std::char_traits<wchar_t>, ' 'std::allocator<wchar_t> >', 'std::wstring') sym = sym.replace('std::basic_string<unsigned short, ' - 'base::string16_char_traits, ' + 'base::string16_internals::' + 'string16_char_traits, ' 'std::allocator<unsigned short> >', 'string16') sym = re.sub(r', std::allocator<\S+\s+>', '', sym) return sym
diff --git a/ui/accessibility/platform/ax_platform_node_mac.mm b/ui/accessibility/platform/ax_platform_node_mac.mm index 2c2bd33..56dab4a 100644 --- a/ui/accessibility/platform/ax_platform_node_mac.mm +++ b/ui/accessibility/platform/ax_platform_node_mac.mm
@@ -69,7 +69,9 @@ {ui::AX_ROLE_FOOTER, NSAccessibilityGroupRole}, {ui::AX_ROLE_FORM, NSAccessibilityGroupRole}, {ui::AX_ROLE_GENERIC_CONTAINER, NSAccessibilityGroupRole}, - {ui::AX_ROLE_GRID, NSAccessibilityGridRole}, + // Should be NSAccessibilityGridRole but VoiceOver treating it like + // a list as of 10.12.6, so following WebKit and using table role: + {ui::AX_ROLE_GRID, NSAccessibilityTableRole}, // crbug.com/753925 {ui::AX_ROLE_GROUP, NSAccessibilityGroupRole}, {ui::AX_ROLE_HEADING, @"AXHeading"}, {ui::AX_ROLE_IFRAME, NSAccessibilityGroupRole},
diff --git a/ui/android/BUILD.gn b/ui/android/BUILD.gn index e15ae48..65e9a6e1 100644 --- a/ui/android/BUILD.gn +++ b/ui/android/BUILD.gn
@@ -61,6 +61,7 @@ "//components/viz/host", "//components/viz/service", "//skia", + "//third_party/WebKit/public:blink_headers", "//ui/base", "//ui/display", "//ui/events", @@ -248,7 +249,10 @@ "//third_party/android_tools:android_support_annotations_java", "//third_party/android_tools:android_support_v7_appcompat_java", ] - srcjar_deps = [ ":java_enums_srcjar" ] + srcjar_deps = [ + ":java_enums_srcjar", + "//third_party/WebKit/public:blink_cursor_type_java_enums_srcjar", + ] } junit_binary("ui_junit_tests") {
diff --git a/ui/android/DEPS b/ui/android/DEPS index bec96dda..54c50b6 100644 --- a/ui/android/DEPS +++ b/ui/android/DEPS
@@ -12,6 +12,7 @@ "+components/viz/service/surfaces", "+jni", "+skia/ext", + "+third_party/WebKit/public/platform/WebCursorInfo.h", "+third_party/skia", "+ui/base", "+ui/display",
diff --git a/ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java b/ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java index 6a661b3..0828e99 100644 --- a/ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java +++ b/ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java
@@ -8,14 +8,17 @@ import android.content.ClipData; import android.graphics.Bitmap; import android.os.Build; +import android.view.PointerIcon; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout.LayoutParams; import android.widget.ImageView; import org.chromium.base.ApiCompatibilityUtils; +import org.chromium.base.VisibleForTesting; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; +import org.chromium.blink_public.web.WebCursorInfoType; /** * Class to acquire, position, and remove anchor views from the implementing View. @@ -102,6 +105,146 @@ new View.DragShadowBuilder(imageView), null, View.DRAG_FLAG_GLOBAL); } + @VisibleForTesting + @CalledByNative + public void onCursorChangedToCustom(Bitmap customCursorBitmap, int hotspotX, int hotspotY) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + PointerIcon icon = PointerIcon.create(customCursorBitmap, hotspotX, hotspotY); + getContainerView().setPointerIcon(icon); + } + } + + @VisibleForTesting + @CalledByNative + public void onCursorChanged(int cursorType) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) return; + + int pointerIconType = PointerIcon.TYPE_ARROW; + switch (cursorType) { + case WebCursorInfoType.TYPE_NONE: + pointerIconType = PointerIcon.TYPE_NULL; + break; + case WebCursorInfoType.TYPE_POINTER: + pointerIconType = PointerIcon.TYPE_ARROW; + break; + case WebCursorInfoType.TYPE_CONTEXT_MENU: + pointerIconType = PointerIcon.TYPE_CONTEXT_MENU; + break; + case WebCursorInfoType.TYPE_HAND: + pointerIconType = PointerIcon.TYPE_HAND; + break; + case WebCursorInfoType.TYPE_HELP: + pointerIconType = PointerIcon.TYPE_HELP; + break; + case WebCursorInfoType.TYPE_WAIT: + pointerIconType = PointerIcon.TYPE_WAIT; + break; + case WebCursorInfoType.TYPE_CELL: + pointerIconType = PointerIcon.TYPE_CELL; + break; + case WebCursorInfoType.TYPE_CROSS: + pointerIconType = PointerIcon.TYPE_CROSSHAIR; + break; + case WebCursorInfoType.TYPE_I_BEAM: + pointerIconType = PointerIcon.TYPE_TEXT; + break; + case WebCursorInfoType.TYPE_VERTICAL_TEXT: + pointerIconType = PointerIcon.TYPE_VERTICAL_TEXT; + break; + case WebCursorInfoType.TYPE_ALIAS: + pointerIconType = PointerIcon.TYPE_ALIAS; + break; + case WebCursorInfoType.TYPE_COPY: + pointerIconType = PointerIcon.TYPE_COPY; + break; + case WebCursorInfoType.TYPE_NO_DROP: + pointerIconType = PointerIcon.TYPE_NO_DROP; + break; + case WebCursorInfoType.TYPE_COLUMN_RESIZE: + pointerIconType = PointerIcon.TYPE_HORIZONTAL_DOUBLE_ARROW; + break; + case WebCursorInfoType.TYPE_ROW_RESIZE: + pointerIconType = PointerIcon.TYPE_VERTICAL_DOUBLE_ARROW; + break; + case WebCursorInfoType.TYPE_NORTH_EAST_SOUTH_WEST_RESIZE: + pointerIconType = PointerIcon.TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW; + break; + case WebCursorInfoType.TYPE_NORTH_WEST_SOUTH_EAST_RESIZE: + pointerIconType = PointerIcon.TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW; + break; + case WebCursorInfoType.TYPE_ZOOM_IN: + pointerIconType = PointerIcon.TYPE_ZOOM_IN; + break; + case WebCursorInfoType.TYPE_ZOOM_OUT: + pointerIconType = PointerIcon.TYPE_ZOOM_OUT; + break; + case WebCursorInfoType.TYPE_GRAB: + pointerIconType = PointerIcon.TYPE_GRAB; + break; + case WebCursorInfoType.TYPE_GRABBING: + pointerIconType = PointerIcon.TYPE_GRABBING; + break; + // TODO(jaebaek): set types correctly + // after fixing http://crbug.com/584424. + case WebCursorInfoType.TYPE_EAST_WEST_RESIZE: + pointerIconType = PointerIcon.TYPE_HORIZONTAL_DOUBLE_ARROW; + break; + case WebCursorInfoType.TYPE_NORTH_SOUTH_RESIZE: + pointerIconType = PointerIcon.TYPE_VERTICAL_DOUBLE_ARROW; + break; + case WebCursorInfoType.TYPE_EAST_RESIZE: + pointerIconType = PointerIcon.TYPE_HORIZONTAL_DOUBLE_ARROW; + break; + case WebCursorInfoType.TYPE_NORTH_RESIZE: + pointerIconType = PointerIcon.TYPE_VERTICAL_DOUBLE_ARROW; + break; + case WebCursorInfoType.TYPE_NORTH_EAST_RESIZE: + pointerIconType = PointerIcon.TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW; + break; + case WebCursorInfoType.TYPE_NORTH_WEST_RESIZE: + pointerIconType = PointerIcon.TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW; + break; + case WebCursorInfoType.TYPE_SOUTH_RESIZE: + pointerIconType = PointerIcon.TYPE_VERTICAL_DOUBLE_ARROW; + break; + case WebCursorInfoType.TYPE_SOUTH_EAST_RESIZE: + pointerIconType = PointerIcon.TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW; + break; + case WebCursorInfoType.TYPE_SOUTH_WEST_RESIZE: + pointerIconType = PointerIcon.TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW; + break; + case WebCursorInfoType.TYPE_WEST_RESIZE: + pointerIconType = PointerIcon.TYPE_HORIZONTAL_DOUBLE_ARROW; + break; + case WebCursorInfoType.TYPE_PROGRESS: + pointerIconType = PointerIcon.TYPE_WAIT; + break; + case WebCursorInfoType.TYPE_NOT_ALLOWED: + pointerIconType = PointerIcon.TYPE_NO_DROP; + break; + case WebCursorInfoType.TYPE_MOVE: + case WebCursorInfoType.TYPE_MIDDLE_PANNING: + pointerIconType = PointerIcon.TYPE_ALL_SCROLL; + break; + case WebCursorInfoType.TYPE_EAST_PANNING: + case WebCursorInfoType.TYPE_NORTH_PANNING: + case WebCursorInfoType.TYPE_NORTH_EAST_PANNING: + case WebCursorInfoType.TYPE_NORTH_WEST_PANNING: + case WebCursorInfoType.TYPE_SOUTH_PANNING: + case WebCursorInfoType.TYPE_SOUTH_EAST_PANNING: + case WebCursorInfoType.TYPE_SOUTH_WEST_PANNING: + case WebCursorInfoType.TYPE_WEST_PANNING: + assert false : "These pointer icon types are not supported"; + break; + case WebCursorInfoType.TYPE_CUSTOM: + assert false : "onCursorChangedToCustom must be called instead"; + break; + } + ViewGroup containerView = getContainerView(); + PointerIcon icon = PointerIcon.getSystemIcon(containerView.getContext(), pointerIconType); + containerView.setPointerIcon(icon); + } + /** * Called whenever the background color of the page changes as notified by Blink. * @param color The new ARGB color of the page background.
diff --git a/ui/android/view_android.cc b/ui/android/view_android.cc index 0dac1cc..fa6e38f 100644 --- a/ui/android/view_android.cc +++ b/ui/android/view_android.cc
@@ -12,12 +12,14 @@ #include "base/stl_util.h" #include "cc/layers/layer.h" #include "jni/ViewAndroidDelegate_jni.h" +#include "third_party/WebKit/public/platform/WebCursorInfo.h" #include "ui/android/event_forwarder.h" #include "ui/android/view_client.h" #include "ui/android/window_android.h" #include "ui/base/layout.h" #include "ui/events/android/drag_event_android.h" #include "ui/events/android/motion_event_android.h" +#include "ui/gfx/android/java_bitmap.h" #include "url/gurl.h" namespace ui { @@ -25,6 +27,7 @@ using base::android::ConvertUTF8ToJavaString; using base::android::JavaRef; using base::android::ScopedJavaLocalRef; +using blink::WebCursorInfo; ViewAndroid::ScopedAnchorView::ScopedAnchorView( JNIEnv* env, @@ -288,6 +291,23 @@ jimage); } +void ViewAndroid::OnCursorChanged(int type, + const SkBitmap& custom_image, + const gfx::Point& hotspot) { + ScopedJavaLocalRef<jobject> delegate(GetViewAndroidDelegate()); + if (delegate.is_null()) + return; + JNIEnv* env = base::android::AttachCurrentThread(); + if (type == WebCursorInfo::kTypeCustom) { + ScopedJavaLocalRef<jobject> java_bitmap = + gfx::ConvertToJavaBitmap(&custom_image); + Java_ViewAndroidDelegate_onCursorChangedToCustom(env, delegate, java_bitmap, + hotspot.x(), hotspot.y()); + } else { + Java_ViewAndroidDelegate_onCursorChanged(env, delegate, type); + } +} + void ViewAndroid::OnBackgroundColorChanged(unsigned int color) { ScopedJavaLocalRef<jobject> delegate(GetViewAndroidDelegate()); if (delegate.is_null())
diff --git a/ui/android/view_android.h b/ui/android/view_android.h index 6516f00b4..b12c3835 100644 --- a/ui/android/view_android.h +++ b/ui/android/view_android.h
@@ -14,10 +14,16 @@ #include "ui/android/ui_android_export.h" #include "ui/gfx/geometry/rect_f.h" +class SkBitmap; + namespace cc { class Layer; } +namespace gfx { +class Point; +} + namespace ui { class DragEventAndroid; class EventForwarder; @@ -146,6 +152,9 @@ gfx::Size GetPhysicalBackingSize(); void OnPhysicalBackingSizeChanged(const gfx::Size& size); + void OnCursorChanged(int type, + const SkBitmap& custom_image, + const gfx::Point& hotspot); void OnBackgroundColorChanged(unsigned int color); void OnTopControlsChanged(float top_controls_offset, float top_content_offset);
diff --git a/ui/app_list/app_list_constants.cc b/ui/app_list/app_list_constants.cc index 1b503f8..2117297 100644 --- a/ui/app_list/app_list_constants.cc +++ b/ui/app_list/app_list_constants.cc
@@ -134,9 +134,24 @@ const int kSearchBoxPadding = 16; const int kSearchBoxTopPadding = 24; +// Bottom padding of search box in peeking state. +const int kSearchBoxPeekingBottomPadding = 12; + +// Bottom padding of search box in fullscreen state. +const int kSearchBoxFullscreenBottomPadding = 24; + // The background border corner radius of the search box in fullscreen mode. const int kSearchBoxBorderCornerRadiusFullscreen = 24; +// Preferred height of search box. +const int kSearchBoxPreferredHeight = 48; + +// The height of the peeking app list from the bottom of the screen. +const int kPeekingAppListHeight = 320; + +// The height/width of the shelf from the bottom/side of the screen. +const int kShelfSize = 48; + // Max items allowed in a folder. size_t kMaxFolderItems = 16;
diff --git a/ui/app_list/app_list_constants.h b/ui/app_list/app_list_constants.h index 01ab81d..8b96d84 100644 --- a/ui/app_list/app_list_constants.h +++ b/ui/app_list/app_list_constants.h
@@ -99,7 +99,13 @@ APP_LIST_EXPORT extern const int kAppsGridLeftRightPaddingFullscreen; APP_LIST_EXPORT extern const int kSearchBoxPadding; APP_LIST_EXPORT extern const int kSearchBoxTopPadding; +APP_LIST_EXPORT extern const int kSearchBoxPeekingBottomPadding; +APP_LIST_EXPORT extern const int kSearchBoxFullscreenBottomPadding; APP_LIST_EXPORT extern const int kSearchBoxBorderCornerRadiusFullscreen; +APP_LIST_EXPORT extern const int kSearchBoxPreferredHeight; + +APP_LIST_EXPORT extern const int kPeekingAppListHeight; +APP_LIST_EXPORT extern const int kShelfSize; APP_LIST_EXPORT extern size_t kMaxFolderItems; APP_LIST_EXPORT extern const size_t kNumFolderTopItems;
diff --git a/ui/app_list/presenter/app_list_presenter_impl.cc b/ui/app_list/presenter/app_list_presenter_impl.cc index 7872f99..c3d1ebb 100644 --- a/ui/app_list/presenter/app_list_presenter_impl.cc +++ b/ui/app_list/presenter/app_list_presenter_impl.cc
@@ -177,7 +177,9 @@ views::Widget* widget = view_->GetWidget(); ui::Layer* layer = GetLayer(widget); layer->GetAnimator()->StopAnimating(); - gfx::Rect target_bounds = widget->GetWindowBoundsInScreen(); + gfx::Rect target_bounds = is_fullscreen_app_list_enabled_ + ? widget->GetNativeView()->bounds() + : widget->GetWindowBoundsInScreen(); ui::ScopedLayerAnimationSettings animation(layer->GetAnimator()); aura::Window* root_window = widget->GetNativeView()->GetRootWindow(); const gfx::Vector2d offset = @@ -200,6 +202,10 @@ animation.AddObserver(this); layer->SetOpacity(is_visible_ ? 1.0 : 0.0); + if (is_fullscreen_app_list_enabled_) { + widget->GetNativeView()->SetBounds(target_bounds); + return; + } widget->SetBounds(target_bounds); }
diff --git a/ui/app_list/search/mixer.cc b/ui/app_list/search/mixer.cc index c7328e60..0e49894 100644 --- a/ui/app_list/search/mixer.cc +++ b/ui/app_list/search/mixer.cc
@@ -12,6 +12,7 @@ #include "base/macros.h" #include "base/memory/ptr_util.h" +#include "ui/app_list/app_list_features.h" #include "ui/app_list/search_provider.h" #include "ui/app_list/search_result.h" @@ -47,8 +48,12 @@ // Used to group relevant providers together for mixing their results. class Mixer::Group { public: - Group(size_t max_results, double multiplier) - : max_results_(max_results), multiplier_(multiplier) {} + Group(size_t max_results, double multiplier, double boost) + : max_results_(max_results), + multiplier_(multiplier), + boost_(boost), + is_fullscreen_app_list_enabled_( + features::IsFullscreenAppListEnabled()) {} ~Group() {} void AddProvider(SearchProvider* provider) { @@ -63,43 +68,44 @@ DCHECK(!result->id().empty()); // We cannot rely on providers to give relevance scores in the range - // [0.0, 1.0] (e.g., PeopleProvider directly gives values from the - // Google+ API). Clamp to that range. + // [0.0, 1.0]. Clamp to that range. const double relevance = std::min(std::max(result->relevance(), 0.0), 1.0); - double boost = 0.0; + double boost = boost_; - // Recommendations should not be affected by query-to-launch correlation - // from KnownResults as it causes recommendations to become dominated by - // previously clicked results. This happens because the recommendation - // query is the empty string and the clicked results get forever - // boosted. - if (result->display_type() != SearchResult::DISPLAY_RECOMMENDATION) { - KnownResults::const_iterator known_it = - known_results.find(result->id()); - if (known_it != known_results.end()) { - switch (known_it->second) { - case PERFECT_PRIMARY: - boost = 4.0; - break; - case PREFIX_PRIMARY: - boost = 3.75; - break; - case PERFECT_SECONDARY: - boost = 3.25; - break; - case PREFIX_SECONDARY: - boost = 3.0; - break; - case UNKNOWN_RESULT: - NOTREACHED() << "Unknown result in KnownResults?"; - break; + if (!is_fullscreen_app_list_enabled_) { + // Recommendations should not be affected by query-to-launch + // correlation from KnownResults as it causes recommendations to + // become dominated by previously clicked results. This happens + // because the recommendation query is the empty string and the + // clicked results get forever boosted. + if (result->display_type() != SearchResult::DISPLAY_RECOMMENDATION) { + KnownResults::const_iterator known_it = + known_results.find(result->id()); + if (known_it != known_results.end()) { + switch (known_it->second) { + case PERFECT_PRIMARY: + boost = 4.0; + break; + case PREFIX_PRIMARY: + boost = 3.75; + break; + case PERFECT_SECONDARY: + boost = 3.25; + break; + case PREFIX_SECONDARY: + boost = 3.0; + break; + case UNKNOWN_RESULT: + NOTREACHED() << "Unknown result in KnownResults?"; + break; + } } - } - // If this is a voice query, voice results receive a massive boost. - if (is_voice_query && result->voice_result()) - boost += 4.0; + // If this is a voice query, voice results receive a massive boost. + if (is_voice_query && result->voice_result()) + boost += 4.0; + } } results_.emplace_back(result.get(), relevance * multiplier_ + boost); @@ -117,6 +123,9 @@ typedef std::vector<SearchProvider*> Providers; const size_t max_results_; const double multiplier_; + const double boost_; + + const bool is_fullscreen_app_list_enabled_; Providers providers_; // Not owned. SortedResults results_; @@ -130,8 +139,8 @@ Mixer::~Mixer() { } -size_t Mixer::AddGroup(size_t max_results, double multiplier) { - groups_.push_back(base::MakeUnique<Group>(max_results, multiplier)); +size_t Mixer::AddGroup(size_t max_results, double multiplier, double boost) { + groups_.push_back(base::MakeUnique<Group>(max_results, multiplier, boost)); return groups_.size() - 1; }
diff --git a/ui/app_list/search/mixer.h b/ui/app_list/search/mixer.h index 253de6fd3..41818396 100644 --- a/ui/app_list/search/mixer.h +++ b/ui/app_list/search/mixer.h
@@ -38,8 +38,9 @@ // chosen from this group (if 0, will allow unlimited results from this // group). If there aren't enough results from all groups, more than // |max_results| may be chosen from this group. Each result in the group will - // have its score multiplied by |multiplier|. Returns the group's group_id. - size_t AddGroup(size_t max_results, double multiplier); + // have its score multiplied by |multiplier| and added by |boost|. Returns the + // group's group_id. + size_t AddGroup(size_t max_results, double multiplier, double boost); // Associates a provider with a mixer group. void AddProviderToGroup(size_t group_id, SearchProvider* provider);
diff --git a/ui/app_list/search/mixer_unittest.cc b/ui/app_list/search/mixer_unittest.cc index fb4f91d..66546b3 100644 --- a/ui/app_list/search/mixer_unittest.cc +++ b/ui/app_list/search/mixer_unittest.cc
@@ -131,9 +131,12 @@ mixer_.reset(new Mixer(results_.get())); - size_t apps_group_id = mixer_->AddGroup(kMaxAppsGroupResults, 1.0); - size_t omnibox_group_id = mixer_->AddGroup(kMaxOmniboxResults, 1.0); - size_t webstore_group_id = mixer_->AddGroup(kMaxWebstoreResults, 0.5); + // TODO(warx): when fullscreen app list is default enabled, modify this test + // to (1) test answer card/apps group having relevance boost, (2) remove + // known results boost tests. + size_t apps_group_id = mixer_->AddGroup(kMaxAppsGroupResults, 1.0, 0.0); + size_t omnibox_group_id = mixer_->AddGroup(kMaxOmniboxResults, 1.0, 0.0); + size_t webstore_group_id = mixer_->AddGroup(kMaxWebstoreResults, 0.5, 0.0); mixer_->AddProviderToGroup(apps_group_id, providers_[0].get()); mixer_->AddProviderToGroup(omnibox_group_id, providers_[1].get());
diff --git a/ui/app_list/search_controller.cc b/ui/app_list/search_controller.cc index cae0583..b2628f25 100644 --- a/ui/app_list/search_controller.cc +++ b/ui/app_list/search_controller.cc
@@ -103,8 +103,10 @@ result->InvokeAction(action_index, event_flags); } -size_t SearchController::AddGroup(size_t max_results, double multiplier) { - return mixer_->AddGroup(max_results, multiplier); +size_t SearchController::AddGroup(size_t max_results, + double multiplier, + double boost) { + return mixer_->AddGroup(max_results, multiplier, boost); } void SearchController::AddProvider(size_t group_id,
diff --git a/ui/app_list/search_controller.h b/ui/app_list/search_controller.h index ea57747a..4c6c9390 100644 --- a/ui/app_list/search_controller.h +++ b/ui/app_list/search_controller.h
@@ -42,7 +42,7 @@ int event_flags); // Adds a new mixer group. See Mixer::AddGroup. - size_t AddGroup(size_t max_results, double multiplier); + size_t AddGroup(size_t max_results, double multiplier, double boost); // Takes ownership of |provider| and associates it with given mixer group. void AddProvider(size_t group_id, std::unique_ptr<SearchProvider> provider);
diff --git a/ui/app_list/views/app_list_page.cc b/ui/app_list/views/app_list_page.cc index 9799f94..0953b75 100644 --- a/ui/app_list/views/app_list_page.cc +++ b/ui/app_list/views/app_list_page.cc
@@ -30,6 +30,11 @@ AppListModel::State from_state, AppListModel::State to_state) {} +gfx::Rect AppListPage::GetPageBoundsDuringDragging( + AppListModel::State state) const { + return GetPageBoundsForState(state); +} + gfx::Rect AppListPage::GetSearchBoxBounds() const { DCHECK(contents_view_); return contents_view_->GetDefaultSearchBoxBounds();
diff --git a/ui/app_list/views/app_list_page.h b/ui/app_list/views/app_list_page.h index f3c452b..0b07e42 100644 --- a/ui/app_list/views/app_list_page.h +++ b/ui/app_list/views/app_list_page.h
@@ -36,6 +36,10 @@ // Returns where this page should move to when the given state is active. virtual gfx::Rect GetPageBoundsForState(AppListModel::State state) const = 0; + // Returns the bounds of the page during dragging. + virtual gfx::Rect GetPageBoundsDuringDragging( + AppListModel::State state) const; + // Returns where the search box should be when this page is shown. Is at the // top of the app list by default, in the contents view's coordinate space. virtual gfx::Rect GetSearchBoxBounds() const;
diff --git a/ui/app_list/views/app_list_view.cc b/ui/app_list/views/app_list_view.cc index 7dd66588..6efa0e8 100644 --- a/ui/app_list/views/app_list_view.cc +++ b/ui/app_list/views/app_list_view.cc
@@ -58,9 +58,6 @@ // The margin from the edge to the speech UI. constexpr int kSpeechUIMargin = 12; -// The height of the peeking app list from the bottom of the screen. -constexpr int kPeekingAppListHeight = 320; - // The height of the half app list from the bottom of the screen. constexpr int kHalfAppListHeight = 561; @@ -178,16 +175,8 @@ AppListView::AppListView(AppListViewDelegate* delegate) : delegate_(delegate), - app_list_main_view_(nullptr), - speech_view_(nullptr), - search_box_focus_host_(nullptr), - search_box_widget_(nullptr), - search_box_view_(nullptr), is_fullscreen_app_list_enabled_(features::IsFullscreenAppListEnabled()), - processing_scroll_event_series_(false), - app_list_state_(PEEKING), display_observer_(this), - overlay_view_(nullptr), animation_observer_(new HideViewAnimationObserver()) { CHECK(delegate); delegate_->GetSpeechUI()->AddObserver(this); @@ -432,22 +421,17 @@ int initial_apps_page) { const display::Display display_nearest_view = GetDisplayNearestView(); const gfx::Rect display_work_area_bounds = display_nearest_view.work_area(); - const int bottom_of_screen = display_nearest_view.size().height(); // Set the widget height to the shelf height to replace the shelf background // on show animation with no flicker. In shelf mode we set the bounds to the // top of the screen because the widget does not animate. - const int overlay_view_bounds_y = - is_side_shelf_ ? 0 : (bottom_of_screen - kShelfSize); - const int overlay_view_bounds_x = - is_side_shelf_ ? 0 : display_work_area_bounds.x(); - const int overlay_view_bounds_width = - display_work_area_bounds.width() + (is_side_shelf_ ? kShelfSize : 0); - const int overlay_view_bounds_height = - display_work_area_bounds.height() + (is_side_shelf_ ? 0 : kShelfSize); + const int overlay_view_bounds_y = is_side_shelf_ + ? display_work_area_bounds.y() + : display_work_area_bounds.bottom(); gfx::Rect app_list_overlay_view_bounds( - overlay_view_bounds_x, overlay_view_bounds_y, overlay_view_bounds_width, - overlay_view_bounds_height); + display_nearest_view.bounds().x(), overlay_view_bounds_y, + display_nearest_view.bounds().width(), + display_nearest_view.bounds().height()); fullscreen_widget_ = new views::Widget; views::Widget::InitParams app_list_overlay_view_params( @@ -458,11 +442,18 @@ app_list_overlay_view_params.delegate = this; app_list_overlay_view_params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; - app_list_overlay_view_params.bounds = app_list_overlay_view_bounds; app_list_overlay_view_params.layer_type = ui::LAYER_SOLID_COLOR; fullscreen_widget_->Init(app_list_overlay_view_params); + // Set bounds directly in screen coordinates to avoid screen position + // controller setting bounds in the display where the widget has the largest + // intersection. + fullscreen_widget_->GetNativeView()->SetBoundsInScreen( + app_list_overlay_view_bounds, GetDisplayNearestView()); + overlay_view_ = new AppListOverlayView(0 /* no corners */); + + work_area_bottom_ = fullscreen_widget_->GetWorkAreaBoundsInScreen().bottom(); } void AppListView::InitializeBubble(gfx::NativeView parent, @@ -484,10 +475,17 @@ overlay_view_->SetBoundsRect(GetContentsBounds()); } -void AppListView::HandleClickOrTap() { +void AppListView::HandleClickOrTap(ui::LocatedEvent* event) { if (!is_fullscreen_app_list_enabled_) return; + // No-op if app list is on fullscreen all apps state and the event location is + // within apps grid view's bounds. + if (app_list_state_ == FULLSCREEN_ALL_APPS && + GetAppsGridView()->GetBoundsInScreen().Contains(event->location())) { + return; + } + if (!search_box_view_->is_search_box_active()) { SetState(CLOSED); return; @@ -498,17 +496,19 @@ } void AppListView::StartDrag(const gfx::Point& location) { + // Convert drag point from widget coordinates to screen coordinates because + // the widget bounds changes during the dragging. initial_drag_point_ = location; + ConvertPointToScreen(this, &initial_drag_point_); + initial_window_bounds_ = fullscreen_widget_->GetWindowBoundsInScreen(); } void AppListView::UpdateDrag(const gfx::Point& location) { - // Update the bounds of the widget while maintaining the - // relative position of the top of the widget and the mouse/gesture. - // Block drags north of 0 and recalculate the initial_drag_point_. - int new_y_position = location.y() - initial_drag_point_.y() + - fullscreen_widget_->GetWindowBoundsInScreen().y(); - if (new_y_position < 0) - initial_drag_point_ = location; + // Update the widget bounds based on the initial widget bounds and drag delta. + gfx::Point location_in_screen_coordinates = location; + ConvertPointToScreen(this, &location_in_screen_coordinates); + int new_y_position = location_in_screen_coordinates.y() - + initial_drag_point_.y() + initial_window_bounds_.y(); UpdateYPositionAndOpacity(new_y_position, GetAppListBackgroundOpacityDuringDragging(), @@ -520,8 +520,7 @@ if (app_list_state_ == CLOSED) return; - // Restores opacity of all the items in app list if dragging ends. - UpdateOpacity(kAppListOpacity, true /* is_end_gesture */); + DraggingLayout(); // Change the app list state based on where the drag ended. If fling velocity // was over the threshold, snap to the next state in the direction of the // fling. @@ -585,13 +584,15 @@ break; } - gfx::Point location_in_screen_coordinates = location; - ConvertPointToScreen(this, &location_in_screen_coordinates); - const int new_y_position = - location_in_screen_coordinates.y() - initial_drag_point_.y(); const int app_list_threshold = app_list_height / kAppListThresholdDenominator; - const int drag_delta = app_list_y_for_state - new_y_position; + gfx::Point location_in_screen_coordinates = location; + ConvertPointToScreen(this, &location_in_screen_coordinates); + const int drag_delta = + initial_drag_point_.y() - location_in_screen_coordinates.y(); + const int location_y_in_current_display = + location_in_screen_coordinates.y() - + GetDisplayNearestView().bounds().y(); switch (app_list_state_) { case FULLSCREEN_ALL_APPS: if (std::abs(drag_delta) > app_list_threshold) @@ -608,7 +609,7 @@ case HALF: if (std::abs(drag_delta) > app_list_threshold) { SetState(drag_delta > 0 ? FULLSCREEN_SEARCH : CLOSED); - } else if (location_in_screen_coordinates.y() >= + } else if (location_y_in_current_display >= display_height - kAppListBezelMargin) { // If the user drags to the bezel, close the app list. SetState(CLOSED); @@ -619,7 +620,7 @@ case PEEKING: if (std::abs(drag_delta) > app_list_threshold) { SetState(drag_delta > 0 ? FULLSCREEN_ALL_APPS : CLOSED); - } else if (location_in_screen_coordinates.y() >= + } else if (location_y_in_current_display >= display_height - kAppListBezelMargin) { // If the user drags to the bezel, close the app list. SetState(CLOSED); @@ -638,6 +639,12 @@ return display::Screen::GetScreen()->GetDisplayNearestView(parent_window()); } +AppsGridView* AppListView::GetAppsGridView() const { + return app_list_main_view_->contents_view() + ->apps_container_view() + ->apps_grid_view(); +} + void AppListView::OnBeforeBubbleWidgetInit(views::Widget::InitParams* params, views::Widget* widget) const { if (!params->native_widget) { @@ -692,7 +699,7 @@ switch (event->type()) { case ui::ET_MOUSE_PRESSED: event->SetHandled(); - HandleClickOrTap(); + HandleClickOrTap(event); break; case ui::ET_MOUSEWHEEL: if (HandleScroll(event)) @@ -709,32 +716,37 @@ switch (event->type()) { case ui::ET_GESTURE_TAP: - processing_scroll_event_series_ = false; + is_in_drag_ = false; event->SetHandled(); - HandleClickOrTap(); + HandleClickOrTap(event); break; case ui::ET_SCROLL_FLING_START: case ui::ET_GESTURE_SCROLL_BEGIN: if (is_side_shelf_) return; - processing_scroll_event_series_ = true; - StartDrag(event->location()); + // There may be multiple scroll begin events in one drag because the + // relative location of the finger and widget is almost unchanged and + // scroll begin event occurs when the relative location changes beyond a + // threshold. So avoid resetting the initial drag point in drag. + if (!is_in_drag_) + StartDrag(event->location()); + is_in_drag_ = true; event->SetHandled(); break; case ui::ET_GESTURE_SCROLL_UPDATE: if (is_side_shelf_) return; - processing_scroll_event_series_ = true; + is_in_drag_ = true; last_fling_velocity_ = event->details().scroll_y(); UpdateDrag(event->location()); event->SetHandled(); break; case ui::ET_GESTURE_END: - if (!processing_scroll_event_series_) + if (!is_in_drag_) break; if (is_side_shelf_) return; - processing_scroll_event_series_ = false; + is_in_drag_ = false; EndDrag(event->location()); event->SetHandled(); break; @@ -944,7 +956,7 @@ break; } - gfx::Rect target_bounds = fullscreen_widget_->GetWindowBoundsInScreen(); + gfx::Rect target_bounds = fullscreen_widget_->GetNativeView()->bounds(); target_bounds.set_y(target_state_y); std::unique_ptr<ui::LayerAnimationElement> bounds_animation_element = @@ -992,22 +1004,24 @@ void AppListView::UpdateYPositionAndOpacity(int y_position_in_screen, float background_opacity, bool is_end_gesture) { + is_in_drag_ = !is_end_gesture; + background_opacity_ = background_opacity; if (is_end_gesture) { SetState(FULLSCREEN_ALL_APPS); } else { gfx::Rect new_widget_bounds = fullscreen_widget_->GetWindowBoundsInScreen(); - new_widget_bounds.set_y(std::max(y_position_in_screen, 0)); - fullscreen_widget_->SetBounds(new_widget_bounds); + app_list_y_position_in_screen_ = + std::max(y_position_in_screen, GetDisplayNearestView().bounds().y()); + new_widget_bounds.set_y(app_list_y_position_in_screen_); + fullscreen_widget_->GetNativeView()->SetBoundsInScreen( + new_widget_bounds, GetDisplayNearestView()); } - UpdateOpacity(background_opacity, is_end_gesture); + DraggingLayout(); } -PaginationModel* AppListView::GetAppsPaginationModel() { - return app_list_main_view_->contents_view() - ->apps_container_view() - ->apps_grid_view() - ->pagination_model(); +PaginationModel* AppListView::GetAppsPaginationModel() const { + return GetAppsGridView()->pagination_model(); } void AppListView::OnSpeechRecognitionStateChanged( @@ -1085,8 +1099,7 @@ return; // Set the |fullscreen_widget_| size to fit the new display metrics. - gfx::Size size = GetDisplayNearestView().work_area().size(); - size.Enlarge(0, kShelfSize); + gfx::Size size = GetDisplayNearestView().size(); fullscreen_widget_->SetSize(size); // Update the |fullscreen_widget_| bounds to accomodate the new work @@ -1094,28 +1107,25 @@ SetState(app_list_state_); } -void AppListView::UpdateOpacity(float background_opacity, bool is_end_gesture) { +void AppListView::DraggingLayout() { app_list_background_shield_->layer()->SetOpacity( - is_end_gesture ? kAppListOpacity : background_opacity); - gfx::Rect work_area_bounds = fullscreen_widget_->GetWorkAreaBoundsInScreen(); - search_box_view_->UpdateOpacity(work_area_bounds.bottom(), is_end_gesture); - app_list_main_view_->contents_view() - ->apps_container_view() - ->apps_grid_view() - ->UpdateOpacity(work_area_bounds.bottom(), is_end_gesture); + is_in_drag_ ? background_opacity_ : kAppListOpacity); + + // Updates the opacity of the items in the app list. + search_box_view_->UpdateOpacity(app_list_y_position_in_screen_); + GetAppsGridView()->UpdateOpacity(app_list_y_position_in_screen_); + + app_list_main_view_->contents_view()->Layout(); if (app_list_state_ == PEEKING) { app_list_main_view_->contents_view()->start_page_view()->UpdateOpacity( - work_area_bounds.bottom(), is_end_gesture); + work_area_bottom_, !is_in_drag_); } } float AppListView::GetAppListBackgroundOpacityDuringDragging() { float top_of_applist = fullscreen_widget_->GetWindowBoundsInScreen().y(); - float work_area_bottom = - fullscreen_widget_->GetWorkAreaBoundsInScreen().bottom(); - - float dragging_height = std::max((work_area_bottom - top_of_applist), 0.f); + float dragging_height = std::max((work_area_bottom_ - top_of_applist), 0.f); float coefficient = std::min(dragging_height / (kNumOfShelfSize * kShelfSize), 1.0f); return coefficient * kAppListOpacity;
diff --git a/ui/app_list/views/app_list_view.h b/ui/app_list/views/app_list_view.h index b052b49..4119f77 100644 --- a/ui/app_list/views/app_list_view.h +++ b/ui/app_list/views/app_list_view.h
@@ -27,6 +27,7 @@ class AppListMainView; class AppListModel; class AppListViewDelegate; +class AppsGridView; class HideViewAnimationObserver; class PaginationModel; class SearchBoxView; @@ -43,9 +44,6 @@ public display::DisplayObserver, public AppListViewDelegateObserver { public: - // The height/width of the shelf from the bottom/side of the screen. - static constexpr int kShelfSize = 48; - // Number of the size of shelf. Used to determine the opacity of items in the // app list during dragging. static constexpr float kNumOfShelfSize = 2.0; @@ -128,6 +126,11 @@ void Layout() override; void SchedulePaintInRect(const gfx::Rect& rect) override; + // Overridden from ui::EventHandler: + void OnScrollEvent(ui::ScrollEvent* event) override; + void OnMouseEvent(ui::MouseEvent* event) override; + void OnGestureEvent(ui::GestureEvent* event) override; + // Called when tablet mode starts and ends. void OnTabletModeChanged(bool started); @@ -153,7 +156,7 @@ bool is_end_gesture); // Gets the PaginationModel owned by this view's apps grid. - PaginationModel* GetAppsPaginationModel(); + PaginationModel* GetAppsPaginationModel() const; views::Widget* get_fullscreen_widget_for_test() const { return fullscreen_widget_; @@ -163,9 +166,9 @@ views::Widget* search_box_widget() const { return search_box_widget_; } - SearchBoxView* search_box_view() { return search_box_view_; } + SearchBoxView* search_box_view() const { return search_box_view_; } - AppListMainView* app_list_main_view() { return app_list_main_view_; } + AppListMainView* app_list_main_view() const { return app_list_main_view_; } bool is_fullscreen() const { return app_list_state_ == FULLSCREEN_ALL_APPS || @@ -174,6 +177,14 @@ bool is_tablet_mode() const { return is_tablet_mode_; } + bool is_in_drag() const { return is_in_drag_; } + + int app_list_y_position_in_screen() const { + return app_list_y_position_in_screen_; + } + + int work_area_bottom() const { return work_area_bottom_; } + private: friend class test::AppListViewTestApi; @@ -189,7 +200,7 @@ // Closes the AppListView when a click or tap event propogates to the // AppListView. - void HandleClickOrTap(); + void HandleClickOrTap(ui::LocatedEvent* event); // Initializes |initial_drag_point_|. void StartDrag(const gfx::Point& location); @@ -205,6 +216,9 @@ // Gets the display nearest to the parent window. display::Display GetDisplayNearestView() const; + // Gets the apps grid view owned by this view. + AppsGridView* GetAppsGridView() const; + // Overridden from views::BubbleDialogDelegateView: void OnBeforeBubbleWidgetInit(views::Widget::InitParams* params, views::Widget* widget) const override; @@ -215,11 +229,6 @@ bool WidgetHasHitTestMask() const override; void GetWidgetHitTestMask(gfx::Path* mask) const override; - // Overridden from ui::EventHandler: - void OnScrollEvent(ui::ScrollEvent* event) override; - void OnMouseEvent(ui::MouseEvent* event) override; - void OnGestureEvent(ui::GestureEvent* event) override; - // Overridden from views::WidgetObserver: void OnWidgetDestroying(views::Widget* widget) override; void OnWidgetVisibilityChanged(views::Widget* widget, bool visible) override; @@ -232,8 +241,8 @@ void OnDisplayMetricsChanged(const display::Display& display, uint32_t changed_metrics) override; - // Updates opacity of both background and items in the app list. - void UpdateOpacity(float background_opacity, bool is_end_gesture); + // Layouts the app list during dragging. + void DraggingLayout(); // Gets app list background opacity during dragging. float GetAppListBackgroundOpacityDuringDragging(); @@ -246,13 +255,15 @@ AppListViewDelegate* delegate_; // Weak. Owned by AppListService. - AppListMainView* app_list_main_view_; - SpeechView* speech_view_; + AppListMainView* app_list_main_view_ = nullptr; + SpeechView* speech_view_ = nullptr; views::Widget* fullscreen_widget_ = nullptr; // Owned by AppListView. - views::View* search_box_focus_host_; // Owned by the views hierarchy. - views::Widget* search_box_widget_; // Owned by the app list's widget. - SearchBoxView* search_box_view_; // Owned by |search_box_widget_|. + views::View* search_box_focus_host_ = + nullptr; // Owned by the views hierarchy. + views::Widget* search_box_widget_ = + nullptr; // Owned by the app list's widget. + SearchBoxView* search_box_view_ = nullptr; // Owned by |search_box_widget_|. // Owned by the app list's widget. Null if the fullscreen app list is not // enabled. views::View* app_list_background_shield_ = nullptr; @@ -261,22 +272,37 @@ // Whether the shelf is oriented on the side. bool is_side_shelf_ = false; - // The gap between the initial gesture event and the top of the window. + // True if the user is in the process of gesture-dragging on opened app list, + // or dragging the app list from shelf. + bool is_in_drag_ = false; + + // Y position of the app list in screen space coordinate during dragging. + int app_list_y_position_in_screen_ = 0; + + // Bottom of work area. + int work_area_bottom_ = 0; + + // The opacity of app list background during dragging. + float background_opacity_ = 0.f; + + // The location of initial gesture event in screen coordinates. gfx::Point initial_drag_point_; + + // The rectangle of initial widget's window in screen coordinates. + gfx::Rect initial_window_bounds_; + // The velocity of the gesture event. float last_fling_velocity_ = 0; // Whether the fullscreen app list feature is enabled. const bool is_fullscreen_app_list_enabled_; - // Whether a series of scroll events are being processed. - bool processing_scroll_event_series_; // The state of the app list, controlled via SetState(). - AppListState app_list_state_; + AppListState app_list_state_ = PEEKING; // An observer that notifies AppListView when the display has changed. ScopedObserver<display::Screen, display::DisplayObserver> display_observer_; // A semi-transparent white overlay that covers the app list while dialogs // are open. - views::View* overlay_view_; + views::View* overlay_view_ = nullptr; std::unique_ptr<HideViewAnimationObserver> animation_observer_;
diff --git a/ui/app_list/views/app_list_view_unittest.cc b/ui/app_list/views/app_list_view_unittest.cc index e4e02a4..fb42ae7 100644 --- a/ui/app_list/views/app_list_view_unittest.cc +++ b/ui/app_list/views/app_list_view_unittest.cc
@@ -584,6 +584,36 @@ start_page_view()->GetSelectedIndexForTest()); } +// Tests that when a click or tap event propagates to the AppListView, if the +// event location is within the bounds of AppsGridView, do not close the +// AppListView. +TEST_F(AppListViewFullscreenTest, TapAndClickWithinAppsGridView) { + Initialize(0, false, false); + delegate_->GetTestModel()->PopulateApps(kInitialItems); + Show(); + view_->SetState(AppListView::FULLSCREEN_ALL_APPS); + EXPECT_EQ(AppListView::FULLSCREEN_ALL_APPS, view_->app_list_state()); + ContentsView* contents_view = view_->app_list_main_view()->contents_view(); + AppsContainerView* container_view = contents_view->apps_container_view(); + const gfx::Rect grid_view_bounds = + container_view->apps_grid_view()->GetBoundsInScreen(); + gfx::Point target_point = grid_view_bounds.origin(); + target_point.Offset(100, 100); + ASSERT_TRUE(grid_view_bounds.Contains(target_point)); + + // Tests gesture tap within apps grid view doesn't close app list view. + ui::GestureEvent tap(target_point.x(), target_point.y(), 0, base::TimeTicks(), + ui::GestureEventDetails(ui::ET_GESTURE_TAP)); + view_->OnGestureEvent(&tap); + EXPECT_EQ(AppListView::FULLSCREEN_ALL_APPS, view_->app_list_state()); + + // Tests mouse click within apps grid view doesn't close app list view. + ui::MouseEvent mouse_click(ui::ET_MOUSE_PRESSED, target_point, target_point, + base::TimeTicks(), 0, 0); + view_->OnMouseEvent(&mouse_click); + EXPECT_EQ(AppListView::FULLSCREEN_ALL_APPS, view_->app_list_state()); +} + // Tests displaying the app list and performs a standard set of checks on its // top level views. Then closes the window. TEST_F(AppListViewTest, DisplayTest) {
diff --git a/ui/app_list/views/apps_container_view.cc b/ui/app_list/views/apps_container_view.cc index ab652ab5..10ce60e 100644 --- a/ui/app_list/views/apps_container_view.cc +++ b/ui/app_list/views/apps_container_view.cc
@@ -15,9 +15,11 @@ #include "ui/app_list/views/app_list_folder_view.h" #include "ui/app_list/views/app_list_item_view.h" #include "ui/app_list/views/app_list_main_view.h" +#include "ui/app_list/views/app_list_view.h" #include "ui/app_list/views/apps_grid_view.h" #include "ui/app_list/views/contents_view.h" #include "ui/app_list/views/folder_background_view.h" +#include "ui/app_list/views/search_box_view.h" #include "ui/app_list/views/suggestions_container_view.h" #include "ui/base/l10n/l10n_util.h" #include "ui/events/event.h" @@ -25,6 +27,15 @@ namespace app_list { +// Initial search box top padding in shelf mode. +constexpr int kSearchBoxInitalTopPadding = 12; + +// Top padding of search box in peeking state. +constexpr int kSearchBoxPeekingTopPadding = 24; + +// Minimum top padding of search box in fullscreen state. +constexpr int kSearchBoxMinimumTopPadding = 24; + AppsContainerView::AppsContainerView(AppListMainView* app_list_main_view, AppListModel* model) : is_fullscreen_app_list_enabled_(features::IsFullscreenAppListEnabled()) { @@ -163,16 +174,58 @@ if (!is_fullscreen_app_list_enabled_) return AppListPage::GetSearchBoxBounds(); - // Makes search box and content vertically centered in screen. gfx::Rect search_box_bounds(contents_view()->GetDefaultSearchBoxBounds()); - const int total_height = - GetDefaultContentsBounds().bottom() - search_box_bounds.y(); - search_box_bounds.set_y( - std::max(search_box_bounds.y(), - (contents_view()->GetDisplayHeight() - total_height) / 2)); + if (contents_view()->app_list_view()->is_in_drag()) + search_box_bounds.set_y(GetSearchBoxTopPaddingDuringDragging()); + else + search_box_bounds.set_y(GetSearchBoxFinalTopPadding()); + return search_box_bounds; } +gfx::Rect AppsContainerView::GetPageBoundsDuringDragging( + AppListModel::State state) const { + float app_list_y_position_in_screen = + contents_view()->app_list_view()->app_list_y_position_in_screen(); + float work_area_bottom = contents_view()->app_list_view()->work_area_bottom(); + float drag_amount = + std::max(0.f, work_area_bottom - app_list_y_position_in_screen); + + float y = 0; + float peeking_final_y = + kSearchBoxPeekingTopPadding + kSearchBoxPreferredHeight + + kSearchBoxPeekingBottomPadding - kSearchBoxFullscreenBottomPadding; + if (drag_amount <= (kPeekingAppListHeight - kShelfSize)) { + // App list is dragged from collapsed to peeking, which moved up at most + // |kPeekingAppListHeight - kShelfSize| (272px). The top padding of apps + // container view changes from |-kSearchBoxFullscreenBottomPadding| to + // |kSearchBoxPeekingTopPadding + kSearchBoxPreferredHeight + + // kSearchBoxPeekingBottomPadding - kSearchBoxFullscreenBottomPadding|. + y = std::ceil( + ((peeking_final_y + kSearchBoxFullscreenBottomPadding) * drag_amount) / + (kPeekingAppListHeight - kShelfSize) - + kSearchBoxFullscreenBottomPadding); + } else { + // App list is dragged from peeking to fullscreen, which moved up at most + // |peeking_to_fullscreen_height|. The top padding of apps container view + // changes from |peeking_final_y| to |final_y|. + float final_y = GetSearchBoxFinalTopPadding() + kSearchBoxPreferredHeight; + float peeking_to_fullscreen_height = + contents_view()->GetDisplayHeight() - kPeekingAppListHeight; + y = std::ceil((final_y - peeking_final_y) * + (drag_amount - (kPeekingAppListHeight - kShelfSize)) / + peeking_to_fullscreen_height + + peeking_final_y); + y = std::max(std::min(final_y, y), peeking_final_y); + } + + gfx::Rect onscreen_bounds = GetPageBoundsForState(state); + if (state == AppListModel::STATE_APPS) + onscreen_bounds.set_y(y); + + return onscreen_bounds; +} + void AppsContainerView::OnTopIconAnimationsComplete() { --top_icon_animation_pending_count_; @@ -273,4 +326,49 @@ apps_grid_view_->activated_folder_item_view()->SetVisible(false); } +int AppsContainerView::GetSearchBoxFinalTopPadding() const { + gfx::Rect search_box_bounds(contents_view()->GetDefaultSearchBoxBounds()); + const int total_height = + GetDefaultContentsBounds().bottom() - search_box_bounds.y(); + + // Makes search box and content vertically centered in contents_view. + int y = std::max(search_box_bounds.y(), + (contents_view()->GetDisplayHeight() - total_height) / 2); + + // Top padding of the searchbox should not be smaller than + // |kSearchBoxMinimumTopPadding| + return std::max(y, kSearchBoxMinimumTopPadding); +} + +int AppsContainerView::GetSearchBoxTopPaddingDuringDragging() const { + float searchbox_final_y = GetSearchBoxFinalTopPadding(); + float peeking_to_fullscreen_height = + contents_view()->GetDisplayHeight() - kPeekingAppListHeight; + float drag_amount = std::max( + 0, contents_view()->app_list_view()->work_area_bottom() - + contents_view()->app_list_view()->app_list_y_position_in_screen()); + + if (drag_amount <= (kPeekingAppListHeight - kShelfSize)) { + // App list is dragged from collapsed to peeking, which moved up at most + // |kPeekingAppListHeight - kShelfSize| (272px). The top padding of search + // box changes from |kSearchBoxInitalTopPadding| to + // |kSearchBoxPeekingTopPadding|, + return std::ceil( + (kSearchBoxPeekingTopPadding - kSearchBoxInitalTopPadding) + + ((kSearchBoxPeekingTopPadding - kSearchBoxInitalTopPadding) * + drag_amount) / + (kPeekingAppListHeight - kShelfSize)); + } else { + // App list is dragged from peeking to fullscreen, which moved up at most + // |peeking_to_fullscreen_height|. The top padding of search box changes + // from |kSearchBoxPeekingTopPadding| to |searchbox_final_y|. + int y = (kSearchBoxPeekingTopPadding + + std::ceil((searchbox_final_y - kSearchBoxPeekingTopPadding) * + (drag_amount - (kPeekingAppListHeight - kShelfSize)) / + peeking_to_fullscreen_height)); + y = std::max(kSearchBoxPeekingTopPadding, y); + return y; + } +} + } // namespace app_list
diff --git a/ui/app_list/views/apps_container_view.h b/ui/app_list/views/apps_container_view.h index c55654d..934c9529 100644 --- a/ui/app_list/views/apps_container_view.h +++ b/ui/app_list/views/apps_container_view.h
@@ -73,6 +73,8 @@ void OnWillBeShown() override; gfx::Rect GetPageBoundsForState(AppListModel::State state) const override; gfx::Rect GetSearchBoxBounds() const override; + gfx::Rect GetPageBoundsDuringDragging( + AppListModel::State state) const override; // TopIconAnimationObserver overrides: void OnTopIconAnimationsComplete() override; @@ -106,6 +108,12 @@ void PrepareToShowApps(AppListFolderItem* folder_item); + // Gets the final top padding of search box. + int GetSearchBoxFinalTopPadding() const; + + // Gets the top padding of search box during dragging. + int GetSearchBoxTopPaddingDuringDragging() const; + // The views below are owned by views hierarchy. AppsGridView* apps_grid_view_ = nullptr; AppListFolderView* app_list_folder_view_ = nullptr;
diff --git a/ui/app_list/views/apps_grid_view.cc b/ui/app_list/views/apps_grid_view.cc index 20811b3..facb7c3 100644 --- a/ui/app_list/views/apps_grid_view.cc +++ b/ui/app_list/views/apps_grid_view.cc
@@ -97,9 +97,6 @@ // UI. constexpr int kFolderDroppingCircleRadius = 39; -// Bottom padding for search box. -constexpr int kSearchBoxBottomPadding = 24; - // Padding between suggested apps tiles and all apps indicator. constexpr int kSuggestionsAllAppsIndicatorPadding = 16; @@ -109,6 +106,21 @@ // The height of gradient fade-out zones. constexpr int kFadeoutZoneHeight = 24; +// Range of the fraction of app list from collapsed to peeking that suggested +// apps should change opacity. +constexpr float kSuggestedAppsOpacityStartFraction = 0.3f; +constexpr float kSuggestedAppsOpacityEndFraction = 0.7f; + +// Range of the fraction of app list from peeking to fullscreen that all apps +// indictor should change opacity. +constexpr float kAllAppsIndicatorOpacityStartFraction = 0.7f; +constexpr float kAllAppsIndicatorOpacityEndFraction = 1.0f; + +// Range of the height of centerline above screen bottom that all apps should +// change opacity. +constexpr float kAllAppsOpacityStartPx = 8.0f; +constexpr float kAllAppsOpacityEndPx = 144.0f; + // Returns the size of a tile view excluding its padding. gfx::Size GetTileViewSize() { if (features::IsFullscreenAppListEnabled()) @@ -774,7 +786,7 @@ if (is_fullscreen_app_list_enabled_) { fadeout_layer_delegate_->layer()->SetBounds(layer()->bounds()); - rect.Inset(0, kSearchBoxBottomPadding, 0, 0); + rect.Inset(0, kSearchBoxFullscreenBottomPadding, 0, 0); } if (!folder_delegate_) { @@ -1618,14 +1630,6 @@ return folder_delegate_->IsOEMFolder(); } -void AppsGridView::UpdateOpacityOfItem(views::View* view_item, - float centroid_y) { - float delta_y = std::max(work_area_bottom_ - centroid_y, 0.0f); - float opacity = std::min( - delta_y / (AppListView::kNumOfShelfSize * AppListView::kShelfSize), 1.0f); - view_item->layer()->SetOpacity(is_end_gesture_ ? 1.0f : opacity); -} - void AppsGridView::DispatchDragEventForReparent(Pointer pointer, const gfx::Point& drag_point) { folder_delegate_->DispatchDragEventForReparent(pointer, drag_point); @@ -1689,36 +1693,75 @@ item_list_ = nullptr; } -void AppsGridView::UpdateOpacity(float work_area_bottom, bool is_end_gesture) { - work_area_bottom_ = work_area_bottom; - is_end_gesture_ = is_end_gesture; +void AppsGridView::UpdateOpacity(int app_list_y_position_in_screen) { + int work_area_bottom = contents_view_->app_list_view()->work_area_bottom(); + bool is_in_drag = contents_view_->app_list_view()->is_in_drag(); + // The opacity of suggested apps is a function of the fractional displacement + // of the app list from collapsed(0) to peeking(1) state. When the fraction + // changes from |kSuggestedAppsOpacityStartFraction| to + // |kSuggestedAppsOpacityEndFraction|, the opacity of suggested apps changes + // from 0.f to 1.0f. + float fraction = + std::max<float>(work_area_bottom - app_list_y_position_in_screen, 0) / + (kPeekingAppListHeight - kShelfSize); + float opacity = + std::min(std::max((fraction - kSuggestedAppsOpacityStartFraction) / + (kSuggestedAppsOpacityEndFraction - + kSuggestedAppsOpacityStartFraction), + 0.f), + 1.0f); + suggestions_container_->layer()->SetOpacity(is_in_drag ? opacity : 1.0f); - // Updates the opacity of suggestions container. - gfx::Rect suggestions_container_bounds = - suggestions_container_->GetBoundsInScreen(); - UpdateOpacityOfItem(suggestions_container_, - suggestions_container_bounds.CenterPoint().y()); + // The opacity of all apps indicator is a function of the fractional + // displacement of the app list from peeking(0) to fullscreen(1) state. When + // the fraction changes from |kAllAppsIndicatorOpacityStartFraction| to + // |kAllAppsIndicatorOpacityEndFraction|, the opacity of all apps indicator + // changes from 0.f to 1.0f. + float peeking_to_fullscreen_height = + contents_view_->GetDisplayHeight() - kPeekingAppListHeight; + float drag_amount = (work_area_bottom + kShelfSize) - + app_list_y_position_in_screen - kPeekingAppListHeight; + fraction = std::max(drag_amount / peeking_to_fullscreen_height, 0.f); + opacity = std::min(std::max((fraction + kAllAppsIndicatorOpacityEndFraction - + kAllAppsIndicatorOpacityStartFraction - 1.0f) / + (kAllAppsIndicatorOpacityEndFraction - + kAllAppsIndicatorOpacityStartFraction), + 0.f), + 1.0f); + all_apps_indicator_->layer()->SetOpacity(is_in_drag ? opacity : 1.0f); - // Updates the opacity of all apps indicator. - gfx::Rect all_apps_indicator_bounds = - all_apps_indicator_->GetLabelBoundsInScreen(); - UpdateOpacityOfItem(all_apps_indicator_, - all_apps_indicator_bounds.CenterPoint().y()); - - // Updates the opacity of all apps. + // Updates the opacity of all apps. The opacity of the app starting at 0.f + // when the ceterline of the app is |kAllAppsOpacityStartPx| above the bottom + // of work area and transitioning to 1.0f by the time the centerline reaches + // |kAllAppsOpacityEndPx| above the work area bottom. + float centerline_above_work_area = 0.f; for (int i = 0; i < view_model_.view_size(); ++i) { AppListItemView* item_view = GetItemViewAt(i); if (item_view != drag_view_) { gfx::Rect view_bounds = view_model_.ideal_bounds(i); views::View::ConvertRectToScreen(this, &view_bounds); - UpdateOpacityOfItem(item_view, view_bounds.CenterPoint().y()); + centerline_above_work_area = std::max<float>( + work_area_bottom + kShelfSize - view_bounds.CenterPoint().y(), 0.f); + opacity = std::min( + std::max((centerline_above_work_area - kAllAppsOpacityStartPx) / + (kAllAppsOpacityEndPx - kAllAppsOpacityStartPx), + 0.f), + 1.0f); + item_view->layer()->SetOpacity(is_in_drag ? opacity : 1.0f); } } - // Updates the opacity of page switcher buttons. + // Updates the opacity of page switcher buttons. The same rule as all apps. if (page_switcher_view_) { gfx::Rect switcher_bounds = page_switcher_view_->GetBoundsInScreen(); - UpdateOpacityOfItem(page_switcher_view_, switcher_bounds.CenterPoint().y()); + centerline_above_work_area = std::max<float>( + work_area_bottom + kShelfSize - switcher_bounds.CenterPoint().y(), 0.f); + opacity = std::min( + std::max((centerline_above_work_area - kAllAppsOpacityStartPx) / + (kAllAppsOpacityEndPx - kAllAppsOpacityStartPx), + 0.f), + 1.0f); + page_switcher_view_->layer()->SetOpacity(is_in_drag ? opacity : 1.0f); } } @@ -2249,13 +2292,13 @@ return 0; if (page == 0) { - return kSearchBoxBottomPadding + + return kSearchBoxFullscreenBottomPadding + suggestions_container_->GetPreferredSize().height() + kSuggestionsAllAppsIndicatorPadding + all_apps_indicator_->GetPreferredSize().height() + kAllAppsIndicatorExtraPadding; } - return kSearchBoxBottomPadding - kTileVerticalPadding; + return kSearchBoxFullscreenBottomPadding - kTileVerticalPadding; } gfx::Rect AppsGridView::GetExpectedTileBounds(int slot) const {
diff --git a/ui/app_list/views/apps_grid_view.h b/ui/app_list/views/apps_grid_view.h index 37cb41f4..68c04cad 100644 --- a/ui/app_list/views/apps_grid_view.h +++ b/ui/app_list/views/apps_grid_view.h
@@ -193,11 +193,8 @@ // The grid view must be inside a folder view. void OnFolderItemRemoved(); - // Updates the opacity of all the items in the grid during dragging. The - // opacity of each item is based on how much the item's |centroid_y| is above - // |work_area_bottom|. If |is_end_gesture| is true, set all the items opacity - // to 1.0f. - void UpdateOpacity(float work_area_bottom, bool is_end_gesture); + // Updates the opacity of all the items in the grid during dragging. + void UpdateOpacity(int app_list_y_position_in_screen); // Return the view model for test purposes. const views::ViewModelT<AppListItemView>* view_model_for_test() const { @@ -488,9 +485,6 @@ // Returns true if the grid view is under an OEM folder. bool IsUnderOEMFolder(); - // Updates opacity of |view_item| in the app list based on |centroid_y|. - void UpdateOpacityOfItem(views::View* view_item, float centroid_y); - AppListModel* model_ = nullptr; // Owned by AppListView. AppListItemList* item_list_ = nullptr; // Not owned. @@ -599,9 +593,6 @@ // True if the fullscreen app list feature is enabled. const bool is_fullscreen_app_list_enabled_; - // The bottom of work area. - float work_area_bottom_ = 0.f; - // True if it is the end gesture from shelf dragging. bool is_end_gesture_ = false;
diff --git a/ui/app_list/views/contents_view.cc b/ui/app_list/views/contents_view.cc index c6c9f75..99b4ce6 100644 --- a/ui/app_list/views/contents_view.cc +++ b/ui/app_list/views/contents_view.cc
@@ -487,7 +487,10 @@ return; for (AppListPage* page : app_list_pages_) { - page->SetBoundsRect(page->GetPageBoundsForState(GetActiveState())); + if (app_list_view_ && app_list_view_->is_in_drag()) + page->SetBoundsRect(page->GetPageBoundsDuringDragging(GetActiveState())); + else + page->SetBoundsRect(page->GetPageBoundsForState(GetActiveState())); } // The search box is contained in a widget so set the bounds of the widget
diff --git a/ui/app_list/views/contents_view.h b/ui/app_list/views/contents_view.h index f8ff40d..56a55c04 100644 --- a/ui/app_list/views/contents_view.h +++ b/ui/app_list/views/contents_view.h
@@ -105,6 +105,8 @@ AppListMainView* app_list_main_view() const { return app_list_main_view_; } + AppListView* app_list_view() const { return app_list_view_; } + // Returns the pagination model for the ContentsView. const PaginationModel& pagination_model() { return pagination_model_; }
diff --git a/ui/app_list/views/search_box_view.cc b/ui/app_list/views/search_box_view.cc index c8a5c68..2b62cfc 100644 --- a/ui/app_list/views/search_box_view.cc +++ b/ui/app_list/views/search_box_view.cc
@@ -22,6 +22,7 @@ #include "ui/app_list/views/app_list_view.h" #include "ui/app_list/views/contents_view.h" #include "ui/app_list/views/search_box_view_delegate.h" +#include "ui/app_list/views/search_result_page_view.h" #include "ui/base/ime/text_input_flags.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/resource/resource_bundle.h" @@ -54,7 +55,6 @@ constexpr int kInnerPadding = 24; constexpr int kPreferredWidth = 360; constexpr int kPreferredWidthFullscreen = 544; -constexpr int kSearchBoxPreferredHeight = 48; constexpr int kSearchBoxBorderWidth = 4; constexpr SkColor kHintTextColor = SkColorSetARGBMacro(0xFF, 0xA0, 0xA0, 0xA0); @@ -69,6 +69,11 @@ constexpr int kLightVibrantBlendAlpha = 0xE6; +// Range of the fraction of app list from collapsed to peeking that search box +// should change opacity. +constexpr float kOpacityStartFraction = 0.1f; +constexpr float kOpacityEndFraction = 0.6f; + // Color of placeholder text in zero query state. constexpr SkColor kZeroQuerySearchboxColor = SkColorSetARGBMacro(0x8A, 0x00, 0x00, 0x00); @@ -644,21 +649,28 @@ return background_color_; } -void SearchBoxView::UpdateOpacity(float work_area_bottom, bool is_end_gesture) { - float opacity = 1.0f; - if (!is_end_gesture) { - gfx::Rect search_box_bounds = this->GetBoundsInScreen(); - float delta_y = std::max( - (work_area_bottom - search_box_bounds.CenterPoint().y()), 0.0f); - opacity = std::min( - delta_y / (AppListView::kNumOfShelfSize * AppListView::kShelfSize), - 1.0f); - } +void SearchBoxView::UpdateOpacity(int app_list_y_position_in_screen) { + // The opacity of searchbox is a function of the fractional displacement of + // the app list from collapsed(0) to peeking(1) state. When the fraction + // changes from |kOpacityStartFraction| to |kOpaticyEndFraction|, the opacity + // of searchbox changes from 0.f to 1.0f. + ContentsView* contents_view = static_cast<ContentsView*>(contents_view_); + float fraction = + std::max<float>(0, contents_view->app_list_view()->work_area_bottom() - + app_list_y_position_in_screen) / + (kPeekingAppListHeight - kShelfSize); - // Restores the opacity of searchbox to 1.0f if it is the end of the gesture - // dragging. + float opacity = 1.0f; + if (contents_view->app_list_view()->is_in_drag()) + opacity = + std::min(std::max((fraction - kOpacityStartFraction) / + (kOpacityEndFraction - kOpacityStartFraction), + 0.f), + 1.0f); + + // Restores the opacity of searchbox if the gesture dragging ends. this->layer()->SetOpacity(opacity); - contents_view_->layer()->SetOpacity(opacity); + contents_view->search_results_page_view()->layer()->SetOpacity(opacity); } bool SearchBoxView::IsArrowKey(const ui::KeyEvent& event) {
diff --git a/ui/app_list/views/search_box_view.h b/ui/app_list/views/search_box_view.h index 25af2b31..d0de2036 100644 --- a/ui/app_list/views/search_box_view.h +++ b/ui/app_list/views/search_box_view.h
@@ -135,7 +135,7 @@ SkColor GetBackgroundColorForState(AppListModel::State state) const; // Updates the opacity of the searchbox. - void UpdateOpacity(float work_area_bottom, bool is_end_gesture); + void UpdateOpacity(int app_list_y_position_in_screen); // Used only in the tests to get the current search icon. views::ImageView* get_search_icon_for_test() { return search_icon_; }
diff --git a/ui/app_list/views/search_result_page_view.cc b/ui/app_list/views/search_result_page_view.cc index 0f4d9ad..4e4146b 100644 --- a/ui/app_list/views/search_result_page_view.cc +++ b/ui/app_list/views/search_result_page_view.cc
@@ -144,6 +144,9 @@ : selected_index_(0), is_fullscreen_app_list_enabled_(features::IsFullscreenAppListEnabled()), contents_view_(new views::View) { + SetPaintToLayer(); + layer()->SetFillsBoundsOpaquely(false); + if (is_fullscreen_app_list_enabled_) { contents_view_->SetLayoutManager( new views::BoxLayout(views::BoxLayout::kVertical, gfx::Insets(), 0));
diff --git a/ui/app_list/views/start_page_view.cc b/ui/app_list/views/start_page_view.cc index f982bb6..bd95de0 100644 --- a/ui/app_list/views/start_page_view.cc +++ b/ui/app_list/views/start_page_view.cc
@@ -47,7 +47,6 @@ // Layout constants. constexpr int kInstantContainerSpacing = 24; -constexpr int kSearchBoxBottomPadding = 12; constexpr int kSearchBoxAndTilesSpacing = 35; constexpr int kStartPageSearchBoxWidth = 480; constexpr int kStartPageSearchBoxWidthFullscreen = 544; @@ -147,8 +146,8 @@ views::BoxLayout* instant_layout_manager = new views::BoxLayout( views::BoxLayout::kVertical, gfx::Insets(), kInstantContainerSpacing); if (is_fullscreen_app_list_enabled_) { - instant_layout_manager->set_inside_border_insets( - gfx::Insets(kSearchBoxTopPadding, 0, kSearchBoxBottomPadding, 0)); + instant_layout_manager->set_inside_border_insets(gfx::Insets( + kSearchBoxTopPadding, 0, kSearchBoxPeekingBottomPadding, 0)); } else { instant_layout_manager->set_inside_border_insets( gfx::Insets(0, 0, kSearchBoxAndTilesSpacing, 0)); @@ -446,8 +445,8 @@ void StartPageView::UpdateOpacityOfItem(views::View* view_item, float centroid_y) { float delta_y = std::max(work_area_bottom_ - centroid_y, 0.f); - float opacity = std::min( - delta_y / (AppListView::kNumOfShelfSize * AppListView::kShelfSize), 1.0f); + float opacity = + std::min(delta_y / (AppListView::kNumOfShelfSize * kShelfSize), 1.0f); view_item->layer()->SetOpacity(is_end_gesture_ ? 1.0f : opacity); }
diff --git a/ui/base/BUILD.gn b/ui/base/BUILD.gn index f1e6c73b..002a68d0 100644 --- a/ui/base/BUILD.gn +++ b/ui/base/BUILD.gn
@@ -377,8 +377,6 @@ if (is_fuchsia) { sources += [ - "clipboard/clipboard_fuchsia.cc", - "clipboard/clipboard_fuchsia.h", "idle/idle_fuchsia.cc", "resource/resource_bundle_fuchsia.cc", ] @@ -649,10 +647,6 @@ if (is_android || is_ios) { sources -= [ "device_form_factor_desktop.cc" ] } - - if (is_fuchsia) { - sources += [ "cursor/cursor_loader_fuchsia.cc" ] - } } static_library("test_support") {
diff --git a/ui/base/clipboard/clipboard_fuchsia.cc b/ui/base/clipboard/clipboard_fuchsia.cc deleted file mode 100644 index 72de3f4..0000000 --- a/ui/base/clipboard/clipboard_fuchsia.cc +++ /dev/null
@@ -1,281 +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 "ui/base/clipboard/clipboard_fuchsia.h" - -#include <algorithm> -#include <utility> - -#include "base/callback.h" -#include "base/lazy_instance.h" -#include "base/stl_util.h" -#include "base/strings/utf_string_conversions.h" -#include "base/synchronization/lock.h" -#include "base/time/time.h" -#include "third_party/skia/include/core/SkBitmap.h" -#include "ui/gfx/geometry/size.h" - -namespace ui { - -const char kMimeTypeBitmap[] = "image/bmp"; - -// Clipboard::FormatType implementation. -Clipboard::FormatType::FormatType() {} - -Clipboard::FormatType::FormatType(const std::string& native_format) - : data_(native_format) {} - -Clipboard::FormatType::~FormatType() {} - -std::string Clipboard::FormatType::Serialize() const { - return data_; -} - -// static -Clipboard::FormatType Clipboard::FormatType::Deserialize( - const std::string& serialization) { - return FormatType(serialization); -} - -bool Clipboard::FormatType::operator<(const FormatType& other) const { - return data_ < other.data_; -} - -bool Clipboard::FormatType::Equals(const FormatType& other) const { - return data_ == other.data_; -} - -// Various predefined FormatTypes. -// static -Clipboard::FormatType Clipboard::GetFormatType( - const std::string& format_string) { - return FormatType::Deserialize(format_string); -} - -// static -const Clipboard::FormatType& Clipboard::GetUrlFormatType() { - CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeURIList)); - return type; -} - -// static -const Clipboard::FormatType& Clipboard::GetUrlWFormatType() { - return GetUrlFormatType(); -} - -// static -const Clipboard::FormatType& Clipboard::GetPlainTextFormatType() { - CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeText)); - return type; -} - -// static -const Clipboard::FormatType& Clipboard::GetPlainTextWFormatType() { - return GetPlainTextFormatType(); -} - -// static -const Clipboard::FormatType& Clipboard::GetWebKitSmartPasteFormatType() { - CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeWebkitSmartPaste)); - return type; -} - -// static -const Clipboard::FormatType& Clipboard::GetHtmlFormatType() { - CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeHTML)); - return type; -} - -// static -const Clipboard::FormatType& Clipboard::GetRtfFormatType() { - CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeRTF)); - return type; -} - -// static -const Clipboard::FormatType& Clipboard::GetBitmapFormatType() { - CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeBitmap)); - return type; -} - -// static -const Clipboard::FormatType& Clipboard::GetWebCustomDataFormatType() { - CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeWebCustomData)); - return type; -} - -// static -const Clipboard::FormatType& Clipboard::GetPepperCustomDataFormatType() { - CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypePepperCustomData)); - return type; -} - -// Clipboard factory method. -// static -Clipboard* Clipboard::Create() { - return new ClipboardFuchsia; -} - -// ClipboardFuchsia implementation. - -ClipboardFuchsia::ClipboardFuchsia() { - DCHECK(CalledOnValidThread()); -} - -ClipboardFuchsia::~ClipboardFuchsia() { - DCHECK(CalledOnValidThread()); -} - -void ClipboardFuchsia::OnPreShutdown() {} - -uint64_t ClipboardFuchsia::GetSequenceNumber(ClipboardType type) const { - DCHECK(CalledOnValidThread()); - NOTIMPLEMENTED(); - return 0; -} - -bool ClipboardFuchsia::IsFormatAvailable(const Clipboard::FormatType& format, - ClipboardType type) const { - DCHECK(CalledOnValidThread()); - DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE); - NOTIMPLEMENTED(); - return false; -} - -void ClipboardFuchsia::Clear(ClipboardType type) { - DCHECK(CalledOnValidThread()); - DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE); - NOTIMPLEMENTED(); -} - -void ClipboardFuchsia::ReadAvailableTypes(ClipboardType type, - std::vector<base::string16>* types, - bool* contains_filenames) const { - DCHECK(CalledOnValidThread()); - DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE); - NOTIMPLEMENTED(); - types->clear(); - *contains_filenames = false; -} - -void ClipboardFuchsia::ReadText(ClipboardType type, - base::string16* result) const { - DCHECK(CalledOnValidThread()); - DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE); - NOTREACHED(); -} - -void ClipboardFuchsia::ReadAsciiText(ClipboardType type, - std::string* result) const { - DCHECK(CalledOnValidThread()); - DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE); - NOTREACHED(); -} - -// Note: |src_url| isn't really used. It is only implemented in Windows -void ClipboardFuchsia::ReadHTML(ClipboardType type, - base::string16* markup, - std::string* src_url, - uint32_t* fragment_start, - uint32_t* fragment_end) const { - DCHECK(CalledOnValidThread()); - DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE); - NOTREACHED(); -} - -void ClipboardFuchsia::ReadRTF(ClipboardType type, std::string* result) const { - DCHECK(CalledOnValidThread()); - NOTREACHED(); -} - -SkBitmap ClipboardFuchsia::ReadImage(ClipboardType type) const { - DCHECK(CalledOnValidThread()); - DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE); - NOTREACHED(); - return SkBitmap(); -} - -void ClipboardFuchsia::ReadCustomData(ClipboardType clipboard_type, - const base::string16& type, - base::string16* result) const { - DCHECK(CalledOnValidThread()); - NOTREACHED(); -} - -void ClipboardFuchsia::ReadBookmark(base::string16* title, - std::string* url) const { - DCHECK(CalledOnValidThread()); - NOTREACHED(); -} - -void ClipboardFuchsia::ReadData(const Clipboard::FormatType& format, - std::string* result) const { - DCHECK(CalledOnValidThread()); - NOTIMPLEMENTED(); - result->clear(); -} - -base::Time ClipboardFuchsia::GetLastModifiedTime() const { - DCHECK(CalledOnValidThread()); - NOTIMPLEMENTED(); - return base::Time(); -} - -void ClipboardFuchsia::ClearLastModifiedTime() { - DCHECK(CalledOnValidThread()); - NOTIMPLEMENTED(); -} - -// Main entry point used to write several values in the clipboard. -void ClipboardFuchsia::WriteObjects(ClipboardType type, - const ObjectMap& objects) { - DCHECK(CalledOnValidThread()); - DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE); - NOTIMPLEMENTED(); -} - -void ClipboardFuchsia::WriteText(const char* text_data, size_t text_len) { - DCHECK(CalledOnValidThread()); - NOTIMPLEMENTED(); -} - -void ClipboardFuchsia::WriteHTML(const char* markup_data, - size_t markup_len, - const char* url_data, - size_t url_len) { - DCHECK(CalledOnValidThread()); - NOTIMPLEMENTED(); -} - -void ClipboardFuchsia::WriteRTF(const char* rtf_data, size_t data_len) { - DCHECK(CalledOnValidThread()); - NOTIMPLEMENTED(); -} - -void ClipboardFuchsia::WriteBookmark(const char* title_data, - size_t title_len, - const char* url_data, - size_t url_len) { - DCHECK(CalledOnValidThread()); - NOTIMPLEMENTED(); -} - -void ClipboardFuchsia::WriteWebSmartPaste() { - DCHECK(CalledOnValidThread()); - NOTIMPLEMENTED(); -} - -void ClipboardFuchsia::WriteBitmap(const SkBitmap& bitmap) { - DCHECK(CalledOnValidThread()); - NOTIMPLEMENTED(); -} - -void ClipboardFuchsia::WriteData(const Clipboard::FormatType& format, - const char* data_data, - size_t data_len) { - DCHECK(CalledOnValidThread()); - NOTIMPLEMENTED(); -} - -} // namespace ui
diff --git a/ui/base/clipboard/clipboard_fuchsia.h b/ui/base/clipboard/clipboard_fuchsia.h deleted file mode 100644 index ca68893a..0000000 --- a/ui/base/clipboard/clipboard_fuchsia.h +++ /dev/null
@@ -1,71 +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 UI_BASE_CLIPBOARD_CLIPBOARD_FUCHSIA_H_ -#define UI_BASE_CLIPBOARD_CLIPBOARD_FUCHSIA_H_ - -#include "ui/base/clipboard/clipboard.h" - -#include "base/macros.h" -#include "base/time/time.h" - -namespace ui { - -// This is a stub implementation of Clipboard for Fuchsia. -// TODO(fuchsia): Implement this class. -class ClipboardFuchsia : public Clipboard { - private: - friend class Clipboard; - - ClipboardFuchsia(); - ~ClipboardFuchsia() override; - - // Clipboard overrides: - void OnPreShutdown() override; - uint64_t GetSequenceNumber(ClipboardType type) const override; - bool IsFormatAvailable(const FormatType& format, - ClipboardType type) const override; - void Clear(ClipboardType type) override; - void ReadAvailableTypes(ClipboardType type, - std::vector<base::string16>* types, - bool* contains_filenames) const override; - void ReadText(ClipboardType type, base::string16* result) const override; - void ReadAsciiText(ClipboardType type, std::string* result) const override; - void ReadHTML(ClipboardType type, - base::string16* markup, - std::string* src_url, - uint32_t* fragment_start, - uint32_t* fragment_end) const override; - void ReadRTF(ClipboardType type, std::string* result) const override; - SkBitmap ReadImage(ClipboardType type) const override; - void ReadCustomData(ClipboardType clipboard_type, - const base::string16& type, - base::string16* result) const override; - void ReadBookmark(base::string16* title, std::string* url) const override; - void ReadData(const FormatType& format, std::string* result) const override; - base::Time GetLastModifiedTime() const override; - void ClearLastModifiedTime() override; - void WriteObjects(ClipboardType type, const ObjectMap& objects) override; - void WriteText(const char* text_data, size_t text_len) override; - void WriteHTML(const char* markup_data, - size_t markup_len, - const char* url_data, - size_t url_len) override; - void WriteRTF(const char* rtf_data, size_t data_len) override; - void WriteBookmark(const char* title_data, - size_t title_len, - const char* url_data, - size_t url_len) override; - void WriteWebSmartPaste() override; - void WriteBitmap(const SkBitmap& bitmap) override; - void WriteData(const FormatType& format, - const char* data_data, - size_t data_len) override; - - DISALLOW_COPY_AND_ASSIGN(ClipboardFuchsia); -}; - -} // namespace ui - -#endif // UI_BASE_CLIPBOARD_CLIPBOARD_FUCHSIA_H_
diff --git a/ui/base/cursor/cursor_loader_fuchsia.cc b/ui/base/cursor/cursor_loader_fuchsia.cc deleted file mode 100644 index a7e4280..0000000 --- a/ui/base/cursor/cursor_loader_fuchsia.cc +++ /dev/null
@@ -1,16 +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 "ui/base/cursor/cursor_loader.h" - -#include "base/logging.h" - -namespace ui { - -CursorLoader* CursorLoader::Create() { - NOTIMPLEMENTED(); - return nullptr; -} - -} // namespace ui
diff --git a/ui/base/ime/BUILD.gn b/ui/base/ime/BUILD.gn index cc69675..6d44738 100644 --- a/ui/base/ime/BUILD.gn +++ b/ui/base/ime/BUILD.gn
@@ -52,11 +52,11 @@ "composition_text.h", "composition_text_util_pango.cc", "composition_text_util_pango.h", - "composition_underline.h", "ime_bridge.cc", "ime_bridge.h", "ime_engine_handler_interface.h", "ime_input_context_handler_interface.h", + "ime_text_span.h", "infolist_entry.cc", "infolist_entry.h", "input_method.h", @@ -199,4 +199,11 @@ "//ui/ozone", ] } + + if (is_fuchsia) { + sources -= [ + "input_method_auralinux.cc", + "input_method_auralinux.h", + ] + } }
diff --git a/ui/base/ime/composition_text.cc b/ui/base/ime/composition_text.cc index a2e583f6..3ee2ae3 100644 --- a/ui/base/ime/composition_text.cc +++ b/ui/base/ime/composition_text.cc
@@ -16,15 +16,15 @@ void CompositionText::Clear() { text.clear(); - underlines.clear(); + ime_text_spans.clear(); selection = gfx::Range(); } void CompositionText::CopyFrom(const CompositionText& obj) { Clear(); text = obj.text; - for (size_t i = 0; i < obj.underlines.size(); i++) { - underlines.push_back(obj.underlines[i]); + for (size_t i = 0; i < obj.ime_text_spans.size(); i++) { + ime_text_spans.push_back(obj.ime_text_spans[i]); } selection = obj.selection; }
diff --git a/ui/base/ime/composition_text.h b/ui/base/ime/composition_text.h index ba56c62..f46dc3c 100644 --- a/ui/base/ime/composition_text.h +++ b/ui/base/ime/composition_text.h
@@ -8,7 +8,7 @@ #include <stddef.h> #include "base/strings/string16.h" -#include "ui/base/ime/composition_underline.h" +#include "ui/base/ime/ime_text_span.h" #include "ui/base/ime/ui_base_ime_export.h" #include "ui/gfx/range/range.h" @@ -21,12 +21,11 @@ ~CompositionText(); bool operator==(const CompositionText& rhs) const { - if ((this->text != rhs.text) || - (this->selection != rhs.selection) || - (this->underlines.size() != rhs.underlines.size())) + if ((this->text != rhs.text) || (this->selection != rhs.selection) || + (this->ime_text_spans.size() != rhs.ime_text_spans.size())) return false; - for (size_t i = 0; i < this->underlines.size(); ++i) { - if (this->underlines[i] != rhs.underlines[i]) + for (size_t i = 0; i < this->ime_text_spans.size(); ++i) { + if (this->ime_text_spans[i] != rhs.ime_text_spans[i]) return false; } return true; @@ -43,10 +42,8 @@ // Content of the composition text. base::string16 text; - // Underline information of the composition text. - // They must be sorted in ascending order by their start_offset and cannot be - // overlapped with each other. - CompositionUnderlines underlines; + // ImeTextSpan information for the composition text. + ImeTextSpans ime_text_spans; // Selection range in the composition text. It represents the caret position // if the range length is zero. Usually it's used for representing the target
diff --git a/ui/base/ime/composition_text_unittest.cc b/ui/base/ime/composition_text_unittest.cc index c03090a5..c1623af6 100644 --- a/ui/base/ime/composition_text_unittest.cc +++ b/ui/base/ime/composition_text_unittest.cc
@@ -13,21 +13,21 @@ TEST(CompositionTextTest, CopyTest) { const base::string16 kSampleText = base::UTF8ToUTF16("Sample Text"); - const CompositionUnderline kSampleUnderline1(10, 20, SK_ColorBLACK, false, - SK_ColorTRANSPARENT); + const ImeTextSpan kSampleUnderline1(10, 20, SK_ColorBLACK, false, + SK_ColorTRANSPARENT); - const CompositionUnderline kSampleUnderline2(11, 21, SK_ColorBLACK, true, - SK_ColorTRANSPARENT); + const ImeTextSpan kSampleUnderline2(11, 21, SK_ColorBLACK, true, + SK_ColorTRANSPARENT); - const CompositionUnderline kSampleUnderline3(12, 22, SK_ColorRED, false, - SK_ColorTRANSPARENT); + const ImeTextSpan kSampleUnderline3(12, 22, SK_ColorRED, false, + SK_ColorTRANSPARENT); // Make CompositionText CompositionText text; text.text = kSampleText; - text.underlines.push_back(kSampleUnderline1); - text.underlines.push_back(kSampleUnderline2); - text.underlines.push_back(kSampleUnderline3); + text.ime_text_spans.push_back(kSampleUnderline1); + text.ime_text_spans.push_back(kSampleUnderline2); + text.ime_text_spans.push_back(kSampleUnderline3); text.selection.set_start(30); text.selection.set_end(40); @@ -35,15 +35,16 @@ text2.CopyFrom(text); EXPECT_EQ(text.text, text2.text); - EXPECT_EQ(text.underlines.size(), text2.underlines.size()); - for (size_t i = 0; i < text.underlines.size(); ++i) { - EXPECT_EQ(text.underlines[i].start_offset, - text2.underlines[i].start_offset); - EXPECT_EQ(text.underlines[i].end_offset, text2.underlines[i].end_offset); - EXPECT_EQ(text.underlines[i].color, text2.underlines[i].color); - EXPECT_EQ(text.underlines[i].thick, text2.underlines[i].thick); - EXPECT_EQ(text.underlines[i].background_color, - text2.underlines[i].background_color); + EXPECT_EQ(text.ime_text_spans.size(), text2.ime_text_spans.size()); + for (size_t i = 0; i < text.ime_text_spans.size(); ++i) { + EXPECT_EQ(text.ime_text_spans[i].start_offset, + text2.ime_text_spans[i].start_offset); + EXPECT_EQ(text.ime_text_spans[i].end_offset, + text2.ime_text_spans[i].end_offset); + EXPECT_EQ(text.ime_text_spans[i].color, text2.ime_text_spans[i].color); + EXPECT_EQ(text.ime_text_spans[i].thick, text2.ime_text_spans[i].thick); + EXPECT_EQ(text.ime_text_spans[i].background_color, + text2.ime_text_spans[i].background_color); } EXPECT_EQ(text.selection.start(), text2.selection.start());
diff --git a/ui/base/ime/composition_text_util_pango.cc b/ui/base/ime/composition_text_util_pango.cc index b8a9297..8b30ff6 100644 --- a/ui/base/ime/composition_text_util_pango.cc +++ b/ui/base/ime/composition_text_util_pango.cc
@@ -75,44 +75,41 @@ if (background_attr || underline_attr) { // Use a black thin underline by default. - CompositionUnderline underline(char16_offsets[start], - char16_offsets[end], - SK_ColorBLACK, - false, - SK_ColorTRANSPARENT); + ImeTextSpan ime_text_span(char16_offsets[start], char16_offsets[end], + SK_ColorBLACK, false, SK_ColorTRANSPARENT); // Always use thick underline for a range with background color, which // is usually the selection range. if (background_attr) { - underline.thick = true; + ime_text_span.thick = true; // If the cursor is at start or end of this underline, then we treat // it as the selection range as well, but make sure to set the cursor // position to the selection end. - if (underline.start_offset == cursor_offset) { - composition->selection.set_start(underline.end_offset); + if (ime_text_span.start_offset == cursor_offset) { + composition->selection.set_start(ime_text_span.end_offset); composition->selection.set_end(cursor_offset); - } else if (underline.end_offset == cursor_offset) { - composition->selection.set_start(underline.start_offset); + } else if (ime_text_span.end_offset == cursor_offset) { + composition->selection.set_start(ime_text_span.start_offset); composition->selection.set_end(cursor_offset); } } if (underline_attr) { int type = reinterpret_cast<PangoAttrInt*>(underline_attr)->value; if (type == PANGO_UNDERLINE_DOUBLE) - underline.thick = true; + ime_text_span.thick = true; else if (type == PANGO_UNDERLINE_ERROR) - underline.color = SK_ColorRED; + ime_text_span.color = SK_ColorRED; } - composition->underlines.push_back(underline); + composition->ime_text_spans.push_back(ime_text_span); } } while (pango_attr_iterator_next(iter)); pango_attr_iterator_destroy(iter); } // Use a black thin underline by default. - if (composition->underlines.empty()) { - composition->underlines.push_back(CompositionUnderline( - 0, length, SK_ColorBLACK, false, SK_ColorTRANSPARENT)); + if (composition->ime_text_spans.empty()) { + composition->ime_text_spans.push_back( + ImeTextSpan(0, length, SK_ColorBLACK, false, SK_ColorTRANSPARENT)); } }
diff --git a/ui/base/ime/composition_text_util_pango_unittest.cc b/ui/base/ime/composition_text_util_pango_unittest.cc index c645e30..eb2f340 100644 --- a/ui/base/ime/composition_text_util_pango_unittest.cc +++ b/ui/base/ime/composition_text_util_pango_unittest.cc
@@ -25,7 +25,7 @@ int end_offset; }; -struct Underline { +struct ImeTextSpan { unsigned start_offset; unsigned end_offset; uint32_t color; @@ -36,7 +36,7 @@ struct TestData { const char* text; const AttributeInfo attrs[10]; - const Underline underlines[10]; + const ImeTextSpan ime_text_spans[10]; }; const TestData kTestData[] = { @@ -95,8 +95,7 @@ {0, 0, 0, false, SK_ColorTRANSPARENT}}}, }; -void CompareUnderline(const Underline& a, - const ui::CompositionUnderline& b) { +void CompareImeTextSpan(const ImeTextSpan& a, const ui::ImeTextSpan& b) { EXPECT_EQ(a.start_offset, b.start_offset); EXPECT_EQ(a.end_offset, b.end_offset); EXPECT_EQ(a.color, b.color); @@ -135,11 +134,11 @@ ui::CompositionText result; ui::ExtractCompositionTextFromGtkPreedit(text, pango_attrs, 0, &result); - const Underline* underlines = kTestData[i].underlines; - for (size_t u = 0; underlines[u].color && - u < result.underlines.size(); ++u) { - SCOPED_TRACE(testing::Message() << "Underline:" << u); - CompareUnderline(underlines[u], result.underlines[u]); + const ImeTextSpan* ime_text_spans = kTestData[i].ime_text_spans; + for (size_t u = 0; + ime_text_spans[u].color && u < result.ime_text_spans.size(); ++u) { + SCOPED_TRACE(testing::Message() << "ImeTextSpan:" << u); + CompareImeTextSpan(ime_text_spans[u], result.ime_text_spans[u]); } pango_attr_list_unref(pango_attrs);
diff --git a/ui/base/ime/composition_underline.h b/ui/base/ime/ime_text_span.h similarity index 61% rename from ui/base/ime/composition_underline.h rename to ui/base/ime/ime_text_span.h index 9eb7763..ddfbd43 100644 --- a/ui/base/ime/composition_underline.h +++ b/ui/base/ime/ime_text_span.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef UI_BASE_IME_COMPOSITION_UNDERLINE_H_ -#define UI_BASE_IME_COMPOSITION_UNDERLINE_H_ +#ifndef UI_BASE_IME_IME_TEXT_SPAN_H_ +#define UI_BASE_IME_IME_TEXT_SPAN_H_ #include <stdint.h> @@ -13,10 +13,10 @@ namespace ui { -// Intentionally keep sync with blink::WebCompositionUnderline defined in: -// third_party/WebKit/public/web/WebCompositionUnderline.h -struct CompositionUnderline { - CompositionUnderline() +// Intentionally keep sync with blink::WebImeTextSpan defined in: +// third_party/WebKit/public/web/WebImeTextSpan.h +struct ImeTextSpan { + ImeTextSpan() : start_offset(0), end_offset(0), color(SK_ColorTRANSPARENT), @@ -24,35 +24,33 @@ background_color(SK_ColorTRANSPARENT) {} // TODO(huangs): remove this constructor. - CompositionUnderline(uint32_t s, uint32_t e, SkColor c, bool t) + ImeTextSpan(uint32_t s, uint32_t e, SkColor c, bool t) : start_offset(s), end_offset(e), color(c), thick(t), background_color(SK_ColorTRANSPARENT) {} - CompositionUnderline(uint32_t s, uint32_t e, SkColor c, bool t, SkColor bc) + ImeTextSpan(uint32_t s, uint32_t e, SkColor c, bool t, SkColor bc) : start_offset(s), end_offset(e), color(c), thick(t), background_color(bc) {} - bool operator<(const CompositionUnderline& rhs) const { + bool operator<(const ImeTextSpan& rhs) const { return std::tie(start_offset, end_offset) < std::tie(rhs.start_offset, rhs.end_offset); } - bool operator==(const CompositionUnderline& rhs) const { + bool operator==(const ImeTextSpan& rhs) const { return (this->start_offset == rhs.start_offset) && (this->end_offset == rhs.end_offset) && (this->color == rhs.color) && (this->thick == rhs.thick) && (this->background_color == rhs.background_color); } - bool operator!=(const CompositionUnderline& rhs) const { - return !(*this == rhs); - } + bool operator!=(const ImeTextSpan& rhs) const { return !(*this == rhs); } uint32_t start_offset; uint32_t end_offset; @@ -61,8 +59,8 @@ SkColor background_color; }; -typedef std::vector<CompositionUnderline> CompositionUnderlines; +typedef std::vector<ImeTextSpan> ImeTextSpans; } // namespace ui -#endif // UI_BASE_IME_COMPOSITION_UNDERLINE_H_ +#endif // UI_BASE_IME_IME_TEXT_SPAN_H_
diff --git a/ui/base/ime/input_method_chromeos.cc b/ui/base/ime/input_method_chromeos.cc index 1312ba4..a5dd1d6a 100644 --- a/ui/base/ime/input_method_chromeos.cc +++ b/ui/base/ime/input_method_chromeos.cc
@@ -613,17 +613,18 @@ out_composition->selection = gfx::Range(cursor_offset); - const CompositionUnderlines text_underlines = text.underlines; - if (!text_underlines.empty()) { - for (size_t i = 0; i < text_underlines.size(); ++i) { - const uint32_t start = text_underlines[i].start_offset; - const uint32_t end = text_underlines[i].end_offset; + const ImeTextSpans text_ime_text_spans = text.ime_text_spans; + if (!text_ime_text_spans.empty()) { + for (size_t i = 0; i < text_ime_text_spans.size(); ++i) { + const uint32_t start = text_ime_text_spans[i].start_offset; + const uint32_t end = text_ime_text_spans[i].end_offset; if (start >= end) continue; - CompositionUnderline underline( - char16_offsets[start], char16_offsets[end], text_underlines[i].color, - text_underlines[i].thick, text_underlines[i].background_color); - out_composition->underlines.push_back(underline); + ImeTextSpan ime_text_span(char16_offsets[start], char16_offsets[end], + text_ime_text_spans[i].color, + text_ime_text_spans[i].thick, + text_ime_text_spans[i].background_color); + out_composition->ime_text_spans.push_back(ime_text_span); } } @@ -631,28 +632,26 @@ if (text.selection.start() < text.selection.end()) { const uint32_t start = text.selection.start(); const uint32_t end = text.selection.end(); - CompositionUnderline underline(char16_offsets[start], - char16_offsets[end], - SK_ColorBLACK, - true /* thick */, - SK_ColorTRANSPARENT); - out_composition->underlines.push_back(underline); + ImeTextSpan ime_text_span(char16_offsets[start], char16_offsets[end], + SK_ColorBLACK, true /* thick */, + SK_ColorTRANSPARENT); + out_composition->ime_text_spans.push_back(ime_text_span); - // If the cursor is at start or end of this underline, then we treat + // If the cursor is at start or end of this ime_text_span, then we treat // it as the selection range as well, but make sure to set the cursor // position to the selection end. - if (underline.start_offset == cursor_offset) { - out_composition->selection.set_start(underline.end_offset); + if (ime_text_span.start_offset == cursor_offset) { + out_composition->selection.set_start(ime_text_span.end_offset); out_composition->selection.set_end(cursor_offset); - } else if (underline.end_offset == cursor_offset) { - out_composition->selection.set_start(underline.start_offset); + } else if (ime_text_span.end_offset == cursor_offset) { + out_composition->selection.set_start(ime_text_span.start_offset); out_composition->selection.set_end(cursor_offset); } } // Use a black thin underline by default. - if (out_composition->underlines.empty()) { - out_composition->underlines.push_back(CompositionUnderline( + if (out_composition->ime_text_spans.empty()) { + out_composition->ime_text_spans.push_back(ImeTextSpan( 0, length, SK_ColorBLACK, false /* thick */, SK_ColorTRANSPARENT)); } }
diff --git a/ui/base/ime/win/imm32_manager.cc b/ui/base/ime/win/imm32_manager.cc index 8b868ce5..bc444b7 100644 --- a/ui/base/ime/win/imm32_manager.cc +++ b/ui/base/ime/win/imm32_manager.cc
@@ -62,10 +62,10 @@ // Helper function for IMM32Manager::GetCompositionInfo() method, to get // underlines information of the current composition string. -void GetCompositionUnderlines(HIMC imm_context, - int target_start, - int target_end, - ui::CompositionUnderlines* underlines) { +void GetImeTextSpans(HIMC imm_context, + int target_start, + int target_end, + ui::ImeTextSpans* ime_text_spans) { int clause_size = ::ImmGetCompositionString(imm_context, GCS_COMPCLAUSE, NULL, 0); int clause_length = clause_size / sizeof(uint32_t); @@ -75,19 +75,19 @@ ::ImmGetCompositionString(imm_context, GCS_COMPCLAUSE, clause_data.get(), clause_size); for (int i = 0; i < clause_length - 1; ++i) { - ui::CompositionUnderline underline; - underline.start_offset = clause_data[i]; - underline.end_offset = clause_data[i+1]; - underline.color = SK_ColorBLACK; - underline.thick = false; - underline.background_color = SK_ColorTRANSPARENT; + ui::ImeTextSpan ime_text_span; + ime_text_span.start_offset = clause_data[i]; + ime_text_span.end_offset = clause_data[i + 1]; + ime_text_span.color = SK_ColorBLACK; + ime_text_span.thick = false; + ime_text_span.background_color = SK_ColorTRANSPARENT; // Use thick underline for the target clause. - if (underline.start_offset >= static_cast<uint32_t>(target_start) && - underline.end_offset <= static_cast<uint32_t>(target_end)) { - underline.thick = true; + if (ime_text_span.start_offset >= static_cast<uint32_t>(target_start) && + ime_text_span.end_offset <= static_cast<uint32_t>(target_end)) { + ime_text_span.thick = true; } - underlines->push_back(underline); + ime_text_spans->push_back(ime_text_span); } } } @@ -294,8 +294,8 @@ LPARAM lparam, CompositionText* composition) { // We only care about GCS_COMPATTR, GCS_COMPCLAUSE and GCS_CURSORPOS, and - // convert them into underlines and selection range respectively. - composition->underlines.clear(); + // convert them into composition underlines and selection range respectively. + composition->ime_text_spans.clear(); int length = static_cast<int>(composition->text.length()); @@ -320,36 +320,36 @@ composition->selection = gfx::Range(0); } - // Retrieve the clause segmentations and convert them to underlines. + // Retrieve the clause segmentations and convert them to ime_text_spans. if (lparam & GCS_COMPCLAUSE) { - GetCompositionUnderlines(imm_context, target_start, target_end, - &composition->underlines); + GetImeTextSpans(imm_context, target_start, target_end, + &composition->ime_text_spans); } - // Set default underlines in case there is no clause information. - if (!composition->underlines.empty()) + // Set default composition underlines in case there is no clause information. + if (!composition->ime_text_spans.empty()) return; - CompositionUnderline underline; - underline.color = SK_ColorBLACK; - underline.background_color = SK_ColorTRANSPARENT; + ImeTextSpan ime_text_span; + ime_text_span.color = SK_ColorBLACK; + ime_text_span.background_color = SK_ColorTRANSPARENT; if (target_start > 0) { - underline.start_offset = 0U; - underline.end_offset = static_cast<uint32_t>(target_start); - underline.thick = false; - composition->underlines.push_back(underline); + ime_text_span.start_offset = 0U; + ime_text_span.end_offset = static_cast<uint32_t>(target_start); + ime_text_span.thick = false; + composition->ime_text_spans.push_back(ime_text_span); } if (target_end > target_start) { - underline.start_offset = static_cast<uint32_t>(target_start); - underline.end_offset = static_cast<uint32_t>(target_end); - underline.thick = true; - composition->underlines.push_back(underline); + ime_text_span.start_offset = static_cast<uint32_t>(target_start); + ime_text_span.end_offset = static_cast<uint32_t>(target_end); + ime_text_span.thick = true; + composition->ime_text_spans.push_back(ime_text_span); } if (target_end < length) { - underline.start_offset = static_cast<uint32_t>(target_end); - underline.end_offset = static_cast<uint32_t>(length); - underline.thick = false; - composition->underlines.push_back(underline); + ime_text_span.start_offset = static_cast<uint32_t>(target_end); + ime_text_span.end_offset = static_cast<uint32_t>(length); + ime_text_span.thick = false; + composition->ime_text_spans.push_back(ime_text_span); } } @@ -403,7 +403,7 @@ composition->text[0] = 0xFF3F; } - // Retrieve the composition underlines and selection range information. + // Retrieve the IME text spans and selection range information. GetCompositionInfo(imm_context, lparam, composition); // Mark that there is an ongoing composition.
diff --git a/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_avocado.png b/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_avocado.png new file mode 100644 index 0000000..d36e36b --- /dev/null +++ b/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_avocado.png Binary files differ
diff --git a/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_cappucino.png b/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_cappucino.png new file mode 100644 index 0000000..b2aef62 --- /dev/null +++ b/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_cappucino.png Binary files differ
diff --git a/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_icecream.png b/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_icecream.png new file mode 100644 index 0000000..247f4bd98 --- /dev/null +++ b/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_icecream.png Binary files differ
diff --git a/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_icewater.png b/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_icewater.png new file mode 100644 index 0000000..b5427c3 --- /dev/null +++ b/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_icewater.png Binary files differ
diff --git a/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_melon.png b/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_melon.png new file mode 100644 index 0000000..d3a8248 --- /dev/null +++ b/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_melon.png Binary files differ
diff --git a/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_onigiri.png b/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_onigiri.png new file mode 100644 index 0000000..f2881146 --- /dev/null +++ b/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_onigiri.png Binary files differ
diff --git a/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_pizza.png b/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_pizza.png new file mode 100644 index 0000000..d533653 --- /dev/null +++ b/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_pizza.png Binary files differ
diff --git a/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_sandwich.png b/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_sandwich.png new file mode 100644 index 0000000..bbce58db --- /dev/null +++ b/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_sandwich.png Binary files differ
diff --git a/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_avocado.png b/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_avocado.png new file mode 100644 index 0000000..036fc9b0 --- /dev/null +++ b/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_avocado.png Binary files differ
diff --git a/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_cappucino.png b/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_cappucino.png new file mode 100644 index 0000000..8027ad4 --- /dev/null +++ b/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_cappucino.png Binary files differ
diff --git a/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_icecream.png b/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_icecream.png new file mode 100644 index 0000000..2aef7b30 --- /dev/null +++ b/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_icecream.png Binary files differ
diff --git a/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_icewater.png b/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_icewater.png new file mode 100644 index 0000000..9a38a16 --- /dev/null +++ b/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_icewater.png Binary files differ
diff --git a/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_melon.png b/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_melon.png new file mode 100644 index 0000000..180155f --- /dev/null +++ b/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_melon.png Binary files differ
diff --git a/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_onigiri.png b/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_onigiri.png new file mode 100644 index 0000000..51b3b75 --- /dev/null +++ b/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_onigiri.png Binary files differ
diff --git a/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_pizza.png b/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_pizza.png new file mode 100644 index 0000000..c5c8dd07 --- /dev/null +++ b/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_pizza.png Binary files differ
diff --git a/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_sandwich.png b/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_sandwich.png new file mode 100644 index 0000000..dfbfd171 --- /dev/null +++ b/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_sandwich.png Binary files differ
diff --git a/ui/chromeos/resources/ui_chromeos_resources.grd b/ui/chromeos/resources/ui_chromeos_resources.grd index d458dea..569f59d1 100644 --- a/ui/chromeos/resources/ui_chromeos_resources.grd +++ b/ui/chromeos/resources/ui_chromeos_resources.grd
@@ -78,6 +78,14 @@ <structure type="chrome_scaled_image" name="IDR_LOGIN_DEFAULT_USER_55" file="default_user_images/illustration/avatar_sushi.png" /> <structure type="chrome_scaled_image" name="IDR_LOGIN_DEFAULT_USER_56" file="default_user_images/illustration/avatar_bike.png" /> <structure type="chrome_scaled_image" name="IDR_LOGIN_DEFAULT_USER_57" file="default_user_images/illustration/avatar_sunglasses.png" /> + <structure type="chrome_scaled_image" name="IDR_LOGIN_DEFAULT_USER_58" file="default_user_images/abstract/avatar_pizza.png" /> + <structure type="chrome_scaled_image" name="IDR_LOGIN_DEFAULT_USER_59" file="default_user_images/abstract/avatar_sandwich.png" /> + <structure type="chrome_scaled_image" name="IDR_LOGIN_DEFAULT_USER_60" file="default_user_images/abstract/avatar_cappucino.png" /> + <structure type="chrome_scaled_image" name="IDR_LOGIN_DEFAULT_USER_61" file="default_user_images/abstract/avatar_icewater.png" /> + <structure type="chrome_scaled_image" name="IDR_LOGIN_DEFAULT_USER_62" file="default_user_images/abstract/avatar_icecream.png" /> + <structure type="chrome_scaled_image" name="IDR_LOGIN_DEFAULT_USER_63" file="default_user_images/abstract/avatar_onigiri.png" /> + <structure type="chrome_scaled_image" name="IDR_LOGIN_DEFAULT_USER_64" file="default_user_images/abstract/avatar_melon.png" /> + <structure type="chrome_scaled_image" name="IDR_LOGIN_DEFAULT_USER_65" file="default_user_images/abstract/avatar_avocado.png" /> <!-- Print Job Notification images. --> <structure type="chrome_scaled_image" name="IDR_PRINT_NOTIFICATION_CANCEL" file="print_notification/cancel.png" />
diff --git a/ui/chromeos/ui_chromeos_strings.grd b/ui/chromeos/ui_chromeos_strings.grd index 1ff7211..b1a2072 100644 --- a/ui/chromeos/ui_chromeos_strings.grd +++ b/ui/chromeos/ui_chromeos_strings.grd
@@ -239,6 +239,30 @@ <message name="IDS_LOGIN_DEFAULT_USER_DESC_57" desc="Description of the default user icon with a picture of a pair of sunglasses"> Sunglasses </message> + <message name="IDS_LOGIN_DEFAULT_USER_DESC_58" desc="Description of the default user icon with a picture of a pizza"> + Pizza + </message> + <message name="IDS_LOGIN_DEFAULT_USER_DESC_59" desc="Description of the default user icon with a picture of a sandwich"> + Sandwich + </message> + <message name="IDS_LOGIN_DEFAULT_USER_DESC_60" desc="Description of the default user icon with a picture of a cappocino"> + Cappocino + </message> + <message name="IDS_LOGIN_DEFAULT_USER_DESC_61" desc="Description of the default user icon with a picture of an ice water"> + Ice water + </message> + <message name="IDS_LOGIN_DEFAULT_USER_DESC_62" desc="Description of the default user icon with a picture of an ice cream"> + Ice cream + </message> + <message name="IDS_LOGIN_DEFAULT_USER_DESC_63" desc="Description of the default user icon with a picture of onigiri"> + Onigiri + </message> + <message name="IDS_LOGIN_DEFAULT_USER_DESC_64" desc="Description of the default user icon with a picture of a melon"> + Melon + </message> + <message name="IDS_LOGIN_DEFAULT_USER_DESC_65" desc="Description of the default user icon with a picture of an avocado"> + Avocado + </message> <!-- Attribution strings for stock user images, not translateable. --> <message translateable="false" name="IDS_LOGIN_DEFAULT_USER_AUTHOR">
diff --git a/ui/display/BUILD.gn b/ui/display/BUILD.gn index 8ec761f..dcede94 100644 --- a/ui/display/BUILD.gn +++ b/ui/display/BUILD.gn
@@ -76,10 +76,6 @@ "CoreGraphics.framework", ] } - - if (is_fuchsia) { - sources += [ "screen_fuchsia.cc" ] - } } component("display_manager_test_api") {
diff --git a/ui/display/screen_fuchsia.cc b/ui/display/screen_fuchsia.cc deleted file mode 100644 index e8f2cb87..0000000 --- a/ui/display/screen_fuchsia.cc +++ /dev/null
@@ -1,18 +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 "ui/display/screen.h" - -#include "base/logging.h" - -namespace display { - -// static -gfx::NativeWindow Screen::GetWindowForView(gfx::NativeView view) { - // TODO(fuchsia): Stubbed during headless bringup https://crbug.com/743296. - NOTREACHED(); - return nullptr; -} - -} // namespace display
diff --git a/ui/events/blink/input_handler_proxy_unittest.cc b/ui/events/blink/input_handler_proxy_unittest.cc index 8666ffd..776a8c6 100644 --- a/ui/events/blink/input_handler_proxy_unittest.cc +++ b/ui/events/blink/input_handler_proxy_unittest.cc
@@ -779,6 +779,8 @@ gesture_.SetType(WebInputEvent::kGestureScrollBegin); EXPECT_EQ(expected_disposition_, input_handler_->HandleInputEvent(gesture_)); + VERIFY_AND_RESET_MOCKS(); + // GSB is dropped and not sent to the main thread, GSE shouldn't get sent to // the main thread, either. expected_disposition_ = InputHandlerProxy::DROP_EVENT; @@ -788,6 +790,12 @@ EXPECT_EQ(expected_disposition_, input_handler_->HandleInputEvent(gesture_)); VERIFY_AND_RESET_MOCKS(); + + expected_disposition_ = InputHandlerProxy::DROP_EVENT; + gesture_.SetType(WebInputEvent::kGestureFlingStart); + EXPECT_EQ(expected_disposition_, input_handler_->HandleInputEvent(gesture_)); + + VERIFY_AND_RESET_MOCKS(); } TEST_P(InputHandlerProxyTest, GestureScrollByPage) {
diff --git a/ui/gfx/buffer_types.h b/ui/gfx/buffer_types.h index 9cb5b7b6..cf53cdc 100644 --- a/ui/gfx/buffer_types.h +++ b/ui/gfx/buffer_types.h
@@ -37,12 +37,16 @@ // by the CPU. *_CPU_READ_WRITE_PERSISTENT adds the additional condition that // successive Map() calls (with Unmap() calls between) will return a pointer to // the same memory contents. SCANOUT implies GPU_READ_WRITE. +// *_VDA_WRITE is for cases where a video decode accellerator writes into +// the buffers. + // TODO(reveman): Add GPU_READ_WRITE for use-cases where SCANOUT is not // required. enum class BufferUsage { GPU_READ, SCANOUT, SCANOUT_CPU_READ_WRITE, + SCANOUT_VDA_WRITE, GPU_READ_CPU_READ_WRITE, // TODO(reveman): Merge this with GPU_READ_CPU_READ_WRITE when SurfaceTexture // backed buffers are single buffered and support it.
diff --git a/ui/gfx/linux/client_native_pixmap_factory_dmabuf.cc b/ui/gfx/linux/client_native_pixmap_factory_dmabuf.cc index a91e5064..16d4af4 100644 --- a/ui/gfx/linux/client_native_pixmap_factory_dmabuf.cc +++ b/ui/gfx/linux/client_native_pixmap_factory_dmabuf.cc
@@ -68,6 +68,8 @@ format == gfx::BufferFormat::BGRA_8888 || format == gfx::BufferFormat::RGBX_8888 || format == gfx::BufferFormat::RGBA_8888; + case gfx::BufferUsage::SCANOUT_VDA_WRITE: + return false; case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE: case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT: { #if defined(OS_CHROMEOS) @@ -104,6 +106,7 @@ #endif case gfx::BufferUsage::GPU_READ: case gfx::BufferUsage::SCANOUT: + case gfx::BufferUsage::SCANOUT_VDA_WRITE: // Close all the fds. for (const auto& fd : handle.fds) base::ScopedFD scoped_fd(fd.fd);
diff --git a/ui/gfx/mojo/buffer_types.mojom b/ui/gfx/mojo/buffer_types.mojom index 29c50d54..b11bec3 100644 --- a/ui/gfx/mojo/buffer_types.mojom +++ b/ui/gfx/mojo/buffer_types.mojom
@@ -33,6 +33,7 @@ GPU_READ, SCANOUT, SCANOUT_CPU_READ_WRITE, + SCANOUT_VDA_WRITE, GPU_READ_CPU_READ_WRITE, GPU_READ_CPU_READ_WRITE_PERSISTENT,
diff --git a/ui/gfx/mojo/buffer_types_struct_traits.h b/ui/gfx/mojo/buffer_types_struct_traits.h index fadb17a8..0f0b1ad 100644 --- a/ui/gfx/mojo/buffer_types_struct_traits.h +++ b/ui/gfx/mojo/buffer_types_struct_traits.h
@@ -128,6 +128,8 @@ return gfx::mojom::BufferUsage::SCANOUT; case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE: return gfx::mojom::BufferUsage::SCANOUT_CPU_READ_WRITE; + case gfx::BufferUsage::SCANOUT_VDA_WRITE: + return gfx::mojom::BufferUsage::SCANOUT_VDA_WRITE; case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE: return gfx::mojom::BufferUsage::GPU_READ_CPU_READ_WRITE; case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT: @@ -148,6 +150,9 @@ case gfx::mojom::BufferUsage::SCANOUT_CPU_READ_WRITE: *out = gfx::BufferUsage::SCANOUT_CPU_READ_WRITE; return true; + case gfx::mojom::BufferUsage::SCANOUT_VDA_WRITE: + *out = gfx::BufferUsage::SCANOUT_VDA_WRITE; + return true; case gfx::mojom::BufferUsage::GPU_READ_CPU_READ_WRITE: *out = gfx::BufferUsage::GPU_READ_CPU_READ_WRITE; return true;
diff --git a/ui/login/account_picker/md_user_pod_row.js b/ui/login/account_picker/md_user_pod_row.js index dae3ddd1c..b2606f7f 100644 --- a/ui/login/account_picker/md_user_pod_row.js +++ b/ui/login/account_picker/md_user_pod_row.js
@@ -2915,6 +2915,8 @@ // If testing mode is enabled. testingModeEnabled_: false, + // The color used by the scroll list when the user count exceeds + // LANDSCAPE_MODE_LIMIT or PORTRAIT_MODE_LIMIT. overlayColors_: {maskColor: undefined, scrollColor: undefined}, /** @override */ @@ -3577,7 +3579,15 @@ * screen orientation and showing the virtual keyboard. */ onWindowResize: function() { - this.placePods_(); + var isAccountPicker = + $('login-header-bar').signinUIState == SIGNIN_UI_STATE.ACCOUNT_PICKER; + if (isAccountPicker) { + // Redo pod placement if account picker is the current screen. + this.placePods_(); + } else { + // Postpone pod placement. |handleBeforeShow| will check this flag. + this.podPlacementPostponed_ = true; + } }, /**
diff --git a/ui/login/display_manager.js b/ui/login/display_manager.js index 1dcda53..87e40cc 100644 --- a/ui/login/display_manager.js +++ b/ui/login/display_manager.js
@@ -105,10 +105,6 @@ // A lock screen enabled app is running in foreground - an app window is // shown over the lock screen user pods (header bar should still be visible). FOREGROUND: 'LOCK_SCREEN_APPS_STATE.FOREGROUND', - // State used to request launch of a lock screen note-taking app - this state - // is not expected to be received from platform as a current state (instead, - // on successful launch, state will be changed to FOREGROUND). - LAUNCH_REQUESTED: 'LOCK_SCREEN_APPS_STATE.LAUNCH_REQUESTED' }; /** @const */ var USER_ACTION_ROLLBACK_TOGGLED = 'rollback-toggled'; @@ -809,6 +805,9 @@ var currentScreen = $(currentScreenId); if (currentScreen) currentScreen.onWindowResize(); + // The account picker always needs to be notified of window size changes. + if (currentScreenId != SCREEN_ACCOUNT_PICKER && $(SCREEN_ACCOUNT_PICKER)) + $(SCREEN_ACCOUNT_PICKER).onWindowResize(); }, /*
diff --git a/ui/message_center/views/notification_header_view.cc b/ui/message_center/views/notification_header_view.cc index 651bc2c7..0c3cb8b8 100644 --- a/ui/message_center/views/notification_header_view.cc +++ b/ui/message_center/views/notification_header_view.cc
@@ -138,6 +138,12 @@ views::BoxLayout::CROSS_AXIS_ALIGNMENT_CENTER); SetLayoutManager(layout); + ink_drop_container_ = new views::InkDropContainerView(); + ink_drop_container_->SetPaintToLayer(); + ink_drop_container_->layer()->SetFillsBoundsOpaquely(false); + ink_drop_container_->SetVisible(false); + AddChildView(ink_drop_container_); + views::View* app_info_container = new views::View(); views::BoxLayout* app_info_layout = new views::BoxLayout(views::BoxLayout::kHorizontal, @@ -308,6 +314,16 @@ return highlight; } +void NotificationHeaderView::AddInkDropLayer(ui::Layer* ink_drop_layer) { + ink_drop_container_->AddInkDropLayer(ink_drop_layer); + InstallInkDropMask(ink_drop_layer); +} + +void NotificationHeaderView::RemoveInkDropLayer(ui::Layer* ink_drop_layer) { + ResetInkDropMask(); + ink_drop_container_->RemoveInkDropLayer(ink_drop_layer); +} + void NotificationHeaderView::UpdateSummaryTextVisibility() { const bool visible = has_progress_ || has_overflow_indicator_; summary_text_divider_->SetVisible(visible);
diff --git a/ui/message_center/views/notification_header_view.h b/ui/message_center/views/notification_header_view.h index fe9be9e..73c6f79 100644 --- a/ui/message_center/views/notification_header_view.h +++ b/ui/message_center/views/notification_header_view.h
@@ -46,6 +46,8 @@ std::unique_ptr<views::InkDropRipple> CreateInkDropRipple() const override; std::unique_ptr<views::InkDropHighlight> CreateInkDropHighlight() const override; + void AddInkDropLayer(ui::Layer* ink_drop_layer) override; + void RemoveInkDropLayer(ui::Layer* ink_drop_layer) override; views::ImageView* expand_button() { return expand_button_; } @@ -55,6 +57,7 @@ SkColor accent_color_ = message_center::kNotificationDefaultAccentColor; + views::InkDropContainerView* ink_drop_container_ = nullptr; views::Label* app_name_view_ = nullptr; views::Label* summary_text_divider_ = nullptr; views::Label* summary_text_view_ = nullptr;
diff --git a/ui/message_center/views/notification_view_md.cc b/ui/message_center/views/notification_view_md.cc index ea22ba4..21eead2 100644 --- a/ui/message_center/views/notification_view_md.cc +++ b/ui/message_center/views/notification_view_md.cc
@@ -573,6 +573,24 @@ void NotificationViewMD::CreateOrUpdateContextTitleView( const Notification& notification) { +#if defined(OS_CHROMEOS) + // If |origin_url| and |display_source| are both empty, assume it is + // system notification, and use default |display_source| and + // |accent_color| for system notification. + // TODO(tetsui): Remove this after all system notification transition is + // completed. + // All system notification should use Notification::CreateSystemNotification() + if (notification.display_source().empty() && + notification.origin_url().is_empty()) { + header_row_->SetAppName(l10n_util::GetStringFUTF16( + IDS_MESSAGE_CENTER_NOTIFICATION_CHROMEOS_SYSTEM, + MessageCenter::Get()->GetProductOSName())); + header_row_->SetAccentColor(message_center::kSystemNotificationColorNormal); + header_row_->SetTimestamp(notification.timestamp()); + return; + } +#endif + header_row_->SetAppName(notification.display_source()); header_row_->SetAccentColor( notification.accent_color() == SK_ColorTRANSPARENT
diff --git a/ui/ozone/platform/drm/gpu/drm_thread.cc b/ui/ozone/platform/drm/gpu/drm_thread.cc index 3b95263..1d3b205 100644 --- a/ui/ozone/platform/drm/gpu/drm_thread.cc +++ b/ui/ozone/platform/drm/gpu/drm_thread.cc
@@ -125,6 +125,9 @@ case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE: flags = GBM_BO_USE_LINEAR | GBM_BO_USE_SCANOUT | GBM_BO_USE_TEXTURING; break; + case gfx::BufferUsage::SCANOUT_VDA_WRITE: + flags = GBM_BO_USE_SCANOUT | GBM_BO_USE_TEXTURING; + break; case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE: case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT: flags = GBM_BO_USE_LINEAR | GBM_BO_USE_TEXTURING; @@ -141,11 +144,21 @@ if (window && window->GetController()) modifiers = window->GetController()->GetFormatModifiers(fourcc_format); - if (modifiers.size() > 0 && !(flags & GBM_BO_USE_LINEAR)) - *buffer = GbmBuffer::CreateBufferWithModifiers(gbm, fourcc_format, size, - flags, modifiers); - else - *buffer = GbmBuffer::CreateBuffer(gbm, fourcc_format, size, flags); + // NOTE: BufferUsage::SCANOUT is used to create buffers that will be + // explicitly set via kms on a CRTC (e.g: BufferQueue buffers), therefore + // allocation should fail if it's not possible to allocate a BO_USE_SCANOUT + // buffer in that case. + bool retry_without_scanout = usage != gfx::BufferUsage::SCANOUT; + do { + if (modifiers.size() > 0 && !(flags & GBM_BO_USE_LINEAR)) + *buffer = GbmBuffer::CreateBufferWithModifiers(gbm, fourcc_format, size, + flags, modifiers); + else + *buffer = GbmBuffer::CreateBuffer(gbm, fourcc_format, size, flags); + retry_without_scanout = + retry_without_scanout && (flags & GBM_BO_USE_SCANOUT); + flags &= ~GBM_BO_USE_SCANOUT; + } while (retry_without_scanout); } void DrmThread::CreateBufferFromFds(
diff --git a/ui/ozone/platform/wayland/wayland_window.cc b/ui/ozone/platform/wayland/wayland_window.cc index 85cfee52..a7f4313 100644 --- a/ui/ozone/platform/wayland/wayland_window.cc +++ b/ui/ozone/platform/wayland/wayland_window.cc
@@ -96,7 +96,7 @@ void WaylandWindow::SetTitle(const base::string16& title) { DCHECK(xdg_surface_); - xdg_surface_set_title(xdg_surface_.get(), UTF16ToUTF8(title).c_str()); + xdg_surface_set_title(xdg_surface_.get(), base::UTF16ToUTF8(title).c_str()); connection_->ScheduleFlush(); }
diff --git a/ui/views/animation/OWNERS b/ui/views/animation/OWNERS index 9710b4e0..be29560 100644 --- a/ui/views/animation/OWNERS +++ b/ui/views/animation/OWNERS
@@ -1 +1 @@ -per-file *ink*=bruthig@chromium.org +per-file *ink*=mohsen@chromium.org
diff --git a/ui/views/animation/test/OWNERS b/ui/views/animation/test/OWNERS index 9710b4e0..be29560 100644 --- a/ui/views/animation/test/OWNERS +++ b/ui/views/animation/test/OWNERS
@@ -1 +1 @@ -per-file *ink*=bruthig@chromium.org +per-file *ink*=mohsen@chromium.org
diff --git a/ui/views/bubble/bubble_dialog_delegate_unittest.cc b/ui/views/bubble/bubble_dialog_delegate_unittest.cc index 0887c89..a6c2b175 100644 --- a/ui/views/bubble/bubble_dialog_delegate_unittest.cc +++ b/ui/views/bubble/bubble_dialog_delegate_unittest.cc
@@ -13,6 +13,7 @@ #include "ui/events/event_utils.h" #include "ui/views/bubble/bubble_frame_view.h" #include "ui/views/controls/button/label_button.h" +#include "ui/views/controls/styled_label.h" #include "ui/views/test/test_views.h" #include "ui/views/test/test_widget_observer.h" #include "ui/views/test/views_test_base.h" @@ -58,6 +59,7 @@ using BubbleDialogDelegateView::SetAnchorRect; using BubbleDialogDelegateView::GetBubbleFrameView; + using BubbleDialogDelegateView::SizeToContents; private: View* view_; @@ -384,4 +386,37 @@ title_view->bounds().right()); } +// Ensure the BubbleFrameView correctly resizes when the title is provided by a +// StyledLabel. +TEST_F(BubbleDialogDelegateTest, StyledLabelTitle) { + std::unique_ptr<Widget> anchor_widget(CreateTestWidget()); + TestBubbleDialogDelegateView* bubble_delegate = + new TestBubbleDialogDelegateView(anchor_widget->GetContentsView()); + StyledLabel* title_view = new StyledLabel(base::ASCIIToUTF16("123"), nullptr); + bubble_delegate->set_title_view(title_view); + + Widget* bubble_widget = + BubbleDialogDelegateView::CreateBubble(bubble_delegate); + bubble_widget->Show(); + + const gfx::Size size_before_new_title = + bubble_widget->GetWindowBoundsInScreen().size(); + title_view->SetText(base::ASCIIToUTF16("12")); + bubble_delegate->SizeToContents(); + + // A shorter title should change nothing, since both will be within the + // minimum dialog width. + EXPECT_EQ(size_before_new_title, + bubble_widget->GetWindowBoundsInScreen().size()); + + title_view->SetText(base::UTF8ToUTF16(std::string(200, '0'))); + bubble_delegate->SizeToContents(); + + // A (much) longer title should increase the height, but not the width. + EXPECT_EQ(size_before_new_title.width(), + bubble_widget->GetWindowBoundsInScreen().width()); + EXPECT_LT(size_before_new_title.height(), + bubble_widget->GetWindowBoundsInScreen().height()); +} + } // namespace views
diff --git a/ui/views/bubble/bubble_frame_view.cc b/ui/views/bubble/bubble_frame_view.cc index 33849cdd..a7b5468 100644 --- a/ui/views/bubble/bubble_frame_view.cc +++ b/ui/views/bubble/bubble_frame_view.cc
@@ -159,8 +159,10 @@ } gfx::Rect BubbleFrameView::GetBoundsForClientView() const { + // When NonClientView asks for this, the size of the frame view has been set + // (i.e. |this|), but not the client view bounds. gfx::Rect client_bounds = GetContentsBounds(); - client_bounds.Inset(GetInsets()); + client_bounds.Inset(GetClientInsetsForFrameWidth(client_bounds.width())); // Only account for footnote_container_'s height if it's visible, because // content_margins_ adds extra padding even if all child views are invisible. if (footnote_container_ && footnote_container_->visible()) { @@ -172,12 +174,17 @@ gfx::Rect BubbleFrameView::GetWindowBoundsForClientBounds( const gfx::Rect& client_bounds) const { - gfx::Size size(GetSizeForClientSize(client_bounds.size())); + gfx::Size size(GetFrameSizeForClientSize(client_bounds.size())); return bubble_border_->GetBounds(gfx::Rect(), size); } bool BubbleFrameView::GetClientMask(const gfx::Size& size, gfx::Path* path) const { + // NonClientView calls this after setting the client view size from the return + // of GetBoundsForClientView(); feeding it back in |size|. + DCHECK(GetBoundsForClientView().size() == size); + DCHECK(GetWidget()->client_view()->size() == size); + const int radius = bubble_border_->GetBorderCornerRadius(); gfx::Insets content_insets = GetInsets(); // If the client bounds don't touch the edges, no need to mask. @@ -288,20 +295,7 @@ } gfx::Insets BubbleFrameView::GetInsets() const { - gfx::Insets insets = content_margins_; - - const int icon_height = title_icon_->GetPreferredSize().height(); - const int label_height = title()->GetPreferredSize().height(); - const bool has_title = icon_height > 0 || label_height > 0; - const int title_padding = has_title ? title_margins_.height() : 0; - const int title_height = std::max(icon_height, label_height) + title_padding; - const int close_height = - GetWidget()->widget_delegate()->ShouldShowCloseButton() - ? close_->height() + LayoutProvider::Get()->GetDistanceMetric( - DISTANCE_CLOSE_BUTTON_MARGIN) - : 0; - insets += gfx::Insets(std::max(title_height, close_height), 0, 0, 0); - return insets; + return GetClientInsetsForFrameWidth(GetContentsBounds().width()); } gfx::Size BubbleFrameView::CalculatePreferredSize() const { @@ -369,6 +363,17 @@ title_icon_pref_size.width() > 0 ? title_margins_.left() : 0; const int title_label_x = bounds.x() + title_icon_pref_size.width() + title_icon_padding; + + // TODO(tapted): Layout() should skip more surrounding code when !HasTitle(). + // Currently DCHECKs fail since title_insets is 0 when there is no title. + if (DCHECK_IS_ON() && HasTitle()) { + gfx::Insets title_insets = GetTitleLabelInsetsFromFrame(); + if (border()) + title_insets += border()->GetInsets(); + DCHECK_EQ(title_insets.left(), title_label_x); + DCHECK_EQ(title_insets.right(), width() - title_label_right); + } + const int title_available_width = std::max(1, title_label_right - title_label_x); const int title_preferred_height = @@ -470,7 +475,7 @@ gfx::Rect BubbleFrameView::GetUpdatedWindowBounds(const gfx::Rect& anchor_rect, const gfx::Size& client_size, bool adjust_if_offscreen) { - gfx::Size size(GetSizeForClientSize(client_size)); + gfx::Size size(GetFrameSizeForClientSize(client_size)); const BubbleBorder::Arrow arrow = bubble_border_->arrow(); if (adjust_if_offscreen && BubbleBorder::has_arrow(arrow)) { @@ -572,34 +577,79 @@ SchedulePaint(); } -gfx::Size BubbleFrameView::GetSizeForClientSize( - const gfx::Size& client_size) const { - // Accommodate the width of the title bar elements. - int title_bar_width = title_margins_.width() + border()->GetInsets().width(); - gfx::Size title_icon_size = title_icon_->GetPreferredSize(); - gfx::Size title_label_size = title()->GetPreferredSize(); - if (title_icon_size.width() > 0 && title_label_size.width() > 0) - title_bar_width += title_margins_.left(); - title_bar_width += title_icon_size.width(); - if (close_->visible()) - title_bar_width += close_->width() + 1; +int BubbleFrameView::GetFrameWidthForClientWidth(int client_width) const { + // Note that GetMinimumSize() for multiline Labels is typically 0. + const int title_bar_width = title()->GetMinimumSize().width() + + GetTitleLabelInsetsFromFrame().width(); + const int client_area_width = client_width + content_margins_.width(); + const int frame_width = std::max(title_bar_width, client_area_width); + DialogDelegate* dialog_delegate = + GetWidget()->widget_delegate()->AsDialogDelegate(); + return dialog_delegate && dialog_delegate->ShouldSnapFrameWidth() + ? LayoutProvider::Get()->GetSnappedDialogWidth(frame_width) + : frame_width; +} - gfx::Size size(client_size); - gfx::Insets client_insets = GetInsets(); - size.Enlarge(client_insets.width(), client_insets.height()); - size.SetToMax(gfx::Size(title_bar_width, 0)); +gfx::Size BubbleFrameView::GetFrameSizeForClientSize( + const gfx::Size& client_size) const { + const int frame_width = GetFrameWidthForClientWidth(client_size.width()); + const gfx::Insets client_insets = GetClientInsetsForFrameWidth(frame_width); + DCHECK_GE(frame_width, client_size.width()); + gfx::Size size(frame_width, client_size.height() + client_insets.height()); // Only account for footnote_container_'s height if it's visible, because // content_margins_ adds extra padding even if all child views are invisible. if (footnote_container_ && footnote_container_->visible()) size.Enlarge(0, footnote_container_->GetHeightForWidth(size.width())); - DialogDelegate* dialog_delegate = - GetWidget()->widget_delegate()->AsDialogDelegate(); - if (dialog_delegate && dialog_delegate->ShouldSnapFrameWidth()) - size.set_width(LayoutProvider::Get()->GetSnappedDialogWidth(size.width())); - return size; } +bool BubbleFrameView::HasTitle() const { + return custom_title_ != nullptr || + default_title_->GetPreferredSize().height() > 0 || + title_icon_->GetPreferredSize().height() > 0; +} + +gfx::Insets BubbleFrameView::GetTitleLabelInsetsFromFrame() const { + int insets_right = 0; + if (GetWidget()->widget_delegate()->ShouldShowCloseButton()) { + const int close_margin = + LayoutProvider::Get()->GetDistanceMetric(DISTANCE_CLOSE_BUTTON_MARGIN); + insets_right = 2 * close_margin + close_->width(); + } + if (!HasTitle()) + return gfx::Insets(0, 0, 0, insets_right); + + insets_right = std::max(insets_right, title_margins_.right()); + const gfx::Size title_icon_pref_size = title_icon_->GetPreferredSize(); + const int title_icon_padding = + title_icon_pref_size.width() > 0 ? title_margins_.left() : 0; + const int insets_left = + title_margins_.left() + title_icon_pref_size.width() + title_icon_padding; + return gfx::Insets(title_margins_.top(), insets_left, title_margins_.bottom(), + insets_right); +} + +gfx::Insets BubbleFrameView::GetClientInsetsForFrameWidth( + int frame_width) const { + int close_height = 0; + if (GetWidget()->widget_delegate()->ShouldShowCloseButton()) { + const int close_margin = + LayoutProvider::Get()->GetDistanceMetric(DISTANCE_CLOSE_BUTTON_MARGIN); + // Note: |close_margin| is not applied on the bottom of the icon. + close_height = close_margin + close_->height(); + } + if (!HasTitle()) + return content_margins_ + gfx::Insets(close_height, 0, 0, 0); + + const int icon_height = title_icon_->GetPreferredSize().height(); + const int label_height = title()->GetHeightForWidth( + frame_width - GetTitleLabelInsetsFromFrame().width()); + const int title_height = + std::max(icon_height, label_height) + title_margins_.height(); + return content_margins_ + + gfx::Insets(std::max(title_height, close_height), 0, 0, 0); +} + } // namespace views
diff --git a/ui/views/bubble/bubble_frame_view.h b/ui/views/bubble/bubble_frame_view.h index 37d2fddf..b456f3c 100644 --- a/ui/views/bubble/bubble_frame_view.h +++ b/ui/views/bubble/bubble_frame_view.h
@@ -123,8 +123,26 @@ void OffsetArrowIfOffScreen(const gfx::Rect& anchor_rect, const gfx::Size& client_size); + // The width of the frame for the given |client_width|. The result accounts + // for the minimum title bar width and includes all insets and possible + // snapping. It does not include the border. + int GetFrameWidthForClientWidth(int client_width) const; + // Calculates the size needed to accommodate the given client area. - gfx::Size GetSizeForClientSize(const gfx::Size& client_size) const; + gfx::Size GetFrameSizeForClientSize(const gfx::Size& client_size) const; + + // True if the frame has a title area. This is the area affected by + // |title_margins_|, including the icon and title text, but not the close + // button. + bool HasTitle() const; + + // The insets of the text portion of the title, based on |title_margins_| and + // whether there is an icon and/or close button. Note there may be no title, + // in which case only insets required for the close button are returned. + gfx::Insets GetTitleLabelInsetsFromFrame() const; + + // The client_view insets (from the frame view) for the given |frame_width|. + gfx::Insets GetClientInsetsForFrameWidth(int frame_width) const; // The bubble border. BubbleBorder* bubble_border_;
diff --git a/ui/views/bubble/bubble_frame_view_unittest.cc b/ui/views/bubble/bubble_frame_view_unittest.cc index 61066f0..92072dfe 100644 --- a/ui/views/bubble/bubble_frame_view_unittest.cc +++ b/ui/views/bubble/bubble_frame_view_unittest.cc
@@ -552,11 +552,23 @@ } ~TestBubbleDialogDelegateView() override {} - using BubbleDialogDelegateView::SetAnchorView; + void ChangeTitle(const base::string16& title) { + title_ = title; + // Note UpdateWindowTitle() always does a layout, which will be invalid if + // the Widget needs to change size. But also SizeToContents() _only_ does a + // layout if the size is actually changing. + GetWidget()->UpdateWindowTitle(); + SizeToContents(); + } void set_override_snap(bool value) { override_snap_ = value; } // BubbleDialogDelegateView: + using BubbleDialogDelegateView::SetAnchorView; + using BubbleDialogDelegateView::SizeToContents; + base::string16 GetWindowTitle() const override { return title_; } + bool ShouldShowWindowTitle() const override { return !title_.empty(); } + void DeleteDelegate() override { // This delegate is owned by the test case itself, so it should not delete // itself here. @@ -566,16 +578,34 @@ return override_snap_.value_or( BubbleDialogDelegateView::ShouldSnapFrameWidth()); } + gfx::Size GetMinimumSize() const override { return gfx::Size(); } gfx::Size CalculatePreferredSize() const override { return gfx::Size(200, 200); } private: + base::string16 title_; base::Optional<bool> override_snap_; DISALLOW_COPY_AND_ASSIGN(TestBubbleDialogDelegateView); }; +class TestAnchor { + public: + explicit TestAnchor(Widget::InitParams params) { + params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; + widget_.Init(params); + widget_.Show(); + } + + Widget& widget() { return widget_; } + + private: + Widget widget_; + + DISALLOW_COPY_AND_ASSIGN(TestAnchor); +}; + } // namespace // This test ensures that if the installed LayoutProvider snaps dialog widths, @@ -583,14 +613,9 @@ TEST_F(BubbleFrameViewTest, WidthSnaps) { test::TestLayoutProvider provider; TestBubbleDialogDelegateView delegate; + TestAnchor anchor(CreateParams(Widget::InitParams::TYPE_WINDOW)); - Widget anchor; - Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW); - params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; - anchor.Init(params); - anchor.Show(); - - delegate.SetAnchorView(anchor.GetContentsView()); + delegate.SetAnchorView(anchor.widget().GetContentsView()); delegate.set_margins(gfx::Insets()); Widget* w0 = BubbleDialogDelegateView::CreateBubble(&delegate); @@ -618,4 +643,83 @@ w2->CloseNow(); } +// Tests edge cases when the frame's title view starts to wrap text. This is to +// ensure that the calculations BubbleFrameView does to determine the Widget +// size for a given client view are consistent with the eventual size that the +// client view takes after Layout(). +TEST_F(BubbleFrameViewTest, LayoutEdgeCases) { + test::TestLayoutProvider provider; + TestBubbleDialogDelegateView delegate; + TestAnchor anchor(CreateParams(Widget::InitParams::TYPE_WINDOW)); + delegate.SetAnchorView(anchor.widget().GetContentsView()); + + Widget* bubble = BubbleDialogDelegateView::CreateBubble(&delegate); + bubble->Show(); + + // Even though the bubble has default margins, the dialog view should have + // been given its preferred size. + EXPECT_FALSE(delegate.margins().IsEmpty()); + EXPECT_EQ(delegate.size(), delegate.GetPreferredSize()); + + // Starting with a short title. + base::string16 title(1, 'i'); + delegate.ChangeTitle(title); + const int min_bubble_height = bubble->GetWindowBoundsInScreen().height(); + EXPECT_LT(delegate.GetPreferredSize().height(), min_bubble_height); + + // Grow the title incrementally until word wrap is required. There should + // never be a point where the BubbleFrameView over- or under-estimates the + // size required for the title. If it did, it would cause SizeToContents() to + // Widget size requiring the subsequent Layout() to fill the remaining client + // area with something other than |delegate|'s preferred size. + while (bubble->GetWindowBoundsInScreen().height() == min_bubble_height) { + title += ' '; + title += 'i'; + delegate.ChangeTitle(title); + EXPECT_EQ(delegate.GetPreferredSize(), delegate.size()) << title; + } + + // Sanity check that something interesting happened. The bubble should have + // grown by "a line" for the wrapped title, and the title should have reached + // a length that would have likely caused word wrap. A typical result would be + // a +17-20 change in height and title length of 53 characters. + const int two_line_height = bubble->GetWindowBoundsInScreen().height(); + EXPECT_LT(12, two_line_height - min_bubble_height); + EXPECT_GT(25, two_line_height - min_bubble_height); + EXPECT_LT(30u, title.size()); + EXPECT_GT(80u, title.size()); + + // Now add dialog snapping. + provider.SetSnappedDialogWidth(300); + delegate.SizeToContents(); + + // Height should go back to |min_bubble_height| since the window is wider: + // word wrapping should no longer happen. + EXPECT_EQ(min_bubble_height, bubble->GetWindowBoundsInScreen().height()); + EXPECT_EQ(300, bubble->GetWindowBoundsInScreen().width()); + + // Now we are allowed to diverge from the client view width, but not height. + EXPECT_EQ(delegate.GetPreferredSize().height(), delegate.height()); + EXPECT_LT(delegate.GetPreferredSize().width(), delegate.width()); + EXPECT_GT(300, delegate.width()); // Greater, since there are margins. + + const gfx::Size snapped_size = delegate.size(); + const size_t old_title_size = title.size(); + + // Grow the title again with width snapping until word wrapping occurs. + while (bubble->GetWindowBoundsInScreen().height() == min_bubble_height) { + title += ' '; + title += 'i'; + delegate.ChangeTitle(title); + EXPECT_EQ(snapped_size, delegate.size()) << title; + } + // Change to the height should have been the same as before. Title should + // have grown about 50%. + EXPECT_EQ(two_line_height, bubble->GetWindowBoundsInScreen().height()); + EXPECT_LT(15u, title.size() - old_title_size); + EXPECT_GT(40u, title.size() - old_title_size); + + // When |anchor| goes out of scope it should take |bubble| with it. +} + } // namespace views
diff --git a/ui/views/cocoa/bridged_content_view.mm b/ui/views/cocoa/bridged_content_view.mm index e300b7e..6d05846 100644 --- a/ui/views/cocoa/bridged_content_view.mm +++ b/ui/views/cocoa/bridged_content_view.mm
@@ -1449,7 +1449,7 @@ // the Chrome renderer. Add code to extract underlines from |text| once our // render text implementation supports thick underlines and discontinous // underlines for consecutive characters. See http://crbug.com/612675. - composition.underlines.push_back(ui::CompositionUnderline( + composition.ime_text_spans.push_back(ui::ImeTextSpan( 0, [text length], SK_ColorBLACK, false, SK_ColorTRANSPARENT)); textInputClient_->SetCompositionText(composition); hasUnhandledKeyDownEvent_ = NO;
diff --git a/ui/views/cocoa/bridged_native_widget_unittest.mm b/ui/views/cocoa/bridged_native_widget_unittest.mm index a500e998..733bd50 100644 --- a/ui/views/cocoa/bridged_native_widget_unittest.mm +++ b/ui/views/cocoa/bridged_native_widget_unittest.mm
@@ -40,6 +40,7 @@ using base::SysNSStringToUTF8; using base::SysNSStringToUTF16; using base::SysUTF8ToNSString; +using base::SysUTF16ToNSString; #define EXPECT_EQ_RANGE(a, b) \ EXPECT_EQ(a.location, b.location); \
diff --git a/ui/views/controls/textfield/textfield_model.cc b/ui/views/controls/textfield/textfield_model.cc index f4d2282..58d466b 100644 --- a/ui/views/controls/textfield/textfield_model.cc +++ b/ui/views/controls/textfield/textfield_model.cc
@@ -256,8 +256,8 @@ // representing the target clause (on Windows). Returns an invalid range if // there is no such a range. gfx::Range GetFirstEmphasizedRange(const ui::CompositionText& composition) { - for (size_t i = 0; i < composition.underlines.size(); ++i) { - const ui::CompositionUnderline& underline = composition.underlines[i]; + for (size_t i = 0; i < composition.ime_text_spans.size(); ++i) { + const ui::ImeTextSpan& underline = composition.ime_text_spans[i]; if (underline.thick) return gfx::Range(underline.start_offset, underline.end_offset); } @@ -659,8 +659,9 @@ base::string16 new_text = text(); render_text_->SetText(new_text.insert(cursor, composition.text)); composition_range_ = gfx::Range(cursor, cursor + composition.text.length()); - // Don't render transparent composition underlines. - if (composition.underlines.size() > 0 && composition.underlines[0].color != 0) + // Don't render transparent IME spans. + if (composition.ime_text_spans.size() > 0 && + composition.ime_text_spans[0].color != 0) render_text_->SetCompositionRange(composition_range_); else render_text_->SetCompositionRange(gfx::Range::InvalidRange());
diff --git a/ui/views/controls/textfield/textfield_model_unittest.cc b/ui/views/controls/textfield/textfield_model_unittest.cc index d3722bb..a28fb1e 100644 --- a/ui/views/controls/textfield/textfield_model_unittest.cc +++ b/ui/views/controls/textfield/textfield_model_unittest.cc
@@ -867,7 +867,7 @@ ui::CompositionText composition; composition.text = base::ASCIIToUTF16("678"); - composition.underlines.push_back(ui::CompositionUnderline(0, 3, 0, false)); + composition.ime_text_spans.push_back(ui::ImeTextSpan(0, 3, 0, false)); // Cursor should be at the end of composition when characters are just typed. composition.selection = gfx::Range(3, 3); @@ -881,15 +881,15 @@ // Restart composition with targeting "67" in "678". composition.selection = gfx::Range(1, 3); - composition.underlines.clear(); - composition.underlines.push_back(ui::CompositionUnderline(0, 2, 0, true)); - composition.underlines.push_back(ui::CompositionUnderline(2, 3, 0, false)); + composition.ime_text_spans.clear(); + composition.ime_text_spans.push_back(ui::ImeTextSpan(0, 2, 0, true)); + composition.ime_text_spans.push_back(ui::ImeTextSpan(2, 3, 0, false)); model.SetCompositionText(composition); EXPECT_TRUE(model.HasCompositionText()); EXPECT_TRUE(model.HasSelection()); #if !defined(OS_CHROMEOS) // |composition.selection| is ignored because SetCompositionText checks - // if a bold underline exists first. + // if a thick underline exists first. EXPECT_EQ(gfx::Range(5, 7), model.render_text()->selection()); EXPECT_EQ(7U, model.render_text()->cursor_position()); #else @@ -922,9 +922,9 @@ composition_text_confirmed_or_cleared_ = false; model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_RIGHT, gfx::SELECTION_NONE); - // Also test the case where a selection exists but a bold underline doesn't. + // Also test the case where a selection exists but a thick underline doesn't. composition.selection = gfx::Range(0, 1); - composition.underlines.clear(); + composition.ime_text_spans.clear(); model.SetCompositionText(composition); EXPECT_STR_EQ("1234567890678", model.text()); EXPECT_TRUE(model.HasSelection()); @@ -1475,7 +1475,7 @@ ui::CompositionText composition; composition.text = base::ASCIIToUTF16("abc"); - composition.underlines.push_back(ui::CompositionUnderline(0, 3, 0, false)); + composition.ime_text_spans.push_back(ui::ImeTextSpan(0, 3, 0, false)); composition.selection = gfx::Range(2, 3); model.SetText(base::ASCIIToUTF16("ABCDE"));
diff --git a/ui/views/view.cc b/ui/views/view.cc index 72cdf76..44d60e4f 100644 --- a/ui/views/view.cc +++ b/ui/views/view.cc
@@ -908,10 +908,10 @@ // Transform |clip_path_| from local space to parent recording space. gfx::Transform to_parent_recording_space; + to_parent_recording_space.Translate(paint_info.offset_from_parent()); to_parent_recording_space.Scale( SkFloatToScalar(paint_info.paint_recording_scale_x()), SkFloatToScalar(paint_info.paint_recording_scale_y())); - to_parent_recording_space.Translate(paint_info.offset_from_parent()); clip_path_in_parent.transform(to_parent_recording_space.matrix()); clip_recorder.ClipPathWithAntiAliasing(clip_path_in_parent);
diff --git a/ui/views/widget/native_widget_mac.mm b/ui/views/widget/native_widget_mac.mm index 398ea45f..7494b20 100644 --- a/ui/views/widget/native_widget_mac.mm +++ b/ui/views/widget/native_widget_mac.mm
@@ -268,7 +268,7 @@ bool NativeWidgetMac::SetWindowTitle(const base::string16& title) { NSWindow* window = GetNativeWindow(); NSString* current_title = [window title]; - NSString* new_title = SysUTF16ToNSString(title); + NSString* new_title = base::SysUTF16ToNSString(title); if ([current_title isEqualToString:new_title]) return false;
diff --git a/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_camera.js b/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_camera.js index 0d06a9e6..40fe593 100644 --- a/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_camera.js +++ b/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_camera.js
@@ -13,7 +13,7 @@ * Dimensions for camera capture. * @const */ -var CAPTURE_SIZE = {height: 480, width: 480}; +var CAPTURE_SIZE = {height: 384, width: 384}; Polymer({ is: 'cr-camera',
diff --git a/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_pane.html b/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_pane.html index 131d207..6765125 100644 --- a/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_pane.html +++ b/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_pane.html
@@ -13,7 +13,17 @@ } cr-camera { - --cr-camera-image-size: var(--cr-picture-image-size, 228px); + --cr-camera-image-size: 288px; + } + + #preview { + bottom: 0; + height: var(--cr-picture-image-size, 228px); + left: 0; + margin: auto; + position: absolute; + right: 0; + top: 0; } img { @@ -43,18 +53,21 @@ #discard button { --iron-icon-fill-color: white; + -webkit-margin-start: 0; border-radius: 50%; } </style> <template is="dom-if" if="[[showImagePreview_(cameraActive_, imageSrc)]]"> - <img alt="[[previewAltText]]" src="[[getImgSrc_(imageSrc)]]" - data-show-discard$="[[showDiscard_(imageType)]]"> - <div id="discard" hidden="[[!showDiscard_(imageType)]]"> - <button is="paper-icon-button-light" id="discardImage" - class="icon-delete-white" title="[[discardImageLabel]]" - on-tap="onTapDiscardImage_"> - </button> + <div id="preview"> + <img alt="[[previewAltText]]" src="[[getImgSrc_(imageSrc)]]" + data-show-discard$="[[showDiscard_(imageType)]]"> + <div id="discard" hidden="[[!showDiscard_(imageType)]]"> + <button is="paper-icon-button-light" id="discardImage" + class="icon-delete-white" title="[[discardImageLabel]]" + on-tap="onTapDiscardImage_"> + </button> + </div> </div> </template> <template is="dom-if" if="[[cameraActive_]]">
diff --git a/ui/webui/resources/js/cr/ui/menu_button.js b/ui/webui/resources/js/cr/ui/menu_button.js index d54de2d..b68c1802 100644 --- a/ui/webui/resources/js/cr/ui/menu_button.js +++ b/ui/webui/resources/js/cr/ui/menu_button.js
@@ -43,6 +43,7 @@ */ decorate: function() { this.addEventListener('mousedown', this); + this.addEventListener('touchstart', this); this.addEventListener('keydown', this); this.addEventListener('dblclick', this); @@ -98,6 +99,7 @@ switch (e.type) { case 'mousedown': + case 'touchstart': if (e.currentTarget == this.ownerDocument) { if (e.target instanceof Node && !this.contains(e.target) && !this.menu.contains(e.target)) { @@ -108,8 +110,8 @@ } else { if (this.isMenuShown()) { this.hideMenu(); - } else if (e.button == 0) { // Only show the menu when using left - // mouse button. + } else if (e.type == 'mousedown' && e.button == 0) { + // Only show the menu when using left mouse button. this.showMenu(false, {x: e.screenX, y: e.screenY}); // Prevent the button from stealing focus on mousedown.