diff --git a/DEPS b/DEPS index 75d02a40..7f82f3b5 100644 --- a/DEPS +++ b/DEPS
@@ -74,7 +74,7 @@ # 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': '4fafedd33add9948db1147c60d681ed9340984fd', + 'skia_revision': 'f226e66d75374e370f3ae2c6895bc689670e9e18', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. @@ -86,7 +86,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': '0e74e059621b5eee49e10381a704d13a5713480a', + 'angle_revision': '5b1180df6835e403e5a9636fe9f7c987e1e48e2c', # 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. @@ -98,7 +98,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': '682118834b3cf2b5510ee676088fdd8f11869e84', + 'pdfium_revision': 'd01f2429bc561eed07293b46e08a07c54e471521', # 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.
diff --git a/ash/display/display_manager_unittest.cc b/ash/display/display_manager_unittest.cc index 77d84c6..72031e2 100644 --- a/ash/display/display_manager_unittest.cc +++ b/ash/display/display_manager_unittest.cc
@@ -3810,16 +3810,23 @@ class MultiMirroringTest : public DisplayManagerTest { public: - MultiMirroringTest() { + MultiMirroringTest() = default; + ~MultiMirroringTest() override = default; + + // DisplayManagerTest: + void SetUp() override { base::CommandLine::ForCurrentProcess()->AppendSwitch( ::switches::kEnableMultiMirroring); + DisplayManagerTest::SetUp(); } - ~MultiMirroringTest() override = default; void ActivateSoftwareMirrorMode(bool active) { display_manager()->SetMirrorMode(active); RunAllPendingInMessageLoop(); } + + private: + DISALLOW_COPY_AND_ASSIGN(MultiMirroringTest); }; TEST_F(MultiMirroringTest, HardwareMirrorMode) {
diff --git a/ash/system/palette/tools/metalayer_mode.cc b/ash/system/palette/tools/metalayer_mode.cc index 1d71e01..8107637d 100644 --- a/ash/system/palette/tools/metalayer_mode.cc +++ b/ash/system/palette/tools/metalayer_mode.cc
@@ -157,6 +157,12 @@ UpdateState(); } +void MetalayerMode::OnAssistantFeatureAllowedChanged( + mojom::AssistantAllowedState state) { + assistant_allowed_state_ = state; + UpdateState(); +} + void MetalayerMode::UpdateState() { if (enabled() && !selectable()) delegate()->DisableTool(GetToolId());
diff --git a/ash/system/palette/tools/metalayer_mode.h b/ash/system/palette/tools/metalayer_mode.h index 581d3a04..5e81e60 100644 --- a/ash/system/palette/tools/metalayer_mode.h +++ b/ash/system/palette/tools/metalayer_mode.h
@@ -31,7 +31,8 @@ // from |enabled| which means that the palette tool is currently selected by // the user. bool feature_enabled() const { - return voice_interaction_enabled_ && voice_interaction_context_enabled_; + return voice_interaction_enabled_ && voice_interaction_context_enabled_ && + assistant_allowed_state_ == mojom::AssistantAllowedState::ALLOWED; } // Whether the tool is in "loading" state. @@ -66,6 +67,8 @@ mojom::VoiceInteractionState state) override; void OnVoiceInteractionSettingsEnabled(bool enabled) override; void OnVoiceInteractionContextEnabled(bool enabled) override; + void OnAssistantFeatureAllowedChanged( + mojom::AssistantAllowedState state) override; // Update the state of the tool based on the current availability of the tool. void UpdateState(); @@ -83,6 +86,9 @@ bool voice_interaction_context_enabled_ = false; + mojom::AssistantAllowedState assistant_allowed_state_ = + mojom::AssistantAllowedState::ALLOWED; + base::TimeTicks previous_stroke_end_; // True when the mode is activated via the stylus barrel button.
diff --git a/ash/system/palette/tools/metalayer_unittest.cc b/ash/system/palette/tools/metalayer_unittest.cc index 99e1d272..d8da4e9d 100644 --- a/ash/system/palette/tools/metalayer_unittest.cc +++ b/ash/system/palette/tools/metalayer_unittest.cc
@@ -67,35 +67,54 @@ mojom::VoiceInteractionState::NOT_READY, mojom::VoiceInteractionState::STOPPED, mojom::VoiceInteractionState::RUNNING}; + const mojom::AssistantAllowedState kAllowedStates[] = { + mojom::AssistantAllowedState::ALLOWED, + mojom::AssistantAllowedState::DISALLOWED_BY_ARC_DISALLOWED, + mojom::AssistantAllowedState::DISALLOWED_BY_ARC_POLICY, + mojom::AssistantAllowedState::DISALLOWED_BY_LOCALE, + mojom::AssistantAllowedState::DISALLOWED_BY_FLAG, + mojom::AssistantAllowedState::DISALLOWED_BY_NONPRIMARY_USER, + mojom::AssistantAllowedState::DISALLOWED_BY_SUPERVISED_USER, + mojom::AssistantAllowedState::DISALLOWED_BY_INCOGNITO, + }; const base::string16 kLoading(base::ASCIIToUTF16("loading")); // Iterate over every possible combination of states. for (mojom::VoiceInteractionState state : kStates) { - for (int enabled = 0; enabled <= 1; enabled++) { - for (int context = 0; context <= 1; context++) { - const bool ready = state != mojom::VoiceInteractionState::NOT_READY; - const bool selectable = enabled && context && ready; + for (mojom::AssistantAllowedState allowed_state : kAllowedStates) { + for (int enabled = 0; enabled <= 1; enabled++) { + for (int context = 0; context <= 1; context++) { + const bool allowed = + allowed_state == mojom::AssistantAllowedState::ALLOWED; + const bool ready = state != mojom::VoiceInteractionState::NOT_READY; + const bool selectable = allowed && enabled && context && ready; - Shell::Get()->voice_interaction_controller()->NotifyStatusChanged( - state); - Shell::Get()->voice_interaction_controller()->NotifySettingsEnabled( - enabled); - Shell::Get()->voice_interaction_controller()->NotifyContextEnabled( - context); + Shell::Get()->voice_interaction_controller()->NotifyStatusChanged( + state); + Shell::Get()->voice_interaction_controller()->NotifySettingsEnabled( + enabled); + Shell::Get()->voice_interaction_controller()->NotifyContextEnabled( + context); + Shell::Get()->voice_interaction_controller()->NotifyFeatureAllowed( + allowed_state); - std::unique_ptr<views::View> view = - base::WrapUnique(tool_->CreateView()); - EXPECT_TRUE(view); - EXPECT_EQ(selectable, view->enabled()); + std::unique_ptr<views::View> view = + base::WrapUnique(tool_->CreateView()); + EXPECT_TRUE(view); + EXPECT_EQ(selectable, view->enabled()); - const base::string16 label_text = - static_cast<HoverHighlightView*>(view.get())->text_label()->text(); + const base::string16 label_text = + static_cast<HoverHighlightView*>(view.get()) + ->text_label() + ->text(); - const bool label_contains_loading = - label_text.find(kLoading) != base::string16::npos; + const bool label_contains_loading = + label_text.find(kLoading) != base::string16::npos; - EXPECT_EQ(enabled && context && !ready, label_contains_loading); - tool_->OnViewDestroyed(); + EXPECT_EQ(allowed && enabled && context && !ready, + label_contains_loading); + tool_->OnViewDestroyed(); + } } } }
diff --git a/ash/system/screen_layout_observer_unittest.cc b/ash/system/screen_layout_observer_unittest.cc index 9c00998..aab99c6 100644 --- a/ash/system/screen_layout_observer_unittest.cc +++ b/ash/system/screen_layout_observer_unittest.cc
@@ -551,11 +551,18 @@ // Test ScreenLayoutObserver with multi-mirroring enabled. class ScreenLayoutObserverMultiMirroringTest : public ScreenLayoutObserverTest { public: - ScreenLayoutObserverMultiMirroringTest() { + ScreenLayoutObserverMultiMirroringTest() = default; + ~ScreenLayoutObserverMultiMirroringTest() override = default; + + // ScreenLayoutObserverTest: + void SetUp() override { base::CommandLine::ForCurrentProcess()->AppendSwitch( ::switches::kEnableMultiMirroring); + ScreenLayoutObserverTest::SetUp(); } - ~ScreenLayoutObserverMultiMirroringTest() override = default; + + private: + DISALLOW_COPY_AND_ASSIGN(ScreenLayoutObserverMultiMirroringTest); }; TEST_F(ScreenLayoutObserverMultiMirroringTest,
diff --git a/ash/test/ash_test_helper.cc b/ash/test/ash_test_helper.cc index ae5b9a4..0c14304 100644 --- a/ash/test/ash_test_helper.cc +++ b/ash/test/ash_test_helper.cc
@@ -67,7 +67,8 @@ : ash_test_environment_(ash_test_environment), test_shell_delegate_(nullptr), dbus_thread_manager_initialized_(false), - bluez_dbus_manager_initialized_(false) { + bluez_dbus_manager_initialized_(false), + command_line_(std::make_unique<base::test::ScopedCommandLine>()) { ui::test::EnableTestConfigForPlatformWindows(); aura::test::InitializeAuraEventGeneratorDelegate(); } @@ -75,7 +76,6 @@ AshTestHelper::~AshTestHelper() = default; void AshTestHelper::SetUp(bool start_session, bool provide_local_state) { - command_line_ = std::make_unique<base::test::ScopedCommandLine>(); // TODO(jamescook): Can we do this without changing command line? // Use the origin (1,1) so that it doesn't over // lap with the native mouse cursor.
diff --git a/base/BUILD.gn b/base/BUILD.gn index 89e9ddb9..f5cbb79 100644 --- a/base/BUILD.gn +++ b/base/BUILD.gn
@@ -2879,6 +2879,9 @@ if (is_java_debug || dcheck_always_on) { defines += [ "_DCHECK_IS_ON" ] } + if (use_cfi_diag || is_ubsan || is_ubsan_security || is_ubsan_vptr) { + defines += [ "_IS_UBSAN" ] + } } java_cpp_template("base_native_libraries_gen") {
diff --git a/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java b/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java index af4eeef1..e1b7838 100644 --- a/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java +++ b/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java
@@ -7,9 +7,12 @@ import android.annotation.SuppressLint; import android.content.Context; import android.os.AsyncTask; +import android.os.Build; import android.os.StrictMode; import android.os.SystemClock; +import android.system.Os; +import org.chromium.base.BuildConfig; import org.chromium.base.CommandLine; import org.chromium.base.ContextUtils; import org.chromium.base.Log; @@ -400,6 +403,7 @@ linker.finishLibraryLoad(); } else { + setEnvForNative(); preloadAlreadyLocked(appContext); // Load libraries using the system linker. for (String library : NativeLibraries.LIBRARIES) { @@ -547,6 +551,27 @@ sInstance = loader; } + /** + * Configure ubsan using $UBSAN_OPTIONS. This function needs to be called before any native + * libraries are loaded because ubsan reads its configuration from $UBSAN_OPTIONS when the + * native library is loaded. + */ + public static void setEnvForNative() { + // The setenv API was added in L. On older versions of Android, we should still see ubsan + // reports, but they will not have stack traces. + if (BuildConfig.IS_UBSAN && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + try { + // This value is duplicated in build/android/pylib/constants/__init__.py. + Os.setenv("UBSAN_OPTIONS", + "print_stacktrace=1 stack_trace_format='#%n pc %o %m' " + + "handle_segv=0 handle_sigbus=0 handle_sigfpe=0", + true); + } catch (Exception e) { + Log.w(TAG, "failed to set UBSAN_OPTIONS", e); + } + } + } + // Only methods needed before or during normal JNI registration are during System.OnLoad. // nativeLibraryLoaded is then called to register everything else. This process is called // "initialization". This method will be mapped (by generated code) to the LibraryLoaded
diff --git a/base/android/java/src/org/chromium/base/library_loader/Linker.java b/base/android/java/src/org/chromium/base/library_loader/Linker.java index 7e7c874..827313d 100644 --- a/base/android/java/src/org/chromium/base/library_loader/Linker.java +++ b/base/android/java/src/org/chromium/base/library_loader/Linker.java
@@ -518,6 +518,7 @@ * Load the Linker JNI library. Throws UnsatisfiedLinkError on error. */ protected static void loadLinkerJniLibrary() { + LibraryLoader.setEnvForNative(); String libName = "lib" + LINKER_JNI_LIBRARY + ".so"; if (DEBUG) { Log.i(TAG, "Loading " + libName);
diff --git a/base/android/java/templates/BuildConfig.template b/base/android/java/templates/BuildConfig.template index 16f02f6..6b63584 100644 --- a/base/android/java/templates/BuildConfig.template +++ b/base/android/java/templates/BuildConfig.template
@@ -29,6 +29,12 @@ public static final boolean DCHECK_IS_ON = false; #endif +#if defined(_IS_UBSAN) + public static final boolean IS_UBSAN = true; +#else + public static final boolean IS_UBSAN = false; +#endif + // Sorted list of locales that have a compressed .pak within assets. // Stored as an array because AssetManager.list() is slow. public static final String[] COMPRESSED_LOCALES =
diff --git a/build/android/pylib/constants/__init__.py b/build/android/pylib/constants/__init__.py index 70e8688..b600b20 100644 --- a/build/android/pylib/constants/__init__.py +++ b/build/android/pylib/constants/__init__.py
@@ -118,6 +118,8 @@ # Configure ubsan to print stack traces in the format understood by "stack" so # that they will be symbolized, and disable signal handlers because they # interfere with the breakpad and sandbox tests. +# This value is duplicated in +# base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java UBSAN_OPTIONS = ( 'print_stacktrace=1 stack_trace_format=\'#%n pc %o %m\' ' 'handle_segv=0 handle_sigbus=0 handle_sigfpe=0')
diff --git a/build/android/pylib/local/device/local_device_gtest_run.py b/build/android/pylib/local/device/local_device_gtest_run.py index 53033406c..3306a22 100644 --- a/build/android/pylib/local/device/local_device_gtest_run.py +++ b/build/android/pylib/local/device/local_device_gtest_run.py
@@ -44,8 +44,6 @@ _EXTRA_TEST_LIST = ( 'org.chromium.native_test.NativeTestInstrumentationTestRunner' '.TestList') -_EXTRA_UBSAN_OPTIONS = ( - 'org.chromium.native_test.NativeTest.UBSAN_OPTIONS') _MAX_SHARD_SIZE = 256 _SECONDS_TO_NANOS = int(1e9) @@ -174,9 +172,6 @@ device.adb, dir=device.GetExternalStoragePath(), suffix='.gtest_out') extras[_EXTRA_STDOUT_FILE] = stdout_file.name - if self._tool != 'asan': - extras[_EXTRA_UBSAN_OPTIONS] = constants.UBSAN_OPTIONS - if self._wait_for_java_debugger: cmd = ['am', 'set-debug-app', '-w', self._package] device.RunShellCommand(cmd, check_return=True)
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni index c4a5adc..4fbfb56 100644 --- a/build/config/android/rules.gni +++ b/build/config/android/rules.gni
@@ -2038,6 +2038,9 @@ if (is_java_debug || dcheck_always_on) { defines += [ "_DCHECK_IS_ON" ] } + if (use_cfi_diag || is_ubsan || is_ubsan_security || is_ubsan_vptr) { + defines += [ "_IS_UBSAN" ] + } defines += [ "COMPRESSED_LOCALE_LIST=" + "@FileArg($_rebased_build_config:compressed_locales_java_list)",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetNavigateTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetNavigateTest.java index dca670f..f9c1ec2 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetNavigateTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetNavigateTest.java
@@ -17,6 +17,7 @@ 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.Feature; import org.chromium.base.test.util.Restriction; import org.chromium.chrome.R; @@ -29,6 +30,8 @@ import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.util.OmniboxTestUtils; import org.chromium.chrome.test.util.browser.TabLoadObserver; +import org.chromium.content.browser.test.util.Criteria; +import org.chromium.content.browser.test.util.CriteriaHelper; import org.chromium.content.browser.test.util.KeyUtils; import org.chromium.net.test.EmbeddedTestServer; import org.chromium.ui.test.util.UiRestriction; @@ -83,19 +86,14 @@ // Focus URL bar. final UrlBar urlBar = (UrlBar) mActivity.findViewById(R.id.url_bar); Assert.assertNotNull("urlBar is null", urlBar); - ThreadUtils.runOnUiThreadBlocking(() -> { - urlBar.requestFocus(); - mBottomSheet.endAnimations(); - }); + ThreadUtils.runOnUiThreadBlocking(() -> { urlBar.requestFocus(); }); - Assert.assertEquals("Bottom sheet should be expanded.", BottomSheet.SHEET_STATE_FULL, - mBottomSheet.getSheetState()); + // Verify BottomSheet is expanded. + CriteriaHelper.pollUiThread( + Criteria.equals(BottomSheet.SHEET_STATE_FULL, () -> mBottomSheet.getSheetState())); // Navigate to the URL. - ThreadUtils.runOnUiThreadBlocking(() -> { - urlBar.setText(url); - mBottomSheet.endAnimations(); - }); + ThreadUtils.runOnUiThreadBlocking(() -> { urlBar.setText(url); }); final LocationBarLayout locationBar = (LocationBarLayout) mActivity.findViewById(R.id.location_bar); OmniboxTestUtils.waitForOmniboxSuggestions(locationBar); @@ -106,7 +104,9 @@ InstrumentationRegistry.getInstrumentation(), urlBar, KeyEvent.KEYCODE_ENTER); observer.assertLoaded(); - Assert.assertEquals("Bottom sheet should be closed.", BottomSheet.SHEET_STATE_PEEK, + // TODO(mdjones): Add polling to wait for sheet to be done animating, once it properly + // animates on close. crbug.com/764860. + Assert.assertEquals("The bottom sheet should be closed.", BottomSheet.SHEET_STATE_PEEK, mBottomSheet.getSheetState()); // The URL has been set before the page notification was broadcast, so it is safe to access. @@ -127,6 +127,8 @@ @Test @MediumTest @Feature({"Navigation", "Main"}) + //@RetryOnFailure + @DisabledTest(message = "crbug.com/793534") public void testNavigate() throws Exception { String url = mTestServer.getURL("/chrome/test/data/android/navigate/simple.html"); String result = typeInOmniboxAndNavigate(url, "Simple");
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index b13d6da8..8e17bc9 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -10773,13 +10773,13 @@ "<ph name="CHROME_EXTENSION_NAME">$1<ex>Chrome extension name</ex></ph>" wants to connect </message> <message name="IDS_DEVICE_CHOOSER_NO_DEVICES_FOUND_PROMPT" desc="The label shown to the user to inform them that no USB devices were found matching the requirements that the application provided."> - No compatible devices found + No compatible devices found. </message> <message name="IDS_DEVICE_CHOOSER_DEVICE_NAME_WITH_ID" desc="To distinguish devices with the same name, the device chooser shows the device name with id."> <ph name="DEVICE_NAME">$1<ex>device name</ex></ph> (<ph name="DEVICE_ID">$2<ex>device id</ex></ph>) </message> <message name="IDS_BLUETOOTH_DEVICE_CHOOSER_NO_DEVICES_FOUND_PROMPT" desc="The label shown to the user to inform them that no Bluetooth devices were found matching the requirements that the application provided."> - No compatible devices found + No compatible devices found. </message> <message name="IDS_BLUETOOTH_DEVICE_CHOOSER_TURN_ADAPTER_OFF" desc="Text of a link the user can click to get help information when Bluetooth adapter is turned off."> <ph name="TURN_ON_BLUETOOTH_LINK">$1<ex>Turn on Bluetooth</ex></ph> to allow pairing @@ -10790,8 +10790,17 @@ <message name="IDS_BLUETOOTH_DEVICE_CHOOSER_SCANNING" desc="The label that is used to indicate the chooser is scanning for Bluetooth devices."> ''' while scanning for devices... </message> - <message name="IDS_BLUETOOTH_DEVICE_CHOOSER_RE_SCAN" desc="Text of a link the user can click to start a new scan for Bluetooth devices."> - re-scan + <message name="IDS_BLUETOOTH_DEVICE_CHOOSER_RE_SCAN" desc="Text of a button the user can click to start a new scan for Bluetooth devices."> + Re-scan + </message> + <message name="IDS_BLUETOOTH_DEVICE_CHOOSER_RE_SCAN_TOOLTIP" desc="Tooltip for the button that lets the user start a new scan for Bluetooth devices."> + Re-scan Bluetooth devices + </message> + <message name="IDS_BLUETOOTH_DEVICE_CHOOSER_SCANNING_LABEL" desc="Text on label that indicates a scan for Bluetooth devices is in progress."> + Scanning... + </message> + <message name="IDS_BLUETOOTH_DEVICE_CHOOSER_SCANNING_LABEL_TOOLTIP" desc="Tooltip for the label that shows while scanning for Bluetooth devices."> + Scanning for Bluetooth devices... </message> <message name="IDS_BLUETOOTH_DEVICE_CHOOSER_PAIR_BUTTON_TEXT" desc="Label on the button that closes the Bluetooth chooser popup and pairs the selected device."> Pair
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 430bb7ba..6a9a566e1 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -2660,7 +2660,7 @@ {"enable-bulk-printers", flag_descriptions::kBulkPrintersName, flag_descriptions::kBulkPrintersDescription, kOsCrOS, FEATURE_VALUE_TYPE(features::kBulkPrinters)}, - {"enable-cros-component", flag_descriptions::kCrOSComponentName, + {"disable-cros-component", flag_descriptions::kCrOSComponentName, flag_descriptions::kCrOSComponentDescription, kOsCrOS, FEATURE_VALUE_TYPE(features::kCrOSComponent)}, {"enable-cros-container", flag_descriptions::kCrOSContainerName,
diff --git a/chrome/browser/chooser_controller/chooser_controller.cc b/chrome/browser/chooser_controller/chooser_controller.cc index ff464cac..a792688f 100644 --- a/chrome/browser/chooser_controller/chooser_controller.cc +++ b/chrome/browser/chooser_controller/chooser_controller.cc
@@ -65,10 +65,14 @@ return false; } -bool ChooserController::ShouldShowFootnoteView() const { +bool ChooserController::ShouldShowHelpButton() const { return true; } +bool ChooserController::ShouldShowReScanButton() const { + return false; +} + bool ChooserController::AllowMultipleSelection() const { return false; }
diff --git a/chrome/browser/chooser_controller/chooser_controller.h b/chrome/browser/chooser_controller/chooser_controller.h index 6c620874..72530af 100644 --- a/chrome/browser/chooser_controller/chooser_controller.h +++ b/chrome/browser/chooser_controller/chooser_controller.h
@@ -64,14 +64,17 @@ // Returns the text to be displayed in the chooser title. base::string16 GetTitle() const; - // Returns if the chooser needs to show an icon before the text. + // Returns whether the chooser needs to show an icon before the text. // For WebBluetooth, it is a signal strength icon. virtual bool ShouldShowIconBeforeText() const; - // Returns if the chooser needs to show a footnote view. - virtual bool ShouldShowFootnoteView() const; + // Returns whether the chooser needs to show a help button. + virtual bool ShouldShowHelpButton() const; - // Returns if the chooser allows multiple items to be selected. + // Returns whether the chooser needs to show a button to re-scan for devices. + virtual bool ShouldShowReScanButton() const; + + // Returns whether the chooser allows multiple items to be selected. virtual bool AllowMultipleSelection() const; // Returns the text to be displayed in the chooser when there are no options.
diff --git a/chrome/browser/chooser_controller/fake_bluetooth_chooser_controller.cc b/chrome/browser/chooser_controller/fake_bluetooth_chooser_controller.cc index 918415bf..66487fc6 100644 --- a/chrome/browser/chooser_controller/fake_bluetooth_chooser_controller.cc +++ b/chrome/browser/chooser_controller/fake_bluetooth_chooser_controller.cc
@@ -22,6 +22,10 @@ return true; } +bool FakeBluetoothChooserController::ShouldShowReScanButton() const { + return true; +} + base::string16 FakeBluetoothChooserController::GetNoOptionsText() const { return l10n_util::GetStringUTF16( IDS_BLUETOOTH_DEVICE_CHOOSER_NO_DEVICES_FOUND_PROMPT);
diff --git a/chrome/browser/chooser_controller/fake_bluetooth_chooser_controller.h b/chrome/browser/chooser_controller/fake_bluetooth_chooser_controller.h index e62f219..5ab6c47 100644 --- a/chrome/browser/chooser_controller/fake_bluetooth_chooser_controller.h +++ b/chrome/browser/chooser_controller/fake_bluetooth_chooser_controller.h
@@ -52,6 +52,7 @@ // ChooserController: bool ShouldShowIconBeforeText() const override; + bool ShouldShowReScanButton() const override; base::string16 GetNoOptionsText() const override; base::string16 GetOkButtonLabel() const override; size_t NumOptions() const override;
diff --git a/chrome/browser/chromeos/login/lock/webui_screen_locker.cc b/chrome/browser/chromeos/login/lock/webui_screen_locker.cc index 792baec..d67ddd4 100644 --- a/chrome/browser/chromeos/login/lock/webui_screen_locker.cc +++ b/chrome/browser/chromeos/login/lock/webui_screen_locker.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/chromeos/login/lock/webui_screen_locker.h" +#include "ash/public/cpp/ash_switches.h" #include "base/command_line.h" #include "base/feature_list.h" #include "base/metrics/histogram_macros.h" @@ -83,6 +84,10 @@ // static bool WebUIScreenLocker::ShouldPreloadLockScreen() { + // Only preload webui lock screen when it is used. + if (!ash::switches::IsUsingWebUiLock()) + return false; + // Bail for mash because IdleDetector/UserActivityDetector does not work // properly there. // TODO(xiyuan): Revisit after http://crbug.com/626899.
diff --git a/chrome/browser/chromeos/net/tether_notification_presenter.cc b/chrome/browser/chromeos/net/tether_notification_presenter.cc index 77bf60ac..8e1a120 100644 --- a/chrome/browser/chromeos/net/tether_notification_presenter.cc +++ b/chrome/browser/chromeos/net/tether_notification_presenter.cc
@@ -10,6 +10,7 @@ #include "base/strings/string16.h" #include "base/strings/utf_string_conversions.h" #include "chrome/app/vector_icons/vector_icons.h" +#include "chrome/browser/notifications/notification_display_service.h" #include "chrome/browser/ui/chrome_pages.h" #include "chrome/common/url_constants.h" #include "chrome/grit/generated_resources.h" @@ -20,7 +21,6 @@ #include "ui/gfx/image/image_skia_operations.h" #include "ui/gfx/paint_vector_icon.h" #include "ui/gfx/vector_icon_types.h" -#include "ui/message_center/message_center.h" #include "ui/message_center/notification.h" #include "ui/message_center/notification_types.h" #include "ui/message_center/notifier_id.h" @@ -39,11 +39,33 @@ const char kTetherSettingsSubpage[] = "networks?type=Tether"; +// Handles clicking and closing of a notification via callbacks. +class TetherNotificationDelegate + : public message_center::HandleNotificationClickDelegate { + public: + TetherNotificationDelegate(ButtonClickCallback click, + base::RepeatingClosure close) + : HandleNotificationClickDelegate(click), close_callback_(close) {} + + // NotificationDelegate: + void Close(bool by_user) override { + if (!close_callback_.is_null()) + close_callback_.Run(); + } + + private: + ~TetherNotificationDelegate() override = default; + + base::RepeatingClosure close_callback_; + + DISALLOW_COPY_AND_ASSIGN(TetherNotificationDelegate); +}; + class SettingsUiDelegateImpl : public TetherNotificationPresenter::SettingsUiDelegate { public: - SettingsUiDelegateImpl() {} - ~SettingsUiDelegateImpl() override {} + SettingsUiDelegateImpl() = default; + ~SettingsUiDelegateImpl() override = default; void ShowSettingsSubPageForProfile(Profile* profile, const std::string& sub_page) override { @@ -65,26 +87,6 @@ normalized_signal_strength); } -std::unique_ptr<message_center::Notification> CreateNotification( - const std::string& id, - const base::string16& title, - const base::string16& message, - const gfx::ImageSkia& small_image, - const message_center::RichNotificationData& rich_notification_data = - message_center::RichNotificationData()) { - auto notification = base::MakeUnique<message_center::Notification>( - message_center::NotificationType::NOTIFICATION_TYPE_SIMPLE, id, title, - message, gfx::Image() /* image */, base::string16() /* display_source */, - GURL() /* origin_url */, - message_center::NotifierId( - message_center::NotifierId::NotifierType::SYSTEM_COMPONENT, - ash::system_notifier::kNotifierTether), - rich_notification_data, nullptr); - notification->SetSystemPriority(); - notification->set_small_image(gfx::Image(small_image)); - return notification; -} - } // namespace // static @@ -110,19 +112,13 @@ TetherNotificationPresenter::TetherNotificationPresenter( Profile* profile, - message_center::MessageCenter* message_center, NetworkConnect* network_connect) : profile_(profile), - message_center_(message_center), network_connect_(network_connect), settings_ui_delegate_(base::WrapUnique(new SettingsUiDelegateImpl())), - weak_ptr_factory_(this) { - message_center_->AddObserver(this); -} + weak_ptr_factory_(this) {} -TetherNotificationPresenter::~TetherNotificationPresenter() { - message_center_->RemoveObserver(this); -} +TetherNotificationPresenter::~TetherNotificationPresenter() = default; void TetherNotificationPresenter::NotifyPotentialHotspotNearby( const cryptauth::RemoteDevice& remote_device, @@ -162,13 +158,13 @@ IDS_TETHER_NOTIFICATION_WIFI_AVAILABLE_MULTIPLE_DEVICES_TITLE), l10n_util::GetStringUTF16( IDS_TETHER_NOTIFICATION_WIFI_AVAILABLE_MULTIPLE_DEVICES_MESSAGE), - GetImageForSignalStrength(kMediumSignalStrength))); + GetImageForSignalStrength(kMediumSignalStrength), + {} /* rich_notification_data */)); } NotificationPresenter::PotentialHotspotNotificationState TetherNotificationPresenter::GetPotentialHotspotNotificationState() { - if (!message_center_->FindVisibleNotificationById( - kPotentialHotspotNotificationId)) { + if (showing_notification_id_ != kPotentialHotspotNotificationId) { return NotificationPresenter::PotentialHotspotNotificationState:: NO_HOTSPOT_NOTIFICATION_SHOWN; } @@ -196,7 +192,8 @@ base::ASCIIToUTF16(device_name)), l10n_util::GetStringFUTF16(IDS_TETHER_NOTIFICATION_SETUP_REQUIRED_MESSAGE, base::ASCIIToUTF16(device_name)), - GetImageForSignalStrength(signal_strength))); + GetImageForSignalStrength(signal_strength), + {} /* rich_notification_data */)); } void TetherNotificationPresenter::RemoveSetupRequiredNotification() { @@ -204,12 +201,12 @@ } void TetherNotificationPresenter::NotifyConnectionToHostFailed() { + const std::string id = kActiveHostNotificationId; PA_LOG(INFO) << "Displaying \"connection attempt failed\" notification. " - << "Notification ID = " << kActiveHostNotificationId; + << "Notification ID = " << id; ShowNotification(message_center::Notification::CreateSystemNotification( - message_center::NotificationType::NOTIFICATION_TYPE_SIMPLE, - kActiveHostNotificationId, + message_center::NotificationType::NOTIFICATION_TYPE_SIMPLE, id, l10n_util::GetStringUTF16( IDS_TETHER_NOTIFICATION_CONNECTION_FAILED_TITLE), l10n_util::GetStringUTF16( @@ -219,7 +216,10 @@ message_center::NotifierId( message_center::NotifierId::NotifierType::SYSTEM_COMPONENT, ash::system_notifier::kNotifierTether), - {} /* rich_notification_data */, nullptr /* delegate */, + {} /* rich_notification_data */, + new message_center::HandleNotificationClickDelegate(base::BindRepeating( + &TetherNotificationPresenter::OnNotificationClicked, + weak_ptr_factory_.GetWeakPtr(), id)), kNotificationCellularAlertIcon, message_center::SystemNotificationWarningLevel::WARNING)); } @@ -229,35 +229,53 @@ } void TetherNotificationPresenter::OnNotificationClicked( - const std::string& notification_id) { - // Iterate through all IDs corresponding to notifications which should open - // the Tether settings page when clicked. If the notification ID provided - // exists in |kIdsWhichOpenTetherSettingsOnClick|, open settings. - for (size_t i = 0; i < arraysize(kIdsWhichOpenTetherSettingsOnClick); ++i) { - const char* const curr_clickable_id = kIdsWhichOpenTetherSettingsOnClick[i]; - if (notification_id == curr_clickable_id) { - OpenSettingsAndRemoveNotification(kTetherSettingsSubpage, - notification_id); - return; - } + const std::string& notification_id, + base::Optional<int> button_index) { + if (button_index) { + DCHECK_EQ(kPotentialHotspotNotificationId, notification_id); + DCHECK_EQ(0, *button_index); + DCHECK(hotspot_nearby_device_id_); + PA_LOG(INFO) << "\"Potential hotspot nearby\" notification button was " + << "clicked."; + network_connect_->ConnectToNetworkId(*hotspot_nearby_device_id_); + RemoveNotificationIfVisible(kPotentialHotspotNotificationId); + return; } - // Otherwise, ignore this click since it is not in the list of clickable IDs - // (e.g., it could have been created by another feature/application). + OpenSettingsAndRemoveNotification(kTetherSettingsSubpage, notification_id); } -void TetherNotificationPresenter::OnNotificationButtonClicked( - const std::string& notification_id, - int button_index) { - if (notification_id != kPotentialHotspotNotificationId) - return; +void TetherNotificationPresenter::OnNotificationClosed( + const std::string& notification_id) { + if (showing_notification_id_ == notification_id) + showing_notification_id_.clear(); +} - DCHECK(button_index == 0); - DCHECK(hotspot_nearby_device_id_); - PA_LOG(INFO) << "\"Potential hotspot nearby\" notification button was " - << "clicked."; - network_connect_->ConnectToNetworkId(*hotspot_nearby_device_id_); - RemoveNotificationIfVisible(kPotentialHotspotNotificationId); +std::unique_ptr<message_center::Notification> +TetherNotificationPresenter::CreateNotification( + const std::string& id, + const base::string16& title, + const base::string16& message, + const gfx::ImageSkia& small_image, + const message_center::RichNotificationData& rich_notification_data) { + auto notification = base::MakeUnique<message_center::Notification>( + message_center::NotificationType::NOTIFICATION_TYPE_SIMPLE, id, title, + message, gfx::Image() /* image */, base::string16() /* display_source */, + GURL() /* origin_url */, + message_center::NotifierId( + message_center::NotifierId::NotifierType::SYSTEM_COMPONENT, + ash::system_notifier::kNotifierTether), + rich_notification_data, + new TetherNotificationDelegate( + base::BindRepeating( + &TetherNotificationPresenter::OnNotificationClicked, + weak_ptr_factory_.GetWeakPtr(), id), + base::BindRepeating( + &TetherNotificationPresenter::OnNotificationClosed, + weak_ptr_factory_.GetWeakPtr(), id))); + notification->SetSystemPriority(); + notification->set_small_image(gfx::Image(small_image)); + return notification; } void TetherNotificationPresenter::SetSettingsUiDelegateForTesting( @@ -267,13 +285,9 @@ void TetherNotificationPresenter::ShowNotification( std::unique_ptr<message_center::Notification> notification) { - std::string notification_id = notification->id(); - if (message_center_->FindVisibleNotificationById(notification_id)) { - message_center_->UpdateNotification(notification_id, - std::move(notification)); - } else { - message_center_->AddNotification(std::move(notification)); - } + showing_notification_id_ = notification->id(); + NotificationDisplayService::GetForProfile(profile_)->Display( + NotificationHandler::Type::TRANSIENT, *notification); } void TetherNotificationPresenter::OpenSettingsAndRemoveNotification( @@ -292,12 +306,8 @@ if (notification_id == kPotentialHotspotNotificationId) hotspot_nearby_device_id_.reset(); - if (!message_center_->FindVisibleNotificationById(notification_id)) - return; - - PA_LOG(INFO) << "Removing notification with ID \"" << notification_id - << "\"."; - message_center_->RemoveNotification(notification_id, false /* by_user */); + NotificationDisplayService::GetForProfile(profile_)->Close( + NotificationHandler::Type::TRANSIENT, notification_id); } } // namespace tether
diff --git a/chrome/browser/chromeos/net/tether_notification_presenter.h b/chrome/browser/chromeos/net/tether_notification_presenter.h index fddb2a87..10d810a 100644 --- a/chrome/browser/chromeos/net/tether_notification_presenter.h +++ b/chrome/browser/chromeos/net/tether_notification_presenter.h
@@ -17,13 +17,11 @@ #include "chromeos/network/network_connect.h" #include "chromeos/network/network_state.h" #include "components/cryptauth/remote_device.h" -#include "ui/message_center/message_center_observer.h" #include "ui/message_center/notification.h" class Profile; namespace message_center { -class MessageCenter; class Notification; } // namespace message_center @@ -33,14 +31,11 @@ // Produces notifications associated with CrOS tether network events and alerts // observers about interactions with those notifications. -class TetherNotificationPresenter - : public NotificationPresenter, - public message_center::MessageCenterObserver { +class TetherNotificationPresenter : public NotificationPresenter { public: - // Caller must ensure that |profile|, |message_center|, and |network_connect| - // outlive this instance. + // Caller must ensure that |profile| and |network_connect| outlive this + // instance. TetherNotificationPresenter(Profile* profile, - message_center::MessageCenter* message_center, NetworkConnect* network_connect); ~TetherNotificationPresenter() override; @@ -58,11 +53,6 @@ void NotifyConnectionToHostFailed() override; void RemoveConnectionToHostFailedNotification() override; - // message_center::MessageCenterObserver: - void OnNotificationClicked(const std::string& notification_id) override; - void OnNotificationButtonClicked(const std::string& notification_id, - int button_index) override; - class SettingsUiDelegate { public: virtual ~SettingsUiDelegate() {} @@ -84,6 +74,17 @@ // IDs of all notifications which, when clicked, open mobile data settings. static const char* const kIdsWhichOpenTetherSettingsOnClick[]; + void OnNotificationClicked(const std::string& notification_id, + base::Optional<int> button_index); + void OnNotificationClosed(const std::string& notification_id); + + std::unique_ptr<message_center::Notification> CreateNotification( + const std::string& id, + const base::string16& title, + const base::string16& message, + const gfx::ImageSkia& small_image, + const message_center::RichNotificationData& rich_notification_data); + void SetSettingsUiDelegateForTesting( std::unique_ptr<SettingsUiDelegate> settings_ui_delegate); void ShowNotification( @@ -93,9 +94,11 @@ void RemoveNotificationIfVisible(const std::string& notification_id); Profile* profile_; - message_center::MessageCenter* message_center_; NetworkConnect* network_connect_; + // The ID of the currently showing notification. + std::string showing_notification_id_; + std::unique_ptr<SettingsUiDelegate> settings_ui_delegate_; // The device ID of the device whose metadata is displayed in the "potential
diff --git a/chrome/browser/chromeos/net/tether_notification_presenter_unittest.cc b/chrome/browser/chromeos/net/tether_notification_presenter_unittest.cc index cc4ab821..1f580d4 100644 --- a/chrome/browser/chromeos/net/tether_notification_presenter_unittest.cc +++ b/chrome/browser/chromeos/net/tether_notification_presenter_unittest.cc
@@ -8,14 +8,11 @@ #include "base/memory/ptr_util.h" #include "base/observer_list.h" +#include "chrome/browser/notifications/notification_display_service_tester.h" #include "chrome/common/url_constants.h" +#include "chrome/test/base/browser_with_test_window_test.h" #include "chrome/test/base/testing_profile.h" #include "components/cryptauth/remote_device_test_util.h" -#include "content/public/test/test_browser_thread_bundle.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "ui/message_center/fake_message_center.h" -#include "ui/message_center/message_center_observer.h" namespace { const int kTestNetworkSignalStrength = 50; @@ -29,71 +26,6 @@ const char kTetherSettingsSubpage[] = "networks?type=Tether"; -class TestMessageCenter : public message_center::FakeMessageCenter { - public: - TestMessageCenter() : message_center::FakeMessageCenter() {} - ~TestMessageCenter() override {} - - void NotifyNotificationTapped(const std::string& notification_id) { - for (auto& observer : observer_list_) { - observer.OnNotificationClicked(notification_id); - } - } - - void NotifyNotificationButtonTapped(const std::string& notification_id, - int button_index) { - for (auto& observer : observer_list_) { - observer.OnNotificationButtonClicked(notification_id, button_index); - } - } - - size_t GetNumNotifications() { return notifications_.size(); } - - // message_center::FakeMessageCenter: - void AddObserver(message_center::MessageCenterObserver* observer) override { - observer_list_.AddObserver(observer); - } - - void RemoveObserver( - message_center::MessageCenterObserver* observer) override { - observer_list_.RemoveObserver(observer); - } - - message_center::Notification* FindVisibleNotificationById( - const std::string& id) override { - auto iter = std::find_if( - notifications_.begin(), notifications_.end(), - [id](const std::shared_ptr<message_center::Notification> notification) { - return notification->id() == id; - }); - return iter != notifications_.end() ? iter->get() : nullptr; - } - - void AddNotification( - std::unique_ptr<message_center::Notification> notification) override { - notifications_.push_back(std::move(notification)); - } - - void UpdateNotification( - const std::string& old_id, - std::unique_ptr<message_center::Notification> new_notification) override { - RemoveNotification(old_id, false /* by_user */); - AddNotification(std::move(new_notification)); - } - - void RemoveNotification(const std::string& id, bool by_user) override { - notifications_.erase(std::find_if( - notifications_.begin(), notifications_.end(), - [id](const std::shared_ptr<message_center::Notification> notification) { - return notification->id() == id; - })); - } - - private: - std::vector<std::shared_ptr<message_center::Notification>> notifications_; - base::ObserverList<message_center::MessageCenterObserver> observer_list_; -}; - cryptauth::RemoteDevice CreateTestRemoteDevice() { cryptauth::RemoteDevice device = cryptauth::GenerateTestRemoteDevices(1)[0]; device.name = "testDevice"; @@ -102,7 +34,7 @@ } // namespace -class TetherNotificationPresenterTest : public testing::Test { +class TetherNotificationPresenterTest : public BrowserWithTestWindowTest { public: class TestNetworkConnect : public NetworkConnect { public: @@ -162,16 +94,15 @@ TetherNotificationPresenterTest() : test_device_(CreateTestRemoteDevice()) {} void SetUp() override { - message_center::MessageCenter::Initialize(); + BrowserWithTestWindowTest::SetUp(); - TestingProfile::Builder builder; - profile_ = builder.Build(); - test_message_center_ = base::WrapUnique(new TestMessageCenter()); + display_service_ = + std::make_unique<NotificationDisplayServiceTester>(profile()); + test_network_connect_ = base::WrapUnique(new TestNetworkConnect()); notification_presenter_ = base::MakeUnique<TetherNotificationPresenter>( - profile_.get(), test_message_center_.get(), - test_network_connect_.get()); + profile(), test_network_connect_.get()); test_settings_ui_delegate_ = new TestSettingsUiDelegate(); notification_presenter_->SetSettingsUiDelegateForTesting( @@ -179,8 +110,8 @@ } void TearDown() override { - profile_.reset(); - message_center::MessageCenter::Shutdown(); + display_service_.reset(); + BrowserWithTestWindowTest::TearDown(); } std::string GetActiveHostNotificationId() { @@ -198,7 +129,7 @@ } void VerifySettingsOpened(const std::string& expected_subpage) { - EXPECT_EQ(profile_.get(), test_settings_ui_delegate_->last_profile()); + EXPECT_EQ(profile(), test_settings_ui_delegate_->last_profile()); EXPECT_EQ(expected_subpage, test_settings_ui_delegate_->last_settings_subpage()); } @@ -208,14 +139,12 @@ EXPECT_TRUE(test_settings_ui_delegate_->last_settings_subpage().empty()); } - const content::TestBrowserThreadBundle thread_bundle_; const cryptauth::RemoteDevice test_device_; - std::unique_ptr<TestingProfile> profile_; - std::unique_ptr<TestMessageCenter> test_message_center_; std::unique_ptr<TestNetworkConnect> test_network_connect_; TestSettingsUiDelegate* test_settings_ui_delegate_; std::unique_ptr<TetherNotificationPresenter> notification_presenter_; + std::unique_ptr<NotificationDisplayServiceTester> display_service_; private: DISALLOW_COPY_AND_ASSIGN(TetherNotificationPresenterTest); @@ -223,148 +152,136 @@ TEST_F(TetherNotificationPresenterTest, TestHostConnectionFailedNotification_RemoveProgrammatically) { - EXPECT_FALSE(test_message_center_->FindVisibleNotificationById( - GetActiveHostNotificationId())); + EXPECT_FALSE( + display_service_->GetNotification(GetActiveHostNotificationId())); notification_presenter_->NotifyConnectionToHostFailed(); - message_center::Notification* notification = - test_message_center_->FindVisibleNotificationById( - GetActiveHostNotificationId()); - EXPECT_TRUE(notification); + base::Optional<message_center::Notification> notification = + display_service_->GetNotification(GetActiveHostNotificationId()); + ASSERT_TRUE(notification); EXPECT_EQ(GetActiveHostNotificationId(), notification->id()); - EXPECT_EQ(1u, test_message_center_->GetNumNotifications()); notification_presenter_->RemoveConnectionToHostFailedNotification(); - EXPECT_FALSE(test_message_center_->FindVisibleNotificationById( - GetActiveHostNotificationId())); - EXPECT_EQ(0u, test_message_center_->GetNumNotifications()); + EXPECT_FALSE( + display_service_->GetNotification(GetActiveHostNotificationId())); VerifySettingsNotOpened(); } TEST_F(TetherNotificationPresenterTest, TestHostConnectionFailedNotification_TapNotification) { - EXPECT_FALSE(test_message_center_->FindVisibleNotificationById( - GetActiveHostNotificationId())); + EXPECT_FALSE( + display_service_->GetNotification(GetActiveHostNotificationId())); notification_presenter_->NotifyConnectionToHostFailed(); - message_center::Notification* notification = - test_message_center_->FindVisibleNotificationById( - GetActiveHostNotificationId()); - EXPECT_TRUE(notification); + base::Optional<message_center::Notification> notification = + display_service_->GetNotification(GetActiveHostNotificationId()); + ASSERT_TRUE(notification); EXPECT_EQ(GetActiveHostNotificationId(), notification->id()); // Tap the notification. - test_message_center_->NotifyNotificationTapped(GetActiveHostNotificationId()); + ASSERT_TRUE(notification->delegate()); + notification->delegate()->Click(); VerifySettingsOpened(kTetherSettingsSubpage); - EXPECT_FALSE(test_message_center_->FindVisibleNotificationById( - GetActiveHostNotificationId())); - EXPECT_EQ(0u, test_message_center_->GetNumNotifications()); + EXPECT_FALSE( + display_service_->GetNotification(GetActiveHostNotificationId())); } TEST_F(TetherNotificationPresenterTest, TestSetupRequiredNotification_RemoveProgrammatically) { - EXPECT_FALSE(test_message_center_->FindVisibleNotificationById( - GetSetupRequiredNotificationId())); + EXPECT_FALSE( + display_service_->GetNotification(GetSetupRequiredNotificationId())); notification_presenter_->NotifySetupRequired(test_device_.name, kTestNetworkSignalStrength); - message_center::Notification* notification = - test_message_center_->FindVisibleNotificationById( - GetSetupRequiredNotificationId()); - EXPECT_TRUE(notification); + base::Optional<message_center::Notification> notification = + display_service_->GetNotification(GetSetupRequiredNotificationId()); + ASSERT_TRUE(notification); EXPECT_EQ(GetSetupRequiredNotificationId(), notification->id()); - EXPECT_EQ(1u, test_message_center_->GetNumNotifications()); notification_presenter_->RemoveSetupRequiredNotification(); - EXPECT_FALSE(test_message_center_->FindVisibleNotificationById( - GetSetupRequiredNotificationId())); - EXPECT_EQ(0u, test_message_center_->GetNumNotifications()); -} - -TEST_F(TetherNotificationPresenterTest, - TestSetupRequiredNotification_TapNotification) { - EXPECT_FALSE(test_message_center_->FindVisibleNotificationById( - GetSetupRequiredNotificationId())); - notification_presenter_->NotifySetupRequired(test_device_.name, - kTestNetworkSignalStrength); - - message_center::Notification* notification = - test_message_center_->FindVisibleNotificationById( - GetSetupRequiredNotificationId()); - EXPECT_TRUE(notification); - EXPECT_EQ(GetSetupRequiredNotificationId(), notification->id()); - - // Tap the notification. - test_message_center_->NotifyNotificationTapped( - GetSetupRequiredNotificationId()); - VerifySettingsOpened(kTetherSettingsSubpage); - EXPECT_FALSE(test_message_center_->FindVisibleNotificationById( - GetSetupRequiredNotificationId())); - EXPECT_EQ(0u, test_message_center_->GetNumNotifications()); -} - -TEST_F(TetherNotificationPresenterTest, - TestSinglePotentialHotspotNotification_RemoveProgrammatically) { - EXPECT_FALSE(test_message_center_->FindVisibleNotificationById( - GetPotentialHotspotNotificationId())); - notification_presenter_->NotifyPotentialHotspotNearby( - test_device_, kTestNetworkSignalStrength); - - message_center::Notification* notification = - test_message_center_->FindVisibleNotificationById( - GetPotentialHotspotNotificationId()); - EXPECT_TRUE(notification); - EXPECT_EQ(GetPotentialHotspotNotificationId(), notification->id()); - - notification_presenter_->RemovePotentialHotspotNotification(); - EXPECT_FALSE(test_message_center_->FindVisibleNotificationById( - GetPotentialHotspotNotificationId())); + EXPECT_FALSE( + display_service_->GetNotification(GetSetupRequiredNotificationId())); VerifySettingsNotOpened(); } TEST_F(TetherNotificationPresenterTest, - TestSinglePotentialHotspotNotification_TapNotification) { - EXPECT_FALSE(test_message_center_->FindVisibleNotificationById( - GetPotentialHotspotNotificationId())); + TestSetupRequiredNotification_TapNotification) { + EXPECT_FALSE( + display_service_->GetNotification(GetSetupRequiredNotificationId())); + notification_presenter_->NotifySetupRequired(test_device_.name, + kTestNetworkSignalStrength); + + base::Optional<message_center::Notification> notification = + display_service_->GetNotification(GetSetupRequiredNotificationId()); + ASSERT_TRUE(notification); + EXPECT_EQ(GetSetupRequiredNotificationId(), notification->id()); + + // Tap the notification. + ASSERT_TRUE(notification->delegate()); + notification->delegate()->Click(); + VerifySettingsOpened(kTetherSettingsSubpage); + EXPECT_FALSE( + display_service_->GetNotification(GetSetupRequiredNotificationId())); +} + +TEST_F(TetherNotificationPresenterTest, + TestPotentialHotspotNotification_RemoveProgrammatically) { + EXPECT_FALSE( + display_service_->GetNotification(GetPotentialHotspotNotificationId())); notification_presenter_->NotifyPotentialHotspotNearby( test_device_, kTestNetworkSignalStrength); - message_center::Notification* notification = - test_message_center_->FindVisibleNotificationById( - GetPotentialHotspotNotificationId()); - EXPECT_TRUE(notification); + base::Optional<message_center::Notification> notification = + display_service_->GetNotification(GetPotentialHotspotNotificationId()); + ASSERT_TRUE(notification); + EXPECT_EQ(GetPotentialHotspotNotificationId(), notification->id()); + + notification_presenter_->RemovePotentialHotspotNotification(); + EXPECT_FALSE( + display_service_->GetNotification(GetPotentialHotspotNotificationId())); + + VerifySettingsNotOpened(); +} + +TEST_F(TetherNotificationPresenterTest, + TestPotentialHotspotNotification_TapNotification) { + EXPECT_FALSE( + display_service_->GetNotification(GetPotentialHotspotNotificationId())); + notification_presenter_->NotifyPotentialHotspotNearby( + test_device_, kTestNetworkSignalStrength); + + base::Optional<message_center::Notification> notification = + display_service_->GetNotification(GetPotentialHotspotNotificationId()); + ASSERT_TRUE(notification); EXPECT_EQ(GetPotentialHotspotNotificationId(), notification->id()); // Tap the notification. - test_message_center_->NotifyNotificationTapped( - GetPotentialHotspotNotificationId()); + ASSERT_TRUE(notification->delegate()); + notification->delegate()->Click(); VerifySettingsOpened(kTetherSettingsSubpage); - EXPECT_FALSE(test_message_center_->FindVisibleNotificationById( - GetPotentialHotspotNotificationId())); - EXPECT_EQ(0u, test_message_center_->GetNumNotifications()); + EXPECT_FALSE( + display_service_->GetNotification(GetPotentialHotspotNotificationId())); } TEST_F(TetherNotificationPresenterTest, TestSinglePotentialHotspotNotification_TapNotificationButton) { - EXPECT_FALSE(test_message_center_->FindVisibleNotificationById( - GetPotentialHotspotNotificationId())); + EXPECT_FALSE( + display_service_->GetNotification(GetPotentialHotspotNotificationId())); notification_presenter_->NotifyPotentialHotspotNearby( test_device_, kTestNetworkSignalStrength); - message_center::Notification* notification = - test_message_center_->FindVisibleNotificationById( - GetPotentialHotspotNotificationId()); - EXPECT_TRUE(notification); + base::Optional<message_center::Notification> notification = + display_service_->GetNotification(GetPotentialHotspotNotificationId()); + ASSERT_TRUE(notification); EXPECT_EQ(GetPotentialHotspotNotificationId(), notification->id()); // Tap the notification's button. - test_message_center_->NotifyNotificationButtonTapped( - GetPotentialHotspotNotificationId(), 0 /* button_index */); - EXPECT_FALSE(test_message_center_->FindVisibleNotificationById( - GetPotentialHotspotNotificationId())); - EXPECT_EQ(0u, test_message_center_->GetNumNotifications()); + ASSERT_TRUE(notification->delegate()); + notification->delegate()->ButtonClick(0); + EXPECT_FALSE( + display_service_->GetNotification(GetPotentialHotspotNotificationId())); EXPECT_EQ(test_device_.GetDeviceId(), test_network_connect_->network_id_to_connect()); @@ -372,57 +289,52 @@ TEST_F(TetherNotificationPresenterTest, TestMultiplePotentialHotspotNotification_RemoveProgrammatically) { - EXPECT_FALSE(test_message_center_->FindVisibleNotificationById( - GetPotentialHotspotNotificationId())); + EXPECT_FALSE( + display_service_->GetNotification(GetPotentialHotspotNotificationId())); notification_presenter_->NotifyMultiplePotentialHotspotsNearby(); - message_center::Notification* notification = - test_message_center_->FindVisibleNotificationById( - GetPotentialHotspotNotificationId()); - EXPECT_TRUE(notification); + base::Optional<message_center::Notification> notification = + display_service_->GetNotification(GetPotentialHotspotNotificationId()); + ASSERT_TRUE(notification); EXPECT_EQ(GetPotentialHotspotNotificationId(), notification->id()); notification_presenter_->RemovePotentialHotspotNotification(); - EXPECT_FALSE(test_message_center_->FindVisibleNotificationById( - GetPotentialHotspotNotificationId())); + EXPECT_FALSE( + display_service_->GetNotification(GetPotentialHotspotNotificationId())); VerifySettingsNotOpened(); } TEST_F(TetherNotificationPresenterTest, TestMultiplePotentialHotspotNotification_TapNotification) { - EXPECT_FALSE(test_message_center_->FindVisibleNotificationById( - GetPotentialHotspotNotificationId())); + EXPECT_FALSE( + display_service_->GetNotification(GetPotentialHotspotNotificationId())); notification_presenter_->NotifyMultiplePotentialHotspotsNearby(); - message_center::Notification* notification = - test_message_center_->FindVisibleNotificationById( - GetPotentialHotspotNotificationId()); - EXPECT_TRUE(notification); + base::Optional<message_center::Notification> notification = + display_service_->GetNotification(GetPotentialHotspotNotificationId()); + ASSERT_TRUE(notification); EXPECT_EQ(GetPotentialHotspotNotificationId(), notification->id()); // Tap the notification. - test_message_center_->NotifyNotificationTapped( - GetPotentialHotspotNotificationId()); + ASSERT_TRUE(notification->delegate()); + notification->delegate()->Click(); VerifySettingsOpened(kTetherSettingsSubpage); - EXPECT_FALSE(test_message_center_->FindVisibleNotificationById( - GetPotentialHotspotNotificationId())); - EXPECT_EQ(0u, test_message_center_->GetNumNotifications()); + EXPECT_FALSE( + display_service_->GetNotification(GetPotentialHotspotNotificationId())); } TEST_F(TetherNotificationPresenterTest, TestPotentialHotspotNotifications_UpdatesOneNotification) { - EXPECT_FALSE(test_message_center_->FindVisibleNotificationById( - GetPotentialHotspotNotificationId())); + EXPECT_FALSE( + display_service_->GetNotification(GetPotentialHotspotNotificationId())); notification_presenter_->NotifyPotentialHotspotNearby( test_device_, kTestNetworkSignalStrength); - message_center::Notification* notification = - test_message_center_->FindVisibleNotificationById( - GetPotentialHotspotNotificationId()); - EXPECT_TRUE(notification); + base::Optional<message_center::Notification> notification = + display_service_->GetNotification(GetPotentialHotspotNotificationId()); + ASSERT_TRUE(notification); EXPECT_EQ(GetPotentialHotspotNotificationId(), notification->id()); - EXPECT_EQ(1u, test_message_center_->GetNumNotifications()); // Simulate more device results coming in. Display the potential hotspots // notification for multiple devices. @@ -430,26 +342,19 @@ // The existing notification should have been updated instead of creating a // new one. - notification = test_message_center_->FindVisibleNotificationById( - GetPotentialHotspotNotificationId()); - EXPECT_TRUE(notification); + notification = + display_service_->GetNotification(GetPotentialHotspotNotificationId()); + ASSERT_TRUE(notification); EXPECT_EQ(GetPotentialHotspotNotificationId(), notification->id()); - EXPECT_EQ(1u, test_message_center_->GetNumNotifications()); notification_presenter_->RemovePotentialHotspotNotification(); - EXPECT_FALSE(test_message_center_->FindVisibleNotificationById( - GetPotentialHotspotNotificationId())); + EXPECT_FALSE( + display_service_->GetNotification(GetPotentialHotspotNotificationId())); VerifySettingsNotOpened(); } TEST_F(TetherNotificationPresenterTest, - TestDoesNotOpenSettingsWhenOtherNotificationClicked) { - test_message_center_->NotifyNotificationTapped("otherNotificationId"); - VerifySettingsNotOpened(); -} - -TEST_F(TetherNotificationPresenterTest, TestGetPotentialHotspotNotificationState) { EXPECT_EQ(notification_presenter_->GetPotentialHotspotNotificationState(), NotificationPresenter::PotentialHotspotNotificationState:: @@ -472,8 +377,9 @@ EXPECT_EQ(notification_presenter_->GetPotentialHotspotNotificationState(), NotificationPresenter::PotentialHotspotNotificationState:: SINGLE_HOTSPOT_NEARBY_SHOWN); - test_message_center_->NotifyNotificationTapped( - GetPotentialHotspotNotificationId()); + display_service_->GetNotification(GetPotentialHotspotNotificationId()) + ->delegate() + ->Click(); EXPECT_EQ(notification_presenter_->GetPotentialHotspotNotificationState(), NotificationPresenter::PotentialHotspotNotificationState:: NO_HOTSPOT_NOTIFICATION_SHOWN); @@ -484,8 +390,9 @@ EXPECT_EQ(notification_presenter_->GetPotentialHotspotNotificationState(), NotificationPresenter::PotentialHotspotNotificationState:: SINGLE_HOTSPOT_NEARBY_SHOWN); - test_message_center_->NotifyNotificationButtonTapped( - GetPotentialHotspotNotificationId(), 0 /* button_index */); + display_service_->GetNotification(GetPotentialHotspotNotificationId()) + ->delegate() + ->ButtonClick(0); EXPECT_EQ(notification_presenter_->GetPotentialHotspotNotificationState(), NotificationPresenter::PotentialHotspotNotificationState:: NO_HOTSPOT_NOTIFICATION_SHOWN); @@ -516,8 +423,9 @@ EXPECT_EQ(notification_presenter_->GetPotentialHotspotNotificationState(), NotificationPresenter::PotentialHotspotNotificationState:: MULTIPLE_HOTSPOTS_NEARBY_SHOWN); - test_message_center_->NotifyNotificationTapped( - GetPotentialHotspotNotificationId()); + display_service_->GetNotification(GetPotentialHotspotNotificationId()) + ->delegate() + ->Click(); EXPECT_EQ(notification_presenter_->GetPotentialHotspotNotificationState(), NotificationPresenter::PotentialHotspotNotificationState:: NO_HOTSPOT_NOTIFICATION_SHOWN);
diff --git a/chrome/browser/chromeos/tether/tether_service.cc b/chrome/browser/chromeos/tether/tether_service.cc index 4881a0a..93d54ac 100644 --- a/chrome/browser/chromeos/tether/tether_service.cc +++ b/chrome/browser/chromeos/tether/tether_service.cc
@@ -118,7 +118,6 @@ notification_presenter_( base::MakeUnique<chromeos::tether::TetherNotificationPresenter>( profile_, - message_center::MessageCenter::Get(), chromeos::NetworkConnect::Get())), remote_device_provider_( cryptauth::RemoteDeviceProviderImpl::Factory::NewInstance(
diff --git a/chrome/browser/download/download_danger_prompt_browsertest.cc b/chrome/browser/download/download_danger_prompt_browsertest.cc index 7758a53..44a6f98 100644 --- a/chrome/browser/download/download_danger_prompt_browsertest.cc +++ b/chrome/browser/download/download_danger_prompt_browsertest.cc
@@ -354,11 +354,11 @@ danger_type_ = danger_type; invocation_type_ = invocation_type; - RunDialog(); + ShowAndVerifyUi(); } private: - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { ON_CALL(download_, GetURL()).WillByDefault(ReturnRef(download_url_)); ON_CALL(download_, GetReferrerUrl()) .WillByDefault(ReturnRef(GURL::EmptyGURL())); @@ -389,38 +389,37 @@ }; IN_PROC_BROWSER_TEST_F(DownloadDangerPromptBrowserTest, - InvokeDialog_DangerousFile) { + InvokeUi_DangerousFile) { RunTest(content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE, USER_INITIATED); } IN_PROC_BROWSER_TEST_F(DownloadDangerPromptBrowserTest, - InvokeDialog_DangerousFileFromApi) { + InvokeUi_DangerousFileFromApi) { RunTest(content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE, FROM_DOWNLOAD_API); } -IN_PROC_BROWSER_TEST_F(DownloadDangerPromptBrowserTest, - InvokeDialog_DangerousUrl) { +IN_PROC_BROWSER_TEST_F(DownloadDangerPromptBrowserTest, InvokeUi_DangerousUrl) { RunTest(content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL, USER_INITIATED); } IN_PROC_BROWSER_TEST_F(DownloadDangerPromptBrowserTest, - InvokeDialog_DangerousUrlFromApi) { + InvokeUi_DangerousUrlFromApi) { RunTest(content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL, FROM_DOWNLOAD_API); } IN_PROC_BROWSER_TEST_F(DownloadDangerPromptBrowserTest, - InvokeDialog_UncommonContent) { + InvokeUi_UncommonContent) { RunTest(content::DOWNLOAD_DANGER_TYPE_UNCOMMON_CONTENT, USER_INITIATED); } IN_PROC_BROWSER_TEST_F(DownloadDangerPromptBrowserTest, - InvokeDialog_UncommonContentFromApi) { + InvokeUi_UncommonContentFromApi) { RunTest(content::DOWNLOAD_DANGER_TYPE_UNCOMMON_CONTENT, FROM_DOWNLOAD_API); } IN_PROC_BROWSER_TEST_F(DownloadDangerPromptBrowserTest, - InvokeDialog_PotentiallyUnwanted) { + InvokeUi_PotentiallyUnwanted) { RunTest(content::DOWNLOAD_DANGER_TYPE_POTENTIALLY_UNWANTED, USER_INITIATED); } IN_PROC_BROWSER_TEST_F(DownloadDangerPromptBrowserTest, - InvokeDialog_PotentiallyUnwantedFromApi) { + InvokeUi_PotentiallyUnwantedFromApi) { RunTest(content::DOWNLOAD_DANGER_TYPE_POTENTIALLY_UNWANTED, FROM_DOWNLOAD_API); }
diff --git a/chrome/browser/extensions/bookmark_app_helper_browsertest.cc b/chrome/browser/extensions/bookmark_app_helper_browsertest.cc index ce730444e..58259a8 100644 --- a/chrome/browser/extensions/bookmark_app_helper_browsertest.cc +++ b/chrome/browser/extensions/bookmark_app_helper_browsertest.cc
@@ -92,7 +92,7 @@ run_loop.Run(); } // DialogBrowserTest: - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { ASSERT_TRUE(embedded_test_server()->Start()); const std::string path = (name == "CreateWindowedPWA") @@ -124,17 +124,17 @@ }; // Launches an installation confirmation dialog for a bookmark app. -IN_PROC_BROWSER_TEST_F(BookmarkAppHelperTest, InvokeDialog_CreateBookmarkApp) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(BookmarkAppHelperTest, InvokeUi_CreateBookmarkApp) { + ShowAndVerifyUi(); } // Launches an installation confirmation dialog for a PWA. -IN_PROC_BROWSER_TEST_F(BookmarkAppHelperTest, InvokeDialog_CreateWindowedPWA) { +IN_PROC_BROWSER_TEST_F(BookmarkAppHelperTest, InvokeUi_CreateWindowedPWA) { // The PWA dialog will be launched because manifest_test_page.html passes // the PWA check, but the kDesktopPWAWindowing flag must also be enabled. base::test::ScopedFeatureList feature_list; feature_list.InitAndEnableFeature(features::kDesktopPWAWindowing); - RunDialog(); + ShowAndVerifyUi(); } } // namespace extensions
diff --git a/chrome/browser/extensions/device_permissions_dialog_controller.cc b/chrome/browser/extensions/device_permissions_dialog_controller.cc index 49f01e9..ab2136d 100644 --- a/chrome/browser/extensions/device_permissions_dialog_controller.cc +++ b/chrome/browser/extensions/device_permissions_dialog_controller.cc
@@ -25,7 +25,7 @@ prompt_->SetObserver(nullptr); } -bool DevicePermissionsDialogController::ShouldShowFootnoteView() const { +bool DevicePermissionsDialogController::ShouldShowHelpButton() const { return false; }
diff --git a/chrome/browser/extensions/device_permissions_dialog_controller.h b/chrome/browser/extensions/device_permissions_dialog_controller.h index dd5fbbd..c2de2361 100644 --- a/chrome/browser/extensions/device_permissions_dialog_controller.h +++ b/chrome/browser/extensions/device_permissions_dialog_controller.h
@@ -22,7 +22,7 @@ ~DevicePermissionsDialogController() override; // ChooserController: - bool ShouldShowFootnoteView() const override; + bool ShouldShowHelpButton() const override; bool AllowMultipleSelection() const override; base::string16 GetNoOptionsText() const override; base::string16 GetOkButtonLabel() const override;
diff --git a/chrome/browser/external_protocol/external_protocol_handler.cc b/chrome/browser/external_protocol/external_protocol_handler.cc index e621060..9faf99f 100644 --- a/chrome/browser/external_protocol/external_protocol_handler.cc +++ b/chrome/browser/external_protocol/external_protocol_handler.cc
@@ -201,12 +201,10 @@ if (profile_prefs) { // May be NULL during testing. DictionaryPrefUpdate update_excluded_schemas_profile( profile_prefs, prefs::kExcludedSchemes); - if (!update_excluded_schemas_profile->empty()) { - if (state == DONT_BLOCK) - update_excluded_schemas_profile->SetBoolean(scheme, false); - else - update_excluded_schemas_profile->Remove(scheme, nullptr); - } + if (state == DONT_BLOCK) + update_excluded_schemas_profile->SetBoolean(scheme, false); + else + update_excluded_schemas_profile->Remove(scheme, nullptr); } }
diff --git a/chrome/browser/external_protocol/external_protocol_handler_unittest.cc b/chrome/browser/external_protocol/external_protocol_handler_unittest.cc index 91ad01c..f2a2f8d 100644 --- a/chrome/browser/external_protocol/external_protocol_handler_unittest.cc +++ b/chrome/browser/external_protocol/external_protocol_handler_unittest.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/external_protocol/external_protocol_handler.h" #include "base/run_loop.h" +#include "base/values.h" #include "chrome/browser/prefs/browser_prefs.h" #include "chrome/common/pref_names.h" #include "chrome/test/base/testing_browser_process.h" @@ -120,17 +121,13 @@ ExternalProtocolHandlerTest() {} void SetUp() override { - local_state_.reset(new TestingPrefServiceSimple); profile_.reset(new TestingProfile()); - RegisterLocalState(local_state_->registry()); - TestingBrowserProcess::GetGlobal()->SetLocalState(local_state_.get()); } void TearDown() override { // Ensure that g_accept_requests gets set back to true after test execution. ExternalProtocolHandler::PermitLaunchUrl(); TestingBrowserProcess::GetGlobal()->SetLocalState(nullptr); - local_state_.reset(); } enum class Action { PROMPT, LAUNCH, BLOCK }; @@ -165,7 +162,6 @@ FakeExternalProtocolHandlerDelegate delegate_; - std::unique_ptr<TestingPrefServiceSimple> local_state_; std::unique_ptr<TestingProfile> profile_; }; @@ -246,7 +242,6 @@ ExternalProtocolHandler::BlockState block_state = ExternalProtocolHandler::GetBlockState("tel", profile_.get()); EXPECT_EQ(ExternalProtocolHandler::UNKNOWN, block_state); - EXPECT_TRUE(local_state_->GetDictionary(prefs::kExcludedSchemes)->empty()); EXPECT_TRUE( profile_->GetPrefs()->GetDictionary(prefs::kExcludedSchemes)->empty()); } @@ -255,7 +250,6 @@ ExternalProtocolHandler::BlockState block_state = ExternalProtocolHandler::GetBlockState("afp", profile_.get()); EXPECT_EQ(ExternalProtocolHandler::BLOCK, block_state); - EXPECT_TRUE(local_state_->GetDictionary(prefs::kExcludedSchemes)->empty()); EXPECT_TRUE( profile_->GetPrefs()->GetDictionary(prefs::kExcludedSchemes)->empty()); } @@ -264,7 +258,36 @@ ExternalProtocolHandler::BlockState block_state = ExternalProtocolHandler::GetBlockState("mailto", profile_.get()); EXPECT_EQ(ExternalProtocolHandler::DONT_BLOCK, block_state); - EXPECT_TRUE(local_state_->GetDictionary(prefs::kExcludedSchemes)->empty()); + EXPECT_TRUE( + profile_->GetPrefs()->GetDictionary(prefs::kExcludedSchemes)->empty()); +} + +TEST_F(ExternalProtocolHandlerTest, TestSetBlockState) { + const char kScheme[] = "custom"; + ExternalProtocolHandler::BlockState block_state = + ExternalProtocolHandler::GetBlockState(kScheme, profile_.get()); + EXPECT_EQ(ExternalProtocolHandler::UNKNOWN, block_state); + EXPECT_TRUE( + profile_->GetPrefs()->GetDictionary(prefs::kExcludedSchemes)->empty()); + + // Set to DONT_BLOCK, and make sure it is written to prefs. + ExternalProtocolHandler::SetBlockState( + kScheme, ExternalProtocolHandler::DONT_BLOCK, profile_.get()); + block_state = ExternalProtocolHandler::GetBlockState(kScheme, profile_.get()); + EXPECT_EQ(ExternalProtocolHandler::DONT_BLOCK, block_state); + base::Value expected_excluded_schemes(base::Value::Type::DICTIONARY); + expected_excluded_schemes.SetKey(kScheme, base::Value(false)); + EXPECT_EQ(expected_excluded_schemes, + *profile_->GetPrefs()->GetDictionary(prefs::kExcludedSchemes)); + + // Note: BLOCK is no longer supported (it triggers a DCHECK in SetBlockState; + // see https://crbug.com/724919). + + // Set back to UNKNOWN, and make sure this results in an empty dictionary. + ExternalProtocolHandler::SetBlockState( + kScheme, ExternalProtocolHandler::UNKNOWN, profile_.get()); + block_state = ExternalProtocolHandler::GetBlockState(kScheme, profile_.get()); + EXPECT_EQ(ExternalProtocolHandler::UNKNOWN, block_state); EXPECT_TRUE( profile_->GetPrefs()->GetDictionary(prefs::kExcludedSchemes)->empty()); }
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 385050b..ae28b0b 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -2431,7 +2431,7 @@ const char kCrOSComponentName[] = "Chrome OS Component"; const char kCrOSComponentDescription[] = - "Enable the use of componentized escpr CUPS filter."; + "Disable the use of componentized escpr CUPS filter."; const char kCrOSContainerName[] = "Chrome OS Container"; const char kCrOSContainerDescription[] =
diff --git a/chrome/browser/infobars/infobars_browsertest.cc b/chrome/browser/infobars/infobars_browsertest.cc index a887674..ef3787b9 100644 --- a/chrome/browser/infobars/infobars_browsertest.cc +++ b/chrome/browser/infobars/infobars_browsertest.cc
@@ -16,9 +16,11 @@ #include "chrome/browser/themes/theme_service_factory.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" +#include "chrome/browser/ui/test/test_browser_ui.h" #include "chrome/common/chrome_switches.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" +#include "components/infobars/core/infobar.h" #include "content/public/browser/notification_service.h" #include "extensions/browser/extension_dialog_auto_confirm.h" #include "extensions/browser/extension_registry.h" @@ -26,6 +28,10 @@ #include "extensions/browser/test_extension_registry_observer.h" #include "net/test/embedded_test_server/embedded_test_server.h" +#if !defined(OS_CHROMEOS) +#include "chrome/browser/ui/startup/default_browser_infobar_delegate.h" +#endif + class InfoBarsTest : public InProcessBrowserTest { public: InfoBarsTest() {} @@ -93,3 +99,106 @@ browser()->tab_strip_model()->GetActiveWebContents())-> infobar_count()); } + +namespace { + +// Helper to return when an InfoBar has been removed or replaced. +class InfoBarObserver : public infobars::InfoBarManager::Observer { + public: + InfoBarObserver(infobars::InfoBarManager* manager, infobars::InfoBar* infobar) + : manager_(manager), infobar_(infobar) { + manager_->AddObserver(this); + } + + // infobars::InfoBarManager::Observer: + void OnInfoBarRemoved(infobars::InfoBar* infobar, bool animate) override { + if (infobar != infobar_) + return; + manager_->RemoveObserver(this); + run_loop_.Quit(); + } + void OnInfoBarReplaced(infobars::InfoBar* old_infobar, + infobars::InfoBar* new_infobar) override { + OnInfoBarRemoved(old_infobar, false); + } + + void WaitForRemoval() { run_loop_.Run(); } + + private: + infobars::InfoBarManager* manager_; + infobars::InfoBar* infobar_; + base::RunLoop run_loop_; + + DISALLOW_COPY_AND_ASSIGN(InfoBarObserver); +}; + +} // namespace + +class InfoBarUiTest : public UiBrowserTest { + public: + InfoBarUiTest() = default; + + // TestBrowserUi: + void PreShow() override; + void ShowUi(const std::string& name) override; + bool VerifyUi() override; + void WaitForUserDismissal() override; + + private: + // Returns the InfoBarService associated with the active tab. + InfoBarService* GetInfoBarService(); + + // Sets |infobars_| to a sorted (by pointer value) list of all infobars from + // the active tab. + void UpdateInfoBars(); + + infobars::InfoBarManager::InfoBars infobars_; + + DISALLOW_COPY_AND_ASSIGN(InfoBarUiTest); +}; + +void InfoBarUiTest::PreShow() { + UpdateInfoBars(); +} + +void InfoBarUiTest::ShowUi(const std::string& name) { + // TODO(pkasting): Add other infobars, and check in VerifyUi() that the + // correct one was shown. +#if defined(OS_CHROMEOS) + ADD_FAILURE() << "This infobar is not supported on this OS."; +#else + chrome::DefaultBrowserInfoBarDelegate::Create(GetInfoBarService(), + browser()->profile()); +#endif +} + +bool InfoBarUiTest::VerifyUi() { + infobars::InfoBarManager::InfoBars old_infobars = infobars_; + UpdateInfoBars(); + auto added = base::STLSetDifference<infobars::InfoBarManager::InfoBars>( + infobars_, old_infobars); + return (added.size() == 1) && + (added[0]->delegate()->GetIdentifier() == + infobars::InfoBarDelegate::DEFAULT_BROWSER_INFOBAR_DELEGATE); +} + +void InfoBarUiTest::WaitForUserDismissal() { + InfoBarObserver observer(GetInfoBarService(), infobars_.front()); + observer.WaitForRemoval(); +} + +InfoBarService* InfoBarUiTest::GetInfoBarService() { + return InfoBarService::FromWebContents( + browser()->tab_strip_model()->GetActiveWebContents()); +} + +void InfoBarUiTest::UpdateInfoBars() { + infobars_ = GetInfoBarService()->infobars_; + std::sort(infobars_.begin(), infobars_.end()); +} + +#if !defined(OS_CHROMEOS) +IN_PROC_BROWSER_TEST_F(InfoBarUiTest, InvokeUi_default_browser) { + ShowAndVerifyUi(); +} +#endif
diff --git a/chrome/browser/net/errorpage_browsertest.cc b/chrome/browser/net/errorpage_browsertest.cc index 90ce9f3..7585605 100644 --- a/chrome/browser/net/errorpage_browsertest.cc +++ b/chrome/browser/net/errorpage_browsertest.cc
@@ -450,7 +450,7 @@ DCHECK_EQ(-1, requests_to_wait_for_); DCHECK(!run_loop_); - if (requests_to_wait_for >= num_requests_) + if (requests_to_wait_for <= num_requests_) return; requests_to_wait_for_ = requests_to_wait_for; @@ -461,9 +461,7 @@ EXPECT_EQ(num_requests_, requests_to_wait_for); } - // It is up to the caller to wait until all relevant requests has been - // created, either through calling WaitForRequests or some other manner, - // before calling this method. + // Returns the total number of requests handled thus far. int32_t num_requests() const { DCHECK_CURRENTLY_ON(BrowserThread::UI); return num_requests_; @@ -707,7 +705,6 @@ // Have to wait for it, since the search page does not depend on having // sent the tracking request. WaitForRequests(2); - EXPECT_EQ(2, num_requests()); // Check the path and query string. std::string url; @@ -752,7 +749,6 @@ // to wait for the tracking request, since the new error page does not depend // on it. WaitForRequests(3); - EXPECT_EQ(3, num_requests()); } // Test that the reload button on a DNS error page works after a same document @@ -796,7 +792,6 @@ // to wait for the tracking request, since the new error page does not depend // on it. WaitForRequests(3); - EXPECT_EQ(3, num_requests()); } // Test that clicking links on a DNS error page works. @@ -834,7 +829,6 @@ // to make sure to wait the tracking request, since the new page does not // depend on it. WaitForRequests(2); - EXPECT_EQ(2, num_requests()); } // Test that a DNS error occuring in an iframe does not result in showing
diff --git a/chrome/browser/notifications/stub_notification_display_service.cc b/chrome/browser/notifications/stub_notification_display_service.cc index c2140b2..ade292b 100644 --- a/chrome/browser/notifications/stub_notification_display_service.cc +++ b/chrome/browser/notifications/stub_notification_display_service.cc
@@ -175,7 +175,8 @@ std::unique_ptr<NotificationCommon::Metadata> metadata) { // This mimics notification replacement behaviour; the Close() method on a // notification's delegate is not meant to be invoked in this situation. - Close(notification_type, notification.id()); + RemoveNotification(notification_type, notification.id(), false /* by_user */, + true /* silent */); NotificationHandler* handler = GetNotificationHandler(notification_type); if (notification_type == NotificationHandler::Type::TRANSIENT) @@ -193,14 +194,8 @@ void StubNotificationDisplayService::Close( NotificationHandler::Type notification_type, const std::string& notification_id) { - notifications_.erase( - std::remove_if( - notifications_.begin(), notifications_.end(), - [notification_type, notification_id](const NotificationData& data) { - return data.type == notification_type && - data.notification.id() == notification_id; - }), - notifications_.end()); + RemoveNotification(notification_type, notification_id, false /* by_user */, + false /* silent */); } void StubNotificationDisplayService::GetDisplayed(
diff --git a/chrome/browser/password_manager/password_manager_browsertest.cc b/chrome/browser/password_manager/password_manager_browsertest.cc index 29c09a9..3f77775 100644 --- a/chrome/browser/password_manager/password_manager_browsertest.cc +++ b/chrome/browser/password_manager/password_manager_browsertest.cc
@@ -3518,23 +3518,20 @@ 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. +// Harness for showing dialogs as part of the DialogBrowserTest suite. class PasswordManagerDialogBrowserTest : public SupportsTestDialog<PasswordManagerBrowserTestBase> { public: PasswordManagerDialogBrowserTest() = default; - // SupportsTestDialog: + // SupportsTestUi: void SetUp() override { - // Secondary UI needs to be enabled before ShowDialog for the test to work. + // Secondary UI needs to be enabled before ShowUi for the test to work. UseMdOnly(); - SupportsTestDialog::SetUp(); + SupportsTestUi::SetUp(); } - void ShowDialog(const std::string& name) override { + void ShowUi(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 @@ -3561,8 +3558,8 @@ DISALLOW_COPY_AND_ASSIGN(PasswordManagerDialogBrowserTest); }; -IN_PROC_BROWSER_TEST_F(PasswordManagerDialogBrowserTest, InvokeDialog_normal) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(PasswordManagerDialogBrowserTest, InvokeUi_normal) { + ShowAndVerifyUi(); } // Verify that password manager ignores passwords on forms injected into
diff --git a/chrome/browser/permissions/permission_request_manager_browsertest.cc b/chrome/browser/permissions/permission_request_manager_browsertest.cc index fb9ce5d2..6db3857 100644 --- a/chrome/browser/permissions/permission_request_manager_browsertest.cc +++ b/chrome/browser/permissions/permission_request_manager_browsertest.cc
@@ -110,7 +110,7 @@ PermissionRequest* MakePermissionRequest(ContentSettingsType permission); // TestBrowserDialog: - void ShowDialog(const std::string& name) override; + void ShowUi(const std::string& name) override; // Holds requests that do not delete themselves. std::vector<std::unique_ptr<PermissionRequest>> owned_requests_; @@ -143,7 +143,7 @@ return owned_requests_.back().get(); } -void PermissionDialogTest::ShowDialog(const std::string& name) { +void PermissionDialogTest::ShowUi(const std::string& name) { constexpr const char* kMultipleName = "multiple"; constexpr struct { const char* name; @@ -470,7 +470,7 @@ // that could result in permission bubbles not being dismissed, and a problem // referencing a temporary drag window. See http://crbug.com/754552. IN_PROC_BROWSER_TEST_F(PermissionDialogTest, SwitchBrowserWindow) { - ShowDialog("geolocation"); + ShowUi("geolocation"); TabStripModel* strip = browser()->tab_strip_model(); // Drag out into a dragging window. E.g. see steps in [BrowserWindowController @@ -494,54 +494,53 @@ } // Host wants to run flash. -IN_PROC_BROWSER_TEST_F(PermissionDialogTest, InvokeDialog_flash) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(PermissionDialogTest, InvokeUi_flash) { + ShowAndVerifyUi(); } // Host wants to know your location. -IN_PROC_BROWSER_TEST_F(PermissionDialogTest, InvokeDialog_geolocation) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(PermissionDialogTest, InvokeUi_geolocation) { + ShowAndVerifyUi(); } // Host wants to show notifications. -IN_PROC_BROWSER_TEST_F(PermissionDialogTest, InvokeDialog_notifications) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(PermissionDialogTest, InvokeUi_notifications) { + ShowAndVerifyUi(); } // Host wants to use your microphone. -IN_PROC_BROWSER_TEST_F(PermissionDialogTest, InvokeDialog_mic) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(PermissionDialogTest, InvokeUi_mic) { + ShowAndVerifyUi(); } // Host wants to use your camera. -IN_PROC_BROWSER_TEST_F(PermissionDialogTest, InvokeDialog_camera) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(PermissionDialogTest, InvokeUi_camera) { + ShowAndVerifyUi(); } // Host wants to open email links. -IN_PROC_BROWSER_TEST_F(PermissionDialogTest, InvokeDialog_protocol_handlers) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(PermissionDialogTest, InvokeUi_protocol_handlers) { + ShowAndVerifyUi(); } // Host wants to use your MIDI devices. -IN_PROC_BROWSER_TEST_F(PermissionDialogTest, InvokeDialog_midi) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(PermissionDialogTest, InvokeUi_midi) { + ShowAndVerifyUi(); } // Shows a permissions bubble with multiple requests. -IN_PROC_BROWSER_TEST_F(PermissionDialogTest, InvokeDialog_multiple) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(PermissionDialogTest, InvokeUi_multiple) { + ShowAndVerifyUi(); } // CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER is ChromeOS only. #if defined(OS_CHROMEOS) -#define MAYBE_InvokeDialog_protected_media InvokeDialog_protected_media +#define MAYBE_InvokeUi_protected_media InvokeUi_protected_media #else -#define MAYBE_InvokeDialog_protected_media DISABLED_InvokeDialog_protected_media +#define MAYBE_InvokeUi_protected_media DISABLED_InvokeUi_protected_media #endif -IN_PROC_BROWSER_TEST_F(PermissionDialogTest, - MAYBE_InvokeDialog_protected_media) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(PermissionDialogTest, MAYBE_InvokeUi_protected_media) { + ShowAndVerifyUi(); } } // anonymous namespace
diff --git a/chrome/browser/resources/interventions_internals/index.css b/chrome/browser/resources/interventions_internals/index.css index b06a5b42..295eddc7 100644 --- a/chrome/browser/resources/interventions_internals/index.css +++ b/chrome/browser/resources/interventions_internals/index.css
@@ -60,6 +60,14 @@ float: right; } +#expand-log-button { + float: right; +} + +#collapse-log-button { + float: right; +} + .hidden-tab { display: none; padding: 12px;
diff --git a/chrome/browser/resources/interventions_internals/index.html b/chrome/browser/resources/interventions_internals/index.html index da429f2..91dbe087 100644 --- a/chrome/browser/resources/interventions_internals/index.html +++ b/chrome/browser/resources/interventions_internals/index.html
@@ -59,6 +59,8 @@ <input type="text" id="log-search-bar" placeholder="Search for something ..."> <button id="clear-log-button" type="button">Clear logs</button> + <button id="collapse-log-button" type="button">Collapse all</button> + <button id="expand-log-button" type="button">Expand all</button> <table id="message-logs-table"> <tr> <th class="log-time" id="time-table-header">Time</th>
diff --git a/chrome/browser/resources/interventions_internals/index.js b/chrome/browser/resources/interventions_internals/index.js index 7969b9e..9b3906779 100644 --- a/chrome/browser/resources/interventions_internals/index.js +++ b/chrome/browser/resources/interventions_internals/index.js
@@ -3,7 +3,6 @@ // found in the LICENSE file. /** The columns that are used to find rows that contain the keyword. */ -const KEY_COLUMNS = ['log-type', 'log-description', 'log-url']; const ENABLE_BLACKLIST_BUTTON = 'Enable Blacklist'; const IGNORE_BLACKLIST_BUTTON = 'Ignore Blacklist'; const IGNORE_BLACKLIST_MESSAGE = 'Blacklist decisions are ignored.'; @@ -12,6 +11,19 @@ window.logTableMap = {}; /** + * Helper method to pad number, used for time format. + * @param {number} value The original number. + * @param {number} length The desired number length. + */ +function getPaddedValue(value, length) { + let result = '' + value; + while (result.length < length) { + result = '0' + result; + } + return result; +} + +/** * Convert milliseconds to human readable date/time format. * The return format will be "MM/dd/YYYY hh:mm:ss.sss" * @param {number} time Time in millisecond since Unix Epoch. @@ -26,8 +38,11 @@ }; let dateString = date.toLocaleDateString('en-US', options); - return dateString + ' ' + date.getHours() + ':' + date.getMinutes() + ':' + - date.getSeconds() + '.' + date.getMilliseconds(); + let hour = getPaddedValue(date.getHours(), 2); + let min = getPaddedValue(date.getMinutes(), 2); + let sec = getPaddedValue(date.getSeconds(), 2); + let millisec = getPaddedValue(date.getMilliseconds(), 3); + return dateString + ' ' + hour + ':' + min + ':' + sec + '.' + millisec; } /** @@ -95,6 +110,32 @@ } /** + * Helper method to expand all logs in the message-logs-table. + */ +function expandAllLogs() { + let rows = $('message-logs-table').rows; + for (let i = 1; i < rows.length; i++) { + if (rows[i].className.includes('expansion-row')) { + rows[i].className = rows[i].className.replace('hide', 'show'); + rows[i - 1].querySelector('.arrow').className = 'arrow up'; + } + } +} + +/** + * Helper method to collapse all logs in the message-logs-table. + */ +function collapseAllLogs() { + let rows = $('message-logs-table').rows; + for (let i = 1; i < rows.length; i++) { + if (rows[i].className.includes('expansion-row')) { + rows[i].className = rows[i].className.replace('show', 'hide'); + rows[i - 1].querySelector('.arrow').className = 'arrow down'; + } + } +} + +/** * Update the |pageId| log message group. Copy the main row that contains the * most updated log message of the group to the expansion row, and update the * current main row with new info. @@ -270,22 +311,46 @@ $('log-search-bar').addEventListener('keyup', () => { let keyword = $('log-search-bar').value.toUpperCase(); let rows = $('message-logs-table').rows; + expandAllLogs(); for (let i = 1; i < rows.length; i++) { - let row = rows[i]; - let found = KEY_COLUMNS.some((column) => { - let cell = row.querySelector('.' + column); - if (!cell) { - return keyword == ''; + rows[i].style.display = + rows[i].textContent.toUpperCase().includes(keyword) ? '' : 'none'; + + let subtable = rows[i].querySelector('.expansion-logs-table'); + if (subtable) { + for (let i = 0; i < subtable.rows.length; i++) { + subtable.rows[i].style.display = + subtable.rows[i].textContent.toUpperCase().includes(keyword) ? + '' : + 'none'; } - return cell.textContent.toUpperCase().includes(keyword); - }); - row.style.display = found ? '' : 'none'; + } } }); } /** + * Initialize the button to expand all logs data, and collapse all logs. + */ +function setupExpandLogs() { + // Expand all button. + $('expand-log-button').addEventListener('click', () => { + expandAllLogs(); + $('collapse-log-button').style.display = ''; + $('expand-log-button').style.display = 'none'; + }); + + // Collapse all button. + $('collapse-log-button').style.display = 'none'; + $('collapse-log-button').addEventListener('click', () => { + collapseAllLogs(); + $('collapse-log-button').style.display = 'none'; + $('expand-log-button').style.display = ''; + }); +} + +/** * Create and add a copy to clipboard button to a given node. * * @param {string} text The text that will be copied to the clipboard. @@ -495,11 +560,6 @@ nqeCol.setAttribute('class', 'nqe-value-column'); nqeCol.textContent = type; nqeRow.appendChild(nqeCol); - - // Insert ECT changed message to message-logs-table. - insertMessageRowToMessageLogTable( - now, 'ECT Changed', 'Effective Connection Type changed to ' + type, - '' /* URL */, 0 /* pageId */); }, }; @@ -612,6 +672,7 @@ setupTabControl(); setupLogSearch(); setupLogClear(); + setupExpandLogs(); let pageHandler = null; let pageImpl = null;
diff --git a/chrome/browser/ui/ask_google_for_suggestions_dialog_browsertest.cc b/chrome/browser/ui/ask_google_for_suggestions_dialog_browsertest.cc index 6453113..22a9f839 100644 --- a/chrome/browser/ui/ask_google_for_suggestions_dialog_browsertest.cc +++ b/chrome/browser/ui/ask_google_for_suggestions_dialog_browsertest.cc
@@ -15,7 +15,7 @@ AskGoogleForSuggestionsDialogTest() {} // DialogBrowserTest: - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { std::unique_ptr<SpellingBubbleModel> model = base::MakeUnique<SpellingBubbleModel>( browser()->profile(), @@ -33,15 +33,13 @@ #if !defined(OS_MACOSX) // Initially disabled except on Mac due to http://crbug.com/683808. -#define MAYBE_InvokeDialog_default DISABLED_InvokeDialog_default +#define MAYBE_InvokeUi_default DISABLED_InvokeUi_default #else -#define MAYBE_InvokeDialog_default InvokeDialog_default +#define MAYBE_InvokeUi_default InvokeUi_default #endif -// Test that calls ShowDialog("default"). Interactive when run via -// browser_tests --gtest_filter=BrowserDialogTest.Invoke --interactive -// --dialog=AskGoogleForSuggestionsDialogTest.InvokeDialog_default +// Test that calls ShowUi("default"). IN_PROC_BROWSER_TEST_F(AskGoogleForSuggestionsDialogTest, - MAYBE_InvokeDialog_default) { - RunDialog(); + MAYBE_InvokeUi_default) { + ShowAndVerifyUi(); }
diff --git a/chrome/browser/ui/autofill/card_unmask_prompt_view_browsertest.cc b/chrome/browser/ui/autofill/card_unmask_prompt_view_browsertest.cc index bf2e23b..5b625a2 100644 --- a/chrome/browser/ui/autofill/card_unmask_prompt_view_browsertest.cc +++ b/chrome/browser/ui/autofill/card_unmask_prompt_view_browsertest.cc
@@ -145,7 +145,7 @@ delegate_.reset(new TestCardUnmaskDelegate()); } - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { CardUnmaskPromptView* dialog = CreateCardUnmaskPromptView(controller(), contents()); CreditCard card = test::GetMaskedServerCard(); @@ -183,38 +183,35 @@ DISALLOW_COPY_AND_ASSIGN(CardUnmaskPromptViewBrowserTest); }; -// Note: Although the following tests all just call RunDialog(), they execute -// different behavior based on the test name's suffix. See ShowDialog(). - -IN_PROC_BROWSER_TEST_F(CardUnmaskPromptViewBrowserTest, InvokeDialog_expired) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(CardUnmaskPromptViewBrowserTest, InvokeUi_expired) { + ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_F(CardUnmaskPromptViewBrowserTest, InvokeDialog_valid) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(CardUnmaskPromptViewBrowserTest, InvokeUi_valid) { + ShowAndVerifyUi(); } // This dialog will show a temporary error when Confirm is clicked. IN_PROC_BROWSER_TEST_F(CardUnmaskPromptViewBrowserTest, - InvokeDialog_valid_TemporaryError) { - RunDialog(); + InvokeUi_valid_TemporaryError) { + ShowAndVerifyUi(); } // This dialog will show a permanent error when Confirm is clicked. IN_PROC_BROWSER_TEST_F(CardUnmaskPromptViewBrowserTest, - InvokeDialog_valid_PermanentError) { - RunDialog(); + InvokeUi_valid_PermanentError) { + ShowAndVerifyUi(); } IN_PROC_BROWSER_TEST_F(CardUnmaskPromptViewBrowserTest, DisplayUI) { - ShowDialog(kExpiryExpired); + ShowUi(kExpiryExpired); } // Makes sure the user can close the dialog while the verification success // message is showing. IN_PROC_BROWSER_TEST_F(CardUnmaskPromptViewBrowserTest, EarlyCloseAfterSuccess) { - ShowDialog(kExpiryExpired); + ShowUi(kExpiryExpired); controller()->OnUnmaskResponse(base::ASCIIToUTF16("123"), base::ASCIIToUTF16("10"), base::ASCIIToUTF16("2020"), false); @@ -236,7 +233,7 @@ // https://crbug.com/484376 IN_PROC_BROWSER_TEST_F(CardUnmaskPromptViewBrowserTest, CloseTabWhileDialogShowing) { - ShowDialog(kExpiryExpired); + ShowUi(kExpiryExpired); // Simulate AutofillManager (the delegate in production code) being destroyed // before CardUnmaskPromptViewBridge::OnConstrainedWindowClosed() is called. FreeDelegate();
diff --git a/chrome/browser/ui/autofill/save_card_bubble_controller_impl_browsertest.cc b/chrome/browser/ui/autofill/save_card_bubble_controller_impl_browsertest.cc index 5898906..23dd38b 100644 --- a/chrome/browser/ui/autofill/save_card_bubble_controller_impl_browsertest.cc +++ b/chrome/browser/ui/autofill/save_card_bubble_controller_impl_browsertest.cc
@@ -37,7 +37,7 @@ } // DialogBrowserTest: - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { content::WebContents* web_contents = browser()->tab_strip_model()->GetActiveWebContents(); @@ -69,28 +69,26 @@ }; // Invokes a bubble asking the user if they want to save a credit card locally. -// See test_browser_dialog.h for instructions on how to run. -IN_PROC_BROWSER_TEST_F(SaveCardBubbleControllerImplTest, InvokeDialog_Local) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(SaveCardBubbleControllerImplTest, InvokeUi_Local) { + ShowAndVerifyUi(); } // Invokes a bubble asking the user if they want to save a credit card to the -// server. See test_browser_dialog.h for instructions on how to run. -IN_PROC_BROWSER_TEST_F(SaveCardBubbleControllerImplTest, InvokeDialog_Server) { - RunDialog(); +// server. +IN_PROC_BROWSER_TEST_F(SaveCardBubbleControllerImplTest, InvokeUi_Server) { + ShowAndVerifyUi(); } // Invokes a bubble asking the user if they want to save a credit card to the -// server, with an added CVC step. See test_browser_dialog.h for instructions on -// how to run. +// server, with an added CVC step. IN_PROC_BROWSER_TEST_F(SaveCardBubbleControllerImplTest, - InvokeDialog_Server_WithCvcStep) { - RunDialog(); + InvokeUi_Server_WithCvcStep) { + ShowAndVerifyUi(); } // Tests that opening a new tab will hide the save card bubble. IN_PROC_BROWSER_TEST_F(SaveCardBubbleControllerImplTest, NewTabHidesDialog) { - ShowDialog("Local"); + ShowUi("Local"); EXPECT_NE(nullptr, controller()->save_card_bubble_view()); // Open a new tab page in the foreground. ui_test_utils::NavigateToURLWithDisposition(
diff --git a/chrome/browser/ui/bluetooth/bluetooth_chooser_controller.cc b/chrome/browser/ui/bluetooth/bluetooth_chooser_controller.cc index ae8a004..7112521 100644 --- a/chrome/browser/ui/bluetooth/bluetooth_chooser_controller.cc +++ b/chrome/browser/ui/bluetooth/bluetooth_chooser_controller.cc
@@ -48,6 +48,10 @@ return true; } +bool BluetoothChooserController::ShouldShowReScanButton() const { + return true; +} + base::string16 BluetoothChooserController::GetNoOptionsText() const { return l10n_util::GetStringUTF16( IDS_BLUETOOTH_DEVICE_CHOOSER_NO_DEVICES_FOUND_PROMPT);
diff --git a/chrome/browser/ui/bluetooth/bluetooth_chooser_controller.h b/chrome/browser/ui/bluetooth/bluetooth_chooser_controller.h index a3daa026..9a0529e5 100644 --- a/chrome/browser/ui/bluetooth/bluetooth_chooser_controller.h +++ b/chrome/browser/ui/bluetooth/bluetooth_chooser_controller.h
@@ -29,6 +29,7 @@ // ChooserController: bool ShouldShowIconBeforeText() const override; + bool ShouldShowReScanButton() const override; base::string16 GetNoOptionsText() const override; base::string16 GetOkButtonLabel() const override; size_t NumOptions() const override;
diff --git a/chrome/browser/ui/cocoa/device_chooser_content_view_cocoa.mm b/chrome/browser/ui/cocoa/device_chooser_content_view_cocoa.mm index 19b2c60..4cdf22b 100644 --- a/chrome/browser/ui/cocoa/device_chooser_content_view_cocoa.mm +++ b/chrome/browser/ui/cocoa/device_chooser_content_view_cocoa.mm
@@ -449,7 +449,7 @@ // Help button. CGFloat helpButtonWidth = 0.0f; CGFloat helpButtonHeight = 0.0f; - if (chooserController_->ShouldShowFootnoteView()) { + if (chooserController_->ShouldShowHelpButton()) { helpButton_ = [self createHyperlinkButtonWithText: l10n_util::GetNSStringF( @@ -478,14 +478,14 @@ CGFloat scrollViewWidth = kChooserWidth - 2 * kMarginX; CGFloat scrollViewHeight = kChooserHeight - 2 * kMarginY - - (chooserController_->ShouldShowFootnoteView() ? 4 * kVerticalPadding - : 2 * kVerticalPadding) - + (chooserController_->ShouldShowHelpButton() ? 4 * kVerticalPadding + : 2 * kVerticalPadding) - titleHeight - cancelButtonHeight - helpButtonHeight; CGFloat scrollViewOriginX = kMarginX; CGFloat scrollViewOriginY = kMarginY + helpButtonHeight + - (chooserController_->ShouldShowFootnoteView() ? 3 * kVerticalPadding - : kVerticalPadding) + + (chooserController_->ShouldShowHelpButton() ? 3 * kVerticalPadding + : kVerticalPadding) + cancelButtonHeight; NSRect scrollFrame = NSMakeRect(scrollViewOriginX, scrollViewOriginY, scrollViewWidth, scrollViewHeight); @@ -564,8 +564,8 @@ connectButtonWidth; CGFloat cancelButtonOriginY = kMarginY + helpButtonHeight + - (chooserController_->ShouldShowFootnoteView() ? 2 * kVerticalPadding - : 0.0f); + (chooserController_->ShouldShowHelpButton() ? 2 * kVerticalPadding + : 0.0f); [cancelButton_ setFrameOrigin:NSMakePoint(cancelButtonOriginX, cancelButtonOriginY)]; [self addSubview:cancelButton_]; @@ -579,7 +579,7 @@ [connectButton_ setEnabled:NO]; [self addSubview:connectButton_]; - if (chooserController_->ShouldShowFootnoteView()) { + if (chooserController_->ShouldShowHelpButton()) { // Separator. CGFloat separatorOriginX = 0.0f; separatorOriginY_ = kMarginY + helpButtonHeight + kVerticalPadding;
diff --git a/chrome/browser/ui/collected_cookies_browsertest.cc b/chrome/browser/ui/collected_cookies_browsertest.cc index 2d79848..66e801f 100644 --- a/chrome/browser/ui/collected_cookies_browsertest.cc +++ b/chrome/browser/ui/collected_cookies_browsertest.cc
@@ -24,7 +24,7 @@ CollectedCookiesTest() {} // DialogBrowserTest: - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { ASSERT_TRUE(embedded_test_server()->Start()); // Disable cookies. @@ -62,16 +62,14 @@ DISALLOW_COPY_AND_ASSIGN(CollectedCookiesTestMd); }; -// Test that calls ShowDialog("default"). Interactive when run via -// browser_tests --gtest_filter=BrowserDialogTest.Invoke --interactive -// --dialog=CollectedCookiesTestMd.InvokeDialog_default -IN_PROC_BROWSER_TEST_F(CollectedCookiesTestMd, InvokeDialog_default) { - RunDialog(); +// Test that calls ShowUi("default"). +IN_PROC_BROWSER_TEST_F(CollectedCookiesTestMd, InvokeUi_default) { + ShowAndVerifyUi(); } // If this crashes on Windows, use http://crbug.com/79331 IN_PROC_BROWSER_TEST_F(CollectedCookiesTest, DoubleDisplay) { - ShowDialog(std::string()); + ShowUi(std::string()); // Click on the info link a second time. content::WebContents* web_contents = @@ -81,7 +79,7 @@ // If this crashes on Windows, use http://crbug.com/79331 IN_PROC_BROWSER_TEST_F(CollectedCookiesTest, NavigateAway) { - ShowDialog(std::string()); + ShowUi(std::string()); // Navigate to another page. ui_test_utils::NavigateToURL(
diff --git a/chrome/browser/ui/extensions/extension_installed_bubble_browsertest.cc b/chrome/browser/ui/extensions/extension_installed_bubble_browsertest.cc index 64e5f3c..43a49c21 100644 --- a/chrome/browser/ui/extensions/extension_installed_bubble_browsertest.cc +++ b/chrome/browser/ui/extensions/extension_installed_bubble_browsertest.cc
@@ -37,7 +37,7 @@ std::unique_ptr<base::DictionaryValue> extra_keys = nullptr); // DialogBrowserTest: - void ShowDialog(const std::string& name) override; + void ShowUi(const std::string& name) override; BubbleController* GetExtensionBubbleControllerFromManager( BubbleManager* manager) const { @@ -81,7 +81,7 @@ return bubble; } -void ExtensionInstalledBubbleBrowserTest::ShowDialog(const std::string& name) { +void ExtensionInstalledBubbleBrowserTest::ShowUi(const std::string& name) { // Default to Manifest::COMPONENT to test all anchoring locations. Without // this, a page action is added automatically, which will always be the // preferred anchor. @@ -107,38 +107,36 @@ } IN_PROC_BROWSER_TEST_F(ExtensionInstalledBubbleBrowserTest, - InvokeDialog_BrowserAction) { - RunDialog(); + InvokeUi_BrowserAction) { + ShowAndVerifyUi(); } IN_PROC_BROWSER_TEST_F(ExtensionInstalledBubbleBrowserTest, - InvokeDialog_PageAction) { - RunDialog(); + InvokeUi_PageAction) { + ShowAndVerifyUi(); } // Test anchoring to the app menu. IN_PROC_BROWSER_TEST_F(ExtensionInstalledBubbleBrowserTest, - InvokeDialog_InstalledByDefault) { - RunDialog(); + InvokeUi_InstalledByDefault) { + ShowAndVerifyUi(); } // Test anchoring to the omnibox. -IN_PROC_BROWSER_TEST_F(ExtensionInstalledBubbleBrowserTest, - InvokeDialog_Omnibox) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(ExtensionInstalledBubbleBrowserTest, InvokeUi_Omnibox) { + ShowAndVerifyUi(); } IN_PROC_BROWSER_TEST_F(ExtensionInstalledBubbleBrowserTest, - InvokeDialog_SignInPromo) { - RunDialog(); + InvokeUi_SignInPromo) { + ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_F(ExtensionInstalledBubbleBrowserTest, - InvokeDialog_NoAction) { +IN_PROC_BROWSER_TEST_F(ExtensionInstalledBubbleBrowserTest, InvokeUi_NoAction) { // Sign in to supppress the signin promo. SigninManagerFactory::GetForProfile(browser()->profile()) ->SetAuthenticatedAccountInfo("test", "test@example.com"); - RunDialog(); + ShowAndVerifyUi(); } IN_PROC_BROWSER_TEST_F(ExtensionInstalledBubbleBrowserTest,
diff --git a/chrome/browser/ui/global_error/global_error_browsertest.cc b/chrome/browser/ui/global_error/global_error_browsertest.cc index d62c355..9cdc39c4 100644 --- a/chrome/browser/ui/global_error/global_error_browsertest.cc +++ b/chrome/browser/ui/global_error/global_error_browsertest.cc
@@ -76,13 +76,13 @@ } // DialogBrowserTest: - void ShowDialog(const std::string& name) override; + void ShowUi(const std::string& name) override; private: DISALLOW_COPY_AND_ASSIGN(GlobalErrorBubbleTest); }; -void GlobalErrorBubbleTest::ShowDialog(const std::string& name) { +void GlobalErrorBubbleTest::ShowUi(const std::string& name) { content::WindowedNotificationObserver global_errors_updated( chrome::NOTIFICATION_GLOBAL_ERRORS_CHANGED, base::Bind([](const content::NotificationSource& source, @@ -177,41 +177,41 @@ } IN_PROC_BROWSER_TEST_F(GlobalErrorBubbleTest, - InvokeDialog_ExtensionDisabledGlobalError) { - RunDialog(); + InvokeUi_ExtensionDisabledGlobalError) { + ShowAndVerifyUi(); } IN_PROC_BROWSER_TEST_F(GlobalErrorBubbleTest, - InvokeDialog_ExtensionDisabledGlobalErrorRemote) { - RunDialog(); + InvokeUi_ExtensionDisabledGlobalErrorRemote) { + ShowAndVerifyUi(); } // This shows a non-persistent dialog during a RunLoop::RunUntilIdle(), so it's // not possible to guarantee that events to dismiss the dialog are not processed // as well. Disable by default to prevent flakiness in browser_tests. IN_PROC_BROWSER_TEST_F(GlobalErrorBubbleTest, - DISABLED_InvokeDialog_ExtensionGlobalError) { - RunDialog(); + DISABLED_InvokeUi_ExtensionGlobalError) { + ShowAndVerifyUi(); } IN_PROC_BROWSER_TEST_F(GlobalErrorBubbleTest, - InvokeDialog_ExternalInstallBubbleAlert) { + InvokeUi_ExternalInstallBubbleAlert) { extensions::FeatureSwitch::ScopedOverride prompt( extensions::FeatureSwitch::prompt_for_external_extensions(), true); - RunDialog(); + ShowAndVerifyUi(); } // RecoveryInstallGlobalError only exists on Windows and Mac. #if defined(OS_WIN) || defined(OS_MACOSX) IN_PROC_BROWSER_TEST_F(GlobalErrorBubbleTest, - InvokeDialog_RecoveryInstallGlobalError) { - RunDialog(); + InvokeUi_RecoveryInstallGlobalError) { + ShowAndVerifyUi(); } #endif // Signin global errors never happon on ChromeOS. #if !defined(OS_CHROMEOS) -IN_PROC_BROWSER_TEST_F(GlobalErrorBubbleTest, InvokeDialog_SigninGlobalError) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(GlobalErrorBubbleTest, InvokeUi_SigninGlobalError) { + ShowAndVerifyUi(); } #endif
diff --git a/chrome/browser/ui/test/browser_dialog_browsertest.cc b/chrome/browser/ui/test/browser_ui_browsertest.cc similarity index 67% rename from chrome/browser/ui/test/browser_dialog_browsertest.cc rename to chrome/browser/ui/test/browser_ui_browsertest.cc index d3d7759..9aa2130 100644 --- a/chrome/browser/ui/test/browser_dialog_browsertest.cc +++ b/chrome/browser/ui/test/browser_ui_browsertest.cc
@@ -7,51 +7,51 @@ #include "base/test/launcher/test_launcher.h" #include "base/test/test_switches.h" #include "base/test/test_timeouts.h" -#include "chrome/browser/ui/test/test_browser_dialog.h" +#include "build/build_config.h" +#include "chrome/browser/ui/test/test_browser_ui.h" #include "content/public/common/content_switches.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/compositor/compositor_switches.h" namespace { -// Switch for BrowserDialogTest.Invoke to spawn a subprocess testing the -// provided argument under a consistent setup. -constexpr const char kDialogSwitch[] = "dialog"; +// Switch for BrowserUiTest.Invoke to spawn a subprocess testing the provided +// argument under a consistent setup. +constexpr const char kUiSwitch[] = "ui"; -// Pattern to search in test names that indicate support for dialog testing. -constexpr const char kDialogPattern[] = "InvokeDialog_"; +// Pattern to search in test names that indicate support for UI testing. +constexpr const char kUiPattern[] = "InvokeUi_"; } // namespace -// Adds a browser_test entry point into the dialog testing framework. Without a -// --dialog specified, just lists the available dialogs and exits. -TEST(BrowserDialogTest, Invoke) { +// Adds a browser_test entry point into the UI testing framework. Without a +// --ui specified, just lists the available UIs and exits. +TEST(BrowserUiTest, Invoke) { const base::CommandLine& invoker = *base::CommandLine::ForCurrentProcess(); - const std::string dialog_name = invoker.GetSwitchValueASCII(kDialogSwitch); + const std::string ui_name = invoker.GetSwitchValueASCII(kUiSwitch); - std::set<std::string> dialog_cases; + std::set<std::string> ui_cases; const testing::UnitTest* unit_test = testing::UnitTest::GetInstance(); for (int i = 0; i < unit_test->total_test_case_count(); ++i) { const testing::TestCase* test_case = unit_test->GetTestCase(i); for (int j = 0; j < test_case->total_test_count(); ++j) { const char* name = test_case->GetTestInfo(j)->name(); - if (strstr(name, kDialogPattern)) - dialog_cases.insert(test_case->name() + std::string(".") + name); + if (strstr(name, kUiPattern)) + ui_cases.insert(test_case->name() + std::string(".") + name); } } - if (dialog_name.empty()) { + if (ui_name.empty()) { std::string case_list; - for (const std::string& name : dialog_cases) + for (const std::string& name : ui_cases) case_list += "\t" + name + "\n"; - VLOG(0) << "\nPass one of the following after --" << kDialogSwitch << "=\n" + VLOG(0) << "\nPass one of the following after --" << kUiSwitch << "=\n" << case_list; return; } - auto it = dialog_cases.find(dialog_name); - ASSERT_NE(it, dialog_cases.end()) << "Dialog '" << dialog_name - << "' not found."; + auto it = ui_cases.find(ui_name); + ASSERT_NE(it, ui_cases.end()) << "UI '" << ui_name << "' not found."; // Don't create test output for the subprocess (the paths will conflict). base::CommandLine::StringVector argv = invoker.argv(); @@ -63,8 +63,8 @@ }); base::CommandLine command(argv); - // Replace TestBrowserDialog.Invoke with |dialog_name|. - command.AppendSwitchASCII(base::kGTestFilterFlag, dialog_name); + // Replace TestBrowserUi.Invoke with |ui_name|. + command.AppendSwitchASCII(base::kGTestFilterFlag, ui_name); base::LaunchOptions options;
diff --git a/chrome/browser/ui/test/test_browser_dialog.cc b/chrome/browser/ui/test/test_browser_dialog.cc index d6af0f39..95ede0a 100644 --- a/chrome/browser/ui/test/test_browser_dialog.cc +++ b/chrome/browser/ui/test/test_browser_dialog.cc
@@ -4,19 +4,12 @@ #include "chrome/browser/ui/test/test_browser_dialog.h" -#include "base/command_line.h" +#include "base/logging.h" #include "base/run_loop.h" #include "base/stl_util.h" -#include "base/test/gtest_util.h" -#include "base/test/scoped_feature_list.h" #include "base/threading/thread_task_runner_handle.h" #include "build/build_config.h" -#include "chrome/browser/platform_util.h" -#include "chrome/common/chrome_features.h" -#include "ui/base/ui_base_features.h" -#include "ui/views/test/widget_test.h" -#include "ui/views/widget/widget.h" -#include "ui/views/widget/widget_observer.h" +#include "testing/gtest/include/gtest/gtest.h" #if defined(OS_CHROMEOS) #include "ash/public/cpp/config.h" @@ -28,121 +21,102 @@ #include "chrome/browser/ui/test/test_browser_dialog_mac.h" #endif +#if defined(TOOLKIT_VIEWS) +#include "ui/views/test/widget_test.h" +#include "ui/views/widget/widget_observer.h" +#endif + namespace { -// An automatic action for WidgetCloser to post to the RunLoop. -// TODO(tapted): Explore asynchronous Widget::Close() and DialogClientView:: -// {Accept,Cancel}Window() approaches to test other dialog lifetimes. -enum class DialogAction { - INTERACTIVE, // Run interactively. - CLOSE_NOW, // Call Widget::CloseNow(). - CLOSE, // Call Widget::Close(). -}; - -// Helper to break out of the nested run loop that runs a test dialog. -class WidgetCloser : public views::WidgetObserver { +#if defined(TOOLKIT_VIEWS) +// Helper to return when a Widget has been closed. +// TODO(pkasting): This is pretty similar to views::test::WidgetClosingObserver +// in ui/views/test/widget_test.h but keys off widget destruction rather than +// closing. Can the two be combined? +class WidgetCloseObserver : public views::WidgetObserver { public: - WidgetCloser(views::Widget* widget, DialogAction action) - : action_(action), widget_(widget), weak_ptr_factory_(this) { + explicit WidgetCloseObserver(views::Widget* widget) : widget_(widget) { widget->AddObserver(this); - if (action == DialogAction::INTERACTIVE) - return; - - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::BindOnce(&WidgetCloser::CloseAction, - weak_ptr_factory_.GetWeakPtr())); } - // WidgetObserver: + // views::WidgetObserver: void OnWidgetDestroyed(views::Widget* widget) override { widget_->RemoveObserver(this); widget_ = nullptr; run_loop_.Quit(); } - void Wait() { run_loop_.Run(); } + void WaitForDestroy() { run_loop_.Run(); } + + protected: + views::Widget* widget() { return widget_; } private: - void CloseAction() { - if (!widget_) - return; + views::Widget* widget_; + base::RunLoop run_loop_; - switch (action_) { - case DialogAction::CLOSE_NOW: - widget_->CloseNow(); - break; - case DialogAction::CLOSE: - widget_->Close(); - break; - case DialogAction::INTERACTIVE: - NOTREACHED(); - break; - } + DISALLOW_COPY_AND_ASSIGN(WidgetCloseObserver); +}; + +// Helper to close a Widget. Inherits from WidgetCloseObserver since regardless +// of whether the close is done synchronously, we always want callers to wait +// for it to complete. +class WidgetCloser : public WidgetCloseObserver { + public: + WidgetCloser(views::Widget* widget, bool async) + : WidgetCloseObserver(widget) { + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(&WidgetCloser::CloseWidget, + weak_ptr_factory_.GetWeakPtr(), async)); } - base::RunLoop run_loop_; - const DialogAction action_; - views::Widget* widget_; + private: + void CloseWidget(bool async) { + if (!widget()) + return; - base::WeakPtrFactory<WidgetCloser> weak_ptr_factory_; + if (async) + widget()->Close(); + else + widget()->CloseNow(); + } + + base::WeakPtrFactory<WidgetCloser> weak_ptr_factory_{this}; DISALLOW_COPY_AND_ASSIGN(WidgetCloser); }; - -// Extracts the |name| argument for ShowDialog() from the current test case. -// E.g. for InvokeDialog_name (or DISABLED_InvokeDialog_name) returns "name". -std::string NameFromTestCase() { - const std::string name = base::TestNameWithoutDisabledPrefix( - testing::UnitTest::GetInstance()->current_test_info()->name()); - std::string::size_type underscore = name.find('_'); - return underscore == std::string::npos ? std::string() - : name.substr(underscore + 1); -} +#endif // defined(TOOLKIT_VIEWS) } // namespace -TestBrowserDialog::TestBrowserDialog() {} +TestBrowserDialog::TestBrowserDialog() = default; +TestBrowserDialog::~TestBrowserDialog() = default; -void TestBrowserDialog::RunDialog() { +void TestBrowserDialog::PreShow() { +// The rest of this class assumes the child dialog is toolkit-views. So, for +// Mac, it will only work when MD for secondary UI is enabled. Without this, a +// Cocoa dialog will be created, which TestBrowserDialog doesn't support. +// Force kSecondaryUiMd on Mac to get coverage on the bots. Leave it optional +// elsewhere so that the non-MD dialog can be invoked to compare. #if defined(OS_MACOSX) - // The rest of this method assumes the child dialog is toolkit-views. So, for - // Mac, it will only work when MD for secondary UI is enabled. Without this, a - // Cocoa dialog will be created, which TestBrowserDialog doesn't support. - // Force kSecondaryUiMd on Mac to get coverage on the bots. Leave it optional - // elsewhere so that the non-MD dialog can be invoked to compare. Note that - // since SetUp() has already been called, some parts of the toolkit may - // already be initialized without MD - this is just to ensure Cocoa dialogs - // are not selected. - base::test::ScopedFeatureList enable_views_on_mac_always; - enable_views_on_mac_always.InitWithFeatures( - {features::kSecondaryUiMd, features::kShowAllDialogsWithViewsToolkit}, - {}); + // Note that since SetUp() has already been called, some parts of the toolkit + // may already be initialized without MD - this is just to ensure Cocoa + // dialogs are not selected. + UseMdOnly(); #endif - views::Widget::Widgets widgets_before = - views::test::WidgetTest::GetAllWidgets(); -#if defined(OS_CHROMEOS) - // GetAllWidgets() uses AuraTestHelper to find the aura root window, but - // that's not used on browser_tests, so ask ash. Under mash the MusClient - // provides the list of root windows, so this isn't needed. - if (chromeos::GetAshConfig() != ash::Config::MASH) { - views::Widget::GetAllChildWidgets(ash::Shell::GetPrimaryRootWindow(), - &widgets_before); - } -#endif // OS_CHROMEOS + UpdateWidgets(); +} - ShowDialog(NameFromTestCase()); - views::Widget::Widgets widgets_after = - views::test::WidgetTest::GetAllWidgets(); -#if defined(OS_CHROMEOS) - if (chromeos::GetAshConfig() != ash::Config::MASH) { - views::Widget::GetAllChildWidgets(ash::Shell::GetPrimaryRootWindow(), - &widgets_after); - } -#endif // OS_CHROMEOS +// This can return false if no dialog was shown, if the dialog shown wasn't a +// toolkit-views dialog, or if more than one child dialog was shown. +bool TestBrowserDialog::VerifyUi() { +#if defined(TOOLKIT_VIEWS) + views::Widget::Widgets widgets_before = widgets_; + UpdateWidgets(); - auto added = base::STLSetDifference<std::vector<views::Widget*>>( - widgets_after, widgets_before); + auto added = + base::STLSetDifference<views::Widget::Widgets>(widgets_, widgets_before); if (added.size() > 1) { // Some tests create a standalone window to anchor a dialog. In those cases, @@ -151,38 +125,57 @@ return !widget->widget_delegate()->AsDialogDelegate(); }); } + widgets_ = added; - // This can fail if no dialog was shown, if the dialog shown wasn't a toolkit- - // views dialog, or if more than one child dialog was shown. - ASSERT_EQ(1u, added.size()); + return added.size() == 1; +#else + NOTIMPLEMENTED(); + return false; +#endif +} - DialogAction action = DialogAction::CLOSE_NOW; - if (base::CommandLine::ForCurrentProcess()->HasSwitch( - internal::kInteractiveSwitch)) { - action = DialogAction::INTERACTIVE; - } else if (AlwaysCloseAsynchronously()) { - // TODO(tapted): Iterate over close methods when non-interactive for greater - // test coverage. - action = DialogAction::CLOSE; - } - - WidgetCloser closer(added[0], action); +void TestBrowserDialog::WaitForUserDismissal() { #if defined(OS_MACOSX) internal::TestBrowserDialogInteractiveSetUp(); #endif - closer.Wait(); + +#if defined(TOOLKIT_VIEWS) + ASSERT_FALSE(widgets_.empty()); + WidgetCloseObserver observer(*widgets_.begin()); + observer.WaitForDestroy(); +#else + NOTIMPLEMENTED(); +#endif } -void TestBrowserDialog::UseMdOnly() { -#if defined(OS_MACOSX) - maybe_enable_md_.InitWithFeatures( - {features::kSecondaryUiMd, features::kShowAllDialogsWithViewsToolkit}, - {}); +void TestBrowserDialog::DismissUi() { +#if defined(TOOLKIT_VIEWS) + ASSERT_FALSE(widgets_.empty()); + WidgetCloser closer(*widgets_.begin(), AlwaysCloseAsynchronously()); + closer.WaitForDestroy(); #else - maybe_enable_md_.InitWithFeatures({features::kSecondaryUiMd}, {}); + NOTIMPLEMENTED(); #endif } bool TestBrowserDialog::AlwaysCloseAsynchronously() { + // TODO(tapted): Iterate over close methods for greater test coverage. return false; } + +void TestBrowserDialog::UpdateWidgets() { +#if defined(TOOLKIT_VIEWS) + widgets_ = views::test::WidgetTest::GetAllWidgets(); +#if defined(OS_CHROMEOS) + // GetAllWidgets() uses AuraTestHelper to find the aura root window, but + // that's not used on browser_tests, so ask ash. Under mash the MusClient + // provides the list of root windows, so this isn't needed. + if (chromeos::GetAshConfig() != ash::Config::MASH) { + views::Widget::GetAllChildWidgets(ash::Shell::GetPrimaryRootWindow(), + &widgets_); + } +#endif // OS_CHROMEOS +#else + NOTIMPLEMENTED(); +#endif +}
diff --git a/chrome/browser/ui/test/test_browser_dialog.h b/chrome/browser/ui/test/test_browser_dialog.h index 459b157c..6c7445d2 100644 --- a/chrome/browser/ui/test/test_browser_dialog.h +++ b/chrome/browser/ui/test/test_browser_dialog.h
@@ -5,72 +5,28 @@ #ifndef CHROME_BROWSER_UI_TEST_TEST_BROWSER_DIALOG_H_ #define CHROME_BROWSER_UI_TEST_TEST_BROWSER_DIALOG_H_ -#include <string> -#include <utility> -#include <vector> - #include "base/macros.h" -#include "base/test/scoped_feature_list.h" +#include "chrome/browser/ui/test/test_browser_ui.h" #include "chrome/test/base/in_process_browser_test.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "ui/gfx/native_widget_types.h" -// TestBrowserDialog provides a way to register an InProcessBrowserTest testing -// harness with a framework that invokes Chrome browser dialogs in a consistent -// way. It optionally provides a way to invoke dialogs "interactively". This -// allows screenshots to be generated easily, with the same test data, to assist -// with UI review. It also provides a registry of dialogs so they can be -// systematically checked for subtle changes and regressions. -// -// To use TestBrowserDialog, a test harness should inherit from -// DialogBrowserTest rather than InProcessBrowserTest. If the dialog under test -// has only a single mode of operation, the only other requirement on the test -// harness is an override: -// -// class FooDialogTest : public DialogBrowserTest { -// public: -// .. -// // DialogBrowserTest: -// void ShowDialog(const std::string& name) override { -// /* Show dialog attached to browser() and leave it open. */ -// } -// .. -// }; -// -// then in the foo_dialog_browsertest.cc, define any number of -// -// IN_PROC_BROWSER_TEST_F(FooDialogTest, InvokeDialog_name) { -// RunDialog(); -// } -// -// The string after "InvokeDialog_" (here, "name") is the argument given to -// ShowDialog(). In a regular test suite run, RunDialog() shows the dialog and -// immediately closes it (after ensuring it was actually created). -// -// To get a list of all available dialogs, run the `BrowserDialogTest.Invoke` -// test case without other arguments. I.e. -// -// browser_tests --gtest_filter=BrowserDialogTest.Invoke -// -// Dialogs listed can be shown interactively using the --dialog argument. E.g. -// -// browser_tests --gtest_filter=BrowserDialogTest.Invoke --interactive -// --dialog=FooDialogTest.InvokeDialog_name -class TestBrowserDialog { +#if defined(TOOLKIT_VIEWS) +#include "ui/views/widget/widget.h" +#endif + +// A dialog-specific subclass of TestBrowserUi, which will verify that a test +// showed a single dialog. +class TestBrowserDialog : public TestBrowserUi { protected: TestBrowserDialog(); + ~TestBrowserDialog() override; - // Runs the dialog whose name corresponds to the current test case. - void RunDialog(); + // TestBrowserUi: + void PreShow() override; + bool VerifyUi() override; + void WaitForUserDismissal() override; + void DismissUi() override; - // Convenience method to force-enable features::kSecondaryUiMd for this test - // on all platforms. This should be called in an override of SetUp(). - void UseMdOnly(); - - // Show the dialog corresponding to |name| and leave it open. - virtual void ShowDialog(const std::string& name) = 0; - - // Whether to always close asynchronously using Widget::Close(). This covers + // Whether to close asynchronously using Widget::Close(). This covers // codepaths relying on DialogDelegate::Close(), which isn't invoked by // Widget::CloseNow(). Dialogs should support both, since the OS can initiate // the destruction of dialogs, e.g., during logoff which bypass @@ -78,31 +34,20 @@ virtual bool AlwaysCloseAsynchronously(); private: - base::test::ScopedFeatureList maybe_enable_md_; +#if defined(TOOLKIT_VIEWS) + // Stores the current widgets in |widgets_|. + void UpdateWidgets(); + + // The widgets present before/after showing UI. + views::Widget::Widgets widgets_; +#endif // defined(TOOLKIT_VIEWS) DISALLOW_COPY_AND_ASSIGN(TestBrowserDialog); }; -// Helper to mix in a TestBrowserDialog to an existing test harness. |Base| -// must be a descendant of InProcessBrowserTest. template <class Base> -class SupportsTestDialog : public Base, public TestBrowserDialog { - protected: - template <class... Args> - explicit SupportsTestDialog(Args&&... args) - : Base(std::forward<Args>(args)...) {} - - private: - DISALLOW_COPY_AND_ASSIGN(SupportsTestDialog); -}; +using SupportsTestDialog = SupportsTestUi<Base, TestBrowserDialog>; using DialogBrowserTest = SupportsTestDialog<InProcessBrowserTest>; -namespace internal { - -// When present on the command line, runs the test in an interactive mode. -constexpr const char kInteractiveSwitch[] = "interactive"; - -} // namespace internal - #endif // CHROME_BROWSER_UI_TEST_TEST_BROWSER_DIALOG_H_
diff --git a/chrome/browser/ui/test/test_browser_dialog_mac.h b/chrome/browser/ui/test/test_browser_dialog_mac.h index eb817b8..c82595ad 100644 --- a/chrome/browser/ui/test/test_browser_dialog_mac.h +++ b/chrome/browser/ui/test/test_browser_dialog_mac.h
@@ -7,7 +7,11 @@ namespace internal { -// Platform dependent fixture for TestBrowserDialog. +// Platform dependent fixture for TestBrowserDialog. browser_tests is not built +// as an .app bundle, so windows from it cannot normally be activated. But for +// interactive tests, dialogs need to be activated. This hacks the process type +// so that they can be, and activates the application in case something already +// tried (but failed) to activate it before this. void TestBrowserDialogInteractiveSetUp(); } // namespace internal
diff --git a/chrome/browser/ui/test/test_browser_ui.cc b/chrome/browser/ui/test/test_browser_ui.cc new file mode 100644 index 0000000..9d8cef0 --- /dev/null +++ b/chrome/browser/ui/test/test_browser_ui.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/ui/test/test_browser_ui.h" + +#include "base/command_line.h" +#include "base/test/gtest_util.h" +#include "base/test/scoped_feature_list.h" +#include "build/build_config.h" +#include "chrome/common/chrome_features.h" +#include "ui/base/ui_base_features.h" + +namespace { + +// Extracts the |name| argument for ShowUi() from the current test case name. +// E.g. for InvokeUi_name (or DISABLED_InvokeUi_name) returns "name". +std::string NameFromTestCase() { + const std::string name = base::TestNameWithoutDisabledPrefix( + testing::UnitTest::GetInstance()->current_test_info()->name()); + size_t underscore = name.find('_'); + return underscore == std::string::npos ? std::string() + : name.substr(underscore + 1); +} + +} // namespace + +TestBrowserUi::TestBrowserUi() = default; +TestBrowserUi::~TestBrowserUi() = default; + +void TestBrowserUi::ShowAndVerifyUi() { + PreShow(); + ShowUi(NameFromTestCase()); + ASSERT_TRUE(VerifyUi()); + if (base::CommandLine::ForCurrentProcess()->HasSwitch( + internal::kInteractiveSwitch)) + WaitForUserDismissal(); + else + DismissUi(); +} + +void TestBrowserUi::UseMdOnly() { + if (enable_md_) + return; + + enable_md_ = std::make_unique<base::test::ScopedFeatureList>(); + enable_md_->InitWithFeatures( +#if defined(OS_MACOSX) + {features::kSecondaryUiMd, features::kShowAllDialogsWithViewsToolkit}, +#else + {features::kSecondaryUiMd}, +#endif + {}); +}
diff --git a/chrome/browser/ui/test/test_browser_ui.h b/chrome/browser/ui/test/test_browser_ui.h new file mode 100644 index 0000000..57d1f9fb --- /dev/null +++ b/chrome/browser/ui/test/test_browser_ui.h
@@ -0,0 +1,136 @@ +// 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_UI_TEST_TEST_BROWSER_UI_H_ +#define CHROME_BROWSER_UI_TEST_TEST_BROWSER_UI_H_ + +#include <memory> +#include <string> + +#include "base/macros.h" +#include "chrome/test/base/in_process_browser_test.h" + +namespace base { +namespace test { +class ScopedFeatureList; +} // namespace test +} // namespace base + +// TestBrowserUi provides a way to register an InProcessBrowserTest testing +// harness with a framework that invokes Chrome browser UI in a consistent way. +// It optionally provides a way to invoke UI "interactively". This allows +// screenshots to be generated easily, with the same test data, to assist with +// UI review. It also provides a UI registry so pieces of UI can be +// systematically checked for subtle changes and regressions. +// +// To use TestBrowserUi, a test harness should inherit from UiBrowserTest rather +// than InProcessBrowserTest, then provide some overrides: +// +// class FooUiTest : public UiBrowserTest { +// public: +// .. +// // UiBrowserTest: +// void ShowUi(const std::string& name) override { +// /* Show Ui attached to browser() and leave it open. */ +// } +// +// bool VerifyUi() override { +// /* Return true if the UI was successfully shown. */ +// } +// +// void WaitForUserDismissal() override { +// /* Block until the user closes the UI. */ +// } +// .. +// }; +// +// Further overrides are available for tests which need to do work before +// showing any UI or when closing in non-interactive mode. For tests whose UI +// is a dialog, there's also the TestBrowserDialog class, which provides all but +// ShowUi() already; see test_browser_dialog.h. +// +// The test may then define any number of cases for individual pieces of UI: +// +// IN_PROC_BROWSER_TEST_F(FooUiTest, InvokeUi_name) { +// // Perform optional setup here; then: +// ShowAndVerifyUi(); +// } +// +// The string after "InvokeUi_" (here, "name") is the argument given to +// ShowUi(). In a regular test suite run, ShowAndVerifyUi() shows the UI and +// immediately closes it (after ensuring it was actually created). +// +// To get a list of all available UI, run the "BrowserUiTest.Invoke" test case +// without other arguments, i.e.: +// +// browser_tests --gtest_filter=BrowserUiTest.Invoke +// +// UI listed can be shown interactively using the --ui argument. E.g. +// +// browser_tests --gtest_filter=BrowserUiTest.Invoke --interactive +// --ui=FooUiTest.InvokeUi_name +class TestBrowserUi { + protected: + TestBrowserUi(); + virtual ~TestBrowserUi(); + + // Called by ShowAndVerifyUi() before ShowUi(), to provide a place to do any + // setup needed in order to successfully verify the UI post-show. + virtual void PreShow() {} + + // Should be implemented in individual tests to show UI with the given |name| + // (which will be supplied by the test case). + virtual void ShowUi(const std::string& name) = 0; + + // Called by ShowAndVerifyUi() after ShowUi(). Returns whether the UI was + // successfully shown. + virtual bool VerifyUi() = 0; + + // Called by ShowAndVerifyUi() after VerifyUi(), in the case where the test is + // interactive. This should block until the UI has been dismissed. + virtual void WaitForUserDismissal() = 0; + + // Called by ShowAndVerifyUi() after VerifyUi(), in the case where the test is + // non-interactive. This should do anything necessary to close the UI before + // browser shutdown. + virtual void DismissUi() {} + + // Shows the UI whose name corresponds to the current test case, and verifies + // it was successfully shown. Most test cases can simply invoke this directly + // with no other code. + void ShowAndVerifyUi(); + + // Convenience method to force-enable features::kSecondaryUiMd for this test + // on all platforms. This should be called in an override of SetUp(). + void UseMdOnly(); + + private: + // If non-null, forces secondary UI to MD. + std::unique_ptr<base::test::ScopedFeatureList> enable_md_; + + DISALLOW_COPY_AND_ASSIGN(TestBrowserUi); +}; + +// Helper to mix in a TestBrowserUi to an existing test harness. |Base| must be +// a descendant of InProcessBrowserTest. +template <class Base, class TestUi> +class SupportsTestUi : public Base, public TestUi { + protected: + template <class... Args> + explicit SupportsTestUi(Args&&... args) : Base(std::forward<Args>(args)...) {} + + private: + DISALLOW_COPY_AND_ASSIGN(SupportsTestUi); +}; + +using UiBrowserTest = SupportsTestUi<InProcessBrowserTest, TestBrowserUi>; + +namespace internal { + +// When present on the command line, runs the test in an interactive mode. +constexpr const char kInteractiveSwitch[] = "interactive"; + +} // namespace internal + +#endif // CHROME_BROWSER_UI_TEST_TEST_BROWSER_UI_H_
diff --git a/chrome/browser/ui/update_chrome_dialog_browsertest.cc b/chrome/browser/ui/update_chrome_dialog_browsertest.cc index fb2bec3..29db4592 100644 --- a/chrome/browser/ui/update_chrome_dialog_browsertest.cc +++ b/chrome/browser/ui/update_chrome_dialog_browsertest.cc
@@ -16,7 +16,7 @@ DialogBrowserTest::SetUp(); } - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { InProcessBrowserTest::browser()->window()->ShowUpdateChromeDialog(); } @@ -24,9 +24,7 @@ DISALLOW_COPY_AND_ASSIGN(UpdateRecommendedDialogTest); }; -// Test that calls ShowDialog("default"). Interactive when run via -// browser_tests --gtest_filter=BrowserDialogTest.Invoke --interactive -// --dialog=UpdateRecommendedDialogTest.InvokeDialog_default -IN_PROC_BROWSER_TEST_F(UpdateRecommendedDialogTest, InvokeDialog_default) { - RunDialog(); +// Test that calls ShowUi("default"). +IN_PROC_BROWSER_TEST_F(UpdateRecommendedDialogTest, InvokeUi_default) { + ShowAndVerifyUi(); }
diff --git a/chrome/browser/ui/views/accessibility/invert_bubble_view_browsertest.cc b/chrome/browser/ui/views/accessibility/invert_bubble_view_browsertest.cc index f4a01ba..e9be0c3 100644 --- a/chrome/browser/ui/views/accessibility/invert_bubble_view_browsertest.cc +++ b/chrome/browser/ui/views/accessibility/invert_bubble_view_browsertest.cc
@@ -15,7 +15,7 @@ InvertBubbleViewBrowserTest() {} // DialogBrowserTest: - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { ShowInvertBubbleView(browser(), &anchor_); } @@ -26,7 +26,7 @@ }; // Invokes a bubble that asks the user if they want to install a high contrast -// Chrome theme. See test_browser_dialog.h. -IN_PROC_BROWSER_TEST_F(InvertBubbleViewBrowserTest, InvokeDialog_default) { - RunDialog(); +// Chrome theme. +IN_PROC_BROWSER_TEST_F(InvertBubbleViewBrowserTest, InvokeUi_default) { + ShowAndVerifyUi(); }
diff --git a/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_views_browsertest.cc b/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_views_browsertest.cc index 1bc7da8..0fd9845 100644 --- a/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_views_browsertest.cc +++ b/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_views_browsertest.cc
@@ -23,7 +23,7 @@ AppInfoDialogBrowserTest() {} // DialogBrowserTest: - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { extension_environment_ = base::MakeUnique<extensions::TestExtensionEnvironment>(nullptr); constexpr char kTestExtensionId[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; @@ -52,8 +52,7 @@ DISALLOW_COPY_AND_ASSIGN(AppInfoDialogBrowserTest); }; -// Invokes a dialog that shows details of an installed extension. See -// test_browser_dialog.h. -IN_PROC_BROWSER_TEST_F(AppInfoDialogBrowserTest, InvokeDialog_default) { - RunDialog(); +// Invokes a dialog that shows details of an installed extension. +IN_PROC_BROWSER_TEST_F(AppInfoDialogBrowserTest, InvokeUi_default) { + ShowAndVerifyUi(); }
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view_browsertest.cc b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view_browsertest.cc index 83e5b5c..b5db0b52 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view_browsertest.cc +++ b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view_browsertest.cc
@@ -23,7 +23,7 @@ BookmarkBubbleViewBrowserTest() {} // DialogBrowserTest: - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { #if !defined(OS_CHROMEOS) if (name == "bookmark_details") { SigninManagerFactory::GetForProfile(browser()->profile()) @@ -61,21 +61,20 @@ // ChromeOS is always signed in. #if !defined(OS_CHROMEOS) IN_PROC_BROWSER_TEST_F(BookmarkBubbleViewBrowserTest, - InvokeDialog_bookmark_details) { - RunDialog(); + InvokeUi_bookmark_details) { + ShowAndVerifyUi(); } #endif IN_PROC_BROWSER_TEST_F(BookmarkBubbleViewBrowserTest, - InvokeDialog_bookmark_details_signed_in) { - RunDialog(); + InvokeUi_bookmark_details_signed_in) { + ShowAndVerifyUi(); } #if defined(OS_WIN) -IN_PROC_BROWSER_TEST_F(BookmarkBubbleViewBrowserTest, - InvokeDialog_ios_promotion) { +IN_PROC_BROWSER_TEST_F(BookmarkBubbleViewBrowserTest, InvokeUi_ios_promotion) { base::CommandLine::ForCurrentProcess()->AppendSwitch( switches::kForceDesktopIOSPromotion); - RunDialog(); + ShowAndVerifyUi(); } #endif
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_editor_view_browsertest.cc b/chrome/browser/ui/views/bookmarks/bookmark_editor_view_browsertest.cc index f0536d5d..1c76f5c4 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_editor_view_browsertest.cc +++ b/chrome/browser/ui/views/bookmarks/bookmark_editor_view_browsertest.cc
@@ -13,7 +13,7 @@ BookmarkEditorViewBrowserTest() {} // DialogBrowserTest: - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { DCHECK_EQ("all_tabs", name); chrome::ShowBookmarkAllTabsDialog(browser()); } @@ -24,7 +24,6 @@ // Shows the dialog for bookmarking all tabs. This shows a BookmarkEditorView // dialog, with a tree view, where a user can rename and select a parent folder. -// Can be interactive when run with --gtest_filter=BrowserDialogTest.Invoke. -IN_PROC_BROWSER_TEST_F(BookmarkEditorViewBrowserTest, InvokeDialog_all_tabs) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(BookmarkEditorViewBrowserTest, InvokeUi_all_tabs) { + ShowAndVerifyUi(); }
diff --git a/chrome/browser/ui/views/certificate_selector_dialog_browsertest.cc b/chrome/browser/ui/views/certificate_selector_dialog_browsertest.cc index 60b73d2..acb64dfe 100644 --- a/chrome/browser/ui/views/certificate_selector_dialog_browsertest.cc +++ b/chrome/browser/ui/views/certificate_selector_dialog_browsertest.cc
@@ -45,7 +45,7 @@ CertificateSelectorDialogTest() {} // DialogBrowserTest: - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { cert_1_ = net::ImportCertFromFile(net::GetTestCertsDirectory(), "client_1.pem"); cert_2_ = @@ -65,8 +65,7 @@ DISALLOW_COPY_AND_ASSIGN(CertificateSelectorDialogTest); }; -// Invokes a dialog that allows the user select a certificate. See -// test_browser_dialog.h. -IN_PROC_BROWSER_TEST_F(CertificateSelectorDialogTest, InvokeDialog_default) { - RunDialog(); +// Invokes a dialog that allows the user select a certificate. +IN_PROC_BROWSER_TEST_F(CertificateSelectorDialogTest, InvokeUi_default) { + ShowAndVerifyUi(); }
diff --git a/chrome/browser/ui/views/chrome_cleaner_dialog_browsertest_win.cc b/chrome/browser/ui/views/chrome_cleaner_dialog_browsertest_win.cc index 1ec91178..6c41726 100644 --- a/chrome/browser/ui/views/chrome_cleaner_dialog_browsertest_win.cc +++ b/chrome/browser/ui/views/chrome_cleaner_dialog_browsertest_win.cc
@@ -51,7 +51,7 @@ Return(safe_browsing::ChromeCleanerController::State::kInfected)); } - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { chrome::ShowChromeCleanerPrompt(browser(), mock_dialog_controller_.get(), mock_cleaner_controller_.get()); } @@ -68,8 +68,8 @@ DISALLOW_COPY_AND_ASSIGN(ChromeCleanerDialogTest); }; -IN_PROC_BROWSER_TEST_F(ChromeCleanerDialogTest, InvokeDialog_default) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(ChromeCleanerDialogTest, InvokeUi_default) { + ShowAndVerifyUi(); } } // namespace
diff --git a/chrome/browser/ui/views/chrome_cleaner_reboot_dialog_browsertest_win.cc b/chrome/browser/ui/views/chrome_cleaner_reboot_dialog_browsertest_win.cc index e8f1e2b..bef08121 100644 --- a/chrome/browser/ui/views/chrome_cleaner_reboot_dialog_browsertest_win.cc +++ b/chrome/browser/ui/views/chrome_cleaner_reboot_dialog_browsertest_win.cc
@@ -19,8 +19,7 @@ // Provides tests which allows explicit invocation of the Chrome Cleaner Reboot // Prompt useful for checking dialog layout or any other interactive -// functionality tests. See docs/testing/test_browser_dialog.md for description -// of the testing framework. +// functionality tests. class ChromeCleanerRebootDialog : public DialogBrowserTest { public: void SetUpInProcessBrowserTestFixture() override { @@ -28,7 +27,7 @@ } // DialogBrowserTest overrides. - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { ON_CALL(mock_cleaner_controller_, state()) .WillByDefault(::testing::Return( safe_browsing::ChromeCleanerController::State::kRebootRequired)); @@ -45,8 +44,8 @@ base::test::ScopedFeatureList scoped_feature_list_; }; -IN_PROC_BROWSER_TEST_F(ChromeCleanerRebootDialog, InvokeDialog_default) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(ChromeCleanerRebootDialog, InvokeUi_default) { + ShowAndVerifyUi(); } } // namespace
diff --git a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_browsertest.cc b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_browsertest.cc index d07f5aff5..96e744c6 100644 --- a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_browsertest.cc +++ b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_browsertest.cc
@@ -20,7 +20,7 @@ DesktopMediaPickerViewsBrowserTest() {} // DialogBrowserTest: - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { picker_ = base::MakeUnique<DesktopMediaPickerViews>(); auto* web_contents = browser()->tab_strip_model()->GetActiveWebContents(); gfx::NativeWindow native_window = browser()->window()->GetNativeWindow(); @@ -45,8 +45,7 @@ }; // Invokes a dialog that allows the user to select what view of their desktop -// they would like to share. See test_browser_dialog.h. -IN_PROC_BROWSER_TEST_F(DesktopMediaPickerViewsBrowserTest, - InvokeDialog_default) { - RunDialog(); +// they would like to share. +IN_PROC_BROWSER_TEST_F(DesktopMediaPickerViewsBrowserTest, InvokeUi_default) { + ShowAndVerifyUi(); }
diff --git a/chrome/browser/ui/views/device_chooser_browsertest.cc b/chrome/browser/ui/views/device_chooser_browsertest.cc index f3041e35..87371c55c 100644 --- a/chrome/browser/ui/views/device_chooser_browsertest.cc +++ b/chrome/browser/ui/views/device_chooser_browsertest.cc
@@ -43,13 +43,13 @@ } // namespace // Invokes a dialog allowing the user to select a USB device for a web page or -// extension. See test_browser_dialog.h. +// extension. class UsbChooserBrowserTest : public DialogBrowserTest { public: UsbChooserBrowserTest() {} // DialogBrowserTest: - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { ShowChooser(name, browser(), base::MakeUnique<FakeUsbChooserController>(device_count_)); } @@ -62,33 +62,33 @@ DISALLOW_COPY_AND_ASSIGN(UsbChooserBrowserTest); }; -IN_PROC_BROWSER_TEST_F(UsbChooserBrowserTest, InvokeDialog_NoDevicesBubble) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(UsbChooserBrowserTest, InvokeUi_NoDevicesBubble) { + ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_F(UsbChooserBrowserTest, InvokeDialog_NoDevicesModal) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(UsbChooserBrowserTest, InvokeUi_NoDevicesModal) { + ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_F(UsbChooserBrowserTest, InvokeDialog_WithDevicesBubble) { +IN_PROC_BROWSER_TEST_F(UsbChooserBrowserTest, InvokeUi_WithDevicesBubble) { device_count_ = 5; - RunDialog(); + ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_F(UsbChooserBrowserTest, InvokeDialog_WithDevicesModal) { +IN_PROC_BROWSER_TEST_F(UsbChooserBrowserTest, InvokeUi_WithDevicesModal) { device_count_ = 5; - RunDialog(); + ShowAndVerifyUi(); } // Invokes a dialog allowing the user to select a Bluetooth device for a web -// page or extension. See test_browser_dialog.h. +// page or extension. class BluetoothChooserBrowserTest : public DialogBrowserTest { public: BluetoothChooserBrowserTest() : status_(FakeBluetoothChooserController::BluetoothStatus::UNAVAILABLE) {} // DialogBrowserTest: - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { auto controller = std::make_unique<FakeBluetoothChooserController>(std::move(devices_)); auto* controller_unowned = controller.get(); @@ -145,75 +145,68 @@ }; IN_PROC_BROWSER_TEST_F(BluetoothChooserBrowserTest, - InvokeDialog_UnavailableBubble) { - RunDialog(); + InvokeUi_UnavailableBubble) { + ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_F(BluetoothChooserBrowserTest, - InvokeDialog_UnavailableModal) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(BluetoothChooserBrowserTest, InvokeUi_UnavailableModal) { + ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_F(BluetoothChooserBrowserTest, - InvokeDialog_NoDevicesBubble) { +IN_PROC_BROWSER_TEST_F(BluetoothChooserBrowserTest, InvokeUi_NoDevicesBubble) { set_status(FakeBluetoothChooserController::BluetoothStatus::IDLE); - RunDialog(); + ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_F(BluetoothChooserBrowserTest, - InvokeDialog_NoDevicesModal) { +IN_PROC_BROWSER_TEST_F(BluetoothChooserBrowserTest, InvokeUi_NoDevicesModal) { set_status(FakeBluetoothChooserController::BluetoothStatus::IDLE); - RunDialog(); + ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_F(BluetoothChooserBrowserTest, - InvokeDialog_ScanningBubble) { +IN_PROC_BROWSER_TEST_F(BluetoothChooserBrowserTest, InvokeUi_ScanningBubble) { set_status(FakeBluetoothChooserController::BluetoothStatus::SCANNING); - RunDialog(); + ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_F(BluetoothChooserBrowserTest, - InvokeDialog_ScanningModal) { +IN_PROC_BROWSER_TEST_F(BluetoothChooserBrowserTest, InvokeUi_ScanningModal) { set_status(FakeBluetoothChooserController::BluetoothStatus::SCANNING); - RunDialog(); + ShowAndVerifyUi(); } IN_PROC_BROWSER_TEST_F(BluetoothChooserBrowserTest, - InvokeDialog_ScanningWithDevicesBubble) { + InvokeUi_ScanningWithDevicesBubble) { set_status(FakeBluetoothChooserController::BluetoothStatus::SCANNING); AddDeviceForAllStrengths(); - RunDialog(); + ShowAndVerifyUi(); } IN_PROC_BROWSER_TEST_F(BluetoothChooserBrowserTest, - InvokeDialog_ScanningWithDevicesModal) { + InvokeUi_ScanningWithDevicesModal) { set_status(FakeBluetoothChooserController::BluetoothStatus::SCANNING); AddDeviceForAllStrengths(); - RunDialog(); + ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_F(BluetoothChooserBrowserTest, - InvokeDialog_ConnectedBubble) { +IN_PROC_BROWSER_TEST_F(BluetoothChooserBrowserTest, InvokeUi_ConnectedBubble) { set_status(FakeBluetoothChooserController::BluetoothStatus::IDLE); AddConnectedDevice(); - RunDialog(); + ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_F(BluetoothChooserBrowserTest, - InvokeDialog_ConnectedModal) { +IN_PROC_BROWSER_TEST_F(BluetoothChooserBrowserTest, InvokeUi_ConnectedModal) { set_status(FakeBluetoothChooserController::BluetoothStatus::IDLE); AddConnectedDevice(); - RunDialog(); + ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_F(BluetoothChooserBrowserTest, InvokeDialog_PairedBubble) { +IN_PROC_BROWSER_TEST_F(BluetoothChooserBrowserTest, InvokeUi_PairedBubble) { set_status(FakeBluetoothChooserController::BluetoothStatus::IDLE); AddPairedDevice(); - RunDialog(); + ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_F(BluetoothChooserBrowserTest, InvokeDialog_PairedModal) { +IN_PROC_BROWSER_TEST_F(BluetoothChooserBrowserTest, InvokeUi_PairedModal) { set_status(FakeBluetoothChooserController::BluetoothStatus::IDLE); AddPairedDevice(); - RunDialog(); + ShowAndVerifyUi(); }
diff --git a/chrome/browser/ui/views/device_chooser_content_view.cc b/chrome/browser/ui/views/device_chooser_content_view.cc index 59c6bf2..dd946ee2 100644 --- a/chrome/browser/ui/views/device_chooser_content_view.cc +++ b/chrome/browser/ui/views/device_chooser_content_view.cc
@@ -8,6 +8,7 @@ #include "base/numerics/safe_conversions.h" #include "chrome/browser/ui/views/harmony/chrome_layout_provider.h" #include "chrome/grit/generated_resources.h" +#include "components/strings/grit/components_strings.h" #include "components/vector_icons/vector_icons.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/resource/resource_bundle.h" @@ -17,43 +18,115 @@ #include "ui/gfx/image/image_skia.h" #include "ui/gfx/paint_vector_icon.h" #include "ui/resources/grit/ui_resources.h" +#include "ui/views/controls/button/image_button.h" +#include "ui/views/controls/button/image_button_factory.h" +#include "ui/views/controls/button/label_button.h" +#include "ui/views/controls/button/md_text_button.h" #include "ui/views/controls/styled_label.h" #include "ui/views/controls/table/table_view.h" #include "ui/views/controls/throbber.h" +#include "ui/views/layout/box_layout.h" #include "ui/views/widget/widget.h" namespace { -const int kThrobberDiameter = 24; - -const int kAdapterOffHelpLinkPadding = 5; +constexpr int kAdapterOffHelpLinkPadding = 5; // The lookup table for signal strength level image. -const int kSignalStrengthLevelImageIds[5] = {IDR_SIGNAL_0_BAR, IDR_SIGNAL_1_BAR, - IDR_SIGNAL_2_BAR, IDR_SIGNAL_3_BAR, - IDR_SIGNAL_4_BAR}; +constexpr int kSignalStrengthLevelImageIds[5] = { + IDR_SIGNAL_0_BAR, IDR_SIGNAL_1_BAR, IDR_SIGNAL_2_BAR, IDR_SIGNAL_3_BAR, + IDR_SIGNAL_4_BAR}; + +constexpr int kHelpButtonTag = 1; +constexpr int kReScanButtonTag = 2; } // namespace +DeviceChooserContentView::BluetoothStatusContainer::BluetoothStatusContainer( + views::ButtonListener* listener) { + re_scan_button_ = views::MdTextButton::CreateSecondaryUiButton( + listener, + l10n_util::GetStringUTF16(IDS_BLUETOOTH_DEVICE_CHOOSER_RE_SCAN)); + re_scan_button_->SetTooltipText( + l10n_util::GetStringUTF16(IDS_BLUETOOTH_DEVICE_CHOOSER_RE_SCAN_TOOLTIP)); + re_scan_button_->SetFocusForPlatform(); + re_scan_button_->set_tag(kReScanButtonTag); + // Ensures that the focus will never cycle to the help button, because that's + // rarely useful and can look weird. + re_scan_button_->set_request_focus_on_press(true); + AddChildView(re_scan_button_); + + throbber_ = new views::Throbber(); + AddChildView(throbber_); + + scanning_label_ = new views::Label( + l10n_util::GetStringUTF16(IDS_BLUETOOTH_DEVICE_CHOOSER_SCANNING_LABEL), + views::style::CONTEXT_LABEL, views::style::STYLE_DISABLED); + scanning_label_->SetTooltipText(l10n_util::GetStringUTF16( + IDS_BLUETOOTH_DEVICE_CHOOSER_SCANNING_LABEL_TOOLTIP)); + AddChildView(scanning_label_); +} + +gfx::Size +DeviceChooserContentView::BluetoothStatusContainer::CalculatePreferredSize() + const { + const gfx::Size throbber_size = throbber_->GetPreferredSize(); + const gfx::Size scanning_label_size = scanning_label_->GetPreferredSize(); + const gfx::Size re_scan_button_size = re_scan_button_->GetPreferredSize(); + + // The re-scan button and throbber plus label won't be shown at the same time, + // so they overlap each other. The width is thus the larger of the two modes. + const int width = std::max(throbber_size.width() + GetThrobberLabelSpacing() + + scanning_label_size.width(), + re_scan_button_size.width()); + // The height is equal to the tallest of the child views. + const int height = std::max( + throbber_size.height(), + std::max(scanning_label_size.height(), re_scan_button_size.height())); + return gfx::Size(width, height); +} + +void DeviceChooserContentView::BluetoothStatusContainer::Layout() { + CenterVertically(re_scan_button_); + CenterVertically(throbber_); + CenterVertically(scanning_label_); + scanning_label_->SetX(throbber_->bounds().right() + + GetThrobberLabelSpacing()); +} + +void DeviceChooserContentView::BluetoothStatusContainer:: + ShowScanningLabelAndThrobber() { + re_scan_button_->SetVisible(false); + throbber_->SetVisible(true); + scanning_label_->SetVisible(true); + throbber_->Start(); +} + +void DeviceChooserContentView::BluetoothStatusContainer::ShowReScanButton( + bool enabled) { + re_scan_button_->SetVisible(true); + re_scan_button_->SetEnabled(enabled); + throbber_->Stop(); + throbber_->SetVisible(false); + scanning_label_->SetVisible(false); +} + +int DeviceChooserContentView::BluetoothStatusContainer:: + GetThrobberLabelSpacing() const { + return ChromeLayoutProvider::Get()->GetDistanceMetric( + views::DISTANCE_RELATED_CONTROL_HORIZONTAL); +} + +void DeviceChooserContentView::BluetoothStatusContainer::CenterVertically( + views::View* view) { + view->SizeToPreferredSize(); + view->SetY((height() - view->height()) / 2); +} + DeviceChooserContentView::DeviceChooserContentView( views::TableViewObserver* table_view_observer, std::unique_ptr<ChooserController> chooser_controller) - : chooser_controller_(std::move(chooser_controller)), - help_text_(l10n_util::GetStringFUTF16( - IDS_DEVICE_CHOOSER_GET_HELP_LINK_WITH_SCANNING_STATUS, - base::string16())), - help_and_scanning_text_(l10n_util::GetStringFUTF16( - IDS_DEVICE_CHOOSER_GET_HELP_LINK_WITH_SCANNING_STATUS, - l10n_util::GetStringUTF16(IDS_BLUETOOTH_DEVICE_CHOOSER_SCANNING))) { - base::string16 re_scan_text = - l10n_util::GetStringUTF16(IDS_BLUETOOTH_DEVICE_CHOOSER_RE_SCAN); - std::vector<size_t> offsets; - help_and_re_scan_text_ = l10n_util::GetStringFUTF16( - IDS_DEVICE_CHOOSER_GET_HELP_LINK_WITH_RE_SCAN_LINK, help_text_, - re_scan_text, &offsets); - help_text_range_ = gfx::Range(offsets[0], offsets[0] + help_text_.size()); - re_scan_text_range_ = - gfx::Range(offsets[1], offsets[1] + re_scan_text.size()); + : chooser_controller_(std::move(chooser_controller)) { chooser_controller_->set_view(this); std::vector<ui::TableColumn> table_columns; table_columns.push_back(ui::TableColumn()); @@ -69,10 +142,6 @@ table_parent_ = table_view_->CreateParentIfNecessary(); AddChildView(table_parent_); - throbber_ = new views::Throbber(); - throbber_->SetVisible(false); - AddChildView(throbber_); - base::string16 link_text = l10n_util::GetStringUTF16( IDS_BLUETOOTH_DEVICE_CHOOSER_TURN_ON_BLUETOOTH_LINK_TEXT); size_t offset = 0; @@ -84,13 +153,6 @@ views::StyledLabel::RangeStyleInfo::CreateForLink()); turn_adapter_off_help_->SetVisible(false); AddChildView(turn_adapter_off_help_); - - if (chooser_controller_->ShouldShowFootnoteView()) { - footnote_link_ = base::MakeUnique<views::StyledLabel>(help_text_, this); - footnote_link_->set_owned_by_client(); - footnote_link_->AddStyleRange( - help_text_range_, views::StyledLabel::RangeStyleInfo::CreateForLink()); - } } DeviceChooserContentView::~DeviceChooserContentView() { @@ -107,10 +169,7 @@ void DeviceChooserContentView::Layout() { gfx::Rect rect(GetContentsBounds()); table_parent_->SetBoundsRect(rect); - // Set the throbber in the center of the chooser. - throbber_->SetBounds((rect.width() - kThrobberDiameter) / 2, - (rect.height() - kThrobberDiameter) / 2, - kThrobberDiameter, kThrobberDiameter); + // Set the adapter off message in the center of the chooser. // The adapter off message will only be shown when the adapter is off, // and in that case, the system won't be able to scan for devices, so @@ -128,10 +187,10 @@ } int DeviceChooserContentView::RowCount() { - // When there are no devices, the table contains a message saying there - // are no devices, so the number of rows is always at least 1. + // When there are no devices and we're not scanning, the table contains a + // message saying there are no devices. return std::max(base::checked_cast<int>(chooser_controller_->NumOptions()), - 1); + refreshing_ ? 0 : 1); } base::string16 DeviceChooserContentView::GetText(int row, int column_id) { @@ -190,8 +249,6 @@ table_view_->OnItemsAdded(base::checked_cast<int>(index), 1); UpdateTableView(); table_view_->SetVisible(true); - throbber_->SetVisible(false); - throbber_->Stop(); } void DeviceChooserContentView::OnOptionRemoved(size_t index) { @@ -213,18 +270,8 @@ table_view_->SetVisible(enabled); turn_adapter_off_help_->SetVisible(!enabled); - throbber_->Stop(); - throbber_->SetVisible(false); - - if (enabled) { - SetGetHelpAndReScanLink(); - } else { - DCHECK(footnote_link_); - footnote_link_->SetText(help_text_); - footnote_link_->AddStyleRange( - help_text_range_, views::StyledLabel::RangeStyleInfo::CreateForLink()); - } - + bluetooth_status_container_->ShowReScanButton(enabled); + refreshing_ = false; if (GetWidget() && GetWidget()->GetRootView()) GetWidget()->GetRootView()->Layout(); } @@ -238,26 +285,11 @@ UpdateTableView(); } - // When refreshing and no option available yet, hide |table_view_| and show - // |throbber_|. Otherwise show |table_view_| and hide |throbber_|. - bool throbber_visible = - refreshing && (chooser_controller_->NumOptions() == 0); - table_view_->SetVisible(!throbber_visible); - throbber_->SetVisible(throbber_visible); - if (throbber_visible) - throbber_->Start(); + if (refreshing) + bluetooth_status_container_->ShowScanningLabelAndThrobber(); else - throbber_->Stop(); - - if (refreshing) { - DCHECK(footnote_link_); - footnote_link_->SetText(help_and_scanning_text_); - footnote_link_->AddStyleRange( - help_text_range_, views::StyledLabel::RangeStyleInfo::CreateForLink()); - } else { - SetGetHelpAndReScanLink(); - } - + bluetooth_status_container_->ShowReScanButton(true /* enabled */); + refreshing_ = refreshing; if (GetWidget() && GetWidget()->GetRootView()) GetWidget()->GetRootView()->Layout(); } @@ -265,15 +297,16 @@ void DeviceChooserContentView::StyledLabelLinkClicked(views::StyledLabel* label, const gfx::Range& range, int event_flags) { - if (label == turn_adapter_off_help_) { - chooser_controller_->OpenAdapterOffHelpUrl(); - } else if (label == footnote_link_.get()) { - if (range == help_text_range_) - chooser_controller_->OpenHelpCenterUrl(); - else if (range == re_scan_text_range_) - chooser_controller_->RefreshOptions(); - else - NOTREACHED(); + DCHECK_EQ(turn_adapter_off_help_, label); + chooser_controller_->OpenAdapterOffHelpUrl(); +} + +void DeviceChooserContentView::ButtonPressed(views::Button* sender, + const ui::Event& event) { + if (sender->tag() == kHelpButtonTag) { + chooser_controller_->OpenHelpCenterUrl(); + } else if (sender->tag() == kReScanButtonTag) { + chooser_controller_->RefreshOptions(); } else { NOTREACHED(); } @@ -283,6 +316,40 @@ return chooser_controller_->GetTitle(); } +std::unique_ptr<views::View> DeviceChooserContentView::CreateExtraView() { + std::vector<views::View*> extra_views; + if (chooser_controller_->ShouldShowHelpButton()) { + views::ImageButton* help_button = views::CreateVectorImageButton(this); + views::SetImageFromVectorIcon(help_button, vector_icons::kHelpOutlineIcon); + help_button->SetFocusForPlatform(); + help_button->SetTooltipText(l10n_util::GetStringUTF16(IDS_LEARN_MORE)); + help_button->set_tag(kHelpButtonTag); + extra_views.push_back(help_button); + } + + if (chooser_controller_->ShouldShowReScanButton()) { + bluetooth_status_container_ = new BluetoothStatusContainer(this); + extra_views.push_back(bluetooth_status_container_); + } + + if (extra_views.size() == 0) + return nullptr; + if (extra_views.size() == 1) + return std::unique_ptr<views::View>(extra_views.at(0)); + + auto container = std::make_unique<views::View>(); + views::BoxLayout* layout = + new views::BoxLayout(views::BoxLayout::kHorizontal, gfx::Insets(), + ChromeLayoutProvider::Get()->GetDistanceMetric( + views::DISTANCE_RELATED_CONTROL_HORIZONTAL)); + layout->set_cross_axis_alignment( + views::BoxLayout::CROSS_AXIS_ALIGNMENT_CENTER); + container->SetLayoutManager(layout); + for (auto* view : extra_views) + container->AddChildView(view); + return container; +} + base::string16 DeviceChooserContentView::GetDialogButtonLabel( ui::DialogButton button) const { return button == ui::DIALOG_BUTTON_OK @@ -319,12 +386,3 @@ table_view_->SetEnabled(true); } } - -void DeviceChooserContentView::SetGetHelpAndReScanLink() { - DCHECK(footnote_link_); - footnote_link_->SetText(help_and_re_scan_text_); - footnote_link_->AddStyleRange( - help_text_range_, views::StyledLabel::RangeStyleInfo::CreateForLink()); - footnote_link_->AddStyleRange( - re_scan_text_range_, views::StyledLabel::RangeStyleInfo::CreateForLink()); -}
diff --git a/chrome/browser/ui/views/device_chooser_content_view.h b/chrome/browser/ui/views/device_chooser_content_view.h index 264f9bc..1f3522eb 100644 --- a/chrome/browser/ui/views/device_chooser_content_view.h +++ b/chrome/browser/ui/views/device_chooser_content_view.h
@@ -12,10 +12,13 @@ #include "chrome/browser/chooser_controller/chooser_controller.h" #include "ui/base/models/table_model.h" #include "ui/gfx/range/range.h" +#include "ui/views/controls/button/button.h" +#include "ui/views/controls/label.h" #include "ui/views/controls/styled_label_listener.h" #include "ui/views/view.h" namespace views { +class LabelButton; class StyledLabel; class TableView; class TableViewObserver; @@ -27,7 +30,8 @@ class DeviceChooserContentView : public views::View, public ui::TableModel, public ChooserController::View, - public views::StyledLabelListener { + public views::StyledLabelListener, + public views::ButtonListener { public: DeviceChooserContentView( views::TableViewObserver* table_view_observer, @@ -58,16 +62,17 @@ const gfx::Range& range, int event_flags) override; - views::StyledLabel* footnote_link() { return footnote_link_.get(); } + // views::ButtonListener: + void ButtonPressed(views::Button* sender, const ui::Event& event) override; base::string16 GetWindowTitle() const; + std::unique_ptr<views::View> CreateExtraView(); base::string16 GetDialogButtonLabel(ui::DialogButton button) const; bool IsDialogButtonEnabled(ui::DialogButton button) const; void Accept(); void Cancel(); void Close(); void UpdateTableView(); - void SetGetHelpAndReScanLink(); private: friend class ChooserDialogViewTest; @@ -75,17 +80,42 @@ FRIEND_TEST_ALL_PREFIXES(DeviceChooserContentViewTest, ClickRescanLink); FRIEND_TEST_ALL_PREFIXES(DeviceChooserContentViewTest, ClickGetHelpLink); + class BluetoothStatusContainer : public views::View { + public: + explicit BluetoothStatusContainer(views::ButtonListener* listener); + + // view::Views: + gfx::Size CalculatePreferredSize() const override; + void Layout() override; + + void ShowScanningLabelAndThrobber(); + void ShowReScanButton(bool enabled); + + views::LabelButton* re_scan_button() { return re_scan_button_; } + views::Throbber* throbber() { return throbber_; } + views::Label* scanning_label() { return scanning_label_; } + + private: + int GetThrobberLabelSpacing() const; + void CenterVertically(views::View* view); + + views::LabelButton* re_scan_button_; + views::Throbber* throbber_; + views::Label* scanning_label_; + + DISALLOW_COPY_AND_ASSIGN(BluetoothStatusContainer); + }; + std::unique_ptr<ChooserController> chooser_controller_; - views::TableView* table_view_ = nullptr; // Weak. - views::View* table_parent_ = nullptr; // Weak. - views::StyledLabel* turn_adapter_off_help_ = nullptr; // Weak. - views::Throbber* throbber_ = nullptr; // Weak. - std::unique_ptr<views::StyledLabel> footnote_link_; - base::string16 help_text_; - base::string16 help_and_scanning_text_; - base::string16 help_and_re_scan_text_; - gfx::Range help_text_range_; - gfx::Range re_scan_text_range_; + + // True when the devices are refreshing (i.e. when OnRefreshStateChanged(true) + // is called). + bool refreshing_ = false; + + views::TableView* table_view_ = nullptr; + views::View* table_parent_ = nullptr; + views::StyledLabel* turn_adapter_off_help_ = nullptr; + BluetoothStatusContainer* bluetooth_status_container_ = nullptr; DISALLOW_COPY_AND_ASSIGN(DeviceChooserContentView); };
diff --git a/chrome/browser/ui/views/device_chooser_content_view_unittest.cc b/chrome/browser/ui/views/device_chooser_content_view_unittest.cc index 68347358..954f77e 100644 --- a/chrome/browser/ui/views/device_chooser_content_view_unittest.cc +++ b/chrome/browser/ui/views/device_chooser_content_view_unittest.cc
@@ -14,7 +14,9 @@ #include "testing/gtest/include/gtest/gtest.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/models/list_selection_model.h" -#include "ui/views/controls/link.h" +#include "ui/events/base_event_utils.h" +#include "ui/views/controls/button/image_button.h" +#include "ui/views/controls/button/label_button.h" #include "ui/views/controls/styled_label.h" #include "ui/views/controls/table/table_view.h" #include "ui/views/controls/table/table_view_observer.h" @@ -42,10 +44,14 @@ content_view_ = std::make_unique<DeviceChooserContentView>( table_observer_.get(), std::move(controller)); + // Also creates |bluetooth_status_container_|. + extra_views_container_ = content_view().CreateExtraView(); + ASSERT_NE(nullptr, table_view()); - ASSERT_NE(nullptr, throbber()); ASSERT_NE(nullptr, adapter_off_help_link()); - ASSERT_NE(nullptr, footnote_link()); + ASSERT_NE(nullptr, re_scan_button()); + ASSERT_NE(nullptr, throbber()); + ASSERT_NE(nullptr, scanning_label()); controller_->SetBluetoothStatus( FakeBluetoothChooserController::BluetoothStatus::IDLE); @@ -57,24 +63,17 @@ views::TableView* table_view() { return content_view().table_view_; } ui::TableModel* table_model() { return table_view()->model(); } - views::Throbber* throbber() { return content_view().throbber_; } views::StyledLabel* adapter_off_help_link() { return content_view().turn_adapter_off_help_; } - views::StyledLabel* footnote_link() { - return content_view().footnote_link_.get(); + views::LabelButton* re_scan_button() { + return content_view().bluetooth_status_container_->re_scan_button(); } - - void ExpectFootnoteLinkHasScanningText() { - EXPECT_EQ(content_view().help_and_scanning_text_, footnote_link()->text()); + views::Throbber* throbber() { + return content_view().bluetooth_status_container_->throbber(); } - - void ExpectFootnoteLinkHasRescanText() { - EXPECT_EQ(content_view().help_and_re_scan_text_, footnote_link()->text()); - } - - void ExpectFootnoteLinkOnlyHasHelpText() { - EXPECT_EQ(content_view().help_text_, footnote_link()->text()); + views::Label* scanning_label() { + return content_view().bluetooth_status_container_->scanning_label(); } void AddUnpairedDevice() { @@ -114,6 +113,9 @@ EXPECT_FALSE(IsDeviceSelected()); } + protected: + std::unique_ptr<views::View> extra_views_container_; + private: std::unique_ptr<MockTableViewObserver> table_observer_; FakeBluetoothChooserController* controller_ = nullptr; @@ -127,9 +129,11 @@ EXPECT_TRUE(table_view()->visible()); ExpectNoDevices(); - EXPECT_FALSE(throbber()->visible()); EXPECT_FALSE(adapter_off_help_link()->visible()); - ExpectFootnoteLinkHasRescanText(); + EXPECT_FALSE(throbber()->visible()); + EXPECT_FALSE(scanning_label()->visible()); + EXPECT_TRUE(re_scan_button()->visible()); + EXPECT_TRUE(re_scan_button()->enabled()); } TEST_F(DeviceChooserContentViewTest, AddOption) { @@ -209,7 +213,9 @@ EXPECT_FALSE(table_view()->visible()); EXPECT_TRUE(adapter_off_help_link()->visible()); EXPECT_FALSE(throbber()->visible()); - ExpectFootnoteLinkOnlyHasHelpText(); + EXPECT_FALSE(scanning_label()->visible()); + EXPECT_TRUE(re_scan_button()->visible()); + EXPECT_FALSE(re_scan_button()->enabled()); controller()->RemoveDevice(0); controller()->SetBluetoothStatus( @@ -217,24 +223,29 @@ ExpectNoDevices(); EXPECT_FALSE(adapter_off_help_link()->visible()); EXPECT_FALSE(throbber()->visible()); + EXPECT_FALSE(scanning_label()->visible()); + EXPECT_TRUE(re_scan_button()->visible()); + EXPECT_TRUE(re_scan_button()->enabled()); } TEST_F(DeviceChooserContentViewTest, ScanForDevices) { controller()->SetBluetoothStatus( FakeBluetoothChooserController::BluetoothStatus::SCANNING); - EXPECT_FALSE(table_view()->visible()); + EXPECT_EQ(0, table_view()->RowCount()); + EXPECT_FALSE(table_view()->enabled()); EXPECT_FALSE(adapter_off_help_link()->visible()); EXPECT_TRUE(throbber()->visible()); - ExpectFootnoteLinkHasScanningText(); + EXPECT_TRUE(scanning_label()->visible()); + EXPECT_FALSE(re_scan_button()->visible()); AddUnpairedDevice(); - EXPECT_TRUE(table_view()->visible()); + EXPECT_EQ(1, table_view()->RowCount()); EXPECT_TRUE(table_view()->enabled()); EXPECT_FALSE(adapter_off_help_link()->visible()); - EXPECT_FALSE(throbber()->visible()); - EXPECT_EQ(1, table_view()->RowCount()); + EXPECT_TRUE(throbber()->visible()); + EXPECT_TRUE(scanning_label()->visible()); EXPECT_FALSE(IsDeviceSelected()); - ExpectFootnoteLinkHasScanningText(); + EXPECT_FALSE(re_scan_button()->visible()); } TEST_F(DeviceChooserContentViewTest, ClickAdapterOffHelpLink) { @@ -242,14 +253,24 @@ adapter_off_help_link()->LinkClicked(nullptr, 0); } -TEST_F(DeviceChooserContentViewTest, ClickRescanLink) { +TEST_F(DeviceChooserContentViewTest, ClickRescanButton) { EXPECT_CALL(*controller(), RefreshOptions()).Times(1); - content_view().StyledLabelLinkClicked(footnote_link(), - content_view().re_scan_text_range_, 0); + const gfx::Point point(10, 10); + const ui::MouseEvent event(ui::ET_MOUSE_PRESSED, point, point, + ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, + ui::EF_LEFT_MOUSE_BUTTON); + content_view().ButtonPressed(re_scan_button(), event); } -TEST_F(DeviceChooserContentViewTest, ClickGetHelpLink) { +TEST_F(DeviceChooserContentViewTest, ClickHelpButton) { EXPECT_CALL(*controller(), OpenHelpCenterUrl()).Times(1); - content_view().StyledLabelLinkClicked(footnote_link(), - content_view().help_text_range_, 0); + // The content view doesn't have a direct reference to the help button, so we + // need to find it. It's on the left (in LTR) so it should be the first child. + views::ImageButton* help_button = + static_cast<views::ImageButton*>(extra_views_container_->child_at(0)); + const gfx::Point point(10, 10); + const ui::MouseEvent event(ui::ET_MOUSE_PRESSED, point, point, + ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, + ui::EF_LEFT_MOUSE_BUTTON); + content_view().ButtonPressed(help_button, event); }
diff --git a/chrome/browser/ui/views/extensions/chooser_dialog_view.cc b/chrome/browser/ui/views/extensions/chooser_dialog_view.cc index 7004227..aa0a5d07 100644 --- a/chrome/browser/ui/views/extensions/chooser_dialog_view.cc +++ b/chrome/browser/ui/views/extensions/chooser_dialog_view.cc
@@ -19,9 +19,11 @@ #include "ui/gfx/geometry/insets.h" #include "ui/views/background.h" #include "ui/views/border.h" +#include "ui/views/controls/button/label_button.h" #include "ui/views/controls/link.h" #include "ui/views/controls/styled_label.h" #include "ui/views/layout/fill_layout.h" +#include "ui/views/window/dialog_client_view.h" ChooserDialogView::ChooserDialogView( std::unique_ptr<ChooserController> chooser_controller) { @@ -72,14 +74,14 @@ return device_chooser_content_view_->IsDialogButtonEnabled(button); } -views::View* ChooserDialogView::CreateFootnoteView() { - views::View* footnote_link = device_chooser_content_view_->footnote_link(); - if (footnote_link) { - footnote_link->SetBorder( - views::CreateEmptyBorder(ChromeLayoutProvider::Get()->GetInsetsMetric( - views::INSETS_DIALOG_SUBSECTION))); - } - return footnote_link; +views::View* ChooserDialogView::GetInitiallyFocusedView() { + return GetDialogClientView()->cancel_button(); +} + +views::View* ChooserDialogView::CreateExtraView() { + std::unique_ptr<views::View> extra_view = + device_chooser_content_view_->CreateExtraView(); + return extra_view ? extra_view.release() : nullptr; } bool ChooserDialogView::Accept() {
diff --git a/chrome/browser/ui/views/extensions/chooser_dialog_view.h b/chrome/browser/ui/views/extensions/chooser_dialog_view.h index dcb4f6e..1226158 100644 --- a/chrome/browser/ui/views/extensions/chooser_dialog_view.h +++ b/chrome/browser/ui/views/extensions/chooser_dialog_view.h
@@ -31,7 +31,8 @@ // views::DialogDelegate: base::string16 GetDialogButtonLabel(ui::DialogButton button) const override; bool IsDialogButtonEnabled(ui::DialogButton button) const override; - views::View* CreateFootnoteView() override; + views::View* GetInitiallyFocusedView() override; + views::View* CreateExtraView() override; bool Accept() override; bool Cancel() override; bool Close() override;
diff --git a/chrome/browser/ui/views/extensions/chooser_dialog_view_unittest.cc b/chrome/browser/ui/views/extensions/chooser_dialog_view_unittest.cc index 4438f31..cc6ffe3 100644 --- a/chrome/browser/ui/views/extensions/chooser_dialog_view_unittest.cc +++ b/chrome/browser/ui/views/extensions/chooser_dialog_view_unittest.cc
@@ -11,8 +11,11 @@ #include "chrome/browser/ui/views/device_chooser_content_view.h" #include "chrome/test/views/chrome_views_test_base.h" #include "testing/gmock/include/gmock/gmock.h" +#include "ui/events/base_event_utils.h" +#include "ui/views/controls/button/label_button.h" #include "ui/views/controls/table/table_view.h" #include "ui/views/widget/widget.h" +#include "ui/views/window/dialog_client_view.h" class ChooserDialogViewTest : public ChromeViewsTestBase { public: @@ -23,11 +26,14 @@ auto controller = std::make_unique<FakeBluetoothChooserController>(); controller_ = controller.get(); dialog_ = new ChooserDialogView(std::move(controller)); - controller_->SetBluetoothStatus( - FakeBluetoothChooserController::BluetoothStatus::IDLE); widget_ = views::DialogDelegate::CreateDialogWidget(dialog_, GetContext(), nullptr); + controller_->SetBluetoothStatus( + FakeBluetoothChooserController::BluetoothStatus::IDLE); + + ASSERT_NE(nullptr, table_view()); + ASSERT_NE(nullptr, re_scan_button()); } void TearDown() override { @@ -35,6 +41,15 @@ ChromeViewsTestBase::TearDown(); } + views::TableView* table_view() { + return dialog_->device_chooser_content_view_for_test()->table_view_; + } + + views::LabelButton* re_scan_button() { + return dialog_->device_chooser_content_view_for_test() + ->bluetooth_status_container_->re_scan_button(); + } + void AddDevice() { controller_->AddDevice( {"Device", FakeBluetoothChooserController::NOT_CONNECTED, @@ -42,10 +57,6 @@ FakeBluetoothChooserController::kSignalStrengthLevel1}); } - void SelectDevice(size_t index) { - dialog_->device_chooser_content_view_for_test()->table_view_->Select(index); - } - protected: ChooserDialogView* dialog_ = nullptr; FakeBluetoothChooserController* controller_ = nullptr; @@ -64,7 +75,7 @@ EXPECT_FALSE(dialog_->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK)); AddDevice(); EXPECT_FALSE(dialog_->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK)); - SelectDevice(0); + table_view()->Select(0); EXPECT_TRUE(dialog_->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK)); // Changing state disables the OK button. @@ -74,17 +85,39 @@ controller_->SetBluetoothStatus( FakeBluetoothChooserController::BluetoothStatus::SCANNING); EXPECT_FALSE(dialog_->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK)); - SelectDevice(0); + table_view()->Select(0); EXPECT_TRUE(dialog_->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK)); controller_->SetBluetoothStatus( FakeBluetoothChooserController::BluetoothStatus::IDLE); EXPECT_FALSE(dialog_->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK)); } +TEST_F(ChooserDialogViewTest, CancelButtonFocusedWhenReScanIsPressed) { + EXPECT_CALL(*controller_, RefreshOptions()).WillOnce(testing::Invoke([=]() { + controller_->SetBluetoothStatus( + FakeBluetoothChooserController::BluetoothStatus::SCANNING); + })); + AddDevice(); + table_view()->RequestFocus(); + controller_->RemoveDevice(0); + + // Click the re-scan button. + const gfx::Point point(10, 10); + const ui::MouseEvent event(ui::ET_MOUSE_PRESSED, point, point, + ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, + ui::EF_LEFT_MOUSE_BUTTON); + re_scan_button()->OnMousePressed(event); + re_scan_button()->OnMouseReleased(event); + + EXPECT_FALSE(re_scan_button()->visible()); + EXPECT_EQ(dialog_->GetDialogClientView()->cancel_button(), + dialog_->GetFocusManager()->GetFocusedView()); +} + TEST_F(ChooserDialogViewTest, Accept) { AddDevice(); AddDevice(); - SelectDevice(1); + table_view()->Select(1); std::vector<size_t> expected = {1u}; EXPECT_CALL(*controller_, Select(testing::Eq(expected))).Times(1); dialog_->Accept();
diff --git a/chrome/browser/ui/views/extensions/extension_install_dialog_view_browsertest.cc b/chrome/browser/ui/views/extensions/extension_install_dialog_view_browsertest.cc index abb4d21d..181ab885 100644 --- a/chrome/browser/ui/views/extensions/extension_install_dialog_view_browsertest.cc +++ b/chrome/browser/ui/views/extensions/extension_install_dialog_view_browsertest.cc
@@ -230,7 +230,7 @@ ExtensionInstallDialogViewInteractiveBrowserTest() {} // DialogBrowserTest: - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { extensions::ChromeTestExtensionLoader loader(browser()->profile()); base::FilePath test_data_dir; PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir); @@ -284,59 +284,59 @@ }; IN_PROC_BROWSER_TEST_F(ExtensionInstallDialogViewInteractiveBrowserTest, - InvokeDialog_Simple) { - RunDialog(); + InvokeUi_Simple) { + ShowAndVerifyUi(); } IN_PROC_BROWSER_TEST_F(ExtensionInstallDialogViewInteractiveBrowserTest, - InvokeDialog_External) { + InvokeUi_External) { set_external_install(); - RunDialog(); + ShowAndVerifyUi(); } IN_PROC_BROWSER_TEST_F(ExtensionInstallDialogViewInteractiveBrowserTest, - InvokeDialog_ExternalWithPermission) { + InvokeUi_ExternalWithPermission) { set_external_install(); AddPermission("Example permission"); - RunDialog(); + ShowAndVerifyUi(); } IN_PROC_BROWSER_TEST_F(ExtensionInstallDialogViewInteractiveBrowserTest, - InvokeDialog_FromWebstore) { + InvokeUi_FromWebstore) { set_from_webstore(); - RunDialog(); + ShowAndVerifyUi(); } IN_PROC_BROWSER_TEST_F(ExtensionInstallDialogViewInteractiveBrowserTest, - InvokeDialog_FromWebstoreWithPermission) { + InvokeUi_FromWebstoreWithPermission) { set_from_webstore(); AddPermission("Example permission"); - RunDialog(); + ShowAndVerifyUi(); } IN_PROC_BROWSER_TEST_F(ExtensionInstallDialogViewInteractiveBrowserTest, - InvokeDialog_MultilinePermission) { + InvokeUi_MultilinePermission) { AddPermission( "In the shade of the house, in the sunshine of the riverbank " "near the boats, in the shade of the Sal-wood forest, in the " "shade of the fig tree is where Siddhartha grew up"); - RunDialog(); + ShowAndVerifyUi(); } IN_PROC_BROWSER_TEST_F(ExtensionInstallDialogViewInteractiveBrowserTest, - InvokeDialog_ManyPermissions) { + InvokeUi_ManyPermissions) { for (int i = 0; i < 20; i++) AddPermission("Example permission"); - RunDialog(); + ShowAndVerifyUi(); } IN_PROC_BROWSER_TEST_F(ExtensionInstallDialogViewInteractiveBrowserTest, - InvokeDialog_DetailedPermission) { + InvokeUi_DetailedPermission) { AddPermissionWithDetails("Example header permission", {base::ASCIIToUTF16("Detailed permission 1"), base::ASCIIToUTF16("Detailed permission 2"), base::ASCIIToUTF16("Detailed permission 3")}); - RunDialog(); + ShowAndVerifyUi(); } class ExtensionInstallDialogRatingsSectionTest
diff --git a/chrome/browser/ui/views/extensions/extension_message_bubble_view_browsertest.cc b/chrome/browser/ui/views/extensions/extension_message_bubble_view_browsertest.cc index e228281..ba24278 100644 --- a/chrome/browser/ui/views/extensions/extension_message_bubble_view_browsertest.cc +++ b/chrome/browser/ui/views/extensions/extension_message_bubble_view_browsertest.cc
@@ -51,7 +51,7 @@ void SetUp() override; // TestBrowserDialog: - void ShowDialog(const std::string& name) override; + void ShowUi(const std::string& name) override; private: // ExtensionMessageBubbleBrowserTest: @@ -75,11 +75,10 @@ // not affect the behavior of the bubble (just the appearance), so enable for // all platforms. UseMdOnly(); - SupportsTestDialog::SetUp(); + SupportsTestUi::SetUp(); } -void ExtensionMessageBubbleViewBrowserTest::ShowDialog( - const std::string& name) { +void ExtensionMessageBubbleViewBrowserTest::ShowUi(const std::string& name) { // When invoked this way, the dialog test harness must close the bubble. base::AutoReset<bool> guard(&block_close_, true); @@ -219,11 +218,11 @@ TestControlledStartupNotShownOnRestart(); } -// BrowserDialogTest for the warning bubble that appears when opening a new tab -// and an extension is controlling it. Only shown on Windows. +// BrowserUiTest for the warning bubble that appears when opening a new tab and +// an extension is controlling it. Only shown on Windows. IN_PROC_BROWSER_TEST_F(ExtensionMessageBubbleViewBrowserTest, - InvokeDialog_ntp_override) { - RunDialog(); + InvokeUi_ntp_override) { + ShowAndVerifyUi(); } #endif // defined(OS_WIN) @@ -248,12 +247,11 @@ TestClickingDismissButton(); } -// BrowserDialogTest for the warning bubble that appears at startup when there -// are extensions installed in developer mode. Can be invoked interactively with -// --gtest_filter=BrowserDialogTest.Invoke. +// BrowserUiTest for the warning bubble that appears at startup when there are +// extensions installed in developer mode. IN_PROC_BROWSER_TEST_F(ExtensionMessageBubbleViewBrowserTest, - InvokeDialog_devmode_warning) { - RunDialog(); + InvokeUi_devmode_warning) { + ShowAndVerifyUi(); } class NtpExtensionBubbleViewBrowserTest
diff --git a/chrome/browser/ui/views/extensions/extension_uninstall_dialog_view_browsertest.cc b/chrome/browser/ui/views/extensions/extension_uninstall_dialog_view_browsertest.cc index 0d6032f..d2ce2ef 100644 --- a/chrome/browser/ui/views/extensions/extension_uninstall_dialog_view_browsertest.cc +++ b/chrome/browser/ui/views/extensions/extension_uninstall_dialog_view_browsertest.cc
@@ -264,7 +264,7 @@ EXTENSION_LOCAL_SOURCE, EXTENSION_FROM_WEBSTORE, }; - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { extensions::DictionaryBuilder manifest_builder; manifest_builder.Set("name", "ExtensionForRemoval").Set("version", "1.0"); if (extension_origin_ == EXTENSION_FROM_WEBSTORE) { @@ -310,7 +310,7 @@ uninstall_method_ = uninstall_method; extension_origin_ = extension_origin; - RunDialog(); + ShowAndVerifyUi(); } private: @@ -336,21 +336,21 @@ }; IN_PROC_BROWSER_TEST_F(ExtensionUninstallDialogViewInteractiveBrowserTest, - InvokeDialog_ManualUninstall) { + InvokeUi_ManualUninstall) { RunTest(MANUAL_UNINSTALL, EXTENSION_LOCAL_SOURCE); } IN_PROC_BROWSER_TEST_F(ExtensionUninstallDialogViewInteractiveBrowserTest, - InvokeDialog_ManualUninstallShowReportAbuse) { + InvokeUi_ManualUninstallShowReportAbuse) { RunTest(MANUAL_UNINSTALL, EXTENSION_FROM_WEBSTORE); } IN_PROC_BROWSER_TEST_F(ExtensionUninstallDialogViewInteractiveBrowserTest, - InvokeDialog_UninstallByExtension) { + InvokeUi_UninstallByExtension) { RunTest(UNINSTALL_BY_EXTENSION, EXTENSION_LOCAL_SOURCE); } IN_PROC_BROWSER_TEST_F(ExtensionUninstallDialogViewInteractiveBrowserTest, - InvokeDialog_UninstallByExtensionShowReportAbuse) { + InvokeUi_UninstallByExtensionShowReportAbuse) { RunTest(UNINSTALL_BY_EXTENSION, EXTENSION_FROM_WEBSTORE); }
diff --git a/chrome/browser/ui/views/extensions/media_galleries_dialog_views_browsertest.cc b/chrome/browser/ui/views/extensions/media_galleries_dialog_views_browsertest.cc index 4088981e..e8a04b51 100644 --- a/chrome/browser/ui/views/extensions/media_galleries_dialog_views_browsertest.cc +++ b/chrome/browser/ui/views/extensions/media_galleries_dialog_views_browsertest.cc
@@ -54,7 +54,7 @@ manager.WaitForNavigationFinished(); } - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { std::vector<base::string16> headers = {base::string16(), base::ASCIIToUTF16("header2")}; MediaGalleriesDialogController::Entries attached_permissions = { @@ -78,6 +78,6 @@ }; IN_PROC_BROWSER_TEST_F(MediaGalleriesInteractiveDialogTest, - InvokeDialog_DisplayDialog) { - RunDialog(); + InvokeUi_DisplayDialog) { + ShowAndVerifyUi(); }
diff --git a/chrome/browser/ui/views/extensions/pwa_confirmation_view_browsertest.cc b/chrome/browser/ui/views/extensions/pwa_confirmation_view_browsertest.cc index f71c7089..d971f78 100644 --- a/chrome/browser/ui/views/extensions/pwa_confirmation_view_browsertest.cc +++ b/chrome/browser/ui/views/extensions/pwa_confirmation_view_browsertest.cc
@@ -20,7 +20,7 @@ public: PWAConfirmationViewTest() {} - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { constexpr int kIconSize = 48; WebApplicationInfo::IconInfo icon_info; icon_info.data.allocN32Pixels(kIconSize, kIconSize, true); @@ -58,20 +58,20 @@ // Launches an installation confirmation dialog for a PWA with a short name and // origin. -IN_PROC_BROWSER_TEST_F(PWAConfirmationViewTest, InvokeDialog_short_text) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(PWAConfirmationViewTest, InvokeUi_short_text) { + ShowAndVerifyUi(); } // Launches an installation confirmation dialog for a PWA with name and origin // long enough to be elided. -IN_PROC_BROWSER_TEST_F(PWAConfirmationViewTest, InvokeDialog_long_text) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(PWAConfirmationViewTest, InvokeUi_long_text) { + ShowAndVerifyUi(); } // Launches an installation confirmation dialog for a PWA with an RTL subdomain // which is long enough to be elided. -IN_PROC_BROWSER_TEST_F(PWAConfirmationViewTest, InvokeDialog_rtl) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(PWAConfirmationViewTest, InvokeUi_rtl) { + ShowAndVerifyUi(); } } // namespace
diff --git a/chrome/browser/ui/views/extensions/request_file_system_dialog_browsertest.cc b/chrome/browser/ui/views/extensions/request_file_system_dialog_browsertest.cc index 34cb81a..dfc53bee 100644 --- a/chrome/browser/ui/views/extensions/request_file_system_dialog_browsertest.cc +++ b/chrome/browser/ui/views/extensions/request_file_system_dialog_browsertest.cc
@@ -21,7 +21,7 @@ public: RequestFileSystemDialogTest() {} - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { RequestFileSystemDialogView::ShowDialog( browser()->tab_strip_model()->GetActiveWebContents(), "RequestFileSystemDialogTest", "TestVolume", true, @@ -34,8 +34,8 @@ DISALLOW_COPY_AND_ASSIGN(RequestFileSystemDialogTest); }; -IN_PROC_BROWSER_TEST_F(RequestFileSystemDialogTest, InvokeDialog_default) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(RequestFileSystemDialogTest, InvokeUi_default) { + ShowAndVerifyUi(); } } // namespace
diff --git a/chrome/browser/ui/views/external_protocol_dialog_browsertest.cc b/chrome/browser/ui/views/external_protocol_dialog_browsertest.cc index 30cc493..e5f2570e 100644 --- a/chrome/browser/ui/views/external_protocol_dialog_browsertest.cc +++ b/chrome/browser/ui/views/external_protocol_dialog_browsertest.cc
@@ -77,7 +77,7 @@ ExternalProtocolDialogBrowserTest() {} // DialogBrowserTest: - void ShowDialog(const std::string& name = "") override { + void ShowUi(const std::string& name) override { content::WebContents* web_contents = browser()->tab_strip_model()->GetActiveWebContents(); int render_view_process_id = @@ -108,7 +108,7 @@ }; IN_PROC_BROWSER_TEST_F(ExternalProtocolDialogBrowserTest, TestAccept) { - ShowDialog(); + ShowUi(std::string()); EXPECT_TRUE(dialog_->Accept()); EXPECT_TRUE(called_); EXPECT_TRUE(accept_); @@ -120,7 +120,7 @@ IN_PROC_BROWSER_TEST_F(ExternalProtocolDialogBrowserTest, TestAcceptWithChecked) { - ShowDialog(); + ShowUi(std::string()); SetChecked(true); EXPECT_TRUE(dialog_->Accept()); EXPECT_TRUE(called_); @@ -132,7 +132,7 @@ } IN_PROC_BROWSER_TEST_F(ExternalProtocolDialogBrowserTest, TestCancel) { - ShowDialog(); + ShowUi(std::string()); EXPECT_TRUE(dialog_->Cancel()); EXPECT_FALSE(called_); EXPECT_FALSE(accept_); @@ -144,7 +144,7 @@ IN_PROC_BROWSER_TEST_F(ExternalProtocolDialogBrowserTest, TestCancelWithChecked) { - ShowDialog(); + ShowUi(std::string()); SetChecked(true); EXPECT_TRUE(dialog_->Cancel()); EXPECT_FALSE(called_); @@ -157,7 +157,7 @@ IN_PROC_BROWSER_TEST_F(ExternalProtocolDialogBrowserTest, TestClose) { // Closing the dialog should be the same as canceling, except for histograms. - ShowDialog(); + ShowUi(std::string()); EXPECT_TRUE(dialog_->Close()); EXPECT_FALSE(called_); EXPECT_FALSE(accept_); @@ -170,7 +170,7 @@ IN_PROC_BROWSER_TEST_F(ExternalProtocolDialogBrowserTest, TestCloseWithChecked) { // Closing the dialog should be the same as canceling, except for histograms. - ShowDialog(); + ShowUi(std::string()); SetChecked(true); EXPECT_TRUE(dialog_->Close()); EXPECT_FALSE(called_); @@ -182,8 +182,7 @@ } // Invokes a dialog that asks the user if an external application is allowed to -// run. See test_browser_dialog.h. -IN_PROC_BROWSER_TEST_F(ExternalProtocolDialogBrowserTest, - InvokeDialog_default) { - RunDialog(); +// run. +IN_PROC_BROWSER_TEST_F(ExternalProtocolDialogBrowserTest, InvokeUi_default) { + ShowAndVerifyUi(); }
diff --git a/chrome/browser/ui/views/feature_promos/bookmark_promo_dialog_browsertest.cc b/chrome/browser/ui/views/feature_promos/bookmark_promo_dialog_browsertest.cc index 62b4c01..2091ae81 100644 --- a/chrome/browser/ui/views/feature_promos/bookmark_promo_dialog_browsertest.cc +++ b/chrome/browser/ui/views/feature_promos/bookmark_promo_dialog_browsertest.cc
@@ -14,7 +14,7 @@ BookmarkPromoDialogTest() = default; // DialogBrowserTest: - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { BrowserView::GetBrowserViewForBrowser(browser()) ->toolbar() ->location_bar() @@ -26,10 +26,7 @@ DISALLOW_COPY_AND_ASSIGN(BookmarkPromoDialogTest); }; -// Test that calls ShowDialog("default"). Interactive when run via -// ../browser_tests --gtest_filter=BrowserDialogTest.Invoke --interactive -// --dialog=BookmarkPromoDialogTest.InvokeDialog_BookmarkPromoBubble -IN_PROC_BROWSER_TEST_F(BookmarkPromoDialogTest, - InvokeDialog_BookmarkPromoBubble) { - RunDialog(); +// Test that calls ShowUi("default"). +IN_PROC_BROWSER_TEST_F(BookmarkPromoDialogTest, InvokeUi_BookmarkPromoBubble) { + ShowAndVerifyUi(); }
diff --git a/chrome/browser/ui/views/feature_promos/incognito_window_promo_dialog_browsertest.cc b/chrome/browser/ui/views/feature_promos/incognito_window_promo_dialog_browsertest.cc index 2ad2b07..c394b9f 100644 --- a/chrome/browser/ui/views/feature_promos/incognito_window_promo_dialog_browsertest.cc +++ b/chrome/browser/ui/views/feature_promos/incognito_window_promo_dialog_browsertest.cc
@@ -16,7 +16,7 @@ IncognitoWindowPromoDialogTest() = default; // DialogBrowserTest: - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { feature_engagement::IncognitoWindowTrackerFactory::GetInstance() ->GetForProfile(browser()->profile()) ->ShowPromo(); @@ -28,13 +28,10 @@ } // namespace -// Test that calls ShowDialog("default"). Interactive when run via -// ../browser_tests --gtest_filter=BrowserDialogTest.Invoke -// --interactive -// --dialog=IncognitoWindowPromoDialogTest.InvokeDialog_IncognitoWindowPromo +// Test that calls ShowUi("default"). IN_PROC_BROWSER_TEST_F(IncognitoWindowPromoDialogTest, - InvokeDialog_IncognitoWindowPromo) { - RunDialog(); + InvokeUi_IncognitoWindowPromo) { + ShowAndVerifyUi(); } } // namespace feature_engagement
diff --git a/chrome/browser/ui/views/feature_promos/new_tab_promo_dialog_browsertest.cc b/chrome/browser/ui/views/feature_promos/new_tab_promo_dialog_browsertest.cc index 575e7f0..4c92c8d 100644 --- a/chrome/browser/ui/views/feature_promos/new_tab_promo_dialog_browsertest.cc +++ b/chrome/browser/ui/views/feature_promos/new_tab_promo_dialog_browsertest.cc
@@ -12,7 +12,7 @@ NewTabPromoDialogTest() = default; // DialogBrowserTest: - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { // The promo only exists in the TabStripImpl. TabStripImpl* tab_strip_impl = BrowserView::GetBrowserViewForBrowser(browser()) @@ -26,9 +26,7 @@ DISALLOW_COPY_AND_ASSIGN(NewTabPromoDialogTest); }; -// Test that calls ShowDialog("default"). Interactive when run via -// ../browser_tests --gtest_filter=BrowserDialogTest.Invoke -// --interactive --dialog=NewTabPromoDialogTest.InvokeDialog_NewTabPromo -IN_PROC_BROWSER_TEST_F(NewTabPromoDialogTest, InvokeDialog_NewTabPromo) { - RunDialog(); +// Test that calls ShowUi("default"). +IN_PROC_BROWSER_TEST_F(NewTabPromoDialogTest, InvokeUi_NewTabPromo) { + ShowAndVerifyUi(); }
diff --git a/chrome/browser/ui/views/first_run_bubble_browsertest.cc b/chrome/browser/ui/views/first_run_bubble_browsertest.cc index 997cb49a..b5ef1166 100644 --- a/chrome/browser/ui/views/first_run_bubble_browsertest.cc +++ b/chrome/browser/ui/views/first_run_bubble_browsertest.cc
@@ -14,7 +14,7 @@ FirstRunBubbleBrowserTest() {} // DialogBrowserTest: - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { FirstRunBubble::Show(browser()); } @@ -23,7 +23,7 @@ }; // 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(); +// with Google. +IN_PROC_BROWSER_TEST_F(FirstRunBubbleBrowserTest, InvokeUi_default) { + ShowAndVerifyUi(); }
diff --git a/chrome/browser/ui/views/hung_renderer_view_browsertest.cc b/chrome/browser/ui/views/hung_renderer_view_browsertest.cc index 8f669bf..7ed9b27 100644 --- a/chrome/browser/ui/views/hung_renderer_view_browsertest.cc +++ b/chrome/browser/ui/views/hung_renderer_view_browsertest.cc
@@ -20,7 +20,7 @@ HungRendererDialogViewBrowserTest() {} // DialogBrowserTest: - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { auto* web_contents = browser()->tab_strip_model()->GetActiveWebContents(); TabDialogs::FromWebContents(web_contents) ->ShowHungRendererDialog(content::WebContentsUnresponsiveState()); @@ -30,12 +30,11 @@ DISALLOW_COPY_AND_ASSIGN(HungRendererDialogViewBrowserTest); }; -// Invokes the hung renderer (aka page unresponsive) dialog. See -// test_browser_dialog.h. +// Invokes the hung renderer (aka page unresponsive) dialog. // TODO(tapted): The framework sometimes doesn't pick up the spawned dialog and -// the ASSERT_EQ in TestBrowserDialog::RunDialog() fails. This seems to only +// the ASSERT_EQ in TestBrowserUi::ShowAndVerifyUi() fails. This seems to only // happen on the bots. So the test is disabled for now. IN_PROC_BROWSER_TEST_F(HungRendererDialogViewBrowserTest, - DISABLED_InvokeDialog_default) { - RunDialog(); + DISABLED_InvokeUi_default) { + ShowAndVerifyUi(); }
diff --git a/chrome/browser/ui/views/importer/import_lock_dialog_view_browsertest.cc b/chrome/browser/ui/views/importer/import_lock_dialog_view_browsertest.cc index 766cc793..5e7c9d59 100644 --- a/chrome/browser/ui/views/importer/import_lock_dialog_view_browsertest.cc +++ b/chrome/browser/ui/views/importer/import_lock_dialog_view_browsertest.cc
@@ -15,7 +15,7 @@ ImportLockDialogViewBrowserTest() {} // DialogBrowserTest: - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { gfx::NativeWindow native_window = browser()->window()->GetNativeWindow(); ImportLockDialogView::Show(native_window, base::Callback<void(bool)>()); } @@ -25,7 +25,7 @@ }; // Invokes a dialog that implores the user to close Firefox before trying to -// import data. See test_browser_dialog.h. -IN_PROC_BROWSER_TEST_F(ImportLockDialogViewBrowserTest, InvokeDialog_default) { - RunDialog(); +// import data. +IN_PROC_BROWSER_TEST_F(ImportLockDialogViewBrowserTest, InvokeUi_default) { + ShowAndVerifyUi(); }
diff --git a/chrome/browser/ui/views/location_bar/content_setting_bubble_dialog_browsertest.cc b/chrome/browser/ui/views/location_bar/content_setting_bubble_dialog_browsertest.cc index 1b4996a..a0997fa 100644 --- a/chrome/browser/ui/views/location_bar/content_setting_bubble_dialog_browsertest.cc +++ b/chrome/browser/ui/views/location_bar/content_setting_bubble_dialog_browsertest.cc
@@ -39,7 +39,7 @@ void ShowDialogBubble(ContentSettingsType content_type, ContentSettingImageModel::ImageType image_type); - void ShowDialog(const std::string& name) override; + void ShowUi(const std::string& name) override; private: DISALLOW_COPY_AND_ASSIGN(ContentSettingBubbleDialogTest); @@ -110,7 +110,7 @@ static_cast<int>(image_type), 1); } -void ContentSettingBubbleDialogTest::ShowDialog(const std::string& name) { +void ContentSettingBubbleDialogTest::ShowUi(const std::string& name) { constexpr struct { const char* name; ContentSettingsType content_type; @@ -148,68 +148,63 @@ ADD_FAILURE() << "Unknown dialog type"; } -IN_PROC_BROWSER_TEST_F(ContentSettingBubbleDialogTest, InvokeDialog_cookies) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(ContentSettingBubbleDialogTest, InvokeUi_cookies) { + ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_F(ContentSettingBubbleDialogTest, InvokeDialog_images) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(ContentSettingBubbleDialogTest, InvokeUi_images) { + ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_F(ContentSettingBubbleDialogTest, - InvokeDialog_javascript) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(ContentSettingBubbleDialogTest, InvokeUi_javascript) { + ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_F(ContentSettingBubbleDialogTest, InvokeDialog_plugins) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(ContentSettingBubbleDialogTest, InvokeUi_plugins) { + ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_F(ContentSettingBubbleDialogTest, InvokeDialog_popups) { +IN_PROC_BROWSER_TEST_F(ContentSettingBubbleDialogTest, InvokeUi_popups) { ASSERT_TRUE(embedded_test_server()->Start()); - RunDialog(); + ShowAndVerifyUi(); +} + +IN_PROC_BROWSER_TEST_F(ContentSettingBubbleDialogTest, InvokeUi_geolocation) { + ShowAndVerifyUi(); +} + +IN_PROC_BROWSER_TEST_F(ContentSettingBubbleDialogTest, InvokeUi_ppapi_broker) { + ShowAndVerifyUi(); +} + +IN_PROC_BROWSER_TEST_F(ContentSettingBubbleDialogTest, InvokeUi_mixed_script) { + ShowAndVerifyUi(); } IN_PROC_BROWSER_TEST_F(ContentSettingBubbleDialogTest, - InvokeDialog_geolocation) { - RunDialog(); + InvokeUi_mediastream_mic) { + ShowAndVerifyUi(); } IN_PROC_BROWSER_TEST_F(ContentSettingBubbleDialogTest, - InvokeDialog_ppapi_broker) { - RunDialog(); + InvokeUi_mediastream_camera) { + ShowAndVerifyUi(); } IN_PROC_BROWSER_TEST_F(ContentSettingBubbleDialogTest, - InvokeDialog_mixed_script) { - RunDialog(); + InvokeUi_protocol_handlers) { + ShowAndVerifyUi(); } IN_PROC_BROWSER_TEST_F(ContentSettingBubbleDialogTest, - InvokeDialog_mediastream_mic) { - RunDialog(); + InvokeUi_automatic_downloads) { + ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_F(ContentSettingBubbleDialogTest, - InvokeDialog_mediastream_camera) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(ContentSettingBubbleDialogTest, InvokeUi_midi_sysex) { + ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_F(ContentSettingBubbleDialogTest, - InvokeDialog_protocol_handlers) { - RunDialog(); -} - -IN_PROC_BROWSER_TEST_F(ContentSettingBubbleDialogTest, - InvokeDialog_automatic_downloads) { - RunDialog(); -} - -IN_PROC_BROWSER_TEST_F(ContentSettingBubbleDialogTest, - InvokeDialog_midi_sysex) { - RunDialog(); -} - -IN_PROC_BROWSER_TEST_F(ContentSettingBubbleDialogTest, InvokeDialog_ads) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(ContentSettingBubbleDialogTest, InvokeUi_ads) { + ShowAndVerifyUi(); }
diff --git a/chrome/browser/ui/views/location_bar/zoom_bubble_view_browsertest.cc b/chrome/browser/ui/views/location_bar/zoom_bubble_view_browsertest.cc index c1db4d9..530eafe 100644 --- a/chrome/browser/ui/views/location_bar/zoom_bubble_view_browsertest.cc +++ b/chrome/browser/ui/views/location_bar/zoom_bubble_view_browsertest.cc
@@ -162,7 +162,7 @@ ZoomBubbleDialogTest() {} // DialogBrowserTest: - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { BrowserView* browser_view = static_cast<BrowserView*>(browser()->window()); content::WebContents* web_contents = browser_view->GetActiveWebContents(); ZoomBubbleView::ShowBubble(web_contents, gfx::Point(), @@ -173,9 +173,7 @@ DISALLOW_COPY_AND_ASSIGN(ZoomBubbleDialogTest); }; -// Test that calls ShowDialog("default"). Interactive when run via -// browser_tests --gtest_filter=BrowserDialogTest.Invoke --interactive -// --dialog=ZoomBubbleDialogTest.InvokeDialog_default -IN_PROC_BROWSER_TEST_F(ZoomBubbleDialogTest, InvokeDialog_default) { - RunDialog(); +// Test that calls ShowUi("default"). +IN_PROC_BROWSER_TEST_F(ZoomBubbleDialogTest, InvokeUi_default) { + ShowAndVerifyUi(); }
diff --git a/chrome/browser/ui/views/page_info/page_info_bubble_view_browsertest.cc b/chrome/browser/ui/views/page_info/page_info_bubble_view_browsertest.cc index 488939be..5bf4408c 100644 --- a/chrome/browser/ui/views/page_info/page_info_bubble_view_browsertest.cc +++ b/chrome/browser/ui/views/page_info/page_info_bubble_view_browsertest.cc
@@ -113,7 +113,7 @@ PageInfoBubbleViewBrowserTest() {} // DialogBrowserTest: - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { // All the possible test names. constexpr char kInsecure[] = "Insecure"; constexpr char kInternal[] = "Internal"; @@ -396,90 +396,88 @@ } // Shows the Page Info bubble for a HTTP page (specifically, about:blank). -IN_PROC_BROWSER_TEST_F(PageInfoBubbleViewBrowserTest, InvokeDialog_Insecure) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(PageInfoBubbleViewBrowserTest, InvokeUi_Insecure) { + ShowAndVerifyUi(); } // Shows the Page Info bubble for a HTTPS page. -IN_PROC_BROWSER_TEST_F(PageInfoBubbleViewBrowserTest, InvokeDialog_Secure) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(PageInfoBubbleViewBrowserTest, InvokeUi_Secure) { + ShowAndVerifyUi(); } // Shows the Page Info bubble for an internal page, e.g. chrome://settings. -IN_PROC_BROWSER_TEST_F(PageInfoBubbleViewBrowserTest, InvokeDialog_Internal) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(PageInfoBubbleViewBrowserTest, InvokeUi_Internal) { + ShowAndVerifyUi(); } // Shows the Page Info bubble for an extensions page. IN_PROC_BROWSER_TEST_F(PageInfoBubbleViewBrowserTest, - InvokeDialog_InternalExtension) { - RunDialog(); + InvokeUi_InternalExtension) { + ShowAndVerifyUi(); } // Shows the Page Info bubble for a chrome page that displays the source HTML. IN_PROC_BROWSER_TEST_F(PageInfoBubbleViewBrowserTest, - InvokeDialog_InternalViewSource) { - RunDialog(); + InvokeUi_InternalViewSource) { + ShowAndVerifyUi(); } // Shows the Page Info bubble for a site flagged for malware by Safe Browsing. -IN_PROC_BROWSER_TEST_F(PageInfoBubbleViewBrowserTest, InvokeDialog_Malware) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(PageInfoBubbleViewBrowserTest, InvokeUi_Malware) { + ShowAndVerifyUi(); } // Shows the Page Info bubble for a site flagged for social engineering by Safe // Browsing. -IN_PROC_BROWSER_TEST_F(PageInfoBubbleViewBrowserTest, InvokeDialog_Deceptive) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(PageInfoBubbleViewBrowserTest, InvokeUi_Deceptive) { + ShowAndVerifyUi(); } // Shows the Page Info bubble for a site flagged for distributing unwanted // software by Safe Browsing. IN_PROC_BROWSER_TEST_F(PageInfoBubbleViewBrowserTest, - InvokeDialog_UnwantedSoftware) { - RunDialog(); + InvokeUi_UnwantedSoftware) { + ShowAndVerifyUi(); } // Shows the Page Info bubble Safe Browsing soft warning after detecting the // user has re-used an existing password on a site, e.g. due to phishing. IN_PROC_BROWSER_TEST_F(PageInfoBubbleViewBrowserTest, - InvokeDialog_PasswordReuseSoft) { - RunDialog(); + InvokeUi_PasswordReuseSoft) { + ShowAndVerifyUi(); } // Shows the Page Info bubble Safe Browsing warning after detecting the user has // re-used an existing password on a site, e.g. due to phishing. -IN_PROC_BROWSER_TEST_F(PageInfoBubbleViewBrowserTest, - InvokeDialog_PasswordReuse) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(PageInfoBubbleViewBrowserTest, InvokeUi_PasswordReuse) { + ShowAndVerifyUi(); } // Shows the Page Info bubble for an admin-provided cert when the page is // secure, but has a form that submits to an insecure url. IN_PROC_BROWSER_TEST_F(PageInfoBubbleViewBrowserTest, - InvokeDialog_MixedContentForm) { - RunDialog(); + InvokeUi_MixedContentForm) { + ShowAndVerifyUi(); } // Shows the Page Info bubble for an admin-provided cert when the page is // secure, but it uses insecure resources (e.g. images). -IN_PROC_BROWSER_TEST_F(PageInfoBubbleViewBrowserTest, - InvokeDialog_MixedContent) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(PageInfoBubbleViewBrowserTest, InvokeUi_MixedContent) { + ShowAndVerifyUi(); } // Shows the Page Info bubble with all the permissions displayed with 'Allow' // set. All permissions will show regardless of its factory default value. IN_PROC_BROWSER_TEST_F(PageInfoBubbleViewBrowserTest, - InvokeDialog_AllowAllPermissions) { - RunDialog(); + InvokeUi_AllowAllPermissions) { + ShowAndVerifyUi(); } // Shows the Page Info bubble with all the permissions displayed with 'Block' // set. All permissions will show regardless of its factory default value. IN_PROC_BROWSER_TEST_F(PageInfoBubbleViewBrowserTest, - InvokeDialog_BlockAllPermissions) { - RunDialog(); + InvokeUi_BlockAllPermissions) { + ShowAndVerifyUi(); } IN_PROC_BROWSER_TEST_F(PageInfoBubbleViewBrowserTest,
diff --git a/chrome/browser/ui/views/passwords/manage_password_items_view.cc b/chrome/browser/ui/views/passwords/manage_password_items_view.cc index 800181f3..b7ff76bf 100644 --- a/chrome/browser/ui/views/passwords/manage_password_items_view.cc +++ b/chrome/browser/ui/views/passwords/manage_password_items_view.cc
@@ -133,7 +133,7 @@ label->SetObscured(true); if (!form.federation_origin.unique()) label->SetElideBehavior(gfx::ELIDE_HEAD); - label->SetFocusBehavior(views::View::FocusBehavior::ACCESSIBLE_ONLY); + return label; }
diff --git a/chrome/browser/ui/views/passwords/manage_passwords_bubble_view_browsertest.cc b/chrome/browser/ui/views/passwords/manage_passwords_bubble_view_browsertest.cc index 52bbfa30..3832fe17b 100644 --- a/chrome/browser/ui/views/passwords/manage_passwords_bubble_view_browsertest.cc +++ b/chrome/browser/ui/views/passwords/manage_passwords_bubble_view_browsertest.cc
@@ -16,7 +16,7 @@ ManagePasswordsBubbleDialogViewTest() {} ~ManagePasswordsBubbleDialogViewTest() override {} - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { if (name == "PendingPasswordBubble") { SetupPendingPassword(); } else if (name == "AutomaticPasswordBubble") { @@ -40,12 +40,12 @@ } } - // SupportsTestDialog: + // SupportsTestUi: void SetUp() override { #if defined(OS_MACOSX) UseMdOnly(); // This needs to be called during SetUp() on Mac. #endif - SupportsTestDialog::SetUp(); + SupportsTestUi::SetUp(); } private: @@ -53,23 +53,23 @@ }; IN_PROC_BROWSER_TEST_F(ManagePasswordsBubbleDialogViewTest, - InvokeDialog_PendingPasswordBubble) { - RunDialog(); + InvokeUi_PendingPasswordBubble) { + ShowAndVerifyUi(); } IN_PROC_BROWSER_TEST_F(ManagePasswordsBubbleDialogViewTest, - InvokeDialog_AutomaticPasswordBubble) { - RunDialog(); + InvokeUi_AutomaticPasswordBubble) { + ShowAndVerifyUi(); } // Disabled: ExecuteManagePasswordsCommand() spins a runloop which will be flaky // in a browser test. See http://crbug.com/716681. IN_PROC_BROWSER_TEST_F(ManagePasswordsBubbleDialogViewTest, - DISABLED_InvokeDialog_ManagePasswordBubble) { - RunDialog(); + DISABLED_InvokeUi_ManagePasswordBubble) { + ShowAndVerifyUi(); } IN_PROC_BROWSER_TEST_F(ManagePasswordsBubbleDialogViewTest, - InvokeDialog_AutoSignin) { - RunDialog(); + InvokeUi_AutoSignin) { + ShowAndVerifyUi(); }
diff --git a/chrome/browser/ui/views/passwords/password_dialog_view_browsertest.cc b/chrome/browser/ui/views/passwords/password_dialog_view_browsertest.cc index 414d8fa..2fbc4dd 100644 --- a/chrome/browser/ui/views/passwords/password_dialog_view_browsertest.cc +++ b/chrome/browser/ui/views/passwords/password_dialog_view_browsertest.cc
@@ -99,7 +99,7 @@ public: // DialogBrowserTest: void SetUpOnMainThread() override; - void ShowDialog(const std::string& name) override; + void ShowUi(const std::string& name) override; void SetupChooseCredentials( std::vector<std::unique_ptr<autofill::PasswordForm>> local_credentials, @@ -435,7 +435,7 @@ } // DialogBrowserTest methods for interactive dialog invocation. -void PasswordDialogViewTest::ShowDialog(const std::string& name) { +void PasswordDialogViewTest::ShowUi(const std::string& name) { if (name == "AutoSigninFirstRun") { controller()->OnPromptEnableAutoSignin(); return; @@ -489,26 +489,24 @@ } } -IN_PROC_BROWSER_TEST_F(PasswordDialogViewTest, - InvokeDialog_PopupAutoSigninPrompt) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(PasswordDialogViewTest, InvokeUi_PopupAutoSigninPrompt) { + ShowAndVerifyUi(); } IN_PROC_BROWSER_TEST_F( PasswordDialogViewTest, - InvokeDialog_PopupAccountChooserWithSingleCredentialClickSignIn) { - RunDialog(); + InvokeUi_PopupAccountChooserWithSingleCredentialClickSignIn) { + ShowAndVerifyUi(); } IN_PROC_BROWSER_TEST_F( PasswordDialogViewTest, - InvokeDialog_PopupAccountChooserWithMultipleCredentialClickSignIn) { - RunDialog(); + InvokeUi_PopupAccountChooserWithMultipleCredentialClickSignIn) { + ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_F(PasswordDialogViewTest, - InvokeDialog_AutoSigninFirstRun) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(PasswordDialogViewTest, InvokeUi_AutoSigninFirstRun) { + ShowAndVerifyUi(); } } // namespace
diff --git a/chrome/browser/ui/views/payments/payment_request_browsertest.cc b/chrome/browser/ui/views/payments/payment_request_browsertest.cc index 2c9f80f3..97b6f5e 100644 --- a/chrome/browser/ui/views/payments/payment_request_browsertest.cc +++ b/chrome/browser/ui/views/payments/payment_request_browsertest.cc
@@ -434,9 +434,7 @@ PaymentsRequestVisualTest() {} // TestBrowserDialog: - void ShowDialog(const std::string& name) override { - InvokePaymentRequestUI(); - } + void ShowUi(const std::string& name) override { InvokePaymentRequestUI(); } bool AlwaysCloseAsynchronously() override { // Bypassing Widget::CanClose() causes payments::JourneyLogger to see the @@ -448,9 +446,9 @@ DISALLOW_COPY_AND_ASSIGN(PaymentsRequestVisualTest); }; -IN_PROC_BROWSER_TEST_F(PaymentsRequestVisualTest, InvokeDialog_NoShipping) { +IN_PROC_BROWSER_TEST_F(PaymentsRequestVisualTest, InvokeUi_NoShipping) { NavigateTo("/payment_request_no_shipping_test.html"); - RunDialog(); + ShowAndVerifyUi(); } class PaymentRequestSettingsLinkTest : public PaymentRequestBrowserTestBase {
diff --git a/chrome/browser/ui/views/permission_bubble/chooser_bubble_ui.cc b/chrome/browser/ui/views/permission_bubble/chooser_bubble_ui.cc index ce5d97e..7f73dca4 100644 --- a/chrome/browser/ui/views/permission_bubble/chooser_bubble_ui.cc +++ b/chrome/browser/ui/views/permission_bubble/chooser_bubble_ui.cc
@@ -12,8 +12,10 @@ #include "chrome/browser/ui/views/device_chooser_content_view.h" #include "components/bubble/bubble_controller.h" #include "ui/views/bubble/bubble_dialog_delegate.h" +#include "ui/views/controls/button/label_button.h" #include "ui/views/controls/styled_label.h" #include "ui/views/controls/table/table_view_observer.h" +#include "ui/views/window/dialog_client_view.h" namespace { @@ -46,7 +48,8 @@ // views::DialogDelegate: base::string16 GetDialogButtonLabel(ui::DialogButton button) const override; bool IsDialogButtonEnabled(ui::DialogButton button) const override; - views::View* CreateFootnoteView() override; + views::View* GetInitiallyFocusedView() override; + views::View* CreateExtraView() override; bool Accept() override; bool Cancel() override; bool Close() override; @@ -107,6 +110,10 @@ return device_chooser_content_view_->GetWindowTitle(); } +views::View* ChooserBubbleUiViewDelegate::GetInitiallyFocusedView() { + return GetDialogClientView()->cancel_button(); +} + base::string16 ChooserBubbleUiViewDelegate::GetDialogButtonLabel( ui::DialogButton button) const { return device_chooser_content_view_->GetDialogButtonLabel(button); @@ -117,8 +124,10 @@ return device_chooser_content_view_->IsDialogButtonEnabled(button); } -views::View* ChooserBubbleUiViewDelegate::CreateFootnoteView() { - return device_chooser_content_view_->footnote_link(); +views::View* ChooserBubbleUiViewDelegate::CreateExtraView() { + std::unique_ptr<views::View> extra_view = + device_chooser_content_view_->CreateExtraView(); + return extra_view ? extra_view.release() : nullptr; } bool ChooserBubbleUiViewDelegate::Accept() {
diff --git a/chrome/browser/ui/views/profiles/forced_reauthentication_dialog_view_browsertest.cc b/chrome/browser/ui/views/profiles/forced_reauthentication_dialog_view_browsertest.cc index 33d1dfd77..1bc5832 100644 --- a/chrome/browser/ui/views/profiles/forced_reauthentication_dialog_view_browsertest.cc +++ b/chrome/browser/ui/views/profiles/forced_reauthentication_dialog_view_browsertest.cc
@@ -20,7 +20,7 @@ ForcedReauthenticationDialogViewBrowserTest() {} // override DialogBrowserTest - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { Profile* profile = browser()->profile(); SigninManager* manager = SigninManagerFactory::GetForProfile(profile); manager->SetAuthenticatedAccountInfo("test1", "test@xyz.com"); @@ -35,8 +35,8 @@ }; IN_PROC_BROWSER_TEST_F(ForcedReauthenticationDialogViewBrowserTest, - InvokeDialog_default) { - RunDialog(); + InvokeUi_default) { + ShowAndVerifyUi(); } // Dialog will not be display if there is no valid browser window.
diff --git a/chrome/browser/ui/views/profiles/profile_chooser_view_browsertest.cc b/chrome/browser/ui/views/profiles/profile_chooser_view_browsertest.cc index acb51eb1..cb201662 100644 --- a/chrome/browser/ui/views/profiles/profile_chooser_view_browsertest.cc +++ b/chrome/browser/ui/views/profiles/profile_chooser_view_browsertest.cc
@@ -125,8 +125,8 @@ ProfileChooserViewExtensionsTest() {} ~ProfileChooserViewExtensionsTest() override {} - // SupportsTestDialog: - void ShowDialog(const std::string& name) override { + // SupportsTestUi: + void ShowUi(const std::string& name) override { constexpr char kSignedIn[] = "SignedIn"; constexpr char kMultiProfile[] = "MultiProfile"; constexpr char kGuest[] = "Guest"; @@ -388,43 +388,42 @@ } // Shows a non-signed in profile with no others. -IN_PROC_BROWSER_TEST_F(ProfileChooserViewExtensionsTest, InvokeDialog_default) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(ProfileChooserViewExtensionsTest, InvokeUi_default) { + ShowAndVerifyUi(); } // Shows a signed in profile with no others. -IN_PROC_BROWSER_TEST_F(ProfileChooserViewExtensionsTest, - InvokeDialog_SignedIn) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(ProfileChooserViewExtensionsTest, InvokeUi_SignedIn) { + ShowAndVerifyUi(); } // Shows the |ProfileChooserView| with three different profiles. IN_PROC_BROWSER_TEST_F(ProfileChooserViewExtensionsTest, - InvokeDialog_MultiProfile) { - RunDialog(); + InvokeUi_MultiProfile) { + ShowAndVerifyUi(); } // Shows the |ProfileChooserView| during a Guest browsing session. -IN_PROC_BROWSER_TEST_F(ProfileChooserViewExtensionsTest, InvokeDialog_Guest) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(ProfileChooserViewExtensionsTest, InvokeUi_Guest) { + ShowAndVerifyUi(); } // Shows the manage account link, which appears when account consistency is // enabled for signed-in accounts. IN_PROC_BROWSER_TEST_F(ProfileChooserViewExtensionsTest, - InvokeDialog_ManageAccountLink) { - RunDialog(); + InvokeUi_ManageAccountLink) { + ShowAndVerifyUi(); } // Shows the |ProfileChooserView| from a signed-in account that has a supervised // user profile attached. IN_PROC_BROWSER_TEST_F(ProfileChooserViewExtensionsTest, - InvokeDialog_SupervisedOwner) { - RunDialog(); + InvokeUi_SupervisedOwner) { + ShowAndVerifyUi(); } // Shows the |ProfileChooserView| when a supervised user is the active profile. IN_PROC_BROWSER_TEST_F(ProfileChooserViewExtensionsTest, - InvokeDialog_SupervisedUser) { - RunDialog(); + InvokeUi_SupervisedUser) { + ShowAndVerifyUi(); }
diff --git a/chrome/browser/ui/views/safe_browsing/password_reuse_modal_warning_dialog_browsertest.cc b/chrome/browser/ui/views/safe_browsing/password_reuse_modal_warning_dialog_browsertest.cc index 1ec7bd6a..a8dc24b 100644 --- a/chrome/browser/ui/views/safe_browsing/password_reuse_modal_warning_dialog_browsertest.cc +++ b/chrome/browser/ui/views/safe_browsing/password_reuse_modal_warning_dialog_browsertest.cc
@@ -27,7 +27,7 @@ ~PasswordReuseModalWarningTest() override {} // DialogBrowserTest: - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { content::WebContents* web_contents = browser()->tab_strip_model()->GetActiveWebContents(); dialog_ = new PasswordReuseModalWarningDialog( @@ -59,16 +59,16 @@ DISALLOW_COPY_AND_ASSIGN(PasswordReuseModalWarningTest); }; -IN_PROC_BROWSER_TEST_F(PasswordReuseModalWarningTest, InvokeDialog_default) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(PasswordReuseModalWarningTest, InvokeUi_default) { + ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_F(PasswordReuseModalWarningTest, InvokeDialog_softer) { +IN_PROC_BROWSER_TEST_F(PasswordReuseModalWarningTest, InvokeUi_softer) { base::test::ScopedFeatureList feature_list; feature_list.InitAndEnableFeatureWithParameters( safe_browsing::kGoogleBrandedPhishingWarning, {{"softer_warning", "true"}}); - RunDialog(); + ShowAndVerifyUi(); } IN_PROC_BROWSER_TEST_F(PasswordReuseModalWarningTest, TestBasicDialogBehavior) { @@ -76,13 +76,13 @@ // Simulating a click on ui::DIALOG_BUTTON_OK button results in a // CHANGE_PASSWORD action. - ShowDialog(std::string()); + ShowUi(std::string()); dialog_->GetDialogClientView()->AcceptWindow(); EXPECT_EQ(PasswordProtectionService::CHANGE_PASSWORD, latest_user_action_); // Simulating a click on ui::DIALOG_BUTTON_CANCEL button results in an // IGNORE_WARNING action. - ShowDialog(std::string()); + ShowUi(std::string()); dialog_->GetDialogClientView()->CancelWindow(); EXPECT_EQ(PasswordProtectionService::IGNORE_WARNING, latest_user_action_); } @@ -91,7 +91,7 @@ CloseDialogWhenWebContentsDestroyed) { ASSERT_TRUE(embedded_test_server()->Start()); - ShowDialog(std::string()); + ShowUi(std::string()); CloseActiveWebContents(); EXPECT_EQ(PasswordProtectionService::CLOSE, latest_user_action_); }
diff --git a/chrome/browser/ui/views/session_crashed_bubble_view_browsertest.cc b/chrome/browser/ui/views/session_crashed_bubble_view_browsertest.cc index 938c5049..827bba3 100644 --- a/chrome/browser/ui/views/session_crashed_bubble_view_browsertest.cc +++ b/chrome/browser/ui/views/session_crashed_bubble_view_browsertest.cc
@@ -18,7 +18,7 @@ SessionCrashedBubbleViewTest() {} ~SessionCrashedBubbleViewTest() override {} - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { views::View* anchor_view = BrowserView::GetBrowserViewForBrowser(browser()) ->toolbar() ->app_menu_button(); @@ -32,6 +32,6 @@ }; IN_PROC_BROWSER_TEST_F(SessionCrashedBubbleViewTest, - InvokeDialog_SessionCrashedBubble) { - RunDialog(); + InvokeUi_SessionCrashedBubble) { + ShowAndVerifyUi(); }
diff --git a/chrome/browser/ui/views/settings_reset_prompt_dialog_browsertest.cc b/chrome/browser/ui/views/settings_reset_prompt_dialog_browsertest.cc index 31a4243..346cde5a 100644 --- a/chrome/browser/ui/views/settings_reset_prompt_dialog_browsertest.cc +++ b/chrome/browser/ui/views/settings_reset_prompt_dialog_browsertest.cc
@@ -148,7 +148,7 @@ class SettingsResetPromptDialogTest : public DialogBrowserTest { public: - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { const std::map<std::string, ModelParams> name_to_model_params = { {"DefaultSearchEngineChanged", {SettingType::DEFAULT_SEARCH_ENGINE, 0, 0}}, @@ -183,55 +183,54 @@ }; IN_PROC_BROWSER_TEST_F(SettingsResetPromptDialogTest, - InvokeDialog_DefaultSearchEngineChanged) { - RunDialog(); + InvokeUi_DefaultSearchEngineChanged) { + ShowAndVerifyUi(); } IN_PROC_BROWSER_TEST_F(SettingsResetPromptDialogTest, - InvokeDialog_SingleStartupPageChanged) { - RunDialog(); + InvokeUi_SingleStartupPageChanged) { + ShowAndVerifyUi(); } IN_PROC_BROWSER_TEST_F(SettingsResetPromptDialogTest, - InvokeDialog_MultipleStartupPagesChanged) { - RunDialog(); + InvokeUi_MultipleStartupPagesChanged) { + ShowAndVerifyUi(); } IN_PROC_BROWSER_TEST_F(SettingsResetPromptDialogTest, - InvokeDialog_HomePageChanged) { - RunDialog(); + InvokeUi_HomePageChanged) { + ShowAndVerifyUi(); } IN_PROC_BROWSER_TEST_F(SettingsResetPromptDialogTest, - InvokeDialog_DefaultSearchEngineChangedByExtension) { - RunDialog(); + InvokeUi_DefaultSearchEngineChangedByExtension) { + ShowAndVerifyUi(); } IN_PROC_BROWSER_TEST_F(SettingsResetPromptDialogTest, - InvokeDialog_SingleStartupPageChangedByExtension) { - RunDialog(); + InvokeUi_SingleStartupPageChangedByExtension) { + ShowAndVerifyUi(); } IN_PROC_BROWSER_TEST_F(SettingsResetPromptDialogTest, - InvokeDialog_MultipleStartupPagesChangedByExtension) { - RunDialog(); + InvokeUi_MultipleStartupPagesChangedByExtension) { + ShowAndVerifyUi(); } IN_PROC_BROWSER_TEST_F(SettingsResetPromptDialogTest, - InvokeDialog_HomePageChangedByExtension) { - RunDialog(); + InvokeUi_HomePageChangedByExtension) { + ShowAndVerifyUi(); } IN_PROC_BROWSER_TEST_F( SettingsResetPromptDialogTest, - InvokeDialog_DefaultSearchEngineChangedByMultipleExtensions) { - RunDialog(); -} -IN_PROC_BROWSER_TEST_F( - SettingsResetPromptDialogTest, - InvokeDialog_SingleStartupPageChangedByMultipleExtensions) { - RunDialog(); -} -IN_PROC_BROWSER_TEST_F( - SettingsResetPromptDialogTest, - InvokeDialog_MultipleStartupPagesChangedByMultipleExtensions) { - RunDialog(); + InvokeUi_DefaultSearchEngineChangedByMultipleExtensions) { + ShowAndVerifyUi(); } IN_PROC_BROWSER_TEST_F(SettingsResetPromptDialogTest, - InvokeDialog_HomePageChangedByMultipleExtensions) { - RunDialog(); + InvokeUi_SingleStartupPageChangedByMultipleExtensions) { + ShowAndVerifyUi(); +} +IN_PROC_BROWSER_TEST_F( + SettingsResetPromptDialogTest, + InvokeUi_MultipleStartupPagesChangedByMultipleExtensions) { + ShowAndVerifyUi(); +} +IN_PROC_BROWSER_TEST_F(SettingsResetPromptDialogTest, + InvokeUi_HomePageChangedByMultipleExtensions) { + ShowAndVerifyUi(); } } // namespace
diff --git a/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views_browsertest.cc b/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views_browsertest.cc index f0f1d46..ff3af99 100644 --- a/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views_browsertest.cc +++ b/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views_browsertest.cc
@@ -43,7 +43,7 @@ DialogBrowserTest::SetUp(); } - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { Profile* profile = browser()->profile(); // Add a bookmark to ensure CheckShouldPromptForNewProfile() returns true. @@ -65,10 +65,7 @@ DISALLOW_COPY_AND_ASSIGN(ProfileSigninConfirmationDialogTest); }; -// Test that calls ShowDialog("default"). Interactive when run via -// browser_tests --gtest_filter=BrowserDialogTest.Invoke --interactive -// --dialog=ProfileSigninConfirmationDialogTest.InvokeDialog_default -IN_PROC_BROWSER_TEST_F(ProfileSigninConfirmationDialogTest, - InvokeDialog_default) { - RunDialog(); +// Test that calls ShowUi("default"). +IN_PROC_BROWSER_TEST_F(ProfileSigninConfirmationDialogTest, InvokeUi_default) { + ShowAndVerifyUi(); }
diff --git a/chrome/browser/ui/views/toolbar/outdated_upgrade_bubble_view_browsertest.cc b/chrome/browser/ui/views/toolbar/outdated_upgrade_bubble_view_browsertest.cc index bd9b68b5..58fb244 100644 --- a/chrome/browser/ui/views/toolbar/outdated_upgrade_bubble_view_browsertest.cc +++ b/chrome/browser/ui/views/toolbar/outdated_upgrade_bubble_view_browsertest.cc
@@ -14,7 +14,7 @@ OutdatedUpgradeBubbleTest() = default; // DialogBrowserTest: - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { ToolbarView* toolbar_view = BrowserView::GetBrowserViewForBrowser(browser())->toolbar(); if (name == "Outdated") @@ -31,17 +31,17 @@ DISALLOW_COPY_AND_ASSIGN(OutdatedUpgradeBubbleTest); }; -IN_PROC_BROWSER_TEST_F(OutdatedUpgradeBubbleTest, InvokeDialog_Outdated) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(OutdatedUpgradeBubbleTest, InvokeUi_Outdated) { + ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_F(OutdatedUpgradeBubbleTest, InvokeDialog_NoAutoUpdate) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(OutdatedUpgradeBubbleTest, InvokeUi_NoAutoUpdate) { + ShowAndVerifyUi(); } // The critical upgrade dialog is intentionally only shown on Windows. #if defined(OS_WIN) -IN_PROC_BROWSER_TEST_F(OutdatedUpgradeBubbleTest, InvokeDialog_Critical) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(OutdatedUpgradeBubbleTest, InvokeUi_Critical) { + ShowAndVerifyUi(); } #endif
diff --git a/chrome/browser/ui/views/try_chrome_dialog_win/try_chrome_dialog_browsertest.cc b/chrome/browser/ui/views/try_chrome_dialog_win/try_chrome_dialog_browsertest.cc index b3ecee5..0c7f30b1 100644 --- a/chrome/browser/ui/views/try_chrome_dialog_win/try_chrome_dialog_browsertest.cc +++ b/chrome/browser/ui/views/try_chrome_dialog_win/try_chrome_dialog_browsertest.cc
@@ -78,7 +78,7 @@ // functionality. class TryChromeDialogBrowserTestBase : public InProcessBrowserTest { public: - // Breaks ShowDialog() out of its modal run loop. + // Breaks ShowDialogSync() out of its modal run loop. void QuitModalLoop() { if (quit_closure_) quit_closure_.Run(); @@ -289,19 +289,19 @@ TryChromeDialogTest() : SupportsTestDialog<TryChromeDialogBrowserTestBase>(GetParam()) {} - // SupportsTestDialog: + // SupportsTestUi: void SetUp() override { UseMdOnly(); - SupportsTestDialog::SetUp(); + SupportsTestUi::SetUp(); } - void ShowDialog(const std::string& name) override { ShowDialogSync(); } + void ShowUi(const std::string& name) override { ShowDialogSync(); } private: DISALLOW_COPY_AND_ASSIGN(TryChromeDialogTest); }; -IN_PROC_BROWSER_TEST_P(TryChromeDialogTest, InvokeDialog_default) { - RunDialog(); +IN_PROC_BROWSER_TEST_P(TryChromeDialogTest, InvokeUi_default) { + ShowAndVerifyUi(); } INSTANTIATE_TEST_CASE_P(
diff --git a/chrome/browser/ui/views/uninstall_view_browsertest.cc b/chrome/browser/ui/views/uninstall_view_browsertest.cc index 7a37338..cc6a8f2 100644 --- a/chrome/browser/ui/views/uninstall_view_browsertest.cc +++ b/chrome/browser/ui/views/uninstall_view_browsertest.cc
@@ -14,7 +14,7 @@ UninstallViewBrowserTest() {} // DialogBrowserTest: - void ShowDialog(const std::string& name) override { + void ShowUi(const std::string& name) override { // UninstallView may need to know whether Chrome is the default browser, // which requires IO. Since this is a test, we'll just allow that. base::ThreadRestrictions::SetIOAllowed(true); @@ -31,12 +31,10 @@ DISALLOW_COPY_AND_ASSIGN(UninstallViewBrowserTest); }; -// Invokes a dialog confirming that the user wants to uninstall Chrome. See -// test_browser_dialog.h. +// Invokes a dialog confirming that the user wants to uninstall Chrome. // Disabled because the build bots don't click to dismiss the dialog, they just // wait for it to time out. Unfortunately because we have to explicitly exit -// (see ShowDialog above) this approach doesn't work. -IN_PROC_BROWSER_TEST_F(UninstallViewBrowserTest, - DISABLED_InvokeDialog_default) { - RunDialog(); +// (see ShowUi above) this approach doesn't work. +IN_PROC_BROWSER_TEST_F(UninstallViewBrowserTest, DISABLED_InvokeUi_default) { + ShowAndVerifyUi(); }
diff --git a/chrome/browser/ui/webui/interventions_internals/interventions_internals_page_handler.cc b/chrome/browser/ui/webui/interventions_internals/interventions_internals_page_handler.cc index 5b98e6c53..2cd8d3a9 100644 --- a/chrome/browser/ui/webui/interventions_internals/interventions_internals_page_handler.cc +++ b/chrome/browser/ui/webui/interventions_internals/interventions_internals_page_handler.cc
@@ -9,6 +9,7 @@ #include "base/base_switches.h" #include "base/command_line.h" +#include "base/time/time.h" #include "build/build_config.h" #include "chrome/browser/flag_descriptions.h" #include "chrome/browser/net/nqe/ui_network_quality_estimator_service.h" @@ -91,7 +92,6 @@ mojom::InterventionsInternalsPagePtr page) { page_ = std::move(page); DCHECK(page_); - OnEffectiveConnectionTypeChanged(current_estimated_ect_); logger_->AddAndNotifyObserver(this); ui_nqe_service_->AddEffectiveConnectionTypeObserver(this); } @@ -103,8 +103,15 @@ // Don't try to notify the page if |page_| is not ready. return; } - page_->OnEffectiveConnectionTypeChanged( - net::GetNameForEffectiveConnectionType(type)); + std::string ect_name = net::GetNameForEffectiveConnectionType(type); + page_->OnEffectiveConnectionTypeChanged(ect_name); + + // Log change ECT event. + previews::PreviewsLogger::MessageLog message( + "ECT Changed" /* event_type */, + "Effective Connection Type changed to " + ect_name, GURL(""), + base::Time::Now(), 0 /* page_id */); + OnNewMessageLogAdded(message); } void InterventionsInternalsPageHandler::OnNewMessageLogAdded(
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc index c324c609..152141a 100644 --- a/chrome/common/chrome_features.cc +++ b/chrome/common/chrome_features.cc
@@ -579,7 +579,7 @@ // Enables or disables Chrome OS Component updates on Chrome OS. const base::Feature kCrOSComponent{"CrOSComponent", - base::FEATURE_DISABLED_BY_DEFAULT}; + base::FEATURE_ENABLED_BY_DEFAULT}; // Enables or disables Chrome OS Container utility on Chrome OS. const base::Feature kCrOSContainer{"CrOSContainer",
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 8c0c443..66c0f67 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -784,11 +784,13 @@ "../browser/ui/sync/profile_signin_confirmation_helper_browsertest.cc", "../browser/ui/tab_modal_confirm_dialog_browsertest.cc", "../browser/ui/tab_modal_confirm_dialog_browsertest.h", - "../browser/ui/test/browser_dialog_browsertest.cc", + "../browser/ui/test/browser_ui_browsertest.cc", "../browser/ui/test/test_browser_dialog.cc", "../browser/ui/test/test_browser_dialog.h", "../browser/ui/test/test_browser_dialog_mac.h", "../browser/ui/test/test_browser_dialog_mac.mm", + "../browser/ui/test/test_browser_ui.cc", + "../browser/ui/test/test_browser_ui.h", "../browser/ui/toolbar/browser_actions_bar_browsertest.cc", "../browser/ui/toolbar/browser_actions_bar_browsertest.h", "../browser/ui/toolbar/component_toolbar_actions_browsertest.cc",
diff --git a/chrome/test/base/browser_tests_main.cc b/chrome/test/base/browser_tests_main.cc index d0d20b0..0ef205d 100644 --- a/chrome/test/base/browser_tests_main.cc +++ b/chrome/test/base/browser_tests_main.cc
@@ -10,7 +10,7 @@ #if defined(OS_WIN) #include "base/win/win_util.h" -#include "chrome/browser/ui/test/test_browser_dialog.h" +#include "chrome/browser/ui/test/test_browser_ui.h" #endif // defined(OS_WIN) int main(int argc, char** argv) {
diff --git a/chrome/test/data/webui/interventions_internals_browsertest.js b/chrome/test/data/webui/interventions_internals_browsertest.js index b802f29..9391ab5 100644 --- a/chrome/test/data/webui/interventions_internals_browsertest.js +++ b/chrome/test/data/webui/interventions_internals_browsertest.js
@@ -86,25 +86,6 @@ window.testPageHandler = new TestPageHandler(); - /** - * Convert milliseconds to human readable date/time format. - * The return format will be "MM/dd/YYYY hh:mm:ss.sss" - * @param {number} time Time in millisecond since Unix Epoch. - * @return The converted string format. - */ - getTimeFormat = function(time) { - let date = new Date(time); - let options = { - year: 'numeric', - month: '2-digit', - day: '2-digit', - }; - - let timeString = date.toLocaleDateString('en-US', options); - return dateString + ' ' + date.getHours() + ':' + date.getMinutes() + - ':' + date.getSeconds() + '.' + date.getMilliseconds(); - }; - getBlacklistedStatus = function(blacklisted) { return (blacklisted ? 'Blacklisted' : 'Not blacklisted'); }; @@ -212,6 +193,7 @@ description: 'Some description_a', url: {url: 'Some gurl.spec()_a'}, time: 1507221689240, // Oct 05 2017 16:41:29 UTC + expectedTime: '10/05/2017 09:41:29.240', pageId: 0, }, { @@ -219,6 +201,7 @@ description: 'Some description_b', url: {url: 'Some gurl.spec()_b'}, time: 758675653000, // Jan 15 1994 23:14:13 UTC + expectedTime: '01/15/1994 15:14:13.000', pageId: 0, }, { @@ -226,6 +209,7 @@ description: 'Some description_c', url: {url: 'Some gurl.spec()_c'}, time: -314307870000, // Jan 16 1960 04:15:30 UTC + expectedTime: '01/15/1960 20:15:30.000', pageId: 0, }, ]; @@ -238,13 +222,13 @@ expectEquals(logs.length, rows.length); logs.forEach((log, index) => { - let expectedTime = getTimeFormat(log.time); let row = rows[logs.length - index - 1]; // Expecting reversed order. // (i.e. a new log message is // appended to the top of the // log table). - expectEquals(expectedTime, row.querySelector('.log-time').textContent); + expectEquals( + log.expectedTime, row.querySelector('.log-time').textContent); expectEquals(log.type, row.querySelector('.log-type').textContent); expectEquals( log.description, row.querySelector('.log-description').textContent);
diff --git a/components/cronet/ios/Cronet.h b/components/cronet/ios/Cronet.h index 8ef22fe..18d0de0 100644 --- a/components/cronet/ios/Cronet.h +++ b/components/cronet/ios/Cronet.h
@@ -33,17 +33,6 @@ // be handled. typedef BOOL (^RequestFilterBlock)(NSURLRequest* request); -// A delegate that a client can pass to Cronet to collect metrics for a -// session task. The delegate can be added and removed by calling -// [Cronet addMetricsDelegate:] and [Cronet removeMetricsDelegate:] methods -// respectively. -@protocol CronetMetricsDelegate <NSObject> -// Is invoked by Cronet when the metrics for the task are ready. -- (void)URLSession:(NSURLSession*)session task:(NSURLSessionTask*)task - didFinishCollectingMetrics:(NSURLSessionTaskMetrics*)metrics - NS_AVAILABLE_IOS(10.0); -@end - // Interface for installing Cronet. // TODO(gcasto): Should this macro be separate from the one defined in // bidirectional_stream_c.h? @@ -66,6 +55,10 @@ // any effect before |start| is called. + (void)setBrotliEnabled:(BOOL)brotliEnabled; +// Sets whether Metrics should be collected by CronetEngine. This method only +// has any effect before |start| is called. ++ (void)setMetricsEnabled:(BOOL)metricsEnabled; + // Set HTTP Cache type to be used by CronetEngine. This method only has any // effect before |start| is called. See HttpCacheType enum for available // options. @@ -206,19 +199,4 @@ // This method only has any effect before |start| is called. + (void)enableTestCertVerifierForTesting; -// Registers a CronetMetricsDelegate callback. The client is responsible for -// creating an object which implements CronetMetricsDelegate, and passing -// that as a |delegate|. Returns |YES| if the delegate is added successfully, -// and |NO| if it was not (because there is already an identical delegate -// registered). -+ (BOOL)addMetricsDelegate:(id<CronetMetricsDelegate>)delegate - NS_AVAILABLE_IOS(10.0); - -// Unregisters a CronetMetricsDelegate callback. |delegate| should be a -// pointer to the delegate which is to be removed. It returns |YES| if the -// delegate is successfully removed and |NO| if the delegate is not -// contained in the set of delegates (and therefore cannot be removed). -+ (BOOL)removeMetricsDelegate:(id<CronetMetricsDelegate>)delegate - NS_AVAILABLE_IOS(10.0); - @end
diff --git a/components/cronet/ios/Cronet.mm b/components/cronet/ios/Cronet.mm index fdab2aa..3986be1 100644 --- a/components/cronet/ios/Cronet.mm +++ b/components/cronet/ios/Cronet.mm
@@ -15,6 +15,7 @@ #include "base/synchronization/lock.h" #include "components/cronet/ios/accept_languages_table.h" #include "components/cronet/ios/cronet_environment.h" +#include "components/cronet/ios/cronet_metrics.h" #include "components/cronet/url_request_context_config.h" #include "ios/net/crn_http_protocol_handler.h" #include "ios/net/empty_nsurlcache.h" @@ -45,11 +46,15 @@ base::LazyInstance<std::unique_ptr<CronetHttpProtocolHandlerDelegate>>::Leaky gHttpProtocolHandlerDelegate = LAZY_INSTANCE_INITIALIZER; +base::LazyInstance<std::unique_ptr<cronet::CronetMetricsDelegate>>::Leaky + gMetricsDelegate = LAZY_INSTANCE_INITIALIZER; + // See [Cronet initialize] method to set the default values of the global // variables. BOOL gHttp2Enabled; BOOL gQuicEnabled; BOOL gBrotliEnabled; +BOOL gMetricsEnabled; cronet::URLRequestContextConfig::HttpCacheType gHttpCache; QuicHintVector gQuicHints; NSString* gExperimentalOptions; @@ -63,7 +68,7 @@ std::unique_ptr<net::CertVerifier> gMockCertVerifier; NSString* gAcceptLanguages; BOOL gEnablePKPBypassForLocalTrustAnchors; -NSMutableSet<id<CronetMetricsDelegate>>* gMetricsDelegates; +dispatch_once_t gSwizzleOnceToken; // CertVerifier, which allows any certificates for testing. class TestCertVerifier : public net::CertVerifier { @@ -189,6 +194,11 @@ gBrotliEnabled = brotliEnabled; } ++ (void)setMetricsEnabled:(BOOL)metricsEnabled { + [self checkNotStarted]; + gMetricsEnabled = metricsEnabled; +} + + (BOOL)addQuicHint:(NSString*)host port:(int)port altPort:(int)altPort { [self checkNotStarted]; @@ -332,6 +342,18 @@ gChromeNet.Get()->GetURLRequestContextGetter(), gRequestFilterBlock)); net::HTTPProtocolHandlerDelegate::SetInstance( gHttpProtocolHandlerDelegate.Get().get()); + + if (gMetricsEnabled) { + gMetricsDelegate.Get().reset(new cronet::CronetMetricsDelegate()); + net::MetricsDelegate::SetInstance(gMetricsDelegate.Get().get()); + + dispatch_once(&gSwizzleOnceToken, ^{ + cronet::SwizzleSessionWithConfiguration(); + }); + } else { + net::MetricsDelegate::SetInstance(nullptr); + } + gRequestFilterBlock = nil; } @@ -350,7 +372,14 @@ [self startInternal]; } ++ (void)unswizzleForTesting { + if (gSwizzleOnceToken) + cronet::SwizzleSessionWithConfiguration(); + gSwizzleOnceToken = 0; +} + + (void)shutdownForTesting { + [Cronet unswizzleForTesting]; [Cronet initialize]; } @@ -496,6 +525,7 @@ gHttp2Enabled = YES; gQuicEnabled = NO; gBrotliEnabled = NO; + gMetricsEnabled = NO; gHttpCache = cronet::URLRequestContextConfig::HttpCacheType::DISK; gQuicHints.clear(); gExperimentalOptions = @"{}"; @@ -505,32 +535,12 @@ gPkpList.clear(); gRequestFilterBlock = nil; gHttpProtocolHandlerDelegate.Get().reset(nullptr); + gMetricsDelegate.Get().reset(nullptr); gPreservedSharedURLCache = nil; gEnableTestCertVerifierForTesting = NO; gMockCertVerifier.reset(nullptr); gAcceptLanguages = nil; gEnablePKPBypassForLocalTrustAnchors = YES; - gMetricsDelegates = [NSMutableSet set]; -} - -+ (BOOL)addMetricsDelegate:(id<CronetMetricsDelegate>)delegate { - @synchronized(gMetricsDelegates) { - if ([gMetricsDelegates containsObject:delegate]) { - return NO; - } - [gMetricsDelegates addObject:delegate]; - return YES; - } -} - -+ (BOOL)removeMetricsDelegate:(id<CronetMetricsDelegate>)delegate { - @synchronized(gMetricsDelegates) { - if ([gMetricsDelegates containsObject:delegate]) { - [gMetricsDelegates removeObject:delegate]; - return YES; - } - return NO; - } } @end
diff --git a/components/cronet/ios/cronet_metrics.h b/components/cronet/ios/cronet_metrics.h index 553bb5a1..4754aa3 100644 --- a/components/cronet/ios/cronet_metrics.h +++ b/components/cronet/ios/cronet_metrics.h
@@ -8,31 +8,106 @@ #import <Foundation/Foundation.h> #include "components/grpc_support/include/bidirectional_stream_c.h" +#import "ios/net/crn_http_protocol_handler.h" +#include "net/http/http_network_session.h" + +// These are internal versions of NSURLSessionTaskTransactionMetrics and +// NSURLSessionTaskMetrics, defined primarily so that Cronet can +// initialize them and set their properties (the iOS classes are readonly). + +// The correspondences are +// CronetTransactionMetrics -> NSURLSessionTaskTransactionMetrics +// CronetMetrics -> NSURLSessionTaskMetrics FOUNDATION_EXPORT GRPC_SUPPORT_EXPORT NS_AVAILABLE_IOS(10.0) -@interface CronetMetrics : NSURLSessionTaskTransactionMetrics +@interface CronetTransactionMetrics : NSURLSessionTaskTransactionMetrics +// All of the below redefined as readwrite. + +// This is set to [task currentRequest]. @property(copy, readwrite) NSURLRequest* request; +// This is set to [task response]. @property(copy, readwrite) NSURLResponse* response; +// This is set to net::LoadTimingInfo::request_start_time. @property(copy, readwrite) NSDate* fetchStartDate; +// This is set to net::LoadTimingInfo::ConnectTiming::dns_start. @property(copy, readwrite) NSDate* domainLookupStartDate; +// This is set to net::LoadTimingInfo::ConnectTiming::dns_end. @property(copy, readwrite) NSDate* domainLookupEndDate; +// This is set to net::LoadTimingInfo::ConnectTiming::connect_start. @property(copy, readwrite) NSDate* connectStartDate; +// This is set to net::LoadTimingInfo::ConnectTiming::ssl_start. @property(copy, readwrite) NSDate* secureConnectionStartDate; +// This is set to net::LoadTimingInfo::ConnectTiming::ssl_end. @property(copy, readwrite) NSDate* secureConnectionEndDate; +// This is set to net::LoadTimingInfo::ConnectTiming::connect_end. @property(copy, readwrite) NSDate* connectEndDate; +// This is set to net::LoadTimingInfo::sent_start. @property(copy, readwrite) NSDate* requestStartDate; +// This is set to net::LoadTimingInfo::send_end. @property(copy, readwrite) NSDate* requestEndDate; +// This is set to net::LoadTimingInfo::receive_headers_end. @property(copy, readwrite) NSDate* responseStartDate; +// This is set to net::MetricsDelegate::Metrics::response_end_time. @property(copy, readwrite) NSDate* responseEndDate; +// This is set to net::HttpResponseInfo::connection_info. @property(copy, readwrite) NSString* networkProtocolName; +// This is set to YES if net::HttpResponseInfo::proxy_server.is_direct() +// returns false. @property(assign, readwrite, getter=isProxyConnection) BOOL proxyConnection; +// This is set to YES if net::LoadTimingInfo::ConnectTiming::conect_start is +// null. @property(assign, readwrite, getter=isReusedConnection) BOOL reusedConnection; +// This is set to LocalCache if net::HttpResponseInfo::was_cached is true, set +// to ServerPush if net::LoadTimingInfo::push_start is non-null, and set to +// NetworkLoad otherwise. @property(assign, readwrite) NSURLSessionTaskMetricsResourceFetchType resourceFetchType; +- (NSString*)description; + @end +// This is an internal version of NSURLSessionTaskMetrics - see comment above +// CronetTransactionMetrics. +NS_AVAILABLE_IOS(10.0) @interface CronetMetrics : NSURLSessionTaskMetrics +// Redefined as readwrite. +@property(copy, readwrite) + NSArray<NSURLSessionTaskTransactionMetrics*>* transactionMetrics; +@end + +namespace cronet { + +// net::MetricsDelegate for Cronet. +class CronetMetricsDelegate : public net::MetricsDelegate { + public: + using Metrics = net::MetricsDelegate::Metrics; + + CronetMetricsDelegate() {} + void OnStartNetRequest(NSURLSessionTask* task) override; + void OnStopNetRequest(std::unique_ptr<Metrics> metrics) override; + + // Returns the metrics collected for a specific task (removing that task's + // entry from the map in the process). + // It is called exactly once by the swizzled delegate proxy (see below), + // uses it to retrieve metrics data collected by net/ and pass them on to + // the client. If there is no metrics data for the passed task, this returns + // nullptr. + static std::unique_ptr<Metrics> MetricsForTask(NSURLSessionTask* task); + private: + static NSObject* task_metrics_map_lock_; + static std::map<NSURLSessionTask*, std::unique_ptr<Metrics>> + task_metrics_map_; +}; + +// This is the swizzling function that Cronet (in its startInternal +// method) calls to inject the proxy delegate into iOS networking API and +// intercept didFinishCollectingMetrics to replace the (empty) iOS metrics data +// with metrics data from net. +void SwizzleSessionWithConfiguration(); + +} // namespace cronet + #endif // COMPONENTS_CRONET_IOS_CRONET_METRICS_H_
diff --git a/components/cronet/ios/cronet_metrics.mm b/components/cronet/ios/cronet_metrics.mm index 735f9f6c..61a0b1f 100644 --- a/components/cronet/ios/cronet_metrics.mm +++ b/components/cronet/ios/cronet_metrics.mm
@@ -4,7 +4,11 @@ #import "components/cronet/ios/cronet_metrics.h" -@implementation CronetMetrics +#include <objc/runtime.h> + +#include "base/strings/sys_string_conversions.h" + +@implementation CronetTransactionMetrics @synthesize request = _request; @synthesize response = _response; @@ -26,4 +30,307 @@ @synthesize reusedConnection = _reusedConnection; @synthesize resourceFetchType = _resourceFetchType; +// The NSURLSessionTaskTransactionMetrics and NSURLSessionTaskMetrics classes +// are not supposed to be extended. Its default init method initialized an +// internal class, and therefore needs to be overridden to explicitly +// initialize (and return) an instance of this class. +// The |self = old_self| swap is necessary because [super init] must be +// assigned to self (or returned immediately), but in this case is returning +// a value of the wrong type. + +- (instancetype)init { + id old_self = self; + self = [super init]; + self = old_self; + return old_self; +} + +- (NSString*)description { + return [NSString + stringWithFormat: + @"" + "fetchStartDate: %@\n" + "domainLookupStartDate: %@\n" + "domainLookupEndDate: %@\n" + "connectStartDate: %@\n" + "secureConnectionStartDate: %@\n" + "secureConnectionEndDate: %@\n" + "connectEndDate: %@\n" + "requestStartDate: %@\n" + "requestEndDate: %@\n" + "responseStartDate: %@\n" + "responseEndDate: %@\n" + "networkProtocolName: %@\n" + "proxyConnection: %i\n" + "reusedConnection: %i\n" + "resourceFetchType: %lu\n", + [self fetchStartDate], [self domainLookupStartDate], + [self domainLookupEndDate], [self connectStartDate], + [self secureConnectionStartDate], [self secureConnectionEndDate], + [self connectEndDate], [self requestStartDate], [self requestEndDate], + [self responseStartDate], [self responseEndDate], + [self networkProtocolName], [self isProxyConnection], + [self isReusedConnection], (long)[self resourceFetchType]]; +} + @end + +@implementation CronetMetrics + +@synthesize transactionMetrics = _transactionMetrics; + +- (instancetype)init { + id old_self = self; + self = [super init]; + self = old_self; + return old_self; +} + +@end + +namespace { + +using Metrics = net::MetricsDelegate::Metrics; + +// Helper method that converts the ticks data found in LoadTimingInfo to an +// NSDate value to be used in client-side data. +NSDate* TicksToDate(const net::LoadTimingInfo& reference, + const base::TimeTicks& ticks) { + if (ticks.is_null()) + return nil; + base::Time ticks_since_1970 = + (reference.request_start_time + (ticks - reference.request_start)); + return [NSDate dateWithTimeIntervalSince1970:ticks_since_1970.ToDoubleT()]; +} + +// Converts Metrics metrics data into CronetTransactionMetrics (which +// importantly implements the NSURLSessionTaskTransactionMetrics API) +CronetTransactionMetrics* NativeToIOSMetrics(Metrics& metrics) + NS_AVAILABLE_IOS(10.0) { + NSURLSessionTask* task = metrics.task; + const net::LoadTimingInfo& load_timing_info = metrics.load_timing_info; + const net::HttpResponseInfo& response_info = metrics.response_info; + + CronetTransactionMetrics* transaction_metrics = + [[CronetTransactionMetrics alloc] init]; + + [transaction_metrics setRequest:[task currentRequest]]; + [transaction_metrics setResponse:[task response]]; + + transaction_metrics.fetchStartDate = + [NSDate dateWithTimeIntervalSince1970:load_timing_info.request_start_time + .ToDoubleT()]; + + transaction_metrics.domainLookupStartDate = + TicksToDate(load_timing_info, load_timing_info.connect_timing.dns_start); + transaction_metrics.domainLookupEndDate = + TicksToDate(load_timing_info, load_timing_info.connect_timing.dns_end); + + transaction_metrics.connectStartDate = TicksToDate( + load_timing_info, load_timing_info.connect_timing.connect_start); + transaction_metrics.secureConnectionStartDate = + TicksToDate(load_timing_info, load_timing_info.connect_timing.ssl_start); + transaction_metrics.secureConnectionEndDate = + TicksToDate(load_timing_info, load_timing_info.connect_timing.ssl_end); + transaction_metrics.connectEndDate = TicksToDate( + load_timing_info, load_timing_info.connect_timing.connect_end); + + transaction_metrics.requestStartDate = + TicksToDate(load_timing_info, load_timing_info.send_start); + transaction_metrics.requestEndDate = + TicksToDate(load_timing_info, load_timing_info.send_end); + transaction_metrics.responseStartDate = + TicksToDate(load_timing_info, load_timing_info.receive_headers_end); + transaction_metrics.responseEndDate = [NSDate + dateWithTimeIntervalSince1970:metrics.response_end_time.ToDoubleT()]; + + transaction_metrics.networkProtocolName = + base::SysUTF8ToNSString(net::HttpResponseInfo::ConnectionInfoToString( + response_info.connection_info)); + transaction_metrics.proxyConnection = !response_info.proxy_server.is_direct(); + + // If the connect timing information is null, then there was no connection + // establish - i.e., one was reused. + // The corrolary to this is that, if reusedConnection is YES, then + // domainLookupStartDate, domainLookupEndDate, connectStartDate, + // connectEndDate, secureConnectionStartDate, and secureConnectionEndDate are + // all meaningless. + transaction_metrics.reusedConnection = + load_timing_info.connect_timing.connect_start.is_null(); + + // Guess the resource fetch type based on some heuristics about what data is + // present. + if (response_info.was_cached) { + transaction_metrics.resourceFetchType = + NSURLSessionTaskMetricsResourceFetchTypeLocalCache; + } else if (!load_timing_info.push_start.is_null()) { + transaction_metrics.resourceFetchType = + NSURLSessionTaskMetricsResourceFetchTypeServerPush; + } else { + transaction_metrics.resourceFetchType = + NSURLSessionTaskMetricsResourceFetchTypeNetworkLoad; + } + + return transaction_metrics; +} + +} // namespace + +// In order for Cronet to use the iOS metrics collection API, it needs to +// replace the normal NSURLSession mechanism for calling into the delegate +// (so it can provide metrics from net/, instead of the empty metrics that iOS +// would provide otherwise. +// To this end, Cronet's startInternal method replaces the NSURLSession's +// sessionWithConfiguration method to inject a delegateProxy in between the +// client delegate and iOS code. +// This class represrents that delegateProxy. The important function is the +// didFinishCollectingMetrics callback, which when a request is being handled +// by Cronet, replaces the metrics collected by iOS with those connected by +// Cronet. +@interface URLSessionTaskDelegateProxy : NSProxy<NSURLSessionTaskDelegate> +- (instancetype)initWithDelegate:(id<NSURLSessionDelegate>)delegate; +@end + +@implementation URLSessionTaskDelegateProxy { + id<NSURLSessionDelegate> _delegate; + BOOL _respondsToDidFinishCollectingMetrics; +} + +// As this is a proxy delegate, it needs to be initialized with a real client +// delegate, to whom all of the method invocations will eventually get passed. +- (instancetype)initWithDelegate:(id<NSURLSessionDelegate>)delegate { + _delegate = delegate; + _respondsToDidFinishCollectingMetrics = + [_delegate respondsToSelector:@selector + (URLSession:task:didFinishCollectingMetrics:)]; + return self; +} + +// Any methods other than didFinishCollectingMetrics should be forwarded +// directly to the client delegate. +- (void)forwardInvocation:(NSInvocation*)invocation { + [invocation setTarget:_delegate]; + [invocation invoke]; +} + +// And for that reason, URLSessionTaskDelegateProxy should act like it responds +// to any of the selectors that the client delegate does. +- (nullable NSMethodSignature*)methodSignatureForSelector:(SEL)sel { + return [(id)_delegate methodSignatureForSelector:sel]; +} + +// didFinishCollectionMetrics ultimately calls into the corresponding method on +// the client delegate (if it exists), but first replaces the iOS-supplied +// metrics with metrics collected by Cronet (if they exist). +- (void)URLSession:(NSURLSession*)session + task:(NSURLSessionTask*)task + didFinishCollectingMetrics:(NSURLSessionTaskMetrics*)metrics + NS_AVAILABLE_IOS(10.0) { + std::unique_ptr<Metrics> netMetrics = + cronet::CronetMetricsDelegate::MetricsForTask(task); + + if (_respondsToDidFinishCollectingMetrics) { + if (netMetrics) { + CronetTransactionMetrics* cronetTransactionMetrics = + NativeToIOSMetrics(*netMetrics); + + CronetMetrics* cronetMetrics = [[CronetMetrics alloc] init]; + [cronetMetrics setTransactionMetrics:@[ cronetTransactionMetrics ]]; + + [(id<NSURLSessionTaskDelegate>)_delegate URLSession:session + task:task + didFinishCollectingMetrics:cronetMetrics]; + } else { + // If there are no metrics is Cronet's task->metrics map, then Cronet is + // not handling this request, so just transparently pass iOS's collected + // metrics. + [(id<NSURLSessionTaskDelegate>)_delegate URLSession:session + task:task + didFinishCollectingMetrics:metrics]; + } + } +} + +@end + +@implementation NSURLSession (Cronet) + ++ (NSURLSession*) +hookSessionWithConfiguration:(NSURLSessionConfiguration*)configuration + delegate:(nullable id<NSURLSessionDelegate>)delegate + delegateQueue:(nullable NSOperationQueue*)queue { + URLSessionTaskDelegateProxy* delegate_proxy = + [[URLSessionTaskDelegateProxy alloc] initWithDelegate:delegate]; + // Because the the method implementations are swapped, this is not a + // recursive call, and instead just forwards the call to the original + // sessionWithConfiguration method. + return [self hookSessionWithConfiguration:configuration + delegate:delegate_proxy + delegateQueue:queue]; +} + +@end + +namespace cronet { + +// static +NSObject* CronetMetricsDelegate::task_metrics_map_lock_ = + [[NSObject alloc] init]; +std::map<NSURLSessionTask*, std::unique_ptr<Metrics>> + CronetMetricsDelegate::task_metrics_map_; + +std::unique_ptr<Metrics> CronetMetricsDelegate::MetricsForTask( + NSURLSessionTask* task) { + @synchronized(task_metrics_map_lock_) { + auto metrics_search = task_metrics_map_.find(task); + if (metrics_search == task_metrics_map_.end()) { + return nullptr; + } + + std::unique_ptr<Metrics> metrics = std::move(metrics_search->second); + // Remove the entry to free memory. + task_metrics_map_.erase(metrics_search); + + return metrics; + } +} + +void CronetMetricsDelegate::OnStartNetRequest(NSURLSessionTask* task) { + if (@available(iOS 10, *)) { + @synchronized(task_metrics_map_lock_) { + if ([task state] == NSURLSessionTaskStateRunning) { + task_metrics_map_[task] = nullptr; + } + } + } +} + +void CronetMetricsDelegate::OnStopNetRequest(std::unique_ptr<Metrics> metrics) { + if (@available(iOS 10, *)) { + @synchronized(task_metrics_map_lock_) { + auto metrics_search = task_metrics_map_.find(metrics->task); + if (metrics_search != task_metrics_map_.end()) + metrics_search->second = std::move(metrics); + } + } +} + +#pragma mark - Swizzle + +void SwizzleSessionWithConfiguration() { + Class nsurlsession_class = object_getClass([NSURLSession class]); + + SEL original_selector = + @selector(sessionWithConfiguration:delegate:delegateQueue:); + SEL swizzled_selector = + @selector(hookSessionWithConfiguration:delegate:delegateQueue:); + + Method original_method = + class_getInstanceMethod(nsurlsession_class, original_selector); + Method swizzled_method = + class_getInstanceMethod(nsurlsession_class, swizzled_selector); + + method_exchangeImplementations(original_method, swizzled_method); +} + +} // namespace cronet
diff --git a/components/cronet/ios/test/BUILD.gn b/components/cronet/ios/test/BUILD.gn index 057f51c..8957469 100644 --- a/components/cronet/ios/test/BUILD.gn +++ b/components/cronet/ios/test/BUILD.gn
@@ -8,7 +8,6 @@ test("cronet_test") { testonly = true sources = [ - "../cronet_metrics.h", # used for unit testing of private interface "cronet_acceptlang_test.mm", "cronet_http_test.mm", "cronet_metrics_test.mm",
diff --git a/components/cronet/ios/test/cronet_http_test.mm b/components/cronet/ios/test/cronet_http_test.mm index 4e0dcf5b..0a0e9400 100644 --- a/components/cronet/ios/test/cronet_http_test.mm +++ b/components/cronet/ios/test/cronet_http_test.mm
@@ -421,4 +421,29 @@ ASSERT_TRUE(block_used); } +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +TEST_F(HttpTest, LegacyApi) { + NSURL* url = net::NSURLWithGURL(GURL(grpc_support::kTestServerSimpleUrl)); + + __block BOOL block_used = NO; + [Cronet setRequestFilterBlock:^(NSURLRequest* request) { + block_used = YES; + EXPECT_EQ(request.URL, url); + return YES; + }]; + + NSURLRequest* request = [NSURLRequest requestWithURL:url]; + NSError* err; + NSHTTPURLResponse* response; + [NSURLConnection sendSynchronousRequest:request + returningResponse:&response + error:&err]; + + EXPECT_EQ(200, [response statusCode]); + EXPECT_TRUE(block_used); + EXPECT_FALSE(err); +} +#pragma clang diagnostic pop + } // namespace cronet
diff --git a/components/cronet/ios/test/cronet_metrics_test.mm b/components/cronet/ios/test/cronet_metrics_test.mm index 23e91956..0189a259 100644 --- a/components/cronet/ios/test/cronet_metrics_test.mm +++ b/components/cronet/ios/test/cronet_metrics_test.mm
@@ -4,98 +4,384 @@ #import <Cronet/Cronet.h> -#include "components/cronet/ios/cronet_metrics.h" +#include "base/strings/sys_string_conversions.h" #include "components/cronet/ios/test/cronet_test_base.h" - +#include "components/cronet/ios/test/start_cronet.h" +#include "components/cronet/ios/test/test_server.h" +#include "components/grpc_support/test/quic_test_server.h" +#import "net/base/mac/url_conversions.h" #include "testing/gtest_mac.h" +#include "url/gurl.h" -@interface TestMetricsDelegate : NSObject<CronetMetricsDelegate> -@end - -@implementation TestMetricsDelegate -- (void)URLSession:(NSURLSession*)session task:(NSURLSessionTask*)task - didFinishCollectingMetrics:(NSURLSessionTaskMetrics*)metrics - NS_AVAILABLE_IOS(10.0) { - // This is never actually called, so its definition currently doesn't matter. -} +// Forward declaration of class in cronet_metrics.h for testing. +NS_AVAILABLE_IOS(10.0) +@interface CronetTransactionMetrics : NSURLSessionTaskTransactionMetrics @end namespace cronet { class CronetMetricsTest : public CronetTestBase { protected: - CronetMetricsTest() {} - ~CronetMetricsTest() override {} + void SetUpWithMetrics(BOOL metrics_enabled) { + TestServer::Start(); + + [Cronet setMetricsEnabled:metrics_enabled]; + StartCronet(grpc_support::GetQuicTestServerPort()); + + [Cronet registerHttpProtocolHandler]; + NSURLSessionConfiguration* config = + [NSURLSessionConfiguration ephemeralSessionConfiguration]; + config.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData; + [Cronet installIntoSessionConfiguration:config]; + session_ = [NSURLSession sessionWithConfiguration:config + delegate:delegate_ + delegateQueue:nil]; + } + + void TearDown() override { + [Cronet shutdownForTesting]; + + TestServer::Shutdown(); + CronetTestBase::TearDown(); + } + + NSURLSession* session_; }; -TEST_F(CronetMetricsTest, Setters) { +class CronetEnabledMetricsTest : public CronetMetricsTest { + protected: + void SetUp() override { + CronetMetricsTest::SetUp(); + SetUpWithMetrics(YES); + } +}; + +class CronetDisabledMetricsTest : public CronetMetricsTest { + protected: + void SetUp() override { + CronetMetricsTest::SetUp(); + SetUpWithMetrics(NO); + } +}; + +// Tests that metrics data is sane for a QUIC request. +TEST_F(CronetEnabledMetricsTest, ProtocolIsQuic) { if (@available(iOS 10, *)) { - CronetMetrics* cronet_metrics = [[CronetMetrics alloc] init]; + NSURL* url = net::NSURLWithGURL(GURL(grpc_support::kTestServerSimpleUrl)); - NSDate* test_date = [NSDate date]; - NSURLRequest* test_req = [NSURLRequest - requestWithURL:[NSURL URLWithString:@"test.example.com"]]; - NSURLResponse* test_resp = [[NSURLResponse alloc] - initWithURL:[NSURL URLWithString:@"test.example.com"] - MIMEType:@"text/plain" - expectedContentLength:128 - textEncodingName:@"ascii"]; + __block BOOL block_used = NO; + NSURLSessionDataTask* task = [session_ dataTaskWithURL:url]; + [Cronet setRequestFilterBlock:^(NSURLRequest* request) { + block_used = YES; + EXPECT_EQ(request.URL, url); + return YES; + }]; + StartDataTaskAndWaitForCompletion(task); + EXPECT_TRUE(block_used); + EXPECT_EQ(nil, [delegate_ error]); + EXPECT_STREQ(grpc_support::kSimpleBodyValue, + base::SysNSStringToUTF8([delegate_ responseBody]).c_str()); - [cronet_metrics setRequest:test_req]; - [cronet_metrics setResponse:test_resp]; + NSURLSessionTaskMetrics* task_metrics = delegate_.taskMetrics; + ASSERT_TRUE(task_metrics); + ASSERT_EQ(1lU, task_metrics.transactionMetrics.count); + NSURLSessionTaskTransactionMetrics* metrics = + task_metrics.transactionMetrics.firstObject; + EXPECT_TRUE([metrics isMemberOfClass:[CronetTransactionMetrics class]]); - [cronet_metrics setFetchStartDate:test_date]; - [cronet_metrics setDomainLookupStartDate:test_date]; - [cronet_metrics setDomainLookupEndDate:test_date]; - [cronet_metrics setConnectStartDate:test_date]; - [cronet_metrics setSecureConnectionStartDate:test_date]; - [cronet_metrics setSecureConnectionEndDate:test_date]; - [cronet_metrics setConnectEndDate:test_date]; - [cronet_metrics setRequestStartDate:test_date]; - [cronet_metrics setRequestEndDate:test_date]; - [cronet_metrics setResponseStartDate:test_date]; - [cronet_metrics setResponseEndDate:test_date]; + // Confirm that metrics data is the correct type. + EXPECT_TRUE([metrics.fetchStartDate isKindOfClass:[NSDate class]]); + EXPECT_TRUE([metrics.domainLookupStartDate isKindOfClass:[NSDate class]]); + EXPECT_TRUE([metrics.domainLookupEndDate isKindOfClass:[NSDate class]]); + EXPECT_TRUE([metrics.connectStartDate isKindOfClass:[NSDate class]]); + EXPECT_TRUE( + [metrics.secureConnectionStartDate isKindOfClass:[NSDate class]]); + EXPECT_TRUE([metrics.secureConnectionEndDate isKindOfClass:[NSDate class]]); + EXPECT_TRUE([metrics.connectEndDate isKindOfClass:[NSDate class]]); + EXPECT_TRUE([metrics.requestStartDate isKindOfClass:[NSDate class]]); + EXPECT_TRUE([metrics.requestEndDate isKindOfClass:[NSDate class]]); + EXPECT_TRUE([metrics.responseStartDate isKindOfClass:[NSDate class]]); + EXPECT_TRUE([metrics.responseEndDate isKindOfClass:[NSDate class]]); + EXPECT_TRUE([metrics.networkProtocolName isKindOfClass:[NSString class]]); - [cronet_metrics setNetworkProtocolName:@"http/2"]; - [cronet_metrics setProxyConnection:YES]; - [cronet_metrics setReusedConnection:YES]; - [cronet_metrics setResourceFetchType: - NSURLSessionTaskMetricsResourceFetchTypeNetworkLoad]; + // Confirm that the metrics values are sane. + EXPECT_NE(NSOrderedDescending, [metrics.domainLookupStartDate + compare:metrics.domainLookupEndDate]); + EXPECT_NE(NSOrderedDescending, + [metrics.connectStartDate compare:metrics.connectEndDate]); + EXPECT_NE(NSOrderedDescending, + [metrics.secureConnectionStartDate + compare:metrics.secureConnectionEndDate]); + EXPECT_NE(NSOrderedDescending, + [metrics.requestStartDate compare:metrics.requestEndDate]); + EXPECT_NE(NSOrderedDescending, + [metrics.responseStartDate compare:metrics.responseEndDate]); - NSURLSessionTaskTransactionMetrics* metrics = cronet_metrics; + EXPECT_FALSE(metrics.proxyConnection); - EXPECT_EQ([metrics request], test_req); - EXPECT_EQ([metrics response], test_resp); - - EXPECT_EQ([metrics fetchStartDate], test_date); - EXPECT_EQ([metrics domainLookupStartDate], test_date); - EXPECT_EQ([metrics domainLookupEndDate], test_date); - EXPECT_EQ([metrics connectStartDate], test_date); - EXPECT_EQ([metrics secureConnectionStartDate], test_date); - EXPECT_EQ([metrics secureConnectionEndDate], test_date); - EXPECT_EQ([metrics connectEndDate], test_date); - EXPECT_EQ([metrics requestStartDate], test_date); - EXPECT_EQ([metrics requestEndDate], test_date); - EXPECT_EQ([metrics responseStartDate], test_date); - EXPECT_EQ([metrics responseEndDate], test_date); - - EXPECT_EQ([metrics networkProtocolName], @"http/2"); - EXPECT_EQ([metrics isProxyConnection], YES); - EXPECT_EQ([metrics isReusedConnection], YES); - EXPECT_EQ([metrics resourceFetchType], - NSURLSessionTaskMetricsResourceFetchTypeNetworkLoad); + EXPECT_TRUE([metrics.networkProtocolName containsString:@"quic"]); } } -TEST_F(CronetMetricsTest, Delegate) { +// Tests that metrics data is sane for an HTTP/1.1 request. +TEST_F(CronetEnabledMetricsTest, ProtocolIsNotQuic) { if (@available(iOS 10, *)) { - TestMetricsDelegate* metrics_delegate = - [[TestMetricsDelegate alloc] init]; - EXPECT_TRUE([Cronet addMetricsDelegate:metrics_delegate]); - EXPECT_FALSE([Cronet addMetricsDelegate:metrics_delegate]); - EXPECT_TRUE([Cronet removeMetricsDelegate:metrics_delegate]); - EXPECT_FALSE([Cronet removeMetricsDelegate:metrics_delegate]); + NSURL* url = net::NSURLWithGURL(GURL(TestServer::GetSimpleURL())); + + __block BOOL block_used = NO; + NSURLSessionDataTask* task = [session_ dataTaskWithURL:url]; + [Cronet setRequestFilterBlock:^(NSURLRequest* request) { + block_used = YES; + EXPECT_EQ(request.URL, url); + return YES; + }]; + StartDataTaskAndWaitForCompletion(task); + EXPECT_TRUE(block_used); + EXPECT_EQ(nil, [delegate_ error]); + EXPECT_STREQ("The quick brown fox jumps over the lazy dog.", + base::SysNSStringToUTF8([delegate_ responseBody]).c_str()); + + NSURLSessionTaskMetrics* task_metrics = delegate_.taskMetrics; + ASSERT_TRUE(task_metrics); + ASSERT_EQ(1lU, task_metrics.transactionMetrics.count); + NSURLSessionTaskTransactionMetrics* metrics = + task_metrics.transactionMetrics.firstObject; + EXPECT_TRUE([metrics isMemberOfClass:[CronetTransactionMetrics class]]); + + EXPECT_NSEQ(metrics.networkProtocolName, @"http/1.1"); } } +// Tests that Cronet provides similar metrics data to iOS. +TEST_F(CronetEnabledMetricsTest, PlatformComparison) { + if (@available(iOS 10, *)) { + NSURL* url = net::NSURLWithGURL(GURL(TestServer::GetSimpleURL())); + + // Perform a connection using Cronet. + + __block BOOL block_used = NO; + NSURLSessionDataTask* task = [session_ dataTaskWithURL:url]; + [Cronet setRequestFilterBlock:^(NSURLRequest* request) { + block_used = YES; + EXPECT_EQ(request.URL, url); + return YES; + }]; + StartDataTaskAndWaitForCompletion(task); + EXPECT_TRUE(block_used); + EXPECT_EQ(nil, [delegate_ error]); + EXPECT_STREQ("The quick brown fox jumps over the lazy dog.", + base::SysNSStringToUTF8([delegate_ responseBody]).c_str()); + + NSURLSessionTaskMetrics* cronet_task_metrics = delegate_.taskMetrics; + ASSERT_TRUE(cronet_task_metrics); + ASSERT_EQ(1lU, cronet_task_metrics.transactionMetrics.count); + NSURLSessionTaskTransactionMetrics* cronet_metrics = + cronet_task_metrics.transactionMetrics.firstObject; + + // Perform a connection using the platform stack. + + block_used = NO; + task = [session_ dataTaskWithURL:url]; + [Cronet setRequestFilterBlock:^(NSURLRequest* request) { + block_used = YES; + EXPECT_EQ(request.URL, url); + return NO; + }]; + StartDataTaskAndWaitForCompletion(task); + EXPECT_TRUE(block_used); + EXPECT_EQ(nil, [delegate_ error]); + EXPECT_STREQ("The quick brown fox jumps over the lazy dog.", + base::SysNSStringToUTF8([delegate_ responseBody]).c_str()); + + NSURLSessionTaskMetrics* platform_task_metrics = delegate_.taskMetrics; + ASSERT_TRUE(platform_task_metrics); + ASSERT_EQ(1lU, platform_task_metrics.transactionMetrics.count); + NSURLSessionTaskTransactionMetrics* platform_metrics = + platform_task_metrics.transactionMetrics.firstObject; + + // Compare platform and Cronet metrics data. + + EXPECT_NSEQ(cronet_metrics.networkProtocolName, + platform_metrics.networkProtocolName); + } +} + +// Tests that the metrics API behaves sanely when making a request to an +// invalid URL. +TEST_F(CronetEnabledMetricsTest, InvalidURL) { + if (@available(iOS 10, *)) { + NSURL* url = net::NSURLWithGURL(GURL("http://notfound.example.com")); + + __block BOOL block_used = NO; + NSURLSessionDataTask* task = [session_ dataTaskWithURL:url]; + [Cronet setRequestFilterBlock:^(NSURLRequest* request) { + block_used = YES; + EXPECT_EQ(request.URL, url); + return YES; + }]; + StartDataTaskAndWaitForCompletion(task); + EXPECT_TRUE(block_used); + EXPECT_TRUE([delegate_ error]); + + NSURLSessionTaskMetrics* task_metrics = delegate_.taskMetrics; + ASSERT_TRUE(task_metrics); + ASSERT_EQ(1lU, task_metrics.transactionMetrics.count); + NSURLSessionTaskTransactionMetrics* metrics = + task_metrics.transactionMetrics.firstObject; + EXPECT_TRUE([metrics isMemberOfClass:[CronetTransactionMetrics class]]); + + EXPECT_TRUE(metrics.fetchStartDate); + EXPECT_FALSE(metrics.domainLookupStartDate); + EXPECT_FALSE(metrics.domainLookupEndDate); + EXPECT_FALSE(metrics.connectStartDate); + EXPECT_FALSE(metrics.secureConnectionStartDate); + EXPECT_FALSE(metrics.secureConnectionEndDate); + EXPECT_FALSE(metrics.connectEndDate); + EXPECT_FALSE(metrics.requestStartDate); + EXPECT_FALSE(metrics.requestEndDate); + EXPECT_FALSE(metrics.responseStartDate); + } +} + +// Tests that the metrics API behaves sanely when the request is canceled. +TEST_F(CronetEnabledMetricsTest, CanceledRequest) { + if (@available(iOS 10, *)) { + NSURL* url = net::NSURLWithGURL(GURL(grpc_support::kTestServerSimpleUrl)); + + __block BOOL block_used = NO; + NSURLSessionDataTask* task = [session_ dataTaskWithURL:url]; + [Cronet setRequestFilterBlock:^(NSURLRequest* request) { + block_used = YES; + EXPECT_EQ(request.URL, url); + return YES; + }]; + + StartDataTaskAndWaitForCompletion(task, 1); + [task cancel]; + + EXPECT_TRUE(block_used); + EXPECT_NE(nil, [delegate_ error]); + } +} + +// Tests the metrics data for a reused connection is correct. +TEST_F(CronetEnabledMetricsTest, ReusedConnection) { + if (@available(iOS 10, *)) { + NSURL* url = net::NSURLWithGURL(GURL(grpc_support::kTestServerSimpleUrl)); + + __block BOOL block_used = NO; + NSURLSessionDataTask* task = [session_ dataTaskWithURL:url]; + [Cronet setRequestFilterBlock:^(NSURLRequest* request) { + block_used = YES; + EXPECT_EQ(request.URL, url); + return YES; + }]; + StartDataTaskAndWaitForCompletion(task); + EXPECT_TRUE(block_used); + EXPECT_EQ(nil, [delegate_ error]); + EXPECT_STREQ(grpc_support::kSimpleBodyValue, + base::SysNSStringToUTF8([delegate_ responseBody]).c_str()); + + NSURLSessionTaskMetrics* task_metrics = [delegate_ taskMetrics]; + ASSERT_TRUE(task_metrics); + ASSERT_EQ(1lU, task_metrics.transactionMetrics.count); + NSURLSessionTaskTransactionMetrics* metrics = + task_metrics.transactionMetrics.firstObject; + EXPECT_TRUE([metrics isMemberOfClass:[CronetTransactionMetrics class]]); + + // Second connection + + block_used = NO; + task = [session_ dataTaskWithURL:url]; + [Cronet setRequestFilterBlock:^(NSURLRequest* request) { + block_used = YES; + EXPECT_EQ(request.URL, url); + return YES; + }]; + StartDataTaskAndWaitForCompletion(task); + EXPECT_TRUE(block_used); + EXPECT_EQ(nil, [delegate_ error]); + EXPECT_STREQ(grpc_support::kSimpleBodyValue, + base::SysNSStringToUTF8([delegate_ responseBody]).c_str()); + + task_metrics = delegate_.taskMetrics; + ASSERT_TRUE(task_metrics); + ASSERT_EQ(1lU, task_metrics.transactionMetrics.count); + metrics = task_metrics.transactionMetrics.firstObject; + + EXPECT_TRUE(metrics.isReusedConnection); + EXPECT_FALSE(metrics.domainLookupStartDate); + EXPECT_FALSE(metrics.domainLookupEndDate); + EXPECT_FALSE(metrics.connectStartDate); + EXPECT_FALSE(metrics.secureConnectionStartDate); + EXPECT_FALSE(metrics.secureConnectionEndDate); + EXPECT_FALSE(metrics.connectEndDate); + } +} + +// Tests that the metrics disable switch works. +TEST_F(CronetDisabledMetricsTest, MetricsDisabled) { + if (@available(iOS 10, *)) { + NSURL* url = net::NSURLWithGURL(GURL(grpc_support::kTestServerSimpleUrl)); + + __block BOOL block_used = NO; + NSURLSessionDataTask* task = [session_ dataTaskWithURL:url]; + [Cronet setRequestFilterBlock:^(NSURLRequest* request) { + block_used = YES; + EXPECT_EQ(request.URL, url); + return YES; + }]; + StartDataTaskAndWaitForCompletion(task); + EXPECT_TRUE(block_used); + EXPECT_EQ(nil, [delegate_ error]); + EXPECT_STREQ(grpc_support::kSimpleBodyValue, + base::SysNSStringToUTF8([delegate_ responseBody]).c_str()); + + NSURLSessionTaskMetrics* task_metrics = [delegate_ taskMetrics]; + ASSERT_TRUE(task_metrics); + ASSERT_EQ(1lU, task_metrics.transactionMetrics.count); + NSURLSessionTaskTransactionMetrics* metrics = + task_metrics.transactionMetrics.firstObject; + EXPECT_FALSE([metrics isMemberOfClass:[CronetTransactionMetrics class]]); + + EXPECT_TRUE(metrics.fetchStartDate); + EXPECT_FALSE(metrics.domainLookupStartDate); + EXPECT_FALSE(metrics.domainLookupEndDate); + EXPECT_FALSE(metrics.connectStartDate); + EXPECT_FALSE(metrics.secureConnectionStartDate); + EXPECT_FALSE(metrics.secureConnectionEndDate); + EXPECT_FALSE(metrics.connectEndDate); + EXPECT_FALSE(metrics.requestStartDate); + EXPECT_FALSE(metrics.requestEndDate); + EXPECT_FALSE(metrics.responseStartDate); + EXPECT_FALSE(metrics.responseEndDate); + EXPECT_FALSE(metrics.networkProtocolName); + } +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +TEST_F(CronetEnabledMetricsTest, LegacyApi) { + NSURL* url = net::NSURLWithGURL(GURL(grpc_support::kTestServerSimpleUrl)); + + __block BOOL block_used = NO; + [Cronet setRequestFilterBlock:^(NSURLRequest* request) { + block_used = YES; + EXPECT_EQ(request.URL, url); + return YES; + }]; + + NSURLRequest* request = [NSURLRequest requestWithURL:url]; + NSError* err; + NSHTTPURLResponse* response; + [NSURLConnection sendSynchronousRequest:request + returningResponse:&response + error:&err]; + + EXPECT_EQ(200, [response statusCode]); + EXPECT_TRUE(block_used); + EXPECT_FALSE(err); +} +#pragma clang diagnostic pop + } // namespace cronet
diff --git a/components/cronet/ios/test/cronet_netlog_test.mm b/components/cronet/ios/test/cronet_netlog_test.mm index d765221..f2e7f81 100644 --- a/components/cronet/ios/test/cronet_netlog_test.mm +++ b/components/cronet/ios/test/cronet_netlog_test.mm
@@ -5,14 +5,11 @@ #import <Cronet/Cronet.h> #import <Foundation/Foundation.h> +#include "components/cronet/ios/test/cronet_test_base.h" #include "components/cronet/ios/test/start_cronet.h" #include "components/grpc_support/test/quic_test_server.h" #include "testing/gtest/include/gtest/gtest.h" -@interface Cronet (ExposedForTesting) -+ (void)shutdownForTesting; -@end - namespace cronet { class NetLogTest : public ::testing::Test {
diff --git a/components/cronet/ios/test/cronet_test_base.h b/components/cronet/ios/test/cronet_test_base.h index 10c6a11f..c5dfa3f 100644 --- a/components/cronet/ios/test/cronet_test_base.h +++ b/components/cronet/ios/test/cronet_test_base.h
@@ -38,9 +38,13 @@ @property(readonly) NSMutableDictionary<NSURLSessionDataTask*, NSNumber*>* totalBytesReceivedPerTask; +// Contains the expected amount of received data. @property(readonly) NSMutableDictionary<NSURLSessionDataTask*, NSNumber*>* expectedContentLengthPerTask; +// Contains metrics data. +@property(readonly) NSURLSessionTaskMetrics* taskMetrics NS_AVAILABLE_IOS(10.0); + // Resets the delegate, so it can be used again for another request. - (void)reset;
diff --git a/components/cronet/ios/test/cronet_test_base.mm b/components/cronet/ios/test/cronet_test_base.mm index 4970459f..7f8113d 100644 --- a/components/cronet/ios/test/cronet_test_base.mm +++ b/components/cronet/ios/test/cronet_test_base.mm
@@ -28,6 +28,7 @@ @synthesize errorPerTask = _errorPerTask; @synthesize totalBytesReceivedPerTask = _totalBytesReceivedPerTask; @synthesize expectedContentLengthPerTask = _expectedContentLengthPerTask; +@synthesize taskMetrics = _taskMetrics; - (id)init { if (self = [super init]) { @@ -42,6 +43,7 @@ _totalBytesReceivedPerTask = [NSMutableDictionary dictionaryWithCapacity:0]; _expectedContentLengthPerTask = [NSMutableDictionary dictionaryWithCapacity:0]; + _taskMetrics = nil; } - (NSError*)error { @@ -145,6 +147,13 @@ } - (void)URLSession:(NSURLSession*)session + task:(NSURLSessionTask*)task + didFinishCollectingMetrics:(NSURLSessionTaskMetrics*)metrics + NS_AVAILABLE_IOS(10.0) { + _taskMetrics = metrics; +} + +- (void)URLSession:(NSURLSession*)session dataTask:(NSURLSessionDataTask*)dataTask didReceiveResponse:(NSURLResponse*)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))
diff --git a/components/cronet/ios/test/test_server.cc b/components/cronet/ios/test/test_server.cc index 24cf1c4e..224d5ee 100644 --- a/components/cronet/ios/test/test_server.cc +++ b/components/cronet/ios/test/test_server.cc
@@ -20,16 +20,26 @@ namespace { +const char kSimplePath[] = "/Simple"; const char kEchoHeaderPath[] = "/EchoHeader?"; const char kSetCookiePath[] = "/SetCookie?"; const char kBigDataPath[] = "/BigData?"; const char kUseEncodingPath[] = "/UseEncoding?"; const char kEchoRequestBodyPath[] = "/EchoRequestBody"; +const char kSimpleResponse[] = "The quick brown fox jumps over the lazy dog."; + std::unique_ptr<net::EmbeddedTestServer> g_test_server; base::LazyInstance<std::string>::Leaky g_big_data_body = LAZY_INSTANCE_INITIALIZER; +std::unique_ptr<net::test_server::HttpResponse> SimpleRequest() { + auto http_response = std::make_unique<net::test_server::BasicHttpResponse>(); + http_response->set_code(net::HTTP_OK); + http_response->set_content(kSimpleResponse); + return std::move(http_response); +} + std::unique_ptr<net::test_server::HttpResponse> EchoHeaderInRequest( const net::test_server::HttpRequest& request) { std::string header_name; @@ -109,6 +119,10 @@ std::unique_ptr<net::test_server::HttpResponse> CronetTestRequestHandler( const net::test_server::HttpRequest& request) { + if (base::StartsWith(request.relative_url, kSimplePath, + base::CompareCase::INSENSITIVE_ASCII)) { + return SimpleRequest(); + } if (base::StartsWith(request.relative_url, kEchoHeaderPath, base::CompareCase::INSENSITIVE_ASCII)) { return EchoHeaderInRequest(request); @@ -151,6 +165,11 @@ g_test_server.reset(); } +std::string TestServer::GetSimpleURL() { + DCHECK(g_test_server); + return g_test_server->GetURL(kSimplePath).spec(); +} + std::string TestServer::GetEchoHeaderURL(const std::string& header_name) { DCHECK(g_test_server); return g_test_server->GetURL(kEchoHeaderPath + header_name).spec();
diff --git a/components/cronet/ios/test/test_server.h b/components/cronet/ios/test/test_server.h index 61e4ffc..6e6e602 100644 --- a/components/cronet/ios/test/test_server.h +++ b/components/cronet/ios/test/test_server.h
@@ -14,6 +14,9 @@ static bool Start(); static void Shutdown(); + // Returns URL which responds with the body "The quick brown fox jumps over + // the lazy dog". + static std::string GetSimpleURL(); // Returns URL which respond with echo of header with |header_name| in // response body. static std::string GetEchoHeaderURL(const std::string& header_name);
diff --git a/components/data_reduction_proxy/content/browser/content_lofi_decider.cc b/components/data_reduction_proxy/content/browser/content_lofi_decider.cc index 2d8996f..e2df7c2 100644 --- a/components/data_reduction_proxy/content/browser/content_lofi_decider.cc +++ b/components/data_reduction_proxy/content/browser/content_lofi_decider.cc
@@ -47,7 +47,7 @@ // Turn off LitePage bit. updated_state &= ~(content::SERVER_LITE_PAGE_ON); } - if (!drp_data->lofi_requested()) { + if (!drp_data->lofi_policy_received()) { // Turn off LoFi bit(s). updated_state &= ~(content::SERVER_LOFI_ON); if (drp_data->used_data_reduction_proxy()) {
diff --git a/components/data_reduction_proxy/content/browser/content_lofi_decider_unittest.cc b/components/data_reduction_proxy/content/browser/content_lofi_decider_unittest.cc index 5bfddab..1f1af66 100644 --- a/components/data_reduction_proxy/content/browser/content_lofi_decider_unittest.cc +++ b/components/data_reduction_proxy/content/browser/content_lofi_decider_unittest.cc
@@ -548,7 +548,7 @@ request.get()); data_reduction_proxy_data->set_used_data_reduction_proxy(true); data_reduction_proxy_data->set_lite_page_received(true); - data_reduction_proxy_data->set_lofi_requested(false); + data_reduction_proxy_data->set_lofi_policy_received(false); // Verify selects LitePage bit but doesn't touch client-only NoScript bit. EXPECT_EQ(content::SERVER_LITE_PAGE_ON | content::NOSCRIPT_ON, @@ -569,7 +569,7 @@ request.get()); data_reduction_proxy_data->set_used_data_reduction_proxy(true); data_reduction_proxy_data->set_lite_page_received(false); - data_reduction_proxy_data->set_lofi_requested(true); + data_reduction_proxy_data->set_lofi_policy_received(true); // Verify keeps LoFi bits and also doesn't touch client-only NoScript bit. EXPECT_EQ(
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_data.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_data.cc index 8d134ee..d9cc350 100644 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_data.cc +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_data.cc
@@ -17,6 +17,7 @@ lofi_requested_(false), client_lofi_requested_(false), lite_page_received_(false), + lofi_policy_received_(false), lofi_received_(false), effective_connection_type_(net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN) {}
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_data.h b/components/data_reduction_proxy/core/browser/data_reduction_proxy_data.h index c3f6d60..19e8d053 100644 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_data.h +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_data.h
@@ -51,7 +51,15 @@ lite_page_received_ = lite_page_received; } - // Whether a lite page response was seen for the request or navigation. + // Whether a Lo-Fi (or empty-image) page policy directive was received for + // the navigation. + bool lofi_policy_received() const { return lofi_policy_received_; } + void set_lofi_policy_received(bool lofi_policy_received) { + lofi_policy_received_ = lofi_policy_received; + } + + // Whether a server Lo-Fi page response was seen for the request or + // navigation. bool lofi_received() const { return lofi_received_; } void set_lofi_received(bool lofi_received) { lofi_received_ = lofi_received; } @@ -124,6 +132,10 @@ // Whether a lite page response was seen for the request or navigation. bool lite_page_received_; + // Whether server Lo-Fi directive was received for this navigation. True if + // the proxy returns the empty-image page-policy for the main frame response. + bool lofi_policy_received_; + // Whether a lite page response was seen for the request or navigation. bool lofi_received_;
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc index 2796419..4e11978 100644 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc
@@ -551,14 +551,25 @@ if (!original_response_headers || original_response_headers->IsRedirect(nullptr)) return; - if (IsEmptyImagePreview(*original_response_headers)) { - DataReductionProxyData* data = - DataReductionProxyData::GetDataAndCreateIfNecessary(request); - data->set_lofi_received(true); - } else if (IsLitePagePreview(*original_response_headers)) { - DataReductionProxyData* data = - DataReductionProxyData::GetDataAndCreateIfNecessary(request); - data->set_lite_page_received(true); + + switch (ParseResponseTransform(*original_response_headers)) { + case TRANSFORM_LITE_PAGE: + DataReductionProxyData::GetDataAndCreateIfNecessary(request) + ->set_lite_page_received(true); + break; + case TRANSFORM_PAGE_POLICIES_EMPTY_IMAGE: + DataReductionProxyData::GetDataAndCreateIfNecessary(request) + ->set_lofi_policy_received(true); + break; + case TRANSFORM_EMPTY_IMAGE: + DataReductionProxyData::GetDataAndCreateIfNecessary(request) + ->set_lofi_received(true); + break; + case TRANSFORM_IDENTITY: + case TRANSFORM_COMPRESSED_VIDEO: + case TRANSFORM_NONE: + case TRANSFORM_UNKNOWN: + break; } if (data_reduction_proxy_io_data_ && data_reduction_proxy_io_data_->lofi_decider() &&
diff --git a/components/infobars/core/infobar_manager.h b/components/infobars/core/infobar_manager.h index bbf944f..2d44965 100644 --- a/components/infobars/core/infobar_manager.h +++ b/components/infobars/core/infobar_manager.h
@@ -16,6 +16,7 @@ class ConfirmInfoBarDelegate; class GURL; +class InfoBarUiTest; namespace infobars { @@ -119,6 +120,8 @@ virtual void NotifyInfoBarRemoved(InfoBar* infobar, bool animate); private: + friend class ::InfoBarUiTest; + // InfoBars associated with this InfoBarManager. We own these pointers. // However, this is not a vector of unique_ptr, because we don't delete the // infobars directly once they've been added to this; instead, when we're
diff --git a/components/offline_pages/core/offline_page_metadata_store_sql.cc b/components/offline_pages/core/offline_page_metadata_store_sql.cc index 391bb00d..ab03146 100644 --- a/components/offline_pages/core/offline_page_metadata_store_sql.cc +++ b/components/offline_pages/core/offline_page_metadata_store_sql.cc
@@ -13,10 +13,12 @@ #include "base/sequenced_task_runner.h" #include "base/single_thread_task_runner.h" #include "base/strings/utf_string_conversions.h" +#include "components/offline_pages/core/client_namespace_constants.h" #include "components/offline_pages/core/offline_page_item.h" #include "components/offline_pages/core/offline_store_types.h" #include "components/offline_pages/core/offline_store_utils.h" #include "sql/connection.h" +#include "sql/meta_table.h" #include "sql/statement.h" #include "sql/transaction.h" @@ -27,6 +29,13 @@ // it can be used inline in other SQL statements below. #define OFFLINE_PAGES_TABLE_NAME "offlinepages_v1" +// This is the first version saved in the meta table, which was introduced in +// the store in M65. It is set once a legacy upgrade is run successfully for the +// last time in |UpgradeFromLegacyVersion|. +static const int kFirstPostLegacyVersion = 1; +static const int kCurrentVersion = 2; +static const int kCompatibleVersion = kFirstPostLegacyVersion; + void ReportStoreEvent(OfflinePagesStoreEvent event) { UMA_HISTOGRAM_ENUMERATION("OfflinePages.SQLStorage.StoreEvent", event, OfflinePagesStoreEvent::STORE_EVENT_COUNT); @@ -166,19 +175,28 @@ return UpgradeWithQuery(db, kSql); } -bool CreateSchema(sql::Connection* db) { - // If you create a transaction but don't Commit() it is automatically - // rolled back by its destructor when it falls out of scope. +bool CreateLatestSchema(sql::Connection* db) { sql::Transaction transaction(db); if (!transaction.Begin()) return false; - if (!db->DoesTableExist(OFFLINE_PAGES_TABLE_NAME)) { - if (!CreateOfflinePagesTable(db)) - return false; - } + // First time database initialization. + if (!CreateOfflinePagesTable(db)) + return false; - // Upgrade section. Details are described in the header file. + sql::MetaTable meta_table; + if (!meta_table.Init(db, kCurrentVersion, kCompatibleVersion)) + return false; + + return transaction.Commit(); +} + +bool UpgradeFromLegacyVersion(sql::Connection* db) { + sql::Transaction transaction(db); + if (!transaction.Begin()) + return false; + + // Legacy upgrade section. Details are described in the header file. if (!db->DoesColumnExist(OFFLINE_PAGES_TABLE_NAME, "expiration_time") && !db->DoesColumnExist(OFFLINE_PAGES_TABLE_NAME, "title")) { if (!UpgradeFrom52(db)) @@ -203,10 +221,58 @@ return false; } - // This would be a great place to add indices when we need them. + sql::MetaTable meta_table; + if (!meta_table.Init(db, kFirstPostLegacyVersion, kCompatibleVersion)) + return false; + return transaction.Commit(); } +bool UpgradeFromVersion1ToVersion2(sql::Connection* db, + sql::MetaTable* meta_table) { + sql::Transaction transaction(db); + if (!transaction.Begin()) + return false; + + static const char kSql[] = "UPDATE " OFFLINE_PAGES_TABLE_NAME + " SET upgrade_attempt = 5 " + " WHERE client_namespace = 'async_loading'" + " OR client_namespace = 'download'" + " OR client_namespace = 'ntp_suggestions'" + " OR client_namespace = 'browser_actions'"; + + sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql)); + if (!statement.Run()) + return false; + + meta_table->SetVersionNumber(2); + return transaction.Commit(); +} + +bool CreateSchema(sql::Connection* db) { + if (!sql::MetaTable::DoesTableExist(db)) { + // If this looks like a completely empty DB, simply start from scratch. + if (!db->DoesTableExist(OFFLINE_PAGES_TABLE_NAME)) + return CreateLatestSchema(db); + + // Otherwise we need to run a legacy upgrade. + if (!UpgradeFromLegacyVersion(db)) + return false; + } + + sql::MetaTable meta_table; + if (!meta_table.Init(db, kCurrentVersion, kCompatibleVersion)) + return false; + + if (meta_table.GetVersionNumber() == 1) { + if (!UpgradeFromVersion1ToVersion2(db, &meta_table)) + return false; + } + + // This would be a great place to add indices when we need them. + return true; +} + bool DeleteByOfflineId(sql::Connection* db, int64_t offline_id) { static const char kSql[] = "DELETE FROM " OFFLINE_PAGES_TABLE_NAME " WHERE offline_id=?";
diff --git a/components/offline_pages/core/offline_page_metadata_store_unittest.cc b/components/offline_pages/core/offline_page_metadata_store_unittest.cc index b7b414a..293fa61 100644 --- a/components/offline_pages/core/offline_page_metadata_store_unittest.cc +++ b/components/offline_pages/core/offline_page_metadata_store_unittest.cc
@@ -15,10 +15,14 @@ #include "base/strings/utf_string_conversions.h" #include "base/test/test_mock_time_task_runner.h" #include "base/threading/thread_task_runner_handle.h" +#include "components/offline_pages/core/client_namespace_constants.h" +#include "components/offline_pages/core/model/offline_page_item_generator.h" #include "components/offline_pages/core/offline_page_item.h" #include "components/offline_pages/core/offline_page_metadata_store_sql.h" #include "components/offline_pages/core/offline_page_model.h" +#include "components/offline_pages/core/offline_store_utils.h" #include "sql/connection.h" +#include "sql/meta_table.h" #include "sql/statement.h" #include "testing/gtest/include/gtest/gtest.h" @@ -360,6 +364,101 @@ ASSERT_FALSE(connection.DoesColumnExist(OFFLINE_PAGES_TABLE_V1, "digest")); } +void InjectItemInM62Store(sql::Connection* db, const OfflinePageItem& item) { + ASSERT_TRUE(db->BeginTransaction()); + sql::Statement statement(db->GetUniqueStatement( + "INSERT INTO " OFFLINE_PAGES_TABLE_V1 + "(offline_id, creation_time, file_size, " + "last_access_time, access_count, client_namespace, " + "client_id, online_url, file_path, title, original_url, " + "request_origin, system_download_id, file_missing_time, " + "upgrade_attempt, digest) " + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")); + statement.BindInt64(0, item.offline_id); + statement.BindInt(1, store_utils::ToDatabaseTime(item.creation_time)); + statement.BindInt64(2, item.file_size); + statement.BindInt(3, store_utils::ToDatabaseTime(item.last_access_time)); + statement.BindInt(4, item.access_count); + statement.BindString(5, item.client_id.name_space); + statement.BindString(6, item.client_id.id); + statement.BindString(7, item.url.spec()); + statement.BindString(8, store_utils::ToDatabaseFilePath(item.file_path)); + statement.BindString16(9, item.title); + statement.BindString(10, item.original_url.spec()); + statement.BindString(11, item.request_origin); + statement.BindInt64(12, item.system_download_id); + statement.BindInt(13, store_utils::ToDatabaseTime(item.file_missing_time)); + statement.BindInt(14, item.upgrade_attempt); + statement.BindString(15, item.digest); + ASSERT_TRUE(statement.Run()); + ASSERT_TRUE(db->CommitTransaction()); +} + +void BuildTestStoreWithSchemaFromM62(const base::FilePath& file) { + sql::Connection connection; + ASSERT_TRUE( + connection.Open(file.Append(FILE_PATH_LITERAL("OfflinePages.db")))); + ASSERT_TRUE(connection.is_open()); + ASSERT_TRUE(connection.BeginTransaction()); + ASSERT_TRUE( + connection.Execute("CREATE TABLE " OFFLINE_PAGES_TABLE_V1 + "(offline_id INTEGER PRIMARY KEY NOT NULL," + " creation_time INTEGER NOT NULL," + " file_size INTEGER NOT NULL," + " last_access_time INTEGER NOT NULL," + " access_count INTEGER NOT NULL," + " system_download_id INTEGER NOT NULL DEFAULT 0," + " file_missing_time INTEGER NOT NULL DEFAULT 0," + " upgrade_attempt INTEGER NOT NULL DEFAULT 0," + " client_namespace VARCHAR NOT NULL," + " client_id VARCHAR NOT NULL," + " online_url VARCHAR NOT NULL," + " file_path VARCHAR NOT NULL," + " title VARCHAR NOT NULL DEFAULT ''," + " original_url VARCHAR NOT NULL DEFAULT ''," + " request_origin VARCHAR NOT NULL DEFAULT ''," + " digest VARCHAR NOT NULL DEFAULT ''" + ")")); + ASSERT_TRUE(connection.CommitTransaction()); + + OfflinePageItemGenerator generator; + generator.SetNamespace(kTestClientNamespace); + generator.SetId(kTestClientId2.id); + generator.SetUrl(GURL(kTestURL)); + generator.SetRequestOrigin(kTestRequestOrigin); + generator.SetFileSize(kFileSize); + OfflinePageItem test_item = generator.CreateItem(); + test_item.offline_id = kOfflineId; + test_item.file_path = base::FilePath(kFilePath); + InjectItemInM62Store(&connection, test_item); +} + +void BuildTestStoreWithSchemaVersion1(const base::FilePath& file) { + BuildTestStoreWithSchemaFromM62(file); + sql::Connection connection; + ASSERT_TRUE( + connection.Open(file.Append(FILE_PATH_LITERAL("OfflinePages.db")))); + ASSERT_TRUE(connection.is_open()); + ASSERT_TRUE(connection.BeginTransaction()); + sql::MetaTable meta_table; + ASSERT_TRUE(meta_table.Init(&connection, 1, 1)); + ASSERT_TRUE(connection.CommitTransaction()); + + OfflinePageItemGenerator generator; + generator.SetUrl(GURL(kTestURL)); + generator.SetRequestOrigin(kTestRequestOrigin); + generator.SetFileSize(kFileSize); + + generator.SetNamespace(kAsyncNamespace); + InjectItemInM62Store(&connection, generator.CreateItem()); + generator.SetNamespace(kDownloadNamespace); + InjectItemInM62Store(&connection, generator.CreateItem()); + generator.SetNamespace(kBrowserActionsNamespace); + InjectItemInM62Store(&connection, generator.CreateItem()); + generator.SetNamespace(kNTPSuggestionsNamespace); + InjectItemInM62Store(&connection, generator.CreateItem()); +} + class OfflinePageMetadataStoreFactory { public: OfflinePageMetadataStore* BuildStore(const base::FilePath& file_path) { @@ -416,6 +515,21 @@ base::ThreadTaskRunnerHandle::Get(), file_path); return store; } + + OfflinePageMetadataStore* BuildStoreM62(const base::FilePath& file_path) { + BuildTestStoreWithSchemaFromM62(file_path); + OfflinePageMetadataStoreSQL* store = new OfflinePageMetadataStoreSQL( + base::ThreadTaskRunnerHandle::Get(), file_path); + return store; + } + + OfflinePageMetadataStore* BuildStoreVersion1( + const base::FilePath& file_path) { + BuildTestStoreWithSchemaVersion1(file_path); + OfflinePageMetadataStoreSQL* store = new OfflinePageMetadataStoreSQL( + base::ThreadTaskRunnerHandle::Get(), file_path); + return store; + } }; enum CalledCallback { NONE, LOAD, ADD, UPDATE, REMOVE, RESET }; @@ -440,6 +554,11 @@ std::unique_ptr<OfflinePageMetadataStore> BuildStoreWithSchemaFromM56(); std::unique_ptr<OfflinePageMetadataStore> BuildStoreWithSchemaFromM57(); std::unique_ptr<OfflinePageMetadataStore> BuildStoreWithSchemaFromM61(); + std::unique_ptr<OfflinePageMetadataStore> BuildStoreWithSchemaFromM62(); + std::unique_ptr<OfflinePageMetadataStore> BuildStoreWithSchemaVersion1(); + + void VerifyMetaVersions(int expected_current_version, + int expected_compatible_version); void PumpLoop(); void FastForwardBy(base::TimeDelta time_delta); @@ -457,6 +576,8 @@ void CheckThatOfflinePageCanBeSaved( std::unique_ptr<OfflinePageMetadataStore> store); + void CheckStoreItemsPostUpgradeFromVersion1(); + OfflinePagesUpdateResult* last_update_result() { return last_update_result_.get(); } @@ -542,6 +663,25 @@ return offline_pages_[0]; } +void OfflinePageMetadataStoreTest::CheckStoreItemsPostUpgradeFromVersion1() { + EXPECT_EQ(LOAD, last_called_callback_); + EXPECT_EQ(STATUS_TRUE, last_status_); + EXPECT_EQ(5U, offline_pages_.size()); + + // TODO(fgorski): Use persistent namespaces from the client policy controller + // once an appropriate method is available. + std::set<std::string> upgradeable_namespaces{ + kAsyncNamespace, kDownloadNamespace, kBrowserActionsNamespace, + kNTPSuggestionsNamespace}; + + for (auto page : offline_pages_) { + if (upgradeable_namespaces.count(page.client_id.name_space) > 0) + EXPECT_EQ(5, page.upgrade_attempt); + else + EXPECT_EQ(0, page.upgrade_attempt); + } +} + void OfflinePageMetadataStoreTest::CheckThatOfflinePageCanBeSaved( std::unique_ptr<OfflinePageMetadataStore> store) { size_t store_size = offline_pages_.size(); @@ -710,6 +850,54 @@ return store; } +std::unique_ptr<OfflinePageMetadataStore> +OfflinePageMetadataStoreTest::BuildStoreWithSchemaFromM62() { + std::unique_ptr<OfflinePageMetadataStore> store( + factory_.BuildStoreM62(temp_directory_.GetPath())); + PumpLoop(); + store->Initialize( + base::BindRepeating(&OfflinePageMetadataStoreTest::InitializeCallback, + base::Unretained(this))); + PumpLoop(); + store->GetOfflinePages(base::BindRepeating( + &OfflinePageMetadataStoreTest::GetOfflinePagesCallback, + base::Unretained(this))); + PumpLoop(); + return store; +} + +std::unique_ptr<OfflinePageMetadataStore> +OfflinePageMetadataStoreTest::BuildStoreWithSchemaVersion1() { + std::unique_ptr<OfflinePageMetadataStore> store( + factory_.BuildStoreVersion1(temp_directory_.GetPath())); + PumpLoop(); + store->Initialize( + base::BindRepeating(&OfflinePageMetadataStoreTest::InitializeCallback, + base::Unretained(this))); + PumpLoop(); + store->GetOfflinePages(base::BindRepeating( + &OfflinePageMetadataStoreTest::GetOfflinePagesCallback, + base::Unretained(this))); + PumpLoop(); + return store; +} + +void OfflinePageMetadataStoreTest::VerifyMetaVersions( + int expected_current_version, + int expected_compatible_version) { + sql::Connection connection; + ASSERT_TRUE(connection.Open( + temp_directory_.GetPath().Append(FILE_PATH_LITERAL("OfflinePages.db")))); + ASSERT_TRUE(connection.is_open()); + EXPECT_TRUE(sql::MetaTable::DoesTableExist(&connection)); + sql::MetaTable meta_table; + EXPECT_TRUE(meta_table.Init(&connection, 1, 1)); + + EXPECT_EQ(expected_current_version, meta_table.GetVersionNumber()); + EXPECT_EQ(expected_compatible_version, + meta_table.GetCompatibleVersionNumber()); +} + // Loads empty store and makes sure that there are no offline pages stored in // it. TEST_F(OfflinePageMetadataStoreTest, LoadEmptyStore) { @@ -801,6 +989,7 @@ OfflinePageItem item = CheckThatStoreHasOneItem(); CheckThatOfflinePageCanBeSaved(std::move(store)); + VerifyMetaVersions(2, 1); } // Loads a store which has an outdated schema. @@ -812,6 +1001,7 @@ OfflinePageItem item = CheckThatStoreHasOneItem(); CheckThatOfflinePageCanBeSaved(std::move(store)); + VerifyMetaVersions(2, 1); } // Loads a string with schema from M54. @@ -823,6 +1013,7 @@ OfflinePageItem item = CheckThatStoreHasOneItem(); CheckThatOfflinePageCanBeSaved(std::move(store)); + VerifyMetaVersions(2, 1); } // Loads a string with schema from M55. @@ -834,6 +1025,7 @@ OfflinePageItem item = CheckThatStoreHasOneItem(); CheckThatOfflinePageCanBeSaved(std::move(store)); + VerifyMetaVersions(2, 1); } // Loads a string with schema from M56. @@ -845,6 +1037,7 @@ OfflinePageItem item = CheckThatStoreHasOneItem(); CheckThatOfflinePageCanBeSaved(std::move(store)); + VerifyMetaVersions(2, 1); } // Loads a string with schema from M57. @@ -856,6 +1049,7 @@ OfflinePageItem item = CheckThatStoreHasOneItem(); CheckThatOfflinePageCanBeSaved(std::move(store)); + VerifyMetaVersions(2, 1); } // Loads a string with schema from M61. @@ -867,6 +1061,27 @@ OfflinePageItem item = CheckThatStoreHasOneItem(); CheckThatOfflinePageCanBeSaved(std::move(store)); + VerifyMetaVersions(2, 1); +} + +// Loads a string with schema from M62. +TEST_F(OfflinePageMetadataStoreTest, LoadVersion62Store) { + std::unique_ptr<OfflinePageMetadataStore> store( + BuildStoreWithSchemaFromM62()); + + OfflinePageItem item = CheckThatStoreHasOneItem(); + CheckThatOfflinePageCanBeSaved(std::move(store)); + VerifyMetaVersions(2, 1); +} + +// Loads a string with schema from version 1 (as tracked by meta table). +TEST_F(OfflinePageMetadataStoreTest, LoadStoreWithMetaVersion1) { + std::unique_ptr<OfflinePageMetadataStore> store( + BuildStoreWithSchemaVersion1()); + + CheckStoreItemsPostUpgradeFromVersion1(); + CheckThatOfflinePageCanBeSaved(std::move(store)); + VerifyMetaVersions(2, 1); } // Adds metadata of an offline page into a store and then opens the store
diff --git a/content/browser/android/selection_popup_controller.cc b/content/browser/android/selection_popup_controller.cc index 8adc372f..0fbb90fc 100644 --- a/content/browser/android/selection_popup_controller.cc +++ b/content/browser/android/selection_popup_controller.cc
@@ -99,7 +99,8 @@ void SelectionPopupController::OnSelectionEvent( ui::SelectionEventType event, - const gfx::RectF& selection_rect) { + const gfx::RectF& selection_rect, + const gfx::PointF& bound_middle_point) { JNIEnv* env = AttachCurrentThread(); ScopedJavaLocalRef<jobject> obj = java_obj_.get(env); if (obj.is_null()) @@ -107,7 +108,8 @@ Java_SelectionPopupController_onSelectionEvent( env, obj, event, selection_rect.x(), selection_rect.y(), - selection_rect.right(), selection_rect.bottom()); + selection_rect.right(), selection_rect.bottom(), bound_middle_point.x(), + bound_middle_point.y()); } void SelectionPopupController::OnSelectionChanged(const std::string& text) {
diff --git a/content/browser/android/selection_popup_controller.h b/content/browser/android/selection_popup_controller.h index f8211f8..a551de42 100644 --- a/content/browser/android/selection_popup_controller.h +++ b/content/browser/android/selection_popup_controller.h
@@ -34,7 +34,8 @@ // Called from native -> java void OnSelectionEvent(ui::SelectionEventType event, - const gfx::RectF& selection_rect); + const gfx::RectF& selection_rect, + const gfx::PointF& bound_middle_point); void OnSelectionChanged(const std::string& text); bool ShowSelectionMenu(const ContextMenuParams& params, int handle_height); void OnShowUnhandledTapUIIfNeeded(int x_dip, int y_dip, float dip_scale);
diff --git a/content/browser/devtools/render_frame_devtools_agent_host.cc b/content/browser/devtools/render_frame_devtools_agent_host.cc index 1b8d347..0e931230 100644 --- a/content/browser/devtools/render_frame_devtools_agent_host.cc +++ b/content/browser/devtools/render_frame_devtools_agent_host.cc
@@ -993,8 +993,10 @@ void RenderFrameDevToolsAgentHost::RenderFrameDeleted(RenderFrameHost* rfh) { if (IsBrowserSideNavigationEnabled()) { - if (rfh == frame_host_) + if (rfh == frame_host_) { render_frame_alive_ = false; + agent_ptr_.reset(); + } DCHECK(CheckConsistency()); return; } @@ -1375,7 +1377,7 @@ } bool RenderFrameDevToolsAgentHost::EnsureAgent() { - if (!frame_host_) + if (!frame_host_ || !render_frame_alive_) return false; if (!agent_ptr_) frame_host_->GetRemoteAssociatedInterfaces()->GetInterface(&agent_ptr_);
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc index b285a3bf..c8660add 100644 --- a/content/browser/frame_host/render_frame_host_impl.cc +++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -3672,9 +3672,30 @@ // completing an unload handler. ResetWaitingState(); - Send(new FrameMsg_FailedNavigation(routing_id_, common_params, request_params, - has_stale_copy_in_cache, error_code, - error_page_content)); + StoragePartitionImpl* storage_partition = + static_cast<StoragePartitionImpl*>(BrowserContext::GetStoragePartition( + GetSiteInstance()->GetBrowserContext(), GetSiteInstance())); + + mojom::URLLoaderFactoryPtr default_factory; + if (g_url_loader_factory_callback_for_test.Get().is_null()) { + storage_partition->GetNetworkContext()->CreateURLLoaderFactory( + mojo::MakeRequest(&default_factory), GetProcess()->GetID()); + } else { + mojom::URLLoaderFactoryPtr original_factory; + storage_partition->GetNetworkContext()->CreateURLLoaderFactory( + mojo::MakeRequest(&original_factory), GetProcess()->GetID()); + g_url_loader_factory_callback_for_test.Get().Run( + mojo::MakeRequest(&default_factory), GetProcess()->GetID(), + original_factory.PassInterface()); + } + + base::Optional<URLLoaderFactoryBundle> subresource_loader_factories; + subresource_loader_factories.emplace(); + subresource_loader_factories->SetDefaultFactory(std::move(default_factory)); + + GetNavigationControl()->CommitFailedNavigation( + common_params, request_params, has_stale_copy_in_cache, error_code, + error_page_content, std::move(subresource_loader_factories)); // An error page is expected to commit, hence why is_loading_ is set to true. is_loading_ = true;
diff --git a/content/browser/loader/resource_hints_impl.cc b/content/browser/loader/resource_hints_impl.cc index a0ab5b2..6b1451c8 100644 --- a/content/browser/loader/resource_hints_impl.cc +++ b/content/browser/loader/resource_hints_impl.cc
@@ -6,6 +6,7 @@ #include "base/memory/ptr_util.h" #include "base/memory/ref_counted.h" +#include "base/trace_event/trace_event.h" #include "content/browser/loader/resource_dispatcher_host_impl.h" #include "content/public/browser/resource_hints.h" #include "net/base/address_list.h" @@ -55,6 +56,7 @@ ->io_thread_task_runner() ->BelongsToCurrentThread()); DCHECK(getter); + TRACE_EVENT2("net", "PreconnectUrl", "url", url.spec(), "count", count); net::URLRequestContext* request_context = getter->GetURLRequestContext(); if (!request_context) @@ -99,6 +101,7 @@ ->io_thread_task_runner() ->BelongsToCurrentThread()); DCHECK(getter); + TRACE_EVENT1("net", "PreresolveUrl", "url", url.spec()); net::URLRequestContext* request_context = getter->GetURLRequestContext(); if (!request_context)
diff --git a/content/browser/locks/lock_manager.cc b/content/browser/locks/lock_manager.cc index f2613ef6b..d4d5ea6 100644 --- a/content/browser/locks/lock_manager.cc +++ b/content/browser/locks/lock_manager.cc
@@ -15,15 +15,6 @@ namespace { -template <typename T> -bool Intersects(const std::vector<T>& a, const std::unordered_set<T>& b) { - for (const auto& k : a) { - if (b.find(k) != b.end()) - return true; - } - return false; -} - // A LockHandle is passed to the client when a lock is granted. As long as the // handle is held, the lock is held. Dropping the handle - either explicitly // by script or by process termination - causes the lock to be released. @@ -63,18 +54,15 @@ // and passed to the held callback. Eventually the client will drop the // handle, which will notify the context and remove this. struct LockManager::Lock { - Lock(std::vector<std::string> scope, + Lock(const std::string& name, LockMode mode, int64_t id, blink::mojom::LockRequestPtr request) - : scope(std::move(scope)), - mode(mode), - id(id), - request(std::move(request)) {} + : name(name), mode(mode), id(id), request(std::move(request)) {} ~Lock() = default; - const std::vector<std::string> scope; + const std::string name; const LockMode mode; const int64_t id; blink::mojom::LockRequestPtr request; @@ -87,21 +75,18 @@ LockManager::OriginState::OriginState() = default; LockManager::OriginState::~OriginState() = default; -bool LockManager::OriginState::IsGrantable( - const std::vector<std::string>& scope, - LockMode mode) const { +bool LockManager::OriginState::IsGrantable(const std::string& name, + LockMode mode) const { if (mode == LockMode::EXCLUSIVE) { - return !Intersects(scope, shared) && !Intersects(scope, exclusive); + return !shared.count(name) && !exclusive.count(name); } else { - return !Intersects(scope, exclusive); + return !exclusive.count(name); } } -void LockManager::OriginState::MergeLockState( - const std::vector<std::string>& scope, - LockMode mode) { - (mode == LockMode::SHARED ? shared : exclusive) - .insert(scope.begin(), scope.end()); +void LockManager::OriginState::MergeLockState(const std::string& name, + LockMode mode) { + (mode == LockMode::SHARED ? shared : exclusive).insert(name); } void LockManager::CreateService(blink::mojom::LockManagerRequest request) { @@ -110,13 +95,13 @@ } void LockManager::RequestLock(const url::Origin& origin, - const std::vector<std::string>& scope, + const std::string& name, LockMode mode, WaitMode wait, blink::mojom::LockRequestPtr request) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (wait == WaitMode::NO_WAIT && !IsGrantable(origin, scope, mode)) { + if (wait == WaitMode::NO_WAIT && !IsGrantable(origin, name, mode)) { request->Failed(); return; } @@ -127,8 +112,8 @@ &LockManager::ReleaseLock, base::Unretained(this), origin, lock_id)); origins_[origin].requested.emplace(std::make_pair( - lock_id, std::make_unique<Lock>(std::move(scope), mode, lock_id, - std::move(request)))); + lock_id, + std::make_unique<Lock>(name, mode, lock_id, std::move(request)))); ProcessRequests(origin); } @@ -149,13 +134,13 @@ } bool LockManager::IsGrantable(const url::Origin& origin, - const std::vector<std::string>& scope, + const std::string& name, LockMode mode) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (!base::ContainsKey(origins_, origin)) return true; - return origins_[origin].IsGrantable(scope, mode); + return origins_[origin].IsGrantable(name, mode); } void LockManager::ProcessRequests(const url::Origin& origin) { @@ -172,15 +157,15 @@ state.exclusive.clear(); for (const auto& id_lock_pair : state.held) { const auto& lock = id_lock_pair.second; - state.MergeLockState(lock->scope, lock->mode); + state.MergeLockState(lock->name, lock->mode); } for (auto it = state.requested.begin(); it != state.requested.end();) { auto& lock = it->second; - bool granted = state.IsGrantable(lock->scope, lock->mode); + bool granted = state.IsGrantable(lock->name, lock->mode); - state.MergeLockState(lock->scope, lock->mode); + state.MergeLockState(lock->name, lock->mode); if (granted) { std::unique_ptr<Lock> grantee = std::move(lock);
diff --git a/content/browser/locks/lock_manager.h b/content/browser/locks/lock_manager.h index 9453a3e..2eec0df 100644 --- a/content/browser/locks/lock_manager.h +++ b/content/browser/locks/lock_manager.h
@@ -8,7 +8,6 @@ #include <memory> #include <string> #include <unordered_set> -#include <vector> #include "base/callback.h" #include "base/memory/ref_counted.h" @@ -33,7 +32,7 @@ // Request a lock. When the lock is acquired, |callback| will be invoked with // a LockHandle. void RequestLock(const url::Origin& origin, - const std::vector<std::string>& scope, + const std::string& name, LockMode mode, WaitMode wait, blink::mojom::LockRequestPtr request) override; @@ -54,9 +53,8 @@ OriginState(); ~OriginState(); - bool IsGrantable(const std::vector<std::string>& scope, - LockMode mode) const; - void MergeLockState(const std::vector<std::string>& scope, LockMode mode); + bool IsGrantable(const std::string& name, LockMode mode) const; + void MergeLockState(const std::string& name, LockMode mode); std::map<int64_t, std::unique_ptr<Lock>> requested; std::map<int64_t, std::unique_ptr<Lock>> held; @@ -68,7 +66,7 @@ }; bool IsGrantable(const url::Origin& origin, - const std::vector<std::string>& scope, + const std::string& name, LockMode mode); // Called when a lock is requested and optionally when a lock is released,
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 8da9bd7..0edc633 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.cc +++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -1436,7 +1436,8 @@ ResetGestureDetection(); } selection_popup_controller_->OnSelectionEvent( - event, GetSelectionRect(*touch_selection_controller_)); + event, GetSelectionRect(*touch_selection_controller_), + touch_selection_controller_->GetActiveHandleBoundPoint()); } ui::TouchSelectionControllerClient*
diff --git a/content/browser/service_manager/service_manager_context.cc b/content/browser/service_manager/service_manager_context.cc index bdaf373..8559624 100644 --- a/content/browser/service_manager/service_manager_context.cc +++ b/content/browser/service_manager/service_manager_context.cc
@@ -445,6 +445,8 @@ device_info.factory = base::Bind( &device::CreateDeviceService, device_blocking_task_runner, BrowserThread::GetTaskRunnerForThread(BrowserThread::IO), + base::BindRepeating(&GetGeolocationRequestContextFromContentClient), + GetContentClient()->browser()->GetGeolocationApiKey(), base::Bind(&WakeLockContextHost::GetNativeViewForContext), base::Bind(&ContentBrowserClient::OverrideSystemLocationProvider, base::Unretained(GetContentClient()->browser())), @@ -453,6 +455,8 @@ device_info.factory = base::Bind( &device::CreateDeviceService, device_blocking_task_runner, BrowserThread::GetTaskRunnerForThread(BrowserThread::IO), + base::BindRepeating(&GetGeolocationRequestContextFromContentClient), + GetContentClient()->browser()->GetGeolocationApiKey(), base::Bind(&ContentBrowserClient::OverrideSystemLocationProvider, base::Unretained(GetContentClient()->browser()))); #endif @@ -460,10 +464,10 @@ packaged_services_connection_->AddEmbeddedService(device::mojom::kServiceName, device_info); - // Pipe embedder-supplied API key through to GeolocationProvider. - // TODO(amoylan): Once GeolocationProvider hangs off DeviceService - // (https://crbug.com/709301), pass these via CreateDeviceService above - // instead. + // Pipe embedder-supplied API key & URL request context producer through to + // GeolocationProvider. + // TODO(amoylan): Remove these once GeolocationProvider hangs off + // DeviceService (https://crbug.com/709301). device::GeolocationProvider::SetRequestContextProducer( base::BindRepeating(&GetGeolocationRequestContextFromContentClient)); device::GeolocationProvider::SetApiKey(
diff --git a/content/common/frame.mojom b/content/common/frame.mojom index 08f9728c..0681334 100644 --- a/content/common/frame.mojom +++ b/content/common/frame.mojom
@@ -79,6 +79,23 @@ URLLoaderClientEndpoints? url_loader_client_endpoints, URLLoaderFactoryBundle? subresource_loader_factories, mojo.common.mojom.UnguessableToken devtools_navigation_token); + + // Tells the renderer that a failed navigation is ready to commit. + // + // The result of this commit usually results in displaying an error page. + // Note |error_page_content| may contain the content of the error page + // (i.e. flattened HTML, JS, CSS). + // + // When the Network Service is enabled, |subresource_loader_factories| may + // also be provided by the browser as a a means for the renderer to load + // subresources where applicable. + CommitFailedNavigation( + CommonNavigationParams common_params, + RequestNavigationParams request_params, + bool has_stale_copy_in_cache, + int32 error_code, + string? error_page_content, + URLLoaderFactoryBundle? subresource_loader_factories); }; // Implemented by the frame (e.g. renderer processes).
diff --git a/content/common/frame_messages.h b/content/common/frame_messages.h index 8ba6261..a315de27 100644 --- a/content/common/frame_messages.h +++ b/content/common/frame_messages.h
@@ -951,16 +951,6 @@ #endif // PlzNavigate -// Tells the renderer that a navigation failed with the error code |error_code| -// and that the renderer should display an appropriate error page. -IPC_MESSAGE_ROUTED5(FrameMsg_FailedNavigation, - content::CommonNavigationParams, /* common_params */ - content::RequestNavigationParams, /* request_params */ - bool, /* stale_copy_in_cache */ - int, /* error_code */ - base::Optional<std::string> /* error_page_content */) - -// PlzNavigate // Tells the renderer that a navigation was blocked because a content security // policy was violated. IPC_MESSAGE_ROUTED1(FrameMsg_ReportContentSecurityPolicyViolation,
diff --git a/content/public/android/java/src/org/chromium/content/browser/SelectionPopupController.java b/content/public/android/java/src/org/chromium/content/browser/SelectionPopupController.java index edbd18c..3d44258e 100644 --- a/content/public/android/java/src/org/chromium/content/browser/SelectionPopupController.java +++ b/content/public/android/java/src/org/chromium/content/browser/SelectionPopupController.java
@@ -1049,7 +1049,8 @@ // All coordinates are in DIP. @CalledByNative - private void onSelectionEvent(int eventType, int left, int top, int right, int bottom) { + private void onSelectionEvent(int eventType, int left, int top, int right, int bottom, + float boundMiddlePointX, float boundMiddlePointY) { // Ensure the provided selection coordinates form a non-empty rect, as required by // the selection action mode. if (left == right) ++right;
diff --git a/content/renderer/devtools/devtools_agent.cc b/content/renderer/devtools/devtools_agent.cc index 5250f191..37bd1f5 100644 --- a/content/renderer/devtools/devtools_agent.cc +++ b/content/renderer/devtools/devtools_agent.cc
@@ -271,10 +271,6 @@ GetWebAgent()->FailedToRequestDevTools(session_id); } -void DevToolsAgent::ContinueProgram() { - GetWebAgent()->ContinueProgram(); -} - WebDevToolsAgent* DevToolsAgent::GetWebAgent() { return frame_->GetWebFrame()->DevToolsAgent(); } @@ -287,16 +283,4 @@ return weak_factory_.GetWeakPtr(); } -bool DevToolsAgent::IsAttached() { - return !hosts_.empty(); -} - -void DevToolsAgent::DetachAllSessions() { - for (auto& it : hosts_) - GetWebAgent()->Detach(it.first); - hosts_.clear(); - io_sessions_.clear(); - sessions_.clear(); -} - } // namespace content
diff --git a/content/renderer/devtools/devtools_agent.h b/content/renderer/devtools/devtools_agent.h index 3703a90..04deb945 100644 --- a/content/renderer/devtools/devtools_agent.h +++ b/content/renderer/devtools/devtools_agent.h
@@ -37,9 +37,6 @@ void BindRequest(mojom::DevToolsAgentAssociatedRequest request); base::WeakPtr<DevToolsAgent> GetWeakPtr(); - bool IsAttached(); - void DetachAllSessions(); - void ContinueProgram(); private: class Session;
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index d3bb3d87..cbc1a644 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc
@@ -1788,7 +1788,6 @@ IPC_MESSAGE_HANDLER(FrameMsg_SetTextTrackSettings, OnTextTrackSettingsChanged) IPC_MESSAGE_HANDLER(FrameMsg_PostMessageEvent, OnPostMessageEvent) - IPC_MESSAGE_HANDLER(FrameMsg_FailedNavigation, OnFailedNavigation) IPC_MESSAGE_HANDLER(FrameMsg_ReportContentSecurityPolicyViolation, OnReportContentSecurityPolicyViolation) IPC_MESSAGE_HANDLER(FrameMsg_GetSavableResourceLinks, @@ -1846,8 +1845,6 @@ DCHECK(!IsBrowserSideNavigationEnabled()); TRACE_EVENT2("navigation,rail", "RenderFrameImpl::OnNavigate", "id", routing_id_, "url", common_params.url.possibly_invalid_spec()); - if (devtools_agent_) - devtools_agent_->ContinueProgram(); NavigateInternal(common_params, start_params, request_params, std::unique_ptr<StreamOverrideParameters>(), /*subresource_loader_factories=*/base::nullopt, @@ -2999,8 +2996,7 @@ } void RenderFrameImpl::DetachDevToolsForTest() { - if (devtools_agent_) - devtools_agent_->DetachAllSessions(); + frame_->DetachAllDevToolsSessionsForTesting(); } void RenderFrameImpl::SetPreviewsState(PreviewsState previews_state) { @@ -3131,6 +3127,128 @@ // RenderFrameImpl. } +void RenderFrameImpl::CommitFailedNavigation( + const CommonNavigationParams& common_params, + const RequestNavigationParams& request_params, + bool has_stale_copy_in_cache, + int error_code, + const base::Optional<std::string>& error_page_content, + base::Optional<URLLoaderFactoryBundle> subresource_loader_factories) { + DCHECK(IsBrowserSideNavigationEnabled()); + bool is_reload = + FrameMsg_Navigate_Type::IsReload(common_params.navigation_type); + RenderFrameImpl::PrepareRenderViewForNavigation(common_params.url, + request_params); + + GetContentClient()->SetActiveURL( + common_params.url, frame_->Top()->GetSecurityOrigin().ToString().Utf8()); + + if (subresource_loader_factories) + subresource_loader_factories_ = std::move(subresource_loader_factories); + + // If this frame is navigating cross-process, it may naively assume that this + // is the first navigation in the frame, but this may not actually be the + // case. Inform the frame's state machine if this frame has already committed + // other loads. + if (request_params.has_committed_real_load) + frame_->SetCommittedFirstRealLoad(); + + pending_navigation_params_.reset(new NavigationParams( + common_params, StartNavigationParams(), request_params)); + + // Send the provisional load failure. + WebURLError error( + error_code, + has_stale_copy_in_cache ? WebURLError::HasCopyInCache::kTrue + : WebURLError::HasCopyInCache::kFalse, + WebURLError::IsWebSecurityViolation::kFalse, common_params.url); + WebURLRequest failed_request = + CreateURLRequestForNavigation(common_params, request_params, + std::unique_ptr<StreamOverrideParameters>(), + frame_->IsViewSourceModeEnabled(), + false); // is_same_document_navigation + + if (!ShouldDisplayErrorPageForFailedLoad(error_code, common_params.url)) { + // The browser expects this frame to be loading an error page. Inform it + // that the load stopped. + Send(new FrameHostMsg_DidStopLoading(routing_id_)); + browser_side_navigation_pending_ = false; + browser_side_navigation_pending_url_ = GURL(); + return; + } + + // On load failure, a frame can ask its owner to render fallback content. + // When that happens, don't load an error page. + WebLocalFrame::FallbackContentResult fallback_result = + frame_->MaybeRenderFallbackContent(error); + if (fallback_result != WebLocalFrame::NoFallbackContent) { + if (fallback_result == WebLocalFrame::NoLoadInProgress) { + // If the frame wasn't loading but was fallback-eligible, the fallback + // content won't be shown. However, showing an error page isn't right + // either, as the frame has already been populated with something + // unrelated to this navigation failure. In that case, just send a stop + // IPC to the browser to unwind its state, and leave the frame as-is. + Send(new FrameHostMsg_DidStopLoading(routing_id_)); + } + browser_side_navigation_pending_ = false; + browser_side_navigation_pending_url_ = GURL(); + return; + } + + // Make sure errors are not shown in view source mode. + frame_->EnableViewSourceMode(false); + + // Replace the current history entry in reloads, and loads of the same url. + // This corresponds to Blink's notion of a standard commit. + // Also replace the current history entry if the browser asked for it + // specifically. + // TODO(clamy): see if initial commits in subframes should be handled + // separately. + bool replace = is_reload || common_params.url == GetLoadingUrl() || + common_params.should_replace_current_entry; + std::unique_ptr<HistoryEntry> history_entry; + if (request_params.page_state.IsValid()) + history_entry = PageStateToHistoryEntry(request_params.page_state); + + // The load of the error page can result in this frame being removed. + // Use a WeakPtr as an easy way to detect whether this has occured. If so, + // this method should return immediately and not touch any part of the object, + // otherwise it will result in a use-after-free bug. + base::WeakPtr<RenderFrameImpl> weak_this = weak_factory_.GetWeakPtr(); + + // For renderer initiated navigations, we send out a didFailProvisionalLoad() + // notification. + bool had_provisional_document_loader = frame_->GetProvisionalDocumentLoader(); + if (request_params.nav_entry_id == 0) { + blink::WebHistoryCommitType commit_type = + replace ? blink::kWebHistoryInertCommit : blink::kWebStandardCommit; + if (error_page_content.has_value()) { + DidFailProvisionalLoadInternal(error, commit_type, error_page_content); + } else { + // TODO(https://crbug.com/778824): We only have this branch because a + // layout test expects DidFailProvisionalLoad() to be called directly, + // rather than DidFailProvisionalLoadInternal(). Once the bug is fixed, we + // should be able to call DidFailProvisionalLoadInternal() in all cases. + DidFailProvisionalLoad(error, commit_type); + } + if (!weak_this) + return; + } + + // If we didn't call didFailProvisionalLoad or there wasn't a + // GetProvisionalDocumentLoader(), LoadNavigationErrorPage wasn't called, so + // do it now. + if (request_params.nav_entry_id != 0 || !had_provisional_document_loader) { + LoadNavigationErrorPage(failed_request, error, replace, history_entry.get(), + error_page_content); + if (!weak_this) + return; + } + + browser_side_navigation_pending_ = false; + browser_side_navigation_pending_url_ = GURL(); +} + // mojom::HostZoom implementation ---------------------------------------------- void RenderFrameImpl::SetHostZoomLevel(const GURL& url, double zoom_level) { @@ -4207,11 +4325,6 @@ if (!document_is_empty) return; - // Do not show error page when DevTools is attached. - const RenderFrameImpl* localRoot = GetLocalRoot(); - if (localRoot->devtools_agent_ && localRoot->devtools_agent_->IsAttached()) - return; - // Display error page instead of a blank page, if appropriate. InternalDocumentStateData* internal_data = InternalDocumentStateData::FromDocumentLoader( @@ -5495,124 +5608,6 @@ } // PlzNavigate -void RenderFrameImpl::OnFailedNavigation( - const CommonNavigationParams& common_params, - const RequestNavigationParams& request_params, - bool has_stale_copy_in_cache, - int error_code, - const base::Optional<std::string>& error_page_content) { - DCHECK(IsBrowserSideNavigationEnabled()); - bool is_reload = - FrameMsg_Navigate_Type::IsReload(common_params.navigation_type); - RenderFrameImpl::PrepareRenderViewForNavigation( - common_params.url, request_params); - - GetContentClient()->SetActiveURL( - common_params.url, frame_->Top()->GetSecurityOrigin().ToString().Utf8()); - - // If this frame is navigating cross-process, it may naively assume that this - // is the first navigation in the frame, but this may not actually be the - // case. Inform the frame's state machine if this frame has already committed - // other loads. - if (request_params.has_committed_real_load) - frame_->SetCommittedFirstRealLoad(); - - pending_navigation_params_.reset(new NavigationParams( - common_params, StartNavigationParams(), request_params)); - - // Send the provisional load failure. - WebURLError error( - error_code, - has_stale_copy_in_cache ? WebURLError::HasCopyInCache::kTrue - : WebURLError::HasCopyInCache::kFalse, - WebURLError::IsWebSecurityViolation::kFalse, common_params.url); - WebURLRequest failed_request = - CreateURLRequestForNavigation(common_params, request_params, - std::unique_ptr<StreamOverrideParameters>(), - frame_->IsViewSourceModeEnabled(), - false); // is_same_document_navigation - - if (!ShouldDisplayErrorPageForFailedLoad(error_code, common_params.url)) { - // The browser expects this frame to be loading an error page. Inform it - // that the load stopped. - Send(new FrameHostMsg_DidStopLoading(routing_id_)); - browser_side_navigation_pending_ = false; - browser_side_navigation_pending_url_ = GURL(); - return; - } - - // On load failure, a frame can ask its owner to render fallback content. - // When that happens, don't load an error page. - WebLocalFrame::FallbackContentResult fallback_result = - frame_->MaybeRenderFallbackContent(error); - if (fallback_result != WebLocalFrame::NoFallbackContent) { - if (fallback_result == WebLocalFrame::NoLoadInProgress) { - // If the frame wasn't loading but was fallback-eligible, the fallback - // content won't be shown. However, showing an error page isn't right - // either, as the frame has already been populated with something - // unrelated to this navigation failure. In that case, just send a stop - // IPC to the browser to unwind its state, and leave the frame as-is. - Send(new FrameHostMsg_DidStopLoading(routing_id_)); - } - browser_side_navigation_pending_ = false; - browser_side_navigation_pending_url_ = GURL(); - return; - } - - // Make sure errors are not shown in view source mode. - frame_->EnableViewSourceMode(false); - - // Replace the current history entry in reloads, and loads of the same url. - // This corresponds to Blink's notion of a standard commit. - // Also replace the current history entry if the browser asked for it - // specifically. - // TODO(clamy): see if initial commits in subframes should be handled - // separately. - bool replace = is_reload || common_params.url == GetLoadingUrl() || - common_params.should_replace_current_entry; - std::unique_ptr<HistoryEntry> history_entry; - if (request_params.page_state.IsValid()) - history_entry = PageStateToHistoryEntry(request_params.page_state); - - // The load of the error page can result in this frame being removed. - // Use a WeakPtr as an easy way to detect whether this has occured. If so, - // this method should return immediately and not touch any part of the object, - // otherwise it will result in a use-after-free bug. - base::WeakPtr<RenderFrameImpl> weak_this = weak_factory_.GetWeakPtr(); - - // For renderer initiated navigations, we send out a didFailProvisionalLoad() - // notification. - bool had_provisional_document_loader = frame_->GetProvisionalDocumentLoader(); - if (request_params.nav_entry_id == 0) { - blink::WebHistoryCommitType commit_type = - replace ? blink::kWebHistoryInertCommit : blink::kWebStandardCommit; - if (error_page_content.has_value()) { - DidFailProvisionalLoadInternal(error, commit_type, error_page_content); - } else { - // TODO(crbug.com/778824): We only have this branch because a layout test - // expects DidFailProvisionalLoad() to be called directly, rather than - // DidFailProvisionalLoadInternal(). Once the bug is fixed, we should be - // able to call DidFailProvisionalLoadInternal() in all cases. - DidFailProvisionalLoad(error, commit_type); - } - if (!weak_this) - return; - } - - // If we didn't call didFailProvisionalLoad or there wasn't a - // GetProvisionalDocumentLoader(), LoadNavigationErrorPage wasn't called, so - // do it now. - if (request_params.nav_entry_id != 0 || !had_provisional_document_loader) { - LoadNavigationErrorPage(failed_request, error, replace, history_entry.get(), - error_page_content); - if (!weak_this) - return; - } - - browser_side_navigation_pending_ = false; - browser_side_navigation_pending_url_ = GURL(); -} - void RenderFrameImpl::OnReportContentSecurityPolicyViolation( const content::CSPViolationParams& violation_params) { frame_->ReportContentSecurityPolicyViolation(
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h index a2c6b8d..1dc023e 100644 --- a/content/renderer/render_frame_impl.h +++ b/content/renderer/render_frame_impl.h
@@ -532,6 +532,13 @@ mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints, base::Optional<URLLoaderFactoryBundle> subresource_loaders, const base::UnguessableToken& devtools_navigation_token) override; + void CommitFailedNavigation( + const CommonNavigationParams& common_params, + const RequestNavigationParams& request_params, + bool has_stale_copy_in_cache, + int error_code, + const base::Optional<std::string>& error_page_content, + base::Optional<URLLoaderFactoryBundle> subresource_loaders) override; // mojom::HostZoom implementation: void SetHostZoomLevel(const GURL& url, double zoom_level) override; @@ -1042,12 +1049,6 @@ void OnTextTrackSettingsChanged( const FrameMsg_TextTrackSettings_Params& params); void OnPostMessageEvent(const FrameMsg_PostMessage_Params& params); - void OnFailedNavigation( - const CommonNavigationParams& common_params, - const RequestNavigationParams& request_params, - bool has_stale_copy_in_cache, - int error_code, - const base::Optional<std::string>& error_page_content); void OnReportContentSecurityPolicyViolation( const content::CSPViolationParams& violation_params); void OnGetSavableResourceLinks();
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index 0681118..9e7e596d 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn
@@ -1746,6 +1746,7 @@ data_deps = [ "//components/filesystem:filesystem", + "//testing/buildbot/filters:content_unittests_filters", "//third_party/mesa:osmesa", ]
diff --git a/content/test/test_render_frame_host.cc b/content/test/test_render_frame_host.cc index 4b4101d2..aab25a5 100644 --- a/content/test/test_render_frame_host.cc +++ b/content/test/test_render_frame_host.cc
@@ -73,6 +73,15 @@ std::move(subresource_loader_factories), devtools_navigation_token); } + void CommitFailedNavigation( + const content::CommonNavigationParams& common_params, + const content::RequestNavigationParams& request_params, + bool has_stale_copy_in_cache, + int32_t error_code, + const base::Optional<std::string>& error_page_content, + base::Optional<content::URLLoaderFactoryBundle> + subresource_loader_factories) override {} + private: TestRenderFrameHost* const frame_host_;
diff --git a/docs/README.md b/docs/README.md index 2e3f4ed..37e256bb 100644 --- a/docs/README.md +++ b/docs/README.md
@@ -154,8 +154,7 @@ Diagnosing and fixing layout test flakiness due to ordering dependencies. * [Running Layout Tests using `content_shell`](testing/layout_tests_in_content_shell.md) - Running layout tests by hand. -* [Testing Browser Dialogs](testing/test_browser_dialog.md) - Using - TestBrowserDialog +* [Testing Browser UI](testing/test_browser_ui.md) - Using TestBrowserUi * [Web Platform Tests](testing/web_platform_tests.md) - Shared tests across browser vendors * [Using Breakpad with `content_shell`](testing/using_breakpad_with_content_shell.md) -
diff --git a/docs/adding_to_third_party.md b/docs/adding_to_third_party.md index 8a41e72..8ae4693 100644 --- a/docs/adding_to_third_party.md +++ b/docs/adding_to_third_party.md
@@ -74,7 +74,7 @@ If the code is applicable and will be compiled on all supported Chromium platforms (Windows, Mac, Linux, Chrome OS, iOS, Android), check it in to -[src/third_party](http://src.chromium.org/viewvc/chrome/trunk/src/third_party/). +[src/third_party](http://src.chromium.org/viewvc/chrome/trunk/src/third_party/). If the code is only applicable to certain platforms, check it in to [src/third_party](http://src.chromium.org/viewvc/chrome/trunk/src/third_party/) @@ -95,6 +95,7 @@ DEPS, please ask the infrastructure team before committing the change. ### Checking in large files + _Accessible to Googlers only. Non-Googlers can email one of the people in third_party/OWNERS for help._ @@ -117,11 +118,13 @@ following sign-offs. Some of these are accessible to Googlers only. Non-Googlers can email one of the people in third_party/OWNERS for help. -* Chrome Eng Review. Googlers should see go/chrome-eng-review (please include information about the additional checkout size, build times, and binary sizes. Please also make sure that the motivation for your project is clear, e.g., a design doc has been circulated). -* opensource-licensing@google.com (ping the list with relevant details and a - link to the CL). +* Chrome Eng Review. Googlers should see go/chrome-eng-review. (Please include + information about the additional checkout size, build times, and binary sizes. + Please also make sure that the motivation for your project is clear, e.g., + a design doc has been circulated.) * security@chromium.org (ping the list with relevant details and a link to the CL). +* chromium-third-party@google.com (add the list as a reviewer on your change). Please send separate emails to the three lists. @@ -135,8 +138,7 @@ Subsequent changes don't require third-party-owners approval; you can modify the code as much as you want. -## Ask the infrastructure team to add a git mirror for the dependency (or -configure the git repo, if using googlesource.com) +## Ask the infrastructure team to add a git mirror for the dependency Before committing the DEPS, you need to ask the infra team to create a git mirror for your dependency. [Create a
diff --git a/docs/testing/test_browser_dialog.md b/docs/testing/test_browser_dialog.md index 44cf92a..270fc51c 100644 --- a/docs/testing/test_browser_dialog.md +++ b/docs/testing/test_browser_dialog.md
@@ -1,100 +1,109 @@ -# Testing Chrome browser dialogs with TestBrowserDialog +# Testing Chrome browser UI with TestBrowserUi -\#include "[chrome/browser/ui/test/test_browser_dialog.h]" +\#include "[chrome/browser/ui/test/test_browser_ui.h]" -`TestBrowserDialog` provides a way to register an `InProcessBrowserTest` testing -harness with a framework that invokes Chrome browser dialogs in a consistent -way. It optionally provides a way to invoke dialogs "interactively". This allows -screenshots to be generated easily, with the same test data, to assist with UI -review. It also provides a registry of dialogs so they can be systematically -checked for subtle changes and regressions. +`TestBrowserUi` (and convenience class `TestBrowserDialog`) provide ways to +register an `InProcessBrowserTest` testing harness with a framework that invokes +Chrome browser UI in a consistent way. They optionally provide a way to invoke +UI "interactively". This allows screenshots to be generated easily, with the +same test data, to assist with UI review. `TestBrowserUi` also provides a UI +registry so pieces of UI can be systematically checked for subtle changes and +regressions. [TOC] -## How to register a dialog +## How to register UI -If registering an existing dialog, there's a chance it already has a test -harness inheriting, using, or with `typedef InProcessBrowserTest` (or a -descendant of it). If so, using `TestBrowserDialog` is straightforward. Assume -the existing InProcessBrowserTest is in `foo_dialog_browsertest.cc`: +If registering existing UI, there's a chance it already has a test harness +inheriting, using, or with `typedef InProcessBrowserTest` (or a descendant of +it). If so, using `TestBrowserDialog` (for a dialog) is straightforward, and +`TestBrowserUi` (for other types of UI) relatively so. Assume the existing +`InProcessBrowserTest` is in `foo_browsertest.cc`: - class FooDialogTest : public InProcessBrowserTest { ... + class FooUiTest : public InProcessBrowserTest { ... -Change this to inherit from DialogBrowserTest, and override -`ShowDialog(std::string)`. See [Advanced Usage](#Advanced-Usage) for details. +Change this to inherit from `DialogBrowserTest` (for dialogs) or `UiBrowserTest` +(for non-dialogs), and override `ShowUi(std::string)`. For non-dialogs, also +override `VerifyUi()` and `WaitForUserDismissal()`. See +[Advanced Usage](#Advanced-Usage) for details. ```cpp -class FooDialogTest : public DialogBrowserTest { +class FooUiTest : public UiBrowserTest { public: .. - // DialogBrowserTest: - void ShowDialog(const std::string& name) override { - /* Show dialog attached to browser() and leave it open. */ + // UiBrowserTest: + void ShowUi(const std::string& name) override { + /* Show Ui attached to browser() and leave it open. */ + } + // These next two are not necessary if subclassing DialogBrowserTest. + bool VerifyUi() override { + /* Return true if the UI was successfully shown. */ + } + void WaitForUserDismissal() override { + /* Block until the UI has been dismissed. */ } .. }; ``` -Then add test invocations using the usual GTest macros, in -`foo_dialog_browsertest.cc`: +Finally, add test invocations using the usual GTest macros, in +`foo_browsertest.cc`: ```cpp -IN_PROC_BROWSER_TEST_F(FooDialogTest, InvokeDialog_default) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(FooUiTest, InvokeUi_default) { + ShowAndVerifyUi(); } ``` Notes: -* The body of the test is always just "`RunDialog();`". -* "`default`" is the `std::string` passed to `ShowDialog()` and can be +* The body of the test is always just "`ShowAndVerifyUi();`". +* "`default`" is the `std::string` passed to `ShowUi()` and can be customized. See - [Testing additional dialog "styles"](#Testing-additional-dialog-styles). -* The text before `default` (in this case) must always be "`InvokeDialog_`". + [Testing additional UI "styles"](#Testing-additional-ui-styles). +* The text before `default` (in this case) must always be "`InvokeUi_`". ### Concrete examples * [chrome/browser/ui/ask_google_for_suggestions_dialog_browsertest.cc] -* [chrome/browser/ui/autofill/card_unmask_prompt_view_browsertest.cc] -* [chrome/browser/ui/collected_cookies_browsertest.cc] -* [chrome/browser/ui/update_chrome_dialog_browsertest.cc] +* [chrome/browser/infobars/infobars_browsertest.cc] ## Running the tests -List the available dialogs with +List the available pieces of UI with - $ ./browser_tests --gtest_filter=BrowserDialogTest.Invoke + $ ./browser_tests --gtest_filter=BrowserUiTest.Invoke -E.g. `FooDialogTest.InvokeDialog_default` should be listed. To show the dialog +E.g. `FooUiTest.InvokeUi_default` should be listed. To show the UI interactively, run - $ ./browser_tests --gtest_filter=BrowserDialogTest.Invoke --interactive \ - --dialog=FooDialogTest.InvokeDialog_default + $ ./browser_tests --gtest_filter=BrowserUiTest.Invoke --interactive \ + --ui=FooUiTest.InvokeUi_default ### Implementation -`BrowserDialogTest.Invoke` searches for gtests that have "`InvokeDialog_`" in -their name, so they can be collected in a list. Providing a `--dialog` argument -will invoke that test case in a subprocess. Including `--interactive` will set -up an environment for that subprocess that allows interactivity, e.g., to take -screenshots. The test ends once the dialog is dismissed. +`BrowserUiTest.Invoke` searches for gtests that have "`InvokeUi_`" in their +names, so they can be collected in a list. Providing a `--ui` argument will +invoke that test case in a subprocess. Including `--interactive` will set up an +environment for that subprocess that allows interactivity, e.g., to take +screenshots. The test ends once the UI is dismissed. -The `FooDialogTest.InvokeDialog_default` test case **will still be run in the -usual browser_tests test suite**. Ensure it passes, and isn’t flaky. This will -give your dialog some regression test coverage. `RunDialog()` checks to ensure a -dialog is actually created when it invokes `ShowDialog("default")`. +The `FooUiTest.InvokeUi_default` test case **will still be run in the usual +browser_tests test suite**. Ensure it passes, and isn’t flaky. This will +give your UI some regression test coverage. `ShowAndVerifyUi()` checks to ensure +UI is actually created when it invokes `ShowUi("default")`. -### BrowserDialogTest.Invoke +### BrowserUiTest.Invoke This is also run in browser_tests but, when run that way, the test case just lists the registered test harnesses (it does *not* iterate over them). A -subprocess is never created unless --dialog is passed on the command line. +subprocess is never created unless --ui is passed on the command line. ## Advanced Usage If your test harness inherits from a descendant of `InProcessBrowserTest` (one -example: [ExtensionBrowserTest]) then the `SupportsTestDialog<>` template is -provided. E.g. +example: [ExtensionBrowserTest]) then the `SupportsTestUi<>` and +`SupportsTestDialog` templates are provided. E.g. ```cpp class ExtensionInstallDialogViewTestBase : public ExtensionBrowserTest { ... @@ -107,43 +116,47 @@ public SupportsTestDialog<ExtensionBrowserTest> { ... ``` -### Testing additional dialog "styles" +If you need to do any setup before `ShowUi()` is called, or any teardown in the +non-interactive case, you can override the `PreShow()` and `DismissUi() +methods. -Add additional test cases, with a different string after "`InvokeDialog_`". +### Testing additional UI "styles" + +Add additional test cases, with a different string after "`InvokeUi_`". Example: ```cpp -IN_PROC_BROWSER_TEST_F(CardUnmaskViewBrowserTest, InvokeDialog_expired) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(CardUnmaskViewBrowserTest, InvokeUi_expired) { + ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_F(CardUnmaskViewBrowserTest, InvokeDialog_valid) { - RunDialog(); +IN_PROC_BROWSER_TEST_F(CardUnmaskViewBrowserTest, InvokeUi_valid) { + ShowAndVerifyUi(); } ``` The strings "`expired`" or “`valid`” will be given as arguments to -`ShowDialog(std::string)`. +`ShowUi(std::string)`. ## Rationale Bug reference: [Issue 654151](http://crbug.com/654151). -Chrome has a lot of browser dialogs; often for obscure use-cases and often hard -to invoke. It has traditionally been difficult to be systematic while checking -dialogs for possible regressions. For example, to investigate changes to shared -layout parameters which are testable only with visual inspection. +Chrome has a lot of browser UI; often for obscure use-cases and often hard to +invoke. It has traditionally been difficult to be systematic while checking UI +for possible regressions. For example, to investigate changes to shared layout +parameters which are testable only with visual inspection. For Chrome UI review, screenshots need to be taken. Iterating over all the -"styles" that a dialog may appear with is fiddly. E.g. a login or particular web +"styles" that UI may appear with is fiddly. E.g. a login or particular web server setup may be required. It’s important to provide a consistent “look” for UI review (e.g. same test data, same browser size, anchoring position, etc.). -Some dialogs lack tests. Some dialogs have zero coverage on the bots. Dialogs -can have tricky lifetimes and common mistakes are repeated. TestBrowserDialog -runs simple "Show dialog" regression tests and can be extended to do more. +Some UI lacks tests. Some UI has zero coverage on the bots. UI elements can have +tricky lifetimes and common mistakes are repeated. TestBrowserUi runs simple +"Show UI" regression tests and can be extended to do more. -Even discovering the full set of dialogs present for each platform in Chrome is +Even discovering the full set of UI present for each platform in Chrome is [difficult](http://crbug.com/686239). ### Why browser_tests? @@ -152,12 +165,12 @@ size that can be used as a dialog anchor and to take screenshots for UI review. * UI review have requested that screenshots be provided with the entire - browser window so that the relative size of the dialog/change under + browser window so that the relative size of the UI element/change under review can be assessed. -* Some dialogs already have a test harness with appropriate setup (e.g. test - data) running in browser_tests. - * Supporting `BrowserDialogTest` should require minimal setup and minimal +* Some UI already has a test harness with appropriate setup (e.g. test data) + running in browser_tests. + * Supporting `BrowserUiTest` should require minimal setup and minimal ongoing maintenance. * An alternative is to maintain a working end-to-end build target executable @@ -167,19 +180,18 @@ `MaterialDesignController::Initialize()`, etc.). * Why not chrome.exe? - * E.g. a scrappy chrome:// page with links to invoke dialogs would be - great! + * E.g. a scrappy chrome:// page with links to invoke UI would be great! * But... - * A dialog may have test data (e.g. credit card info) which shouldn’t - be in the release build. - * A dialog may use EmbeddedTestServer. + * UI may have test data (e.g. credit card info) which shouldn’t be in + the release build. + * UI may use EmbeddedTestServer. * Higher maintenance cost - can’t leverage existing test harnesses. ## Future Work -* Opt in more dialogs! - * Eventually, all of them. - * A `BrowserDialogTest` for every descendant of `views::DialogDelegate`. +* Opt in more UI! + * Eventually, all of it. + * A `DialogBrowserTest` for every descendant of `views::DialogDelegate`. * Automatically generate screenshots (for each platform, in various languages) * Build upon [CL 2008283002](https://codereview.chromium.org/2008283002/) @@ -188,8 +200,8 @@ * Probably requires altering the browser_test suite code directly rather than just adding a test case as in the current approach -* An automated test suite for dialogs - * Test various ways to dismiss or hide a dialog +* An automated test suite for UI + * Test various ways to dismiss or hide UI, especially dialogs * e.g. native close (via taskbar?) * close parent window (possibly via task bar) * close parent tab @@ -200,8 +212,8 @@ * Drag tab off browser into a new window * Fullscreen that may create a new window/parent -* Find obscure workflows for invoking dialogs that have no test coverage and - cause crashes (e.g. [http://crrev.com/426302](http://crrev.com/426302)) +* Find obscure workflows for invoking UI that has no test coverage and causes + crashes (e.g. [http://crrev.com/426302](http://crrev.com/426302)) * Supporting window-modal dialogs with a null parent window. * Find memory leaks, e.g. [http://crrev.com/432320](http://crrev.com/432320) @@ -209,71 +221,69 @@ ## Appendix: Sample output -**$ ./out/gn_Debug/browser_tests --gtest_filter=BrowserDialogTest.Invoke** +**$ ./out/gn_Debug/browser_tests --gtest_filter=BrowserUiTest.Invoke** ``` -Note: Google Test filter = BrowserDialogTest.Invoke +Note: Google Test filter = BrowserUiTest.Invoke [==========] Running 1 test from 1 test case. [----------] Global test environment set-up. -[----------] 1 test from BrowserDialogTest -[ RUN ] BrowserDialogTest.Invoke -[26879:775:0207/134949.118352:30434675...:INFO:browser_dialog_browsertest.cc(46) -Pass one of the following after --dialog= - AskGoogleForSuggestionsDialogTest.InvokeDialog_default - CardUnmaskPromptViewBrowserTest.InvokeDialog_expired - CardUnmaskPromptViewBrowserTest.InvokeDialog_valid - CollectedCookiesTestMd.InvokeDialog_default - UpdateRecommendedDialogTest.InvokeDialog_default -/* lots more will eventually be listed here */ -[ OK ] BrowserDialogTest.Invoke (0 ms) -[----------] 1 test from BrowserDialogTest (0 ms total) +[----------] 1 test from BrowserUiTest +[ RUN ] BrowserUiTest.Invoke +[26879:775:0207/134949.118352:30434675...:INFO:browser_ui_browsertest.cc(46) +Pass one of the following after --ui= + AppInfoDialogBrowserTest.InvokeUi_default + AskGoogleForSuggestionsDialogTest.DISABLED_InvokeUi_default + BluetoothChooserBrowserTest.InvokeUi_ConnectedBubble + BluetoothChooserBrowserTest.InvokeUi_ConnectedModal +/* and many more */ +[ OK ] BrowserUiTest.Invoke (0 ms) +[----------] 1 test from BrowserUiTest (0 ms total) [----------] Global test environment tear-down [==========] 1 test from 1 test case ran. (1 ms total) [ PASSED ] 1 test. -[1/1] BrowserDialogTest.Invoke (334 ms) +[1/1] BrowserUiTest.Invoke (334 ms) SUCCESS: all tests passed. ``` -**$ ./out/gn_Debug/browser_tests --gtest_filter=BrowserDialogTest.Invoke ---dialog=CardUnmaskPromptViewBrowserTest.InvokeDialog_expired** +**$ ./out/gn_Debug/browser_tests --gtest_filter=BrowserUiTest.Invoke +--ui=CardUnmaskPromptViewBrowserTest.InvokeUi_expired** ``` -Note: Google Test filter = BrowserDialogTest.Invoke +Note: Google Test filter = BrowserUiTest.Invoke [==========] Running 1 test from 1 test case. [----------] Global test environment set-up. -[----------] 1 test from BrowserDialogTest -[ RUN ] BrowserDialogTest.Invoke +[----------] 1 test from BrowserUiTest +[ RUN ] BrowserUiTest.Invoke Note: Google Test filter = CardUnmaskPromptViewBrowserTest.InvokeDefault [==========] Running 1 test from 1 test case. [----------] Global test environment set-up. [----------] 1 test from CardUnmaskPromptViewBrowserTest, where TypeParam = -[ RUN ] CardUnmaskPromptViewBrowserTest.InvokeDialog_expired +[ RUN ] CardUnmaskPromptViewBrowserTest.InvokeUi_expired /* 7 lines of uninteresting log spam */ -[ OK ] CardUnmaskPromptViewBrowserTest.InvokeDialog_expired (1324 ms) +[ OK ] CardUnmaskPromptViewBrowserTest.InvokeUi_expired (1324 ms) [----------] 1 test from CardUnmaskPromptViewBrowserTest (1324 ms total) [----------] Global test environment tear-down [==========] 1 test from 1 test case ran. (1325 ms total) [ PASSED ] 1 test. -[ OK ] BrowserDialogTest.Invoke (1642 ms) -[----------] 1 test from BrowserDialogTest (1642 ms total) +[ OK ] BrowserUiTest.Invoke (1642 ms) +[----------] 1 test from BrowserUiTest (1642 ms total) [----------] Global test environment tear-down [==========] 1 test from 1 test case ran. (1642 ms total) [ PASSED ] 1 test. -[1/1] BrowserDialogTest.Invoke (2111 ms) +[1/1] BrowserUiTest.Invoke (2111 ms) SUCCESS: all tests passed. ``` -**$ ./out/gn_Debug/browser_tests --gtest_filter=BrowserDialogTest.Invoke ---dialog=CardUnmaskPromptViewBrowserTest.InvokeDialog_expired --interactive** +**$ ./out/gn_Debug/browser_tests --gtest_filter=BrowserUiTest.Invoke +--dialog=CardUnmaskPromptViewBrowserTest.InvokeUi_expired --interactive** ``` /* * Output as above, except the test are not interleaved, and the browser window - * should remain open until the dialog is dismissed + * should remain open until the UI is dismissed */ ``` +[chrome/browser/ui/test/test_browser_ui.h]: https://cs.chromium.org/chromium/src/chrome/browser/ui/test/test_browser_ui.h [chrome/browser/ui/test/test_browser_dialog.h]: https://cs.chromium.org/chromium/src/chrome/browser/ui/test/test_browser_dialog.h -[chrome/browser/ui/autofill/card_unmask_prompt_view_browsertest.cc]: https://cs.chromium.org/chromium/src/chrome/browser/ui/autofill/card_unmask_prompt_view_browsertest.cc?l=104&q=ShowDialog -[chrome/browser/ui/collected_cookies_browsertest.cc]: https://cs.chromium.org/chromium/src/chrome/browser/ui/collected_cookies_browsertest.cc?l=26&q=ShowDialog -[chrome/browser/ui/ask_google_for_suggestions_dialog_browsertest.cc]: https://cs.chromium.org/chromium/src/chrome/browser/ui/ask_google_for_suggestions_dialog_browsertest.cc?l=18&q=ShowDialog -[chrome/browser/ui/update_chrome_dialog_browsertest.cc]: https://cs.chromium.org/chromium/src/chrome/browser/ui/update_chrome_dialog_browsertest.cc?l=15&q=ShowDialog +[chrome/browser/ui/ask_google_for_suggestions_dialog_browsertest.cc]: https://cs.chromium.org/chromium/src/chrome/browser/ui/ask_google_for_suggestions_dialog_browsertest.cc?l=18&q=ShowUi +[chrome/browser/infobars/infobars_browsertest.cc]: https://cs.chromium.org/chromium/src/chrome/browser/infobars/infobars_browsertest.cc?l=134&q=UiBrowserTest [ExtensionBrowserTest]: https://cs.chromium.org/chromium/src/chrome/browser/extensions/extension_browsertest.h?q=extensionbrowsertest&l=40
diff --git a/extensions/browser/api/app_window/app_window_apitest.cc b/extensions/browser/api/app_window/app_window_apitest.cc index b64801d..59ad2f92 100644 --- a/extensions/browser/api/app_window/app_window_apitest.cc +++ b/extensions/browser/api/app_window/app_window_apitest.cc
@@ -66,18 +66,30 @@ #endif // defined(OS_LINUX) IN_PROC_BROWSER_TEST_F(AppWindowApiTest, MAYBE_OnMinimizedEvent) { +#if defined(OS_MACOSX) + if (base::mac::IsOS10_10()) + return; // Fails when swarmed. http://crbug.com/660582, +#endif EXPECT_TRUE(RunExtensionTestWithArg("platform_apps/windows_api_properties", "minimized")) << message_; } IN_PROC_BROWSER_TEST_F(AppWindowApiTest, MAYBE_OnMaximizedEvent) { +#if defined(OS_MACOSX) + if (base::mac::IsOS10_10()) + return; // Fails when swarmed. http://crbug.com/660582, +#endif EXPECT_TRUE(RunExtensionTestWithArg("platform_apps/windows_api_properties", "maximized")) << message_; } IN_PROC_BROWSER_TEST_F(AppWindowApiTest, MAYBE_OnRestoredEvent) { +#if defined(OS_MACOSX) + if (base::mac::IsOS10_10()) + return; // Fails when swarmed. http://crbug.com/660582, +#endif EXPECT_TRUE(RunExtensionTestWithArg("platform_apps/windows_api_properties", "restored")) << message_;
diff --git a/ios/chrome/browser/ui/browser_view_controller_unittest.mm b/ios/chrome/browser/ui/browser_view_controller_unittest.mm index 324b13d..43b73d6 100644 --- a/ios/chrome/browser/ui/browser_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/browser_view_controller_unittest.mm
@@ -141,7 +141,6 @@ @interface TestWebToolbarController : UIViewController - (void)setTabCount:(NSInteger)tabCount; - (void)updateToolbarState; -- (void)adjustToolbarHeight; - (void)setShareButtonEnabled:(BOOL)enabled; - (id)toolsPopupController; - (BOOL)isOmniboxFirstResponder; @@ -163,9 +162,6 @@ - (void)updateToolbarState { return; } -- (void)adjustToolbarHeight { - return; -} - (void)setShareButtonEnabled:(BOOL)enabled { return; }
diff --git a/ios/chrome/browser/ui/fullscreen/legacy_fullscreen_controller.mm b/ios/chrome/browser/ui/fullscreen/legacy_fullscreen_controller.mm index 0d246252..9af86174 100644 --- a/ios/chrome/browser/ui/fullscreen/legacy_fullscreen_controller.mm +++ b/ios/chrome/browser/ui/fullscreen/legacy_fullscreen_controller.mm
@@ -255,14 +255,6 @@ name:kVoiceSearchWillHideNotification object:nil]; [center addObserver:self - selector:@selector(incrementFullScreenLock) - name:kVoiceSearchBarViewButtonSelectedNotification - object:nil]; - [center addObserver:self - selector:@selector(decrementFullScreenLock) - name:kVoiceSearchBarViewButtonDeselectedNotification - object:nil]; - [center addObserver:self selector:@selector(applicationWillEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil];
diff --git a/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.mm b/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.mm index cc649725..1e8e8b3 100644 --- a/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.mm +++ b/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.mm
@@ -280,8 +280,6 @@ kTabHistoryPopupWillHideNotification : kTabHistoryPopupWillShowNotification, kVoiceSearchWillHideNotification : kVoiceSearchWillShowNotification, - kVoiceSearchBarViewButtonDeselectedNotification : - kVoiceSearchBarViewButtonSelectedNotification, kPageInfoWillHideNotification : kPageInfoWillShowNotification, kLocationBarResignsFirstResponderNotification : kLocationBarBecomesFirstResponderNotification,
diff --git a/ios/chrome/browser/ui/qr_scanner/BUILD.gn b/ios/chrome/browser/ui/qr_scanner/BUILD.gn index 5de39b0..299af9b 100644 --- a/ios/chrome/browser/ui/qr_scanner/BUILD.gn +++ b/ios/chrome/browser/ui/qr_scanner/BUILD.gn
@@ -74,8 +74,6 @@ "//ios/chrome/browser/ui/omnibox", "//ios/chrome/browser/ui/toolbar", "//ios/chrome/browser/ui/toolbar:test_support", - "//ios/chrome/browser/ui/toolbar/clean:toolbar", - "//ios/chrome/browser/ui/toolbar/public:toolbar_base_feature", "//ios/chrome/test/app:test_support", "//ios/chrome/test/base", "//ios/chrome/test/earl_grey:test_support",
diff --git a/ios/chrome/browser/ui/qr_scanner/qr_scanner_view_controller_egtest.mm b/ios/chrome/browser/ui/qr_scanner/qr_scanner_view_controller_egtest.mm index 9ae57ea0..01fb4039 100644 --- a/ios/chrome/browser/ui/qr_scanner/qr_scanner_view_controller_egtest.mm +++ b/ios/chrome/browser/ui/qr_scanner/qr_scanner_view_controller_egtest.mm
@@ -18,8 +18,6 @@ #include "ios/chrome/browser/ui/qr_scanner/camera_controller.h" #include "ios/chrome/browser/ui/qr_scanner/qr_scanner_view.h" #include "ios/chrome/browser/ui/qr_scanner/qr_scanner_view_controller.h" -#import "ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator.h" -#import "ios/chrome/browser/ui/toolbar/public/toolbar_controller_base_feature.h" #include "ios/chrome/browser/ui/toolbar/web_toolbar_controller.h" #import "ios/chrome/browser/ui/toolbar/web_toolbar_controller_private.h" #include "ios/chrome/browser/ui/ui_util.h" @@ -411,39 +409,21 @@ // method to load |searchURL| instead of the generated search URL. - (void)swizzleWebToolbarControllerLoadGURLFromLocationBar: (const GURL&)searchURL { - if (base::FeatureList::IsEnabled(kCleanToolbar)) { - void (^loadGURLFromLocationBarBlock)(ToolbarCoordinator*, const GURL&, - ui::PageTransition) = - ^void(ToolbarCoordinator* self, const GURL& url, - ui::PageTransition transition) { - [self.URLLoader loadURL:searchURL - referrer:web::Referrer() - transition:transition - rendererInitiated:NO]; - [self cancelOmniboxEdit]; - }; + void (^loadGURLFromLocationBarBlock)(WebToolbarController*, const GURL&, + ui::PageTransition) = + ^void(WebToolbarController* self, const GURL& url, + ui::PageTransition transition) { + [self.urlLoader loadURL:searchURL + referrer:web::Referrer() + transition:transition + rendererInitiated:NO]; + [self cancelOmniboxEdit]; + }; - load_GURL_from_location_bar_swizzler_.reset( - new ScopedBlockSwizzler([ToolbarCoordinator class], - @selector(loadGURLFromLocationBar:transition:), - loadGURLFromLocationBarBlock)); - } else { - void (^loadGURLFromLocationBarBlock)(WebToolbarController*, const GURL&, - ui::PageTransition) = - ^void(WebToolbarController* self, const GURL& url, - ui::PageTransition transition) { - [self.urlLoader loadURL:searchURL - referrer:web::Referrer() - transition:transition - rendererInitiated:NO]; - [self cancelOmniboxEdit]; - }; - - load_GURL_from_location_bar_swizzler_.reset( - new ScopedBlockSwizzler([WebToolbarController class], - @selector(loadGURLFromLocationBar:transition:), - loadGURLFromLocationBarBlock)); - } + load_GURL_from_location_bar_swizzler_.reset( + new ScopedBlockSwizzler([WebToolbarController class], + @selector(loadGURLFromLocationBar:transition:), + loadGURLFromLocationBarBlock)); } // Creates a new CameraController mock with camera permission granted if
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_switcher_transition_egtest.mm b/ios/chrome/browser/ui/tab_switcher/tab_switcher_transition_egtest.mm index 3ac55d3..b564143 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_switcher_transition_egtest.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_switcher_transition_egtest.mm
@@ -95,8 +95,7 @@ selectElementWithMatcher:grey_allOf( grey_kindOfClass( [TabSwitcherLocalSessionCell class]), - grey_descendant(grey_text(title)), - grey_sufficientlyVisible(), nil)] + grey_descendant(grey_text(title)), nil)] performAction:grey_tap()]; } else { // On phone, tapping on the title UILabel will select the tab.
diff --git a/ios/chrome/browser/ui/toolbar/BUILD.gn b/ios/chrome/browser/ui/toolbar/BUILD.gn index f98186e..2ed7742 100644 --- a/ios/chrome/browser/ui/toolbar/BUILD.gn +++ b/ios/chrome/browser/ui/toolbar/BUILD.gn
@@ -243,7 +243,6 @@ "//ios/chrome/browser/ui/ntp:ntp_controller", "//ios/chrome/browser/ui/ntp:ntp_internal", "//ios/chrome/browser/ui/omnibox:omnibox_internal", - "//ios/chrome/browser/ui/toolbar/clean:toolbar_ui", "//ios/chrome/browser/ui/tools_menu/public", "//ios/chrome/test/app:test_support", "//ios/chrome/test/earl_grey:test_support",
diff --git a/ios/chrome/browser/ui/toolbar/clean/BUILD.gn b/ios/chrome/browser/ui/toolbar/clean/BUILD.gn index 356dec9..d827bf9 100644 --- a/ios/chrome/browser/ui/toolbar/clean/BUILD.gn +++ b/ios/chrome/browser/ui/toolbar/clean/BUILD.gn
@@ -20,7 +20,6 @@ "//components/bookmarks/browser", "//components/google/core/browser", "//components/search_engines", - "//components/strings", "//ios/chrome/browser", "//ios/chrome/browser/autocomplete", "//ios/chrome/browser/bookmarks",
diff --git a/ios/chrome/browser/ui/toolbar/clean/toolbar_button_factory.mm b/ios/chrome/browser/ui/toolbar/clean/toolbar_button_factory.mm index 86085587..4d3fbb8 100644 --- a/ios/chrome/browser/ui/toolbar/clean/toolbar_button_factory.mm +++ b/ios/chrome/browser/ui/toolbar/clean/toolbar_button_factory.mm
@@ -103,9 +103,8 @@ imageForDisabledState: NativeImage( tabSwitcherButtonImages[self.style][DISABLED])]; - SetA11yLabelAndUiAutomationName(tabSwitcherStripButton, - IDS_IOS_TOOLBAR_SHOW_TABS, - kToolbarStackButtonIdentifier); + tabSwitcherStripButton.accessibilityLabel = + l10n_util::GetNSString(IDS_IOS_TOOLBAR_SHOW_TABS); [tabSwitcherStripButton setTitleColor:[self.toolbarConfiguration buttonTitleNormalColor] forState:UIControlStateNormal]; @@ -133,8 +132,8 @@ ToolbarToolsMenuButton* toolsMenuButton = [[ToolbarToolsMenuButton alloc] initWithFrame:CGRectZero style:style]; - SetA11yLabelAndUiAutomationName(toolsMenuButton, IDS_IOS_TOOLBAR_SETTINGS, - kToolbarToolsMenuButtonIdentifier); + toolsMenuButton.accessibilityLabel = + l10n_util::GetNSString(IDS_IOS_TOOLBAR_SETTINGS); return toolsMenuButton; } @@ -151,8 +150,8 @@ imageForDisabledState:NativeImage( shareButtonImages[self.style] [DISABLED])]; - SetA11yLabelAndUiAutomationName(shareButton, IDS_IOS_TOOLS_MENU_SHARE, - kToolbarShareButtonIdentifier); + shareButton.accessibilityLabel = + l10n_util::GetNSString(IDS_IOS_TOOLS_MENU_SHARE); return shareButton; }
diff --git a/ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator.mm b/ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator.mm index ef0dbd20..aeed1a0 100644 --- a/ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator.mm +++ b/ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator.mm
@@ -15,7 +15,6 @@ #include "components/google/core/browser/google_util.h" #include "components/omnibox/browser/omnibox_edit_model.h" #include "components/search_engines/util.h" -#include "components/strings/grit/components_strings.h" #include "ios/chrome/browser/autocomplete/autocomplete_scheme_classifier_impl.h" #include "ios/chrome/browser/bookmarks/bookmark_model_factory.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" @@ -45,7 +44,6 @@ #import "ios/chrome/browser/ui/toolbar/public/web_toolbar_controller_constants.h" #include "ios/chrome/browser/ui/toolbar/toolbar_model_ios.h" #import "ios/chrome/browser/ui/toolbar/tools_menu_button_observer_bridge.h" -#import "ios/chrome/browser/ui/uikit_ui_util.h" #import "ios/chrome/browser/ui/url_loader.h" #import "ios/chrome/browser/ui/voice/text_to_speech_player.h" #import "ios/chrome/browser/ui/voice/voice_search_notification_names.h" @@ -146,9 +144,6 @@ font:[MDCTypography subheadFont] textColor:textColor tintColor:tintColor]; - - SetA11yLabelAndUiAutomationName(self.locationBarView.textField, - IDS_ACCNAME_LOCATION, @"Address"); _locationBar = base::MakeUnique<LocationBarControllerImpl>( self.locationBarView, self.browserState, self, self.dispatcher); self.locationBarView.incognito = isIncognito;
diff --git a/ios/chrome/browser/ui/toolbar/public/toolbar_controller_base_feature.mm b/ios/chrome/browser/ui/toolbar/public/toolbar_controller_base_feature.mm index 78a9374..6ab790b 100644 --- a/ios/chrome/browser/ui/toolbar/public/toolbar_controller_base_feature.mm +++ b/ios/chrome/browser/ui/toolbar/public/toolbar_controller_base_feature.mm
@@ -9,4 +9,4 @@ #endif const base::Feature kCleanToolbar{"CleanToolbar", - base::FEATURE_ENABLED_BY_DEFAULT}; + base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm b/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm index 47ac43e..3d6f924 100644 --- a/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm +++ b/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm
@@ -11,7 +11,6 @@ #import "ios/chrome/browser/ui/content_suggestions/ntp_home_constant.h" #import "ios/chrome/browser/ui/ntp/new_tab_page_controller.h" #import "ios/chrome/browser/ui/omnibox/omnibox_popup_row.h" -#import "ios/chrome/browser/ui/toolbar/clean/toolbar_view.h" #import "ios/chrome/browser/ui/toolbar/toolbar_controller.h" #include "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h" #include "ios/chrome/browser/ui/ui_util.h" @@ -194,10 +193,10 @@ chrome_test_util::ButtonWithAccessibilityLabelId(IDS_IOS_ACCNAME_RELOAD); id<GREYMatcher> bookmarkButton = chrome_test_util::ButtonWithAccessibilityLabelId(IDS_TOOLTIP_STAR); - id<GREYMatcher> voiceSearchButton = - grey_allOf(chrome_test_util::ButtonWithAccessibilityLabelId( - IDS_IOS_ACCNAME_VOICE_SEARCH), - grey_ancestor(grey_kindOfClass([ToolbarView class])), nil); + id<GREYMatcher> voiceSearchButton = grey_allOf( + chrome_test_util::ButtonWithAccessibilityLabelId( + IDS_IOS_ACCNAME_VOICE_SEARCH), + grey_ancestor(grey_kindOfClass([LegacyToolbarView class])), nil); NSString* ntpOmniboxLabel = l10n_util::GetNSString(IDS_OMNIBOX_EMPTY_HINT); NSString* focusedOmniboxLabel = l10n_util::GetNSString(IDS_ACCNAME_LOCATION); NSString* omniboxLabel =
diff --git a/ios/chrome/browser/ui/voice/voice_search_notification_names.h b/ios/chrome/browser/ui/voice/voice_search_notification_names.h index 200a5ac8..37da043 100644 --- a/ios/chrome/browser/ui/voice/voice_search_notification_names.h +++ b/ios/chrome/browser/ui/voice/voice_search_notification_names.h
@@ -24,11 +24,4 @@ // Notification when TTS stops playing. extern NSString* const kTTSDidStopPlayingNotification; -// VoiceSearchBar notifications. - -// Notification when a VoiceSearchBar button is selected. -extern NSString* const kVoiceSearchBarViewButtonSelectedNotification; -// Notification when a VoiceSearchBar button is deselected. -extern NSString* const kVoiceSearchBarViewButtonDeselectedNotification; - #endif // IOS_CHROME_BROWSER_UI_VOICE_VOICE_SEARCH_NOTIFICATION_NAMES_H_
diff --git a/ios/chrome/browser/ui/voice/voice_search_notification_names.mm b/ios/chrome/browser/ui/voice/voice_search_notification_names.mm index c3751d6..68a74bd 100644 --- a/ios/chrome/browser/ui/voice/voice_search_notification_names.mm +++ b/ios/chrome/browser/ui/voice/voice_search_notification_names.mm
@@ -19,8 +19,3 @@ @"kTTSWillStartPlayingNotification"; NSString* const kTTSDidStopPlayingNotification = @"kTTSDidStopPlayingNotification"; - -NSString* const kVoiceSearchBarViewButtonSelectedNotification = - @"kVoiceSearchBarViewButtonSelectedNotification"; -NSString* const kVoiceSearchBarViewButtonDeselectedNotification = - @"kVoiceSearchBarViewButtonDeselectedNotification";
diff --git a/ios/net/crn_http_protocol_handler.h b/ios/net/crn_http_protocol_handler.h index 4247090..576a8ec8 100644 --- a/ios/net/crn_http_protocol_handler.h +++ b/ios/net/crn_http_protocol_handler.h
@@ -7,6 +7,11 @@ #import <Foundation/Foundation.h> +#import "base/mac/scoped_nsobject.h" +#include "base/macros.h" +#include "net/base/load_timing_info.h" +#include "net/http/http_response_info.h" + namespace net { class URLRequestContextGetter; @@ -31,6 +36,39 @@ virtual URLRequestContextGetter* GetDefaultURLRequestContext() = 0; }; +// Delegate class which supplies a metrics callback that is invoked when a net +// request is stopped. +class MetricsDelegate { + public: + // Simple struct collecting all of the metrics data that is passed through to + // the MetricsDelegate callback. + struct Metrics { + Metrics(); + ~Metrics(); + + base::scoped_nsobject<NSURLSessionTask> task; + LoadTimingInfo load_timing_info; + HttpResponseInfo response_info; + base::Time response_end_time; + + private: + DISALLOW_COPY_AND_ASSIGN(Metrics); + }; + + // Set the global instance of the MetricsDelegate. + static void SetInstance(MetricsDelegate* delegate); + + virtual ~MetricsDelegate() = default; + + // This is invoked once when the request begins, in order to set up things + // which may be needed by OnStopNetRequest. + virtual void OnStartNetRequest(NSURLSessionTask* task) = 0; + + // This is invoked once the request is finally stopped, with metrics data + // collect by net passed in as an argument. + virtual void OnStopNetRequest(std::unique_ptr<Metrics> metrics) = 0; +}; + } // namespace net // Custom NSURLProtocol handling HTTP and HTTPS requests.
diff --git a/ios/net/crn_http_protocol_handler.mm b/ios/net/crn_http_protocol_handler.mm index 91da5bf..f3ad4f2 100644 --- a/ios/net/crn_http_protocol_handler.mm +++ b/ios/net/crn_http_protocol_handler.mm
@@ -60,6 +60,9 @@ // Global instance of the HTTPProtocolHandlerDelegate. net::HTTPProtocolHandlerDelegate* g_protocol_handler_delegate = nullptr; +// Global instance of the MetricsDelegate. +net::MetricsDelegate* g_metrics_delegate = nullptr; + // Empty callback. void DoNothing(bool flag) {} @@ -83,12 +86,20 @@ namespace net { +MetricsDelegate::Metrics::Metrics() = default; +MetricsDelegate::Metrics::~Metrics() = default; + // static void HTTPProtocolHandlerDelegate::SetInstance( HTTPProtocolHandlerDelegate* delegate) { g_protocol_handler_delegate = delegate; } +// static +void MetricsDelegate::SetInstance(MetricsDelegate* delegate) { + g_metrics_delegate = delegate; +} + // The HttpProtocolHandlerCore class is the bridge between the URLRequest // and the NSURLProtocolClient. // Threading and ownership details: @@ -138,7 +149,8 @@ HttpProtocolHandlerCore>, public URLRequest::Delegate { public: - HttpProtocolHandlerCore(NSURLRequest* request); + explicit HttpProtocolHandlerCore(NSURLRequest* request); + explicit HttpProtocolHandlerCore(NSURLSessionTask* task); // Starts the network request, and forwards the data downloaded from the // network to |base_client|. void Start(id<CRNNetworkClientProtocol> base_client); @@ -199,6 +211,7 @@ int read_buffer_size_; scoped_refptr<WrappedIOBuffer> read_buffer_wrapper_; base::scoped_nsobject<NSMutableURLRequest> request_; + base::scoped_nsobject<NSURLSessionTask> task_; // Stream delegate to read the HTTPBodyStream. base::scoped_nsobject<CRWHTTPStreamDelegate> stream_delegate_; // Vector of readers used to accumulate a POST data stream. @@ -225,10 +238,16 @@ // from the absoluteString of the original URL, because mutableCopy only // shallowly copies the request, and just retains the non-threadsafe NSURL. thread_checker_.DetachFromThread(); + task_.reset(); request_.reset([request mutableCopy]); // Will allocate read buffer with size |kIOBufferMinSize|. AllocateReadBuffer(0); - [request_ setURL:[NSURL URLWithString:[[request URL] absoluteString]]]; + [request_ setURL:request.URL]; +} + +HttpProtocolHandlerCore::HttpProtocolHandlerCore(NSURLSessionTask* task) + : HttpProtocolHandlerCore([task currentRequest]) { + task_.reset(task); } void HttpProtocolHandlerCore::HandleStreamEvent(NSStream* stream, @@ -724,6 +743,18 @@ DCHECK(thread_checker_.CalledOnValidThread()); if (tracker_) tracker_->StopRequest(net_request_); + + if (g_metrics_delegate) { + auto metrics = std::make_unique<net::MetricsDelegate::Metrics>(); + + metrics->response_end_time = base::Time::Now(); + metrics->task = task_; + metrics->response_info = net_request_->response_info(); + net_request_->GetLoadTimingInfo(&metrics->load_timing_info); + + g_metrics_delegate->OnStopNetRequest(std::move(metrics)); + } + delete net_request_; net_request_ = nullptr; if (stream_delegate_.get()) @@ -887,6 +918,7 @@ base::scoped_nsprotocol<id<CRNHTTPProtocolHandlerProxy>> _protocolProxy; __weak NSThread* _clientThread; BOOL _supportedURL; + NSURLSessionTask* _task; } #pragma mark NSURLProtocol methods @@ -917,6 +949,20 @@ return self; } +- (instancetype)initWithTask:(NSURLSessionTask*)task + cachedResponse:(NSCachedURLResponse*)cachedResponse + client:(id<NSURLProtocolClient>)client { + DCHECK(!cachedResponse); + self = [super initWithTask:task cachedResponse:cachedResponse client:client]; + if (self) { + _supportedURL = + g_protocol_handler_delegate->IsRequestSupported(task.currentRequest); + _core = new net::HttpProtocolHandlerCore(task); + _task = task; + } + return self; +} + #pragma mark NSURLProtocol overrides. - (NSCachedURLResponse*)cachedResponse { @@ -945,6 +991,11 @@ _clientThread = [NSThread currentThread]; + if (g_metrics_delegate) { + g_metrics_delegate->OnStartNetRequest( + base::scoped_nsobject<NSURLSessionTask>(_task)); + } + // The closure passed to PostTask must to retain the _protocolProxy // scoped_nsobject. A call to getProtocolHandlerProxy before passing // _protocolProxy ensure that _protocolProxy is instanciated before passing
diff --git a/services/device/DEPS b/services/device/DEPS index 6383a3f..ae6faf02 100644 --- a/services/device/DEPS +++ b/services/device/DEPS
@@ -1,5 +1,6 @@ include_rules = [ "+device", "+jni", + "+net/url_request", "+ui/gfx/native_widget_types.h", ]
diff --git a/services/device/device_service.cc b/services/device/device_service.cc index 739d07d..c25ec99 100644 --- a/services/device/device_service.cc +++ b/services/device/device_service.cc
@@ -17,6 +17,8 @@ #include "mojo/public/cpp/system/message_pipe.h" #include "services/device/fingerprint/fingerprint.h" #include "services/device/generic_sensor/sensor_provider_impl.h" +#include "services/device/geolocation/public_ip_address_geolocator.h" +#include "services/device/geolocation/public_ip_address_location_notifier.h" #include "services/device/power_monitor/power_monitor_message_broadcaster.h" #include "services/device/public/interfaces/battery_monitor.mojom.h" #include "services/device/serial/serial_device_enumerator_impl.h" @@ -46,6 +48,9 @@ std::unique_ptr<service_manager::Service> CreateDeviceService( scoped_refptr<base::SingleThreadTaskRunner> file_task_runner, scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, + const GeolocationProvider::RequestContextProducer + geolocation_request_context_producer, + const std::string& geolocation_api_key, const WakeLockContextCallback& wake_lock_context_callback, const CustomLocationProviderCallback& custom_location_provider_callback, const base::android::JavaRef<jobject>& java_nfc_delegate) { @@ -53,17 +58,22 @@ custom_location_provider_callback); return std::make_unique<DeviceService>( std::move(file_task_runner), std::move(io_task_runner), + std::move(geolocation_request_context_producer), geolocation_api_key, wake_lock_context_callback, java_nfc_delegate); } #else std::unique_ptr<service_manager::Service> CreateDeviceService( scoped_refptr<base::SingleThreadTaskRunner> file_task_runner, scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, + const GeolocationProvider::RequestContextProducer + geolocation_request_context_producer, + const std::string& geolocation_api_key, const CustomLocationProviderCallback& custom_location_provider_callback) { GeolocationProviderImpl::SetCustomLocationProviderCallback( custom_location_provider_callback); - return std::make_unique<DeviceService>(std::move(file_task_runner), - std::move(io_task_runner)); + return std::make_unique<DeviceService>( + std::move(file_task_runner), std::move(io_task_runner), + std::move(geolocation_request_context_producer), geolocation_api_key); } #endif @@ -71,10 +81,16 @@ DeviceService::DeviceService( scoped_refptr<base::SingleThreadTaskRunner> file_task_runner, scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, + const GeolocationProvider::RequestContextProducer + geolocation_request_context_producer, + const std::string& geolocation_api_key, const WakeLockContextCallback& wake_lock_context_callback, const base::android::JavaRef<jobject>& java_nfc_delegate) : file_task_runner_(std::move(file_task_runner)), io_task_runner_(std::move(io_task_runner)), + geolocation_request_context_producer_( + geolocation_request_context_producer), + geolocation_api_key_(geolocation_api_key), wake_lock_context_callback_(wake_lock_context_callback), java_interface_provider_initialized_(false) { java_nfc_delegate_.Reset(java_nfc_delegate); @@ -82,15 +98,26 @@ #else DeviceService::DeviceService( scoped_refptr<base::SingleThreadTaskRunner> file_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> io_task_runner) + scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, + const GeolocationProvider::RequestContextProducer + geolocation_request_context_producer, + const std::string& geolocation_api_key) : file_task_runner_(std::move(file_task_runner)), - io_task_runner_(std::move(io_task_runner)) {} + io_task_runner_(std::move(io_task_runner)), + geolocation_request_context_producer_( + geolocation_request_context_producer), + geolocation_api_key_(geolocation_api_key) {} #endif DeviceService::~DeviceService() { #if !defined(OS_ANDROID) device::BatteryStatusService::GetInstance()->Shutdown(); #endif + if (public_ip_address_geolocation_provider_) { + DCHECK(io_task_runner_); + io_task_runner_->DeleteSoon( + FROM_HERE, std::move(public_ip_address_geolocation_provider_)); + } } void DeviceService::OnStart() { @@ -102,6 +129,10 @@ &DeviceService::BindGeolocationControlRequest, base::Unretained(this))); registry_.AddInterface<mojom::PowerMonitor>(base::Bind( &DeviceService::BindPowerMonitorRequest, base::Unretained(this))); + registry_.AddInterface<mojom::PublicIpAddressGeolocationProvider>( + base::Bind(&DeviceService::BindPublicIpAddressGeolocationProviderRequest, + base::Unretained(this)), + io_task_runner_); registry_.AddInterface<mojom::ScreenOrientationListener>( base::Bind(&DeviceService::BindScreenOrientationListenerRequest, base::Unretained(this))); @@ -205,6 +236,21 @@ power_monitor_message_broadcaster_->Bind(std::move(request)); } +void DeviceService::BindPublicIpAddressGeolocationProviderRequest( + mojom::PublicIpAddressGeolocationProviderRequest request) { + // This needs to run on IO thread because it uses URLRequestContextGetters + // which must not outlive that thread. + DCHECK(io_task_runner_->RunsTasksInCurrentSequence()); + + if (!public_ip_address_geolocation_provider_) { + public_ip_address_geolocation_provider_ = + std::make_unique<PublicIpAddressGeolocationProvider>( + geolocation_request_context_producer_, geolocation_api_key_); + } + + public_ip_address_geolocation_provider_->Bind(std::move(request)); +} + void DeviceService::BindScreenOrientationListenerRequest( mojom::ScreenOrientationListenerRequest request) { #if defined(OS_ANDROID)
diff --git a/services/device/device_service.h b/services/device/device_service.h index 55f25480..5490637 100644 --- a/services/device/device_service.h +++ b/services/device/device_service.h
@@ -7,11 +7,14 @@ #include "base/memory/ref_counted.h" #include "build/build_config.h" +#include "device/geolocation/geolocation_provider.h" #include "device/geolocation/geolocation_provider_impl.h" +#include "device/geolocation/public/interfaces/geolocation.mojom.h" #include "device/geolocation/public/interfaces/geolocation_context.mojom.h" #include "device/geolocation/public/interfaces/geolocation_control.mojom.h" #include "device/screen_orientation/public/interfaces/screen_orientation.mojom.h" #include "mojo/public/cpp/bindings/binding_set.h" +#include "services/device/geolocation/public_ip_address_geolocation_provider.h" #include "services/device/public/interfaces/battery_monitor.mojom.h" #include "services/device/public/interfaces/fingerprint.mojom.h" #include "services/device/public/interfaces/nfc_provider.mojom.h" @@ -47,15 +50,19 @@ #endif class PowerMonitorMessageBroadcaster; +class PublicIpAddressLocationNotifier; class TimeZoneMonitor; #if defined(OS_ANDROID) -// NOTE: See the comments on the definitions of |WakeLockContextCallback|, -// |CustomLocationProviderCallback| and NFCDelegate.java to understand the -// semantics and usage of these parameters. +// NOTE: See the comments on the definitions of PublicIpAddressLocationNotifier, +// |WakeLockContextCallback|, |CustomLocationProviderCallback| and +// NFCDelegate.java to understand the semantics and usage of these parameters. std::unique_ptr<service_manager::Service> CreateDeviceService( scoped_refptr<base::SingleThreadTaskRunner> file_task_runner, scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, + GeolocationProvider::RequestContextProducer + geolocation_request_context_producer, + const std::string& geolocation_api_key, const WakeLockContextCallback& wake_lock_context_callback, const CustomLocationProviderCallback& custom_location_provider_callback, const base::android::JavaRef<jobject>& java_nfc_delegate); @@ -63,6 +70,9 @@ std::unique_ptr<service_manager::Service> CreateDeviceService( scoped_refptr<base::SingleThreadTaskRunner> file_task_runner, scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, + GeolocationProvider::RequestContextProducer + geolocation_request_context_producer, + const std::string& geolocation_api_key, const CustomLocationProviderCallback& custom_location_provider_callback); #endif @@ -71,11 +81,17 @@ #if defined(OS_ANDROID) DeviceService(scoped_refptr<base::SingleThreadTaskRunner> file_task_runner, scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, + GeolocationProvider::RequestContextProducer + geolocation_request_context_producer, + const std::string& geolocation_api_key, const WakeLockContextCallback& wake_lock_context_callback, const base::android::JavaRef<jobject>& java_nfc_delegate); #else DeviceService(scoped_refptr<base::SingleThreadTaskRunner> file_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> io_task_runner); + scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, + GeolocationProvider::RequestContextProducer + geolocation_request_context_producer, + const std::string& geolocation_api_key); #endif ~DeviceService() override; @@ -103,6 +119,9 @@ void BindPowerMonitorRequest(mojom::PowerMonitorRequest request); + void BindPublicIpAddressGeolocationProviderRequest( + mojom::PublicIpAddressGeolocationProviderRequest request); + void BindScreenOrientationListenerRequest( mojom::ScreenOrientationListenerRequest request); @@ -119,10 +138,15 @@ std::unique_ptr<PowerMonitorMessageBroadcaster> power_monitor_message_broadcaster_; + std::unique_ptr<PublicIpAddressGeolocationProvider> + public_ip_address_geolocation_provider_; std::unique_ptr<TimeZoneMonitor> time_zone_monitor_; scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_; scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; + GeolocationProvider::RequestContextProducer + geolocation_request_context_producer_; + const std::string geolocation_api_key_; WakeLockContextCallback wake_lock_context_callback_; #if defined(OS_ANDROID)
diff --git a/services/device/device_service_test_base.cc b/services/device/device_service_test_base.cc index d850fd8..56d3744 100644 --- a/services/device/device_service_test_base.cc +++ b/services/device/device_service_test_base.cc
@@ -10,6 +10,7 @@ #include "base/memory/ref_counted.h" #include "device/geolocation/public/cpp/location_provider.h" #include "mojo/public/cpp/bindings/binding_set.h" +#include "net/url_request/url_request_test_util.h" #include "services/device/device_service.h" #include "services/device/public/interfaces/constants.mojom.h" #include "services/service_manager/public/cpp/binder_registry.h" @@ -21,6 +22,18 @@ namespace { const char kTestServiceName[] = "device_unittests"; +const char kTestGeolocationApiKey[] = ""; + +// Simple request context producer that immediately produces a +// TestURLRequestContextGetter. +void TestRequestContextProducer( + const scoped_refptr<base::SingleThreadTaskRunner>& network_task_runner, + base::OnceCallback<void(scoped_refptr<net::URLRequestContextGetter>)> + response_callback) { + std::move(response_callback) + .Run(base::MakeRefCounted<net::TestURLRequestContextGetter>( + network_task_runner)); +} // Simply return a nullptr which means no CustomLocationProvider from embedder. std::unique_ptr<LocationProvider> GetCustomLocationProviderForTest() { @@ -56,13 +69,18 @@ #if defined(OS_ANDROID) device_service_context_.reset(new service_manager::ServiceContext( CreateDeviceService( - file_task_runner_, io_task_runner_, wake_lock_context_callback_, + file_task_runner_, io_task_runner_, + base::Bind(&TestRequestContextProducer, io_task_runner_), + kTestGeolocationApiKey, wake_lock_context_callback_, base::Bind(&GetCustomLocationProviderForTest), nullptr), std::move(request))); #else device_service_context_.reset(new service_manager::ServiceContext( - CreateDeviceService(file_task_runner_, io_task_runner_, - base::Bind(&GetCustomLocationProviderForTest)), + CreateDeviceService( + file_task_runner_, io_task_runner_, + base::Bind(&TestRequestContextProducer, io_task_runner_), + kTestGeolocationApiKey, + base::Bind(&GetCustomLocationProviderForTest)), std::move(request))); #endif } @@ -90,7 +108,8 @@ file_thread_("DeviceServiceTestFileThread"), io_thread_("DeviceServiceTestIOThread") { file_thread_.Start(); - io_thread_.Start(); + io_thread_.StartWithOptions( + base::Thread::Options(base::MessageLoop::TYPE_IO, 0)); } DeviceServiceTestBase::~DeviceServiceTestBase() {}
diff --git a/services/device/geolocation/public_ip_address_geolocation_provider.cc b/services/device/geolocation/public_ip_address_geolocation_provider.cc index 4c570ba..207556e 100644 --- a/services/device/geolocation/public_ip_address_geolocation_provider.cc +++ b/services/device/geolocation/public_ip_address_geolocation_provider.cc
@@ -8,13 +8,7 @@ namespace device { -PublicIpAddressGeolocationProvider::PublicIpAddressGeolocationProvider() { - DETACH_FROM_SEQUENCE(sequence_checker_); -} - -PublicIpAddressGeolocationProvider::~PublicIpAddressGeolocationProvider() {} - -void PublicIpAddressGeolocationProvider::Initialize( +PublicIpAddressGeolocationProvider::PublicIpAddressGeolocationProvider( GeolocationProvider::RequestContextProducer request_context_producer, const std::string& api_key) { // Bind sequence_checker_ to the initialization sequence. @@ -25,6 +19,8 @@ request_context_producer, api_key); } +PublicIpAddressGeolocationProvider::~PublicIpAddressGeolocationProvider() {} + void PublicIpAddressGeolocationProvider::Bind( mojom::PublicIpAddressGeolocationProviderRequest request) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
diff --git a/services/device/geolocation/public_ip_address_geolocation_provider.h b/services/device/geolocation/public_ip_address_geolocation_provider.h index 57ee445..a0a0e92 100644 --- a/services/device/geolocation/public_ip_address_geolocation_provider.h +++ b/services/device/geolocation/public_ip_address_geolocation_provider.h
@@ -25,24 +25,16 @@ // Sequencing: // * Must be used and destroyed on the same sequence. // * Provides mojom::Geolocation instances that are bound on the same sequence. -// * Requires two-step construction: Construct on any sequence, then invoke -// Initialize() on the sequence on which this object will run. class PublicIpAddressGeolocationProvider : public mojom::PublicIpAddressGeolocationProvider { public: - // After construction, invoke Initialize() (on the appropriate sequence) to - // finish initialization. - PublicIpAddressGeolocationProvider(); - ~PublicIpAddressGeolocationProvider() override; - - // Finishes initialization, using the specified Google |api_key| and a URL - // request context produced by |request_context_producer| for network location - // requests. - // After this call is made, this object must be used only on the sequence on - // which this call was made. - void Initialize( + // Initialize PublicIpAddressGeolocationProvider using the specified Google + // |api_key| and a URL request context produced by |request_context_producer| + // for network location requests. + PublicIpAddressGeolocationProvider( GeolocationProvider::RequestContextProducer request_context_producer, const std::string& api_key); + ~PublicIpAddressGeolocationProvider() override; // Binds a PublicIpAddressGeolocationProvider request to this instance. void Bind(mojom::PublicIpAddressGeolocationProviderRequest request);
diff --git a/services/device/manifest.json b/services/device/manifest.json index 55a05bc..ea020f60b 100644 --- a/services/device/manifest.json +++ b/services/device/manifest.json
@@ -5,12 +5,13 @@ "service_manager:connector": { "provides": { "device:battery_monitor": [ "device::mojom::BatteryMonitor" ], - "device:hid": [ "device::mojom::HidManager" ], - "device:input_service": [ "device::mojom::InputDeviceManager" ], "device:fingerprint": [ "device::mojom::Fingerprint" ], "device:generic_sensor": [ "device::mojom::SensorProvider" ], "device:geolocation": [ "device::mojom::GeolocationContext" ], "device:geolocation_control": [ "device::mojom::GeolocationControl" ], + "device:hid": [ "device::mojom::HidManager" ], + "device:input_service": [ "device::mojom::InputDeviceManager" ], + "device:ip_geolocator": [ "device::mojom::PublicIpAddressGeolocationProvider" ], "device:nfc": [ "device::mojom::NFCProvider" ], "device:power_monitor": [ "device::mojom::PowerMonitor" ], "device:screen_orientation": [ "device::mojom::ScreenOrientationListener" ],
diff --git a/services/service_manager/sandbox/linux/bpf_network_policy_linux.cc b/services/service_manager/sandbox/linux/bpf_network_policy_linux.cc index bba98ed..731d180 100644 --- a/services/service_manager/sandbox/linux/bpf_network_policy_linux.cc +++ b/services/service_manager/sandbox/linux/bpf_network_policy_linux.cc
@@ -35,56 +35,6 @@ ResultExpr NetworkProcessPolicy::EvaluateSyscall(int sysno) const { switch (sysno) { -// Allowed syscalls: -#if defined(__NR_accept) - case __NR_accept: -#endif -#if defined(__NR_bind) - case __NR_bind: -#endif -#if defined(__NR_connect) - case __NR_connect: -#endif -#if defined(__NR_getsockname) - case __NR_getsockname: -#endif -#if defined(__NR_inotify_add_watch) - case __NR_inotify_add_watch: -#endif -#if defined(__NR_inotify_init) - case __NR_inotify_init: -#endif -#if defined(__NR_inotify_init1) - case __NR_inotify_init1: -#endif -#if defined(__NR_inotify_rm_watch) - case __NR_inotify_rm_watch: -#endif -#if defined(__NR_ioctl) - // TODO(tsepez): restrict based on arguments. - case __NR_ioctl: -#endif -#if defined(__NR_listen) - case __NR_listen: -#endif -#if defined(__NR_socket) - case __NR_socket: -#endif -#if defined(__NR_uname) - case __NR_uname: -#endif -#if defined(__NR_sysinfo) - case __NR_sysinfo: -#endif - return Allow(); - -// Restricted syscalls: -#if defined(__NR_fcntl) - case __NR_fcntl: - return sandbox::RestrictFcntlCommands(); -#endif - -// Trapped syscalls: #if defined(__NR_access) case __NR_access: #endif @@ -138,9 +88,9 @@ #endif return Trap(BrokerProcess::SIGSYS_Handler, SandboxLinux::GetInstance()->broker_process()); - default: - return BPFBasePolicy::EvaluateSyscall(errno); + // TODO(tsepez): FIX this. + return Allow(); } }
diff --git a/testing/android/native_test/java/src/org/chromium/native_test/NativeBrowserTestActivity.java b/testing/android/native_test/java/src/org/chromium/native_test/NativeBrowserTestActivity.java index 600d2de1..92fc4693 100644 --- a/testing/android/native_test/java/src/org/chromium/native_test/NativeBrowserTestActivity.java +++ b/testing/android/native_test/java/src/org/chromium/native_test/NativeBrowserTestActivity.java
@@ -40,7 +40,6 @@ @Override public void onStart() { deletePrivateDataDirectory(); - mTest.setEnvForNative(this); initializeBrowserProcess(); super.onStart(); mTest.postStart(this, false);
diff --git a/testing/android/native_test/java/src/org/chromium/native_test/NativeTest.java b/testing/android/native_test/java/src/org/chromium/native_test/NativeTest.java index e58af13..3e27274 100644 --- a/testing/android/native_test/java/src/org/chromium/native_test/NativeTest.java +++ b/testing/android/native_test/java/src/org/chromium/native_test/NativeTest.java
@@ -7,12 +7,10 @@ import android.app.Activity; import android.content.Context; import android.content.Intent; -import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Process; -import android.system.Os; import org.chromium.base.CommandLine; import org.chromium.base.Log; @@ -40,8 +38,6 @@ "org.chromium.native_test.NativeTest.Shard"; public static final String EXTRA_STDOUT_FILE = "org.chromium.native_test.NativeTest.StdoutFile"; - public static final String EXTRA_UBSAN_OPTIONS = - "org.chromium.native_test.NativeTest.UBSAN_OPTIONS"; private static final String TAG = "cr_NativeTest"; @@ -183,19 +179,6 @@ Log.e(TAG, "[ RUNNER_FAILED ] could not load native library"); } - public void setEnvForNative(Activity activity) { - // The setenv API was added in L. On older versions of Android, we should still see ubsan - // reports, but they will not have stack traces. - String ubsanOptions = activity.getIntent().getStringExtra(EXTRA_UBSAN_OPTIONS); - if (ubsanOptions != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - try { - Os.setenv("UBSAN_OPTIONS", ubsanOptions, true); - } catch (Exception e) { - Log.w(TAG, "failed to set UBSAN_OPTIONS", e); - } - } - } - private native void nativeRunTests(String commandLineFlags, String commandLineFilePath, String stdoutFilePath, Context appContext, String testDataDir); }
diff --git a/testing/android/native_test/java/src/org/chromium/native_test/NativeUnitTest.java b/testing/android/native_test/java/src/org/chromium/native_test/NativeUnitTest.java index ba7c464..89b6a56 100644 --- a/testing/android/native_test/java/src/org/chromium/native_test/NativeUnitTest.java +++ b/testing/android/native_test/java/src/org/chromium/native_test/NativeUnitTest.java
@@ -11,6 +11,7 @@ import org.chromium.base.Log; import org.chromium.base.PathUtils; import org.chromium.base.PowerMonitor; +import org.chromium.base.library_loader.LibraryLoader; import org.chromium.base.library_loader.NativeLibraries; /** @@ -36,10 +37,6 @@ // Needed by system_monitor_unittest.cc PowerMonitor.createForTests(); - // Configure ubsan using $UBSAN_OPTIONS. This needs to happen here because ubsan reads its - // configuration from $UBSAN_OPTIONS when the native library is loaded. - setEnvForNative(activity); - // For NativeActivity based tests, // dependency libraries must be loaded before NativeActivity::OnCreate, // otherwise loading android.app.lib_name will fail @@ -47,6 +44,7 @@ } private void loadLibraries() { + LibraryLoader.setEnvForNative(); for (String library : NativeLibraries.LIBRARIES) { Log.i(TAG, "loading: %s", library); System.loadLibrary(library);
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index d606076..e42a756b 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -4256,6 +4256,18 @@ { "args": [ "--enable-viz", + "--test-launcher-filter-file=../../testing/buildbot/filters/viz.browser_tests.filter" + ], + "name": "viz_browser_tests", + "swarming": { + "can_use_on_swarming_builders": true, + "shards": 5 + }, + "test": "browser_tests" + }, + { + "args": [ + "--enable-viz", "--test-launcher-filter-file=../../testing/buildbot/filters/mojo.fyi.viz.content_browsertests.filter" ], "name": "viz_content_browsertests", @@ -4264,6 +4276,17 @@ "shards": 2 }, "test": "content_browsertests" + }, + { + "args": [ + "--enable-viz", + "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_unitests.filter" + ], + "name": "viz_content_unittests", + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "content_unittests" } ], "isolated_scripts": [ @@ -4489,6 +4512,18 @@ }, { "args": [ + "--enable-viz", + "--test-launcher-filter-file=../../testing/buildbot/filters/viz.browser_tests.filter" + ], + "name": "viz_browser_tests", + "swarming": { + "can_use_on_swarming_builders": true, + "shards": 5 + }, + "test": "browser_tests" + }, + { + "args": [ "--mus" ], "name": "mus_content_browsertests", @@ -4512,6 +4547,17 @@ "test": "content_browsertests" }, { + "args": [ + "--enable-viz", + "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_unitests.filter" + ], + "name": "viz_content_unittests", + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "content_unittests" + }, + { "swarming": { "can_use_on_swarming_builders": true }, @@ -4643,6 +4689,17 @@ "test": "content_browsertests" }, { + "args": [ + "--enable-viz", + "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_unitests.filter" + ], + "name": "viz_content_unittests", + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "content_unittests" + }, + { "swarming": { "can_use_on_swarming_builders": true },
diff --git a/testing/buildbot/filters/BUILD.gn b/testing/buildbot/filters/BUILD.gn index 61191ac..12f156f 100644 --- a/testing/buildbot/filters/BUILD.gn +++ b/testing/buildbot/filters/BUILD.gn
@@ -50,6 +50,14 @@ ] } +source_set("content_unittests_filters") { + testonly = true + + data = [ + "//testing/buildbot/filters/viz.content_unittests.filter", + ] +} + source_set("interactive_ui_tests_filters") { testonly = true
diff --git a/testing/buildbot/filters/mash.browser_tests.filter b/testing/buildbot/filters/mash.browser_tests.filter index 875d362..c6b1b04 100644 --- a/testing/buildbot/filters/mash.browser_tests.filter +++ b/testing/buildbot/filters/mash.browser_tests.filter
@@ -45,7 +45,7 @@ VolumeControllerTest.* # Tests from elsewhere. -BrowserDialogTest.* +BrowserUiTest.* CastSessionBrowserTest.* ChromeContentBrowserClientMashTest.* ChromeContentRendererClientSearchBoxTest.*
diff --git a/testing/buildbot/filters/viz.content_unittests.filter b/testing/buildbot/filters/viz.content_unittests.filter new file mode 100644 index 0000000..84be21af --- /dev/null +++ b/testing/buildbot/filters/viz.content_unittests.filter
@@ -0,0 +1,27 @@ +-RenderWidgetHostInitialSizeTest.InitialSize +-RenderWidgetHostTest.FrameToken_RendererCrash +-RenderWidgetHostTest.NewContentRenderingTimeout +-RenderWidgetHostTest.Resize +-RenderWidgetHostTest.ResizeThenCrash +-RenderWidgetHostTest.SwapCompositorFrameWithBadSourceId +-RenderWidgetHostViewAuraCopyRequestTest.DedupeFrameSubscriberRequests +-RenderWidgetHostViewAuraCopyRequestTest.DestroyedAfterCopyRequest +-RenderWidgetHostViewAuraCopyRequestTest.PresentTime +-RenderWidgetHostViewAuraSurfaceSynchronizationTest.CompositorFrameSinkChange +-RenderWidgetHostViewAuraSurfaceSynchronizationTest.DiscardDelegatedFrames +-RenderWidgetHostViewAuraSurfaceSynchronizationTest.DropFallbackWhenHidden +-RenderWidgetHostViewAuraSurfaceSynchronizationTest.SurfaceChanges +-RenderWidgetHostViewAuraTest.DelegatedFrameGutter +-RenderWidgetHostViewAuraTest.DiscardDelegatedFrames +-RenderWidgetHostViewAuraTest.DiscardDelegatedFramesWithLocking +-RenderWidgetHostViewAuraTest.DiscardDelegatedFramesWithMemoryPressure +-RenderWidgetHostViewAuraTest.ForwardsBeginFrameAcks +-RenderWidgetHostViewAuraTest.HitTestRegionListSubmitted +-RenderWidgetHostViewAuraTest.MissingFramesDontLock +-RenderWidgetHostViewAuraTest.OutputSurfaceIdChange +-RenderWidgetHostViewAuraTest.ResizeAfterReceivingFrame +-RenderWidgetHostViewAuraTest.SkippedDelegatedFrames +-RenderWidgetHostViewAuraTest.TwoOutputSurfaces +-RenderWidgetHostViewChildFrameTest.FrameEviction +-RenderWidgetHostViewChildFrameTest.SwapCompositorFrame +-RenderWidgetHostViewGuestSurfaceTest.TestGuestSurface
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index c36f5d88..82b41be 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -1017,21 +1017,6 @@ }, }, - 'linux_viz_gtests': { - # TODO(jonross): merge all viz tests into one config, use exceptions to - # differentiate between the fyi and cq filters. - 'viz_content_browsertests': { - 'args': [ - '--enable-viz', - '--test-launcher-filter-file=../../testing/buildbot/filters/mojo.fyi.viz.content_browsertests.filter', - ], - 'swarming': { - 'shards': 2, - }, - 'test': 'content_browsertests', - }, - }, - 'mash_chromium_gtests': { 'ash_unittests-mash': { 'test': 'ash_unittests', @@ -1129,30 +1114,10 @@ }, }, - 'mojo_windows_gtests': { + 'mojo_windows_specific_gtests': { 'media_service_unittests': {}, 'services_unittests': {}, 'views_mus_interactive_ui_tests': {}, - 'viz_browser_tests': { - 'args': [ - '--enable-viz', - '--test-launcher-filter-file=../../testing/buildbot/filters/viz.browser_tests.filter' - ], - 'swarming': { - 'shards': 5, - }, - 'test': 'browser_tests', - }, - 'viz_content_browsertests': { - 'args': [ - '--enable-viz', - '--test-launcher-filter-file=../../testing/buildbot/filters/mojo.fyi.viz.content_browsertests.filter', - ], - 'swarming': { - 'shards': 2, - }, - 'test': 'content_browsertests', - }, }, 'mus_chromium_gtests': { @@ -1241,16 +1206,6 @@ 'ozone_x11_unittests': {}, 'views_mus_unittests': {}, 'views_mus_interactive_ui_tests': {}, - 'viz_content_browsertests': { - 'test': 'content_browsertests', - 'args': [ - '--enable-viz', - '--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter', - ], - 'swarming': { - 'shards': 2, - }, - }, 'wayland_client_perftests': {}, }, @@ -1287,16 +1242,6 @@ 'filesystem_service_unittests': {}, 'leveldb_service_unittests': {}, 'traffic_annotation_auditor_unittests': {}, - 'viz_content_browsertests': { - 'swarming': { - 'shards': 2, - }, - 'test': 'content_browsertests', - 'args': [ - '--enable-viz', - '--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter' - ], - }, }, 'linux_specific_chromium_isolated_scripts': { @@ -1342,16 +1287,6 @@ }, 'mojo_chromiumos_specific_gtests': { - 'viz_content_browsertests': { - 'args': [ - '--enable-viz', - '--test-launcher-filter-file=../../testing/buildbot/filters/mojo.fyi.viz.content_browsertests.filter', - ], - 'swarming': { - 'shards': 2, - }, - 'test': 'content_browsertests', - }, 'wayland_client_perftests': {}, }, @@ -1729,6 +1664,36 @@ } }, + 'viz_fyi_gtests': { + 'viz_browser_tests': { + 'args': [ + '--enable-viz', + '--test-launcher-filter-file=../../testing/buildbot/filters/viz.browser_tests.filter' + ], + 'swarming': { + 'shards': 5, + }, + 'test': 'browser_tests', + }, + 'viz_content_browsertests': { + 'args': [ + '--enable-viz', + '--test-launcher-filter-file=../../testing/buildbot/filters/mojo.fyi.viz.content_browsertests.filter', + ], + 'swarming': { + 'shards': 2, + }, + 'test': 'content_browsertests', + }, + 'viz_content_unittests': { + 'args': [ + '--enable-viz', + '--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_unitests.filter', + ], + 'test': 'content_unittests', + } + }, + 'viz_gtests': { 'viz_content_browsertests': { 'args': [ @@ -2027,6 +1992,7 @@ 'non_android_and_clang_win_chromium_gtests', 'non_clang_mac_win_chromium_gtests', 'non_mac_non_clang_win_chromium_gtests', + 'viz_gtests', ], 'chromium_linux_isolated_scripts': [ @@ -2289,11 +2255,17 @@ 'win_specific_chromium_gtests', ], + 'mojo_windows_gtests': [ + 'mojo_windows_specific_gtests', + 'viz_fyi_gtests', + ], + 'mojo_chromiumos_gtests': [ 'aura_non_clang_gtests', 'mash_chromium_gtests', 'mojo_chromiumos_specific_gtests', 'mus_chromium_chromiumos_gtests', + 'viz_fyi_gtests', ], 'sandboxed_chromium_memory_linux_gtests': [
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index 60a6350..aab1979 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -1080,7 +1080,7 @@ 'all', ], 'test_suites': { - 'gtest_tests': 'linux_viz_gtests', + 'gtest_tests': 'viz_fyi_gtests', 'isolated_scripts': 'linux_viz_isolated_scripts', }, },
diff --git a/testing/scripts/common.py b/testing/scripts/common.py index da3e3446..d436452 100644 --- a/testing/scripts/common.py +++ b/testing/scripts/common.py
@@ -92,6 +92,9 @@ def run_runtest(cmd_args, runtest_args): + env = os.environ.copy() + env['CHROME_HEADLESS'] = '1' + if cmd_args.use_src_side_runtest_py: cmd = [ sys.executable, @@ -114,7 +117,7 @@ '--slave-name', cmd_args.properties['slavename'], '--build-number', str(cmd_args.properties['buildnumber']), '--build-properties', json.dumps(cmd_args.properties), - ] + runtest_args) + ] + runtest_args, env=env) @contextlib.contextmanager
diff --git a/testing/scripts/content_shell_crash_test.py b/testing/scripts/content_shell_crash_test.py index b278eaf..e83ba22 100755 --- a/testing/scripts/content_shell_crash_test.py +++ b/testing/scripts/content_shell_crash_test.py
@@ -55,6 +55,7 @@ exe = os.path.join('.', 'content_shell') with common.temporary_file() as tempfile_path: + env['CHROME_HEADLESS'] = '1' rc = xvfb.run_executable([ sys.executable, os.path.join(common.SRC_DIR, 'content', 'shell', 'tools',
diff --git a/testing/scripts/run_gpu_integration_test_as_googletest.py b/testing/scripts/run_gpu_integration_test_as_googletest.py index 994fd02..3163bdf 100755 --- a/testing/scripts/run_gpu_integration_test_as_googletest.py +++ b/testing/scripts/run_gpu_integration_test_as_googletest.py
@@ -103,6 +103,7 @@ valid = True rc = 0 try: + env['CHROME_HEADLESS'] = '1' rc = common.run_command([sys.executable] + rest_args + sharding_args + [ '--write-full-results-to', args.isolated_script_test_output ], env=env)
diff --git a/testing/scripts/run_gtest_perf_test.py b/testing/scripts/run_gtest_perf_test.py index 74d3e72..ce439759 100755 --- a/testing/scripts/run_gtest_perf_test.py +++ b/testing/scripts/run_gtest_perf_test.py
@@ -117,6 +117,7 @@ else: executable = './%s' % executable with common.temporary_file() as tempfile_path: + env['CHROME_HEADLESS'] = '1' rc = common.run_command_with_output([executable] + extra_flags, env=env, stdoutfile=tempfile_path) # Now get the correct json format from the stdout to write to the
diff --git a/testing/scripts/run_isolated_script_test.py b/testing/scripts/run_isolated_script_test.py index 646631f..2567e37 100755 --- a/testing/scripts/run_isolated_script_test.py +++ b/testing/scripts/run_isolated_script_test.py
@@ -61,7 +61,8 @@ args, rest_args = parser.parse_known_args() - env = os.environ + env = os.environ.copy() + env['CHROME_HEADLESS'] = '1' cmd = [sys.executable] + rest_args cmd += ['--write-full-results-to', args.isolated_script_test_output] temp_filter_file = None
diff --git a/testing/scripts/run_telemetry_as_googletest.py b/testing/scripts/run_telemetry_as_googletest.py index 70e9223..d561357 100755 --- a/testing/scripts/run_telemetry_as_googletest.py +++ b/testing/scripts/run_telemetry_as_googletest.py
@@ -72,6 +72,8 @@ total_shards = None shard_index = None env = os.environ.copy() + env['CHROME_HEADLESS'] = '1' + if 'GTEST_TOTAL_SHARDS' in env: total_shards = int(env['GTEST_TOTAL_SHARDS']) del env['GTEST_TOTAL_SHARDS']
diff --git a/testing/scripts/run_telemetry_benchmark_as_googletest.py b/testing/scripts/run_telemetry_benchmark_as_googletest.py index e5f539a..cbde77b3 100755 --- a/testing/scripts/run_telemetry_benchmark_as_googletest.py +++ b/testing/scripts/run_telemetry_benchmark_as_googletest.py
@@ -85,6 +85,8 @@ def run_benchmark(args, rest_args): env = os.environ.copy() + env['CHROME_HEADLESS'] = '1' + # Assume we want to set up the sandbox environment variables all the # time; doing so is harmless on non-Linux platforms and is needed # all the time on Linux.
diff --git a/third_party/OWNERS b/third_party/OWNERS index 7b36d33..109a874 100644 --- a/third_party/OWNERS +++ b/third_party/OWNERS
@@ -14,6 +14,9 @@ # Eng reviewer file://ENG_REVIEW_OWNERS +# Automatic round-robin assignment of reviewer for third-party licenses. +chromium-third-party@google.com + thakis@chromium.org per-file .gitignore=*
diff --git a/third_party/README.chromium b/third_party/README.chromium index 08a82cb..d19364d 100644 --- a/third_party/README.chromium +++ b/third_party/README.chromium
@@ -1,10 +1,14 @@ The third_party directory contains sources from other projects. -Code in third_party must document the license under which the source is being +Code in third_party must document the license under which the source is being used. If the source itself does not include a license header or file, create an entry in this file that refers to reliable documentation of the project's -license terms on the web (and add a note pointing here in the README file in +license terms on the web (and add a note pointing here in the README file in that directory). +When adding a new directory, or updating a directory to a version which has +a different license from before, please add chromium-third-party@google.com +as a reviewer on the change. + <Include table of license information here, once it is available>
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations index f7f9a66..d553c4b 100644 --- a/third_party/WebKit/LayoutTests/TestExpectations +++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -1965,6 +1965,11 @@ crbug.com/751952 virtual/origin-trials-runtimeflags-disabled/http/tests/origin_trials/webexposed/budget-api-origin-trial-interfaces.html [ Pass Failure ] # ====== New tests from wpt-importer added here ====== +crbug.com/626703 external/wpt/svg/path/bearing/zero.svg [ Failure ] +crbug.com/626703 external/wpt/svg/path/bearing/relative.svg [ Failure ] +crbug.com/626703 external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-integrity-classic.html [ Skip ] +crbug.com/626703 external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-integrity-module.html [ Skip ] +crbug.com/626703 external/wpt/svg/path/bearing/absolute.svg [ Failure ] crbug.com/626703 [ Android Win7 ] external/wpt/longtask-timing/longtask-in-sibling-iframe.html [ Timeout ] crbug.com/626703 [ Linux Win ] external/wpt/css/css-color/t425-hsla-onscreen-b.xht [ Failure ] crbug.com/626703 external/wpt/css/css-color/t32-opacity-offscreen-b.xht [ Failure ] @@ -3181,8 +3186,6 @@ crbug.com/717643 external/wpt/html/semantics/scripting-1/the-script-element/module/module-in-xhtml.xhtml [ Failure ] # known bug: import() inside set{Timeout,Interval} -crbug.com/773622 external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-classic.html [ Failure ] -crbug.com/773622 external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-module.html [ Failure ] # import.meta.url is under development. crbug.com/773713 external/wpt/html/semantics/scripting-1/the-script-element/module/import-meta [ Skip ]
diff --git a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json index ac890dc..e7d283a 100644 --- a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json +++ b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
@@ -33989,18 +33989,6 @@ {} ] ], - "css/css-display/display-contents-replaced-001.html": [ - [ - "/css/css-display/display-contents-replaced-001.html", - [ - [ - "/css/css-display/display-contents-replaced-001-ref.html", - "==" - ] - ], - {} - ] - ], "css/css-display/display-contents-state-change-001.html": [ [ "/css/css-display/display-contents-state-change-001.html", @@ -34013,6 +34001,18 @@ {} ] ], + "css/css-display/display-contents-svg-elements.html": [ + [ + "/css/css-display/display-contents-svg-elements.html", + [ + [ + "/css/css-display/display-contents-svg-elements-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-display/display-contents-table-001.html": [ [ "/css/css-display/display-contents-table-001.html", @@ -47526,7 +47526,7 @@ "/css/css-text-decor/line-through-vertical.html", [ [ - "/css/css-text-decor/line-through-vertical-ref.html", + "/css/css-text-decor/reference/line-through-vertical-ref.html", "==" ] ], @@ -47538,7 +47538,7 @@ "/css/css-text-decor/text-decoration-color-recalc.html", [ [ - "/css/css-text-decor/text-decoration-color-recalc-ref.html", + "/css/css-text-decor/reference/text-decoration-color-recalc-ref.html", "==" ] ], @@ -47550,7 +47550,7 @@ "/css/css-text-decor/text-decoration-color.html", [ [ - "/css/css-text-decor/text-decoration-color-ref.html", + "/css/css-text-decor/reference/text-decoration-color-ref.html", "==" ] ], @@ -47610,7 +47610,7 @@ "/css/css-text-decor/text-decoration-line-recalc.html", [ [ - "/css/css-text-decor/text-decoration-line-recalc-ref.html", + "/css/css-text-decor/reference/text-decoration-line-recalc-ref.html", "==" ] ], @@ -47622,7 +47622,7 @@ "/css/css-text-decor/text-decoration-line.html", [ [ - "/css/css-text-decor/text-decoration-line-ref.html", + "/css/css-text-decor/reference/text-decoration-line-ref.html", "==" ] ], @@ -47634,7 +47634,7 @@ "/css/css-text-decor/text-decoration-style-multiple.html", [ [ - "/css/css-text-decor/text-decoration-style-multiple-ref.html", + "/css/css-text-decor/reference/text-decoration-style-multiple-ref.html", "==" ] ], @@ -47646,7 +47646,7 @@ "/css/css-text-decor/text-decoration-style-recalc.html", [ [ - "/css/css-text-decor/text-decoration-style-recalc-ref.html", + "/css/css-text-decor/reference/text-decoration-style-recalc-ref.html", "==" ] ], @@ -85589,6 +85589,18 @@ {} ] ], + "html/semantics/text-level-semantics/the-ruby-element/ruby-usage.html": [ + [ + "/html/semantics/text-level-semantics/the-ruby-element/ruby-usage.html", + [ + [ + "/html/semantics/text-level-semantics/the-ruby-element/ruby-usage-notref.html", + "!=" + ] + ], + {} + ] + ], "html/semantics/text-level-semantics/the-wbr-element/wbr-element.html": [ [ "/html/semantics/text-level-semantics/the-wbr-element/wbr-element.html", @@ -85769,6 +85781,18 @@ {} ] ], + "svg/foreignobject/position-svg-root-in-foreign-object.html": [ + [ + "/svg/foreignobject/position-svg-root-in-foreign-object.html", + [ + [ + "/svg/foreignobject/position-svg-root-in-foreign-object-ref.html", + "==" + ] + ], + {} + ] + ], "svg/linking/reftests/href-a-element-attr-change.html": [ [ "/svg/linking/reftests/href-a-element-attr-change.html", @@ -85889,6 +85913,42 @@ {} ] ], + "svg/path/bearing/absolute.svg": [ + [ + "/svg/path/bearing/absolute.svg", + [ + [ + "/svg/path/bearing/absolute-ref.svg", + "==" + ] + ], + {} + ] + ], + "svg/path/bearing/relative.svg": [ + [ + "/svg/path/bearing/relative.svg", + [ + [ + "/svg/path/bearing/absolute-ref.svg", + "==" + ] + ], + {} + ] + ], + "svg/path/bearing/zero.svg": [ + [ + "/svg/path/bearing/zero.svg", + [ + [ + "/svg/path/bearing/zero-ref.svg", + "==" + ] + ], + {} + ] + ], "svg/path/property/priority.svg": [ [ "/svg/path/property/priority.svg", @@ -91775,11 +91835,6 @@ {} ] ], - "XMLHttpRequest/interfaces-expected.txt": [ - [ - {} - ] - ], "XMLHttpRequest/no-utf16-json-expected.txt": [ [ {} @@ -100155,12 +100210,12 @@ {} ] ], - "css/css-display/display-contents-replaced-001-ref.html": [ + "css/css-display/display-contents-state-change-001-ref.html": [ [ {} ] ], - "css/css-display/display-contents-state-change-001-ref.html": [ + "css/css-display/display-contents-svg-elements-ref.html": [ [ {} ] @@ -112205,7 +112260,17 @@ {} ] ], - "css/css-text-decor/line-through-vertical-ref.html": [ + "css/css-text-decor/reference/line-through-vertical-ref.html": [ + [ + {} + ] + ], + "css/css-text-decor/reference/text-decoration-color-recalc-ref.html": [ + [ + {} + ] + ], + "css/css-text-decor/reference/text-decoration-color-ref.html": [ [ {} ] @@ -112230,6 +112295,26 @@ {} ] ], + "css/css-text-decor/reference/text-decoration-line-recalc-ref.html": [ + [ + {} + ] + ], + "css/css-text-decor/reference/text-decoration-line-ref.html": [ + [ + {} + ] + ], + "css/css-text-decor/reference/text-decoration-style-multiple-ref.html": [ + [ + {} + ] + ], + "css/css-text-decor/reference/text-decoration-style-recalc-ref.html": [ + [ + {} + ] + ], "css/css-text-decor/reference/text-emphasis-color-001-ref.xht": [ [ {} @@ -112340,41 +112425,11 @@ {} ] ], - "css/css-text-decor/text-decoration-color-recalc-ref.html": [ - [ - {} - ] - ], - "css/css-text-decor/text-decoration-color-ref.html": [ - [ - {} - ] - ], - "css/css-text-decor/text-decoration-line-recalc-ref.html": [ - [ - {} - ] - ], - "css/css-text-decor/text-decoration-line-ref.html": [ - [ - {} - ] - ], "css/css-text-decor/text-decoration-serialization.tentative-expected.txt": [ [ {} ] ], - "css/css-text-decor/text-decoration-style-multiple-ref.html": [ - [ - {} - ] - ], - "css/css-text-decor/text-decoration-style-recalc-ref.html": [ - [ - {} - ] - ], "css/css-text/OWNERS": [ [ {} @@ -127805,11 +127860,6 @@ {} ] ], - "generic-sensor/idlharness.https-expected.txt": [ - [ - {} - ] - ], "geolocation-API/OWNERS": [ [ {} @@ -127935,11 +127985,6 @@ {} ] ], - "gyroscope/idlharness.https-expected.txt": [ - [ - {} - ] - ], "hr-time/OWNERS": [ [ {} @@ -136800,6 +136845,21 @@ {} ] ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/cue-recovery-cuetext.vtt": [ + [ + {} + ] + ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/cue-recovery-header.vtt": [ + [ + {} + ] + ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/cue-recovery-note.vtt": [ + [ + {} + ] + ], "html/semantics/embedded-content/media-elements/track/track-element/resources/cue-size-align-bad.vtt": [ [ {} @@ -136835,6 +136895,16 @@ {} ] ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/degenerate-cues.vtt": [ + [ + {} + ] + ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/empty-cue.vtt": [ + [ + {} + ] + ], "html/semantics/embedded-content/media-elements/track/track-element/resources/entities-wrong.vtt": [ [ {} @@ -136845,6 +136915,11 @@ {} ] ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/interspersed-non-cue.vtt": [ + [ + {} + ] + ], "html/semantics/embedded-content/media-elements/track/track-element/resources/iso2022jp3.vtt": [ [ {} @@ -136945,6 +137020,11 @@ {} ] ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/timings-whitespace.vtt": [ + [ + {} + ] + ], "html/semantics/embedded-content/media-elements/track/track-element/resources/track.de.vtt": [ [ {} @@ -136965,6 +137045,11 @@ {} ] ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/unsupported-markup.vtt": [ + [ + {} + ] + ], "html/semantics/embedded-content/media-elements/track/track-element/resources/utf8.vtt": [ [ {} @@ -136985,6 +137070,16 @@ {} ] ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/voice-bad.vtt": [ + [ + {} + ] + ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/voice.vtt": [ + [ + {} + ] + ], "html/semantics/embedded-content/media-elements/track/track-element/resources/webvtt-file.vtt": [ [ {} @@ -138700,6 +138795,61 @@ {} ] ], + "html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/Function.js": [ + [ + {} + ] + ], + "html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/eval.js": [ + [ + {} + ] + ], + "html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/inline-event-handlers-UA-code.js": [ + [ + {} + ] + ], + "html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/reflected-inline-event-handlers.js": [ + [ + {} + ] + ], + "html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/setTimeout.js": [ + [ + {} + ] + ], + "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-classic-expected.txt": [ + [ + {} + ] + ], + "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-module-expected.txt": [ + [ + {} + ] + ], + "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-inline-classic-expected.txt": [ + [ + {} + ] + ], + "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-inline-module-expected.txt": [ + [ + {} + ] + ], + "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic-expected.txt": [ + [ + {} + ] + ], + "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module-expected.txt": [ + [ + {} + ] + ], "html/semantics/scripting-1/the-script-element/module/errorhandling-parseerror-common.js": [ [ {} @@ -139800,6 +139950,11 @@ {} ] ], + "html/semantics/text-level-semantics/the-ruby-element/ruby-usage-notref.html": [ + [ + {} + ] + ], "html/semantics/text-level-semantics/the-s-element/.gitkeep": [ [ {} @@ -142750,11 +142905,6 @@ {} ] ], - "orientation-sensor/idlharness.https-expected.txt": [ - [ - {} - ] - ], "page-visibility/OWNERS": [ [ {} @@ -147985,16 +148135,6 @@ {} ] ], - "storage/interfaces.https-expected.txt": [ - [ - {} - ] - ], - "storage/interfaces.https.worker-expected.txt": [ - [ - {} - ] - ], "storage/interfaces.idl": [ [ {} @@ -148740,6 +148880,11 @@ {} ] ], + "svg/foreignobject/position-svg-root-in-foreign-object-ref.html": [ + [ + {} + ] + ], "svg/interfaces-expected.txt": [ [ {} @@ -148790,6 +148935,21 @@ {} ] ], + "svg/path/bearing/absolute-ref.svg": [ + [ + {} + ] + ], + "svg/path/bearing/relative-ref.svg": [ + [ + {} + ] + ], + "svg/path/bearing/zero-ref.svg": [ + [ + {} + ] + ], "svg/path/property/priority-ref.svg": [ [ {} @@ -148890,11 +149050,6 @@ {} ] ], - "uievents/interfaces-expected.txt": [ - [ - {} - ] - ], "uievents/keyboard/README.md": [ [ {} @@ -150210,6 +150365,11 @@ {} ] ], + "webrtc/RTCPeerConnection-createOffer-offerToReceive-expected.txt": [ + [ + {} + ] + ], "webrtc/RTCPeerConnection-generateCertificate-expected.txt": [ [ {} @@ -182488,6 +182648,12 @@ {} ] ], + "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-cue-recovery.html": [ + [ + "/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-cue-recovery.html", + {} + ] + ], "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-cue-size-align.html": [ [ "/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-cue-size-align.html", @@ -182500,6 +182666,18 @@ {} ] ], + "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-degenerate-cues.html": [ + [ + "/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-degenerate-cues.html", + {} + ] + ], + "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-empty-cue.html": [ + [ + "/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-empty-cue.html", + {} + ] + ], "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-entities.html": [ [ "/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-entities.html", @@ -182512,6 +182690,12 @@ {} ] ], + "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-interspersed-non-cue.html": [ + [ + "/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-interspersed-non-cue.html", + {} + ] + ], "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-line-position.html": [ [ "/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-line-position.html", @@ -182572,6 +182756,18 @@ {} ] ], + "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-timings-whitespace.html": [ + [ + "/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-timings-whitespace.html", + {} + ] + ], + "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-unsupported-markup.html": [ + [ + "/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-unsupported-markup.html", + {} + ] + ], "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-utf8.html": [ [ "/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-utf8.html", @@ -182584,6 +182780,12 @@ {} ] ], + "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-voice.html": [ + [ + "/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-voice.html", + {} + ] + ], "html/semantics/embedded-content/media-elements/user-interface/muted.html": [ [ "/html/semantics/embedded-content/media-elements/user-interface/muted.html", @@ -186310,15 +186512,27 @@ {} ] ], - "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-classic.html": [ + "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-classic.html": [ [ - "/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-classic.html", + "/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-classic.html", {} ] ], - "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-module.html": [ + "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-module.html": [ [ - "/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-module.html", + "/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-module.html", + {} + ] + ], + "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-inline-classic.html": [ + [ + "/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-inline-classic.html", + {} + ] + ], + "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-inline-module.html": [ + [ + "/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-inline-module.html", {} ] ], @@ -186328,12 +186542,36 @@ {} ] ], + "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-integrity-classic.html": [ + [ + "/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-integrity-classic.html", + {} + ] + ], + "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-integrity-module.html": [ + [ + "/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-integrity-module.html", + {} + ] + ], "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-module.html": [ [ "/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-module.html", {} ] ], + "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic.html": [ + [ + "/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic.html", + {} + ] + ], + "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module.html": [ + [ + "/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module.html", + {} + ] + ], "html/semantics/scripting-1/the-script-element/module/error-and-slow-dependency.html": [ [ "/html/semantics/scripting-1/the-script-element/module/error-and-slow-dependency.html", @@ -215632,6 +215870,12 @@ {} ] ], + "webrtc/RTCPeerConnection-createOffer-offerToReceive.html": [ + [ + "/webrtc/RTCPeerConnection-createOffer-offerToReceive.html", + {} + ] + ], "webrtc/RTCPeerConnection-createOffer.html": [ [ "/webrtc/RTCPeerConnection-createOffer.html", @@ -227624,7 +227868,7 @@ "testharness" ], "2dcontext/imagebitmap/createImageBitmap-invalid-args.html": [ - "e839d537057d03f55108b871d2d32272cac7bc7f", + "badef04a0354c9e41f99370b86e5f757b1926ea7", "testharness" ], "2dcontext/imagebitmap/createImageBitmap-sizeOverflow.html": [ @@ -229440,7 +229684,7 @@ "testharness" ], "FileAPI/idlharness.html": [ - "0eb0d3b2f6c394a6b30f71102bd002ae6e339283", + "66720cf090912985b9ea4e9cfe01126778f61e36", "testharness" ], "FileAPI/idlharness.idl": [ @@ -230772,7 +231016,7 @@ "testharness" ], "IndexedDB/interfaces.html": [ - "d2ff3cf10fbaf798d3bf5868699979829703d859", + "ad40586fec970a4907546e3a33aef14f23e378ff", "testharness" ], "IndexedDB/interfaces.idl": [ @@ -231472,11 +231716,11 @@ "support" ], "WebCryptoAPI/idlharness.html": [ - "52b5381311cc0e2595d251273e054fa826de9765", + "f97da6e12fbd08b0fe93a6bc0fb9724053d147a8", "testharness" ], "WebCryptoAPI/idlharness.https.html": [ - "52b5381311cc0e2595d251273e054fa826de9765", + "f97da6e12fbd08b0fe93a6bc0fb9724053d147a8", "testharness" ], "WebCryptoAPI/idlharness.worker.js": [ @@ -232183,10 +232427,6 @@ "1cb82348a9d6f3be34da762267cce7389f715f7c", "testharness" ], - "XMLHttpRequest/interfaces-expected.txt": [ - "c00dd816ba626616b2d02f3cfa2c5d0c79e0456b", - "support" - ], "XMLHttpRequest/interfaces.html": [ "a4c597d2bdb85e37ffe5f5ebba961d7f8a3aeb29", "testharness" @@ -233456,7 +233696,7 @@ "support" ], "accelerometer/idlharness.https-expected.txt": [ - "72a411d6c3167f8b92ac3397ef8b7a2879613561", + "e5d98b3a501e3029a71598c796046b0dc6d555ac", "support" ], "accelerometer/idlharness.https.html": [ @@ -255059,14 +255299,6 @@ "f9d1eaa996cfe84ba9600383bd6c38d179fcbe91", "support" ], - "css/css-display/display-contents-replaced-001-ref.html": [ - "09008a1d912eb30702be95db99b8e5fd6604a768", - "support" - ], - "css/css-display/display-contents-replaced-001.html": [ - "4030618381ad36d2c03be81b3b97cdb87977ddec", - "reftest" - ], "css/css-display/display-contents-state-change-001-ref.html": [ "f7e25855cc7ef1896a9a52005d3c1379bf74746b", "support" @@ -255075,6 +255307,14 @@ "0a689fbe90be794772c66d59b033d15336e6dfe3", "reftest" ], + "css/css-display/display-contents-svg-elements-ref.html": [ + "3e4ddf5f740d8fa688bcbb24201be0a6d4349017", + "support" + ], + "css/css-display/display-contents-svg-elements.html": [ + "93573e17090a860bb09c2a208d925afac9cb17fd", + "reftest" + ], "css/css-display/display-contents-table-001-ref.html": [ "9de4ee8151dbfa3c8e2c381ddd213e51b04f70c1", "support" @@ -271499,13 +271739,21 @@ "b28556fe458fac65f6a168b98e78597688f32a6e", "support" ], - "css/css-text-decor/line-through-vertical-ref.html": [ + "css/css-text-decor/line-through-vertical.html": [ + "d3fb9b272eafcfd36cefcc6a030c6ae3795a669c", + "reftest" + ], + "css/css-text-decor/reference/line-through-vertical-ref.html": [ "f38d583fbcd41470cefb566d7b18c49758b2ebd2", "support" ], - "css/css-text-decor/line-through-vertical.html": [ - "a0aee46cedb667c8906acb59254e6be2906947ce", - "reftest" + "css/css-text-decor/reference/text-decoration-color-recalc-ref.html": [ + "f97bae89c262da57e45294db7638159114047da3", + "support" + ], + "css/css-text-decor/reference/text-decoration-color-ref.html": [ + "4ef765ae8d80ac3eab177109e9bd5b2b7142880f", + "support" ], "css/css-text-decor/reference/text-decoration-line-010-ref.xht": [ "ba55218db818b208176448c9ae0adb4ee101ea53", @@ -271523,6 +271771,22 @@ "065a1c1af6c12c7d2043c3d318330ba3028cdd87", "support" ], + "css/css-text-decor/reference/text-decoration-line-recalc-ref.html": [ + "8e8c434546c5f4b6184d935f16b8e1479c39eb11", + "support" + ], + "css/css-text-decor/reference/text-decoration-line-ref.html": [ + "3612462ad5a2c5447adf1fc80f6aa2b4ee5cb001", + "support" + ], + "css/css-text-decor/reference/text-decoration-style-multiple-ref.html": [ + "e23906652f3abb2123d70b11a7002262ba661f8b", + "support" + ], + "css/css-text-decor/reference/text-decoration-style-recalc-ref.html": [ + "6c6057bb2fd3e94e6141426a9de282120e354bb5", + "support" + ], "css/css-text-decor/reference/text-emphasis-color-001-ref.xht": [ "999f10b2466d839871ca9e974de158b84f5e2a90", "support" @@ -271611,20 +271875,12 @@ "fa665f1520b2148805c182feda36860ef5647c65", "support" ], - "css/css-text-decor/text-decoration-color-recalc-ref.html": [ - "f97bae89c262da57e45294db7638159114047da3", - "support" - ], "css/css-text-decor/text-decoration-color-recalc.html": [ - "90b474101ea3f862c4b25541de7eceab6f400657", + "333110782c52aa29f0ac547164cf754025a285b9", "reftest" ], - "css/css-text-decor/text-decoration-color-ref.html": [ - "4ef765ae8d80ac3eab177109e9bd5b2b7142880f", - "support" - ], "css/css-text-decor/text-decoration-color.html": [ - "1680790f5a026f1a40a09b956303a5caa1d14db9", + "7a11633ef29f67fc2242a265a63749bd9e5c1cfe", "reftest" ], "css/css-text-decor/text-decoration-line-010.xht": [ @@ -271647,20 +271903,12 @@ "e0d6dbb039133f5aee07cc8dd3d96942727bdec0", "manual" ], - "css/css-text-decor/text-decoration-line-recalc-ref.html": [ - "8e8c434546c5f4b6184d935f16b8e1479c39eb11", - "support" - ], "css/css-text-decor/text-decoration-line-recalc.html": [ - "b2ecb8985db8138af208630adc912d489872ac01", + "ab48a5baca2e14a4618dc57f2b96badf98dfd077", "reftest" ], - "css/css-text-decor/text-decoration-line-ref.html": [ - "3612462ad5a2c5447adf1fc80f6aa2b4ee5cb001", - "support" - ], "css/css-text-decor/text-decoration-line.html": [ - "e75f9dd8329e7a7464ead41db58965f09f9897d3", + "2b56bc3ac545e449d4beff61d5c7c1fd97060042", "reftest" ], "css/css-text-decor/text-decoration-serialization.tentative-expected.txt": [ @@ -271675,20 +271923,12 @@ "a633a231d8fd6b5408add5fab972046651889b09", "testharness" ], - "css/css-text-decor/text-decoration-style-multiple-ref.html": [ - "e23906652f3abb2123d70b11a7002262ba661f8b", - "support" - ], "css/css-text-decor/text-decoration-style-multiple.html": [ - "dbf494f252e5f98a17734ffad96462f4b665d8c6", + "4f6e24cfb87dd4b8efb51154e70fbc14e35124da", "reftest" ], - "css/css-text-decor/text-decoration-style-recalc-ref.html": [ - "6c6057bb2fd3e94e6141426a9de282120e354bb5", - "support" - ], "css/css-text-decor/text-decoration-style-recalc.html": [ - "6fb5a8423c86ef7c2b4741787c710cce6fbf2a95", + "9dbfa25a35ae3959b51b28f71a29cbd9188322b3", "reftest" ], "css/css-text-decor/text-decoration-visibility-001.xht": [ @@ -290472,7 +290712,7 @@ "support" ], "css/cssom-view/interfaces-expected.txt": [ - "c00dd816ba626616b2d02f3cfa2c5d0c79e0456b", + "55c90c3c73a74c324d1fbf482a64018f5c32f1ac", "support" ], "css/cssom-view/interfaces.html": [ @@ -290944,7 +291184,7 @@ "testharness" ], "css/cssom/interfaces-expected.txt": [ - "c00dd816ba626616b2d02f3cfa2c5d0c79e0456b", + "172fc989f80c1a122597e1d21046715d0ee72dd4", "support" ], "css/cssom/interfaces.html": [ @@ -296676,7 +296916,7 @@ "testharness" ], "dom/interfaces-expected.txt": [ - "c00dd816ba626616b2d02f3cfa2c5d0c79e0456b", + "45954d3c4a372a3fe4ca89ba476f7c0573d5bf42", "support" ], "dom/interfaces.html": [ @@ -300312,7 +300552,7 @@ "testharness" ], "encrypted-media/idlharness.https.html": [ - "69456d56a5485b04465f4f6ee4abc80388703fd9", + "eece848c772a39b29d6d8ece532e7807d737f50d", "testharness" ], "encrypted-media/polyfill/cast-polyfill.js": [ @@ -301780,7 +302020,7 @@ "support" ], "fetch/api/request/request-idl.html": [ - "b2f1431738bd7f389ab43cf8c10aed3b0d12abb8", + "679ff0c44a0ece1c480f5296e738b7a15f4c79cb", "testharness" ], "fetch/api/request/request-init-001.sub-expected.txt": [ @@ -301976,7 +302216,7 @@ "support" ], "fetch/api/response/response-idl.html": [ - "e0e32634b7e0271ff3566cb66b358e46c9fb8d21", + "d94cfadf60dc146f80f7c1dc9937d7841600f9ef", "testharness" ], "fetch/api/response/response-init-001.html": [ @@ -302400,7 +302640,7 @@ "support" ], "fullscreen/interfaces-expected.txt": [ - "c00dd816ba626616b2d02f3cfa2c5d0c79e0456b", + "0f3c64689d0335035540da90f1cbfafb4bfc996a", "support" ], "fullscreen/interfaces.html": [ @@ -302483,10 +302723,6 @@ "2209b4cc293aefecded2d325b664d494820d38af", "support" ], - "generic-sensor/idlharness.https-expected.txt": [ - "65aa9577c7e504c6b21321c93e9aab90bfcd4d66", - "support" - ], "generic-sensor/idlharness.https.html": [ "22f96f98d5349b430f9b6fe9fcb3213c73376fd7", "testharness" @@ -302711,10 +302947,6 @@ "4f1c57a6bfbceaea2e725ce40ab449b5a687d611", "support" ], - "gyroscope/idlharness.https-expected.txt": [ - "08c4eb140944f6a61544b5269d539a61e782ab2e", - "support" - ], "gyroscope/idlharness.https.html": [ "c7080ff63868e28bebd6fe982e13e88d756977ae", "testharness" @@ -307300,7 +307532,7 @@ "support" ], "html/dom/interfaces-expected.txt": [ - "c00dd816ba626616b2d02f3cfa2c5d0c79e0456b", + "1f66724f72c4e52ca66a9b828f07cb4e698394ef", "support" ], "html/dom/interfaces.html": [ @@ -307308,7 +307540,7 @@ "testharness" ], "html/dom/interfaces.worker-expected.txt": [ - "c00dd816ba626616b2d02f3cfa2c5d0c79e0456b", + "4610698c744b6dcb05c79b7d5b943af78b19a703", "support" ], "html/dom/interfaces.worker.js": [ @@ -313927,6 +314159,18 @@ "6954c71972bfbdab36c94c44190cc2259971adb0", "support" ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/cue-recovery-cuetext.vtt": [ + "befc0d2b1bfb79cd79c2b09af9d35f1db02e59ff", + "support" + ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/cue-recovery-header.vtt": [ + "8ba9c1290b73e11a46b983c10848d14c82a70062", + "support" + ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/cue-recovery-note.vtt": [ + "842da18a789e67bd1dd78c3389581552e0e23c68", + "support" + ], "html/semantics/embedded-content/media-elements/track/track-element/resources/cue-size-align-bad.vtt": [ "a1bf60ed37f7bce2e3a5bec919664633780e60ed", "support" @@ -313955,6 +314199,14 @@ "db041f1a659ab39530144bb68e0ab76d14ca9b90", "support" ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/degenerate-cues.vtt": [ + "01c28a312767c6ca41751a58b227dc80bbff54dc", + "support" + ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/empty-cue.vtt": [ + "65fdbcdc5a88cc9208cfd5b0bf2e1396b23432a7", + "support" + ], "html/semantics/embedded-content/media-elements/track/track-element/resources/entities-wrong.vtt": [ "9941f3c18ac34d852ab7f882c06d10a874453c14", "support" @@ -313963,6 +314215,10 @@ "5913b038e7d6341b19c21d0bb81008057656d929", "support" ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/interspersed-non-cue.vtt": [ + "bfe46bfea8af95d5dc54324ac9e202eb9e5e0b2b", + "support" + ], "html/semantics/embedded-content/media-elements/track/track-element/resources/iso2022jp3.vtt": [ "e929f8e1755f72ecae96dd40430bc07c5a4a433c", "support" @@ -314043,6 +314299,10 @@ "09948fb59cd9e1702ba869f0b444ca36d1ec0bf2", "support" ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/timings-whitespace.vtt": [ + "2d9b2479193680a334da8001254f17105b7a13aa", + "support" + ], "html/semantics/embedded-content/media-elements/track/track-element/resources/track.de.vtt": [ "f83f36449d6a7e9db28bba9e39dc7a4bf7458927", "support" @@ -314059,6 +314319,10 @@ "329c3f585e5e89dfc1f44fde85a1d9601e61aef2", "support" ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/unsupported-markup.vtt": [ + "e6f5fddd1ff13f6e9f81931af691a0ad1c9a55a9", + "support" + ], "html/semantics/embedded-content/media-elements/track/track-element/resources/utf8.vtt": [ "b15aef44ae1726c362448bc561899c7dc554a767", "support" @@ -314075,6 +314339,14 @@ "357f4306f5b5c83b712d0a0bbb098827c3802196", "support" ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/voice-bad.vtt": [ + "f80e328090068ef96781468e107de3afe947d840", + "support" + ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/voice.vtt": [ + "61997c207efb09802c9022fcea544f4196094df6", + "support" + ], "html/semantics/embedded-content/media-elements/track/track-element/resources/webvtt-file.vtt": [ "943c4ca7d7ba197815ad5732222558e30195b022", "support" @@ -314151,6 +314423,10 @@ "f12b9b7384f445b817f1d049d7bff05ec0f2d3d9", "testharness" ], + "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-cue-recovery.html": [ + "ba273b161cbdd6cfeec6be75f08bb510a13bf9e1", + "testharness" + ], "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-cue-size-align.html": [ "519039bd4e00da6802f03f9a9695b96019ef6df0", "testharness" @@ -314159,6 +314435,14 @@ "5f91fd3c078343aee9ee72c1b60bf8a8f82682e2", "testharness" ], + "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-degenerate-cues.html": [ + "bcc7f1b103a7d0896ba19a84de6b41f4758a8837", + "testharness" + ], + "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-empty-cue.html": [ + "d8b948ecac4da42f43896cda9902718130a5a0e6", + "testharness" + ], "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-entities.html": [ "b995f43c4dfef791a95bc0dfcd30721e955fce85", "testharness" @@ -314167,6 +314451,10 @@ "3e83c514cb2d18b2238f03e3d85a21f69a60d5c0", "testharness" ], + "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-interspersed-non-cue.html": [ + "ee7e65642ed06f89c2413278fad652dcfb78d740", + "testharness" + ], "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-line-position.html": [ "410feb59cf264571fb347bbfcb1f14150bbaea8f", "testharness" @@ -314207,6 +314495,14 @@ "ebae3e9d5dc11b91b53439ee4871df86c3a80822", "testharness" ], + "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-timings-whitespace.html": [ + "c42b3e45318e167bf00edf77528d56e2d107d5e8", + "testharness" + ], + "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-unsupported-markup.html": [ + "c43ab0c10e1de3af01f6137c044c73cfcbc6d339", + "testharness" + ], "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-utf8.html": [ "65241920becf512c35f78b335de90c00af03195d", "testharness" @@ -314215,6 +314511,10 @@ "4f6e049d97dc81065df13e66e40cf945ff0914dd", "testharness" ], + "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-voice.html": [ + "c016678eb1f14aad834d4e6e3bbca1818760284a", + "testharness" + ], "html/semantics/embedded-content/media-elements/user-interface/muted.html": [ "74deefbbc4b8f96ff4856db1c32c6428183cc040", "testharness" @@ -318323,22 +318623,90 @@ "997859fce8ed8854053d089a78ab999b3f88a072", "testharness" ], - "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-classic.html": [ - "c5e3bf053403a49ee72c7464b1c1d0758f0fc8be", + "html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/Function.js": [ + "be1ecd94299f35bb000eb5e9df53e9c057231982", + "support" + ], + "html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/eval.js": [ + "686728d887fbb65f9b5c7498edf1a1dfc6611ebd", + "support" + ], + "html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/inline-event-handlers-UA-code.js": [ + "b2f41c32fc88183500ab3069a51894d62873dd7b", + "support" + ], + "html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/reflected-inline-event-handlers.js": [ + "15125c9e98e59d191acee4dcadece1b2986d7ec1", + "support" + ], + "html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/setTimeout.js": [ + "03ee5763c6e62da7d49e058edb58292f4f496a3f", + "support" + ], + "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-classic-expected.txt": [ + "f15dee3678e629a3fa9c39be6719dc6a64121bd1", + "support" + ], + "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-classic.html": [ + "70f97beb38cf958bd2234e3b580712c8436b8095", "testharness" ], - "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-module.html": [ - "a33d3b405b1a826f51dadb18431c855b13aee612", + "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-module-expected.txt": [ + "f15dee3678e629a3fa9c39be6719dc6a64121bd1", + "support" + ], + "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-module.html": [ + "7386a90307c33bdaad34002c865b4ad8793c10a2", + "testharness" + ], + "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-inline-classic-expected.txt": [ + "ef0e42ddf8c98920970e15c05a979ecd0444b2d9", + "support" + ], + "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-inline-classic.html": [ + "928c333bf9c50213175095ceb06f1afdd690bd8a", + "testharness" + ], + "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-inline-module-expected.txt": [ + "ca207a7146b326f11712a5462ee1022748194058", + "support" + ], + "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-inline-module.html": [ + "1daf837d2d9ee258dfc5c9648b1a0f5b0b6e93e4", "testharness" ], "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-classic.html": [ "e22e6f200162000f043d114c89def6667097d13d", "testharness" ], + "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-integrity-classic.html": [ + "0295db34d953b716151726188ac467a948f0d955", + "testharness" + ], + "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-integrity-module.html": [ + "cfc2375f7a8abe67eae4213b2f0c5224ba25337d", + "testharness" + ], "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-module.html": [ "b332499d43e0768b5ddf1d5dbb5cd8ca702c3c64", "testharness" ], + "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic-expected.txt": [ + "6399a325fd1570f28c6c365d8dd02345e3963bba", + "support" + ], + "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic.html": [ + "20a6c6de42fe72fe375ccd8c9c8763191afa78f9", + "testharness" + ], + "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module-expected.txt": [ + "6399a325fd1570f28c6c365d8dd02345e3963bba", + "support" + ], + "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module.html": [ + "93f2cc8f3e88e0cbf508acd64f9a28bdcaff25b0", + "testharness" + ], "html/semantics/scripting-1/the-script-element/module/error-and-slow-dependency.html": [ "32455a1418d94fa68368bae3b1c0291204f6b4e3", "testharness" @@ -319895,6 +320263,14 @@ "da39a3ee5e6b4b0d3255bfef95601890afd80709", "support" ], + "html/semantics/text-level-semantics/the-ruby-element/ruby-usage-notref.html": [ + "2db31a9c9bb7a301dbb579332a7870315e4521f8", + "support" + ], + "html/semantics/text-level-semantics/the-ruby-element/ruby-usage.html": [ + "c20a6cff72623ce86f1139dff58faa88f42673f4", + "reftest" + ], "html/semantics/text-level-semantics/the-s-element/.gitkeep": [ "da39a3ee5e6b4b0d3255bfef95601890afd80709", "support" @@ -320732,7 +321108,7 @@ "testharness" ], "html/webappapis/animation-frames/idlharness.html": [ - "03aebad24e8289a02f8336931825dc34039e83cc", + "8210ec5e16b79035472198220d39596404dab310", "testharness" ], "html/webappapis/animation-frames/same-dispatch-time.html": [ @@ -321604,7 +321980,7 @@ "support" ], "infrastructure/OWNERS": [ - "8eaa91e24975c11fcab9dee15d10d0c9c391c889", + "d8b686f268bd0e90125568deefba63e4fecbf322", "support" ], "infrastructure/README.md": [ @@ -321800,7 +322176,7 @@ "support" ], "interfaces/html.idl": [ - "73fb0f91c2af1e5d5f1a1605acc0e633011b252d", + "87b930d786c7ceb7f10c7975971bdf36a3388095", "support" ], "interfaces/magnetometer.idl": [ @@ -322144,7 +322520,7 @@ "support" ], "magnetometer/idlharness.https-expected.txt": [ - "9e98f55cd270e77673dc9cf48e9ace030572508a", + "fde163c52e1b18818542855c01231c44daf5d001", "support" ], "magnetometer/idlharness.https.html": [ @@ -322168,7 +322544,7 @@ "support" ], "media-capabilities/idlharness.html": [ - "0c34bb1872cc16b21c8c1f33d6dfd796f59500c8", + "396430dee8bc806e95a218e03f767b34efe8fe83", "testharness" ], "media-source/OWNERS": [ @@ -322964,7 +323340,7 @@ "testharness" ], "mediacapture-streams/MediaStreamTrack-idl.https-expected.txt": [ - "c00dd816ba626616b2d02f3cfa2c5d0c79e0456b", + "031371338a5803d1e66f57d33d1ef60653e3f2c3", "support" ], "mediacapture-streams/MediaStreamTrack-idl.https.html": [ @@ -323000,11 +323376,11 @@ "support" ], "mediasession/idlharness-expected.txt": [ - "a50799514e35d344089c5533637d2cad282d812f", + "2368ccca24b197f2d4cabddc50edd64cb3cc219a", "support" ], "mediasession/idlharness.html": [ - "9aa84a0143daf03d9a95108d0407fda2443c9849", + "8db3276ecfd3f02e55b89171f61e45e6af540614", "testharness" ], "mediasession/mediametadata.html": [ @@ -330971,10 +331347,6 @@ "e6e93a77c618e8477d79f6cf1ff05d0f5865821c", "support" ], - "orientation-sensor/idlharness.https-expected.txt": [ - "5b182761d7779f5c4ad3709a196c8268f101c303", - "support" - ], "orientation-sensor/idlharness.https.html": [ "30f9a5f56c1eb360be09b2a7f2fd1d5148469e12", "testharness" @@ -331268,7 +331640,7 @@ "testharness" ], "payment-request/interfaces.https-expected.txt": [ - "002d6e8592cfeca2b4f6a301f13215363fedb848", + "97dfd3932af16c46273033c5547696e2f3435877", "support" ], "payment-request/interfaces.https.html": [ @@ -331496,7 +331868,7 @@ "manual" ], "pointerevents/extension/idlharness.html": [ - "64ed6d6c201773f0b5ab4b81369a2d601fe3363a", + "83ee5397ece0126d71c235cecb554b024e3515d1", "testharness" ], "pointerevents/extension/pointerevent_coalesced_events_attributes-manual-expected.txt": [ @@ -331516,7 +331888,7 @@ "manual" ], "pointerevents/idlharness.html": [ - "6ca74eb661910c27ed6cb8bbbb819b749007a75f", + "7db1757e519a8ebb9123dd150f17bf5c6f23e311", "testharness" ], "pointerevents/pointerevent_attributes_hoverable_pointers-manual.html": [ @@ -339872,7 +340244,7 @@ "testharness" ], "requestidlecallback/idlharness.html": [ - "970dac3de43bddedb88e22c438fc01f76a6b9a41", + "99fabb2abdc8aef189bd8c972a7501223517f932", "testharness" ], "requestidlecallback/resources/post_name_on_load.html": [ @@ -340400,7 +340772,7 @@ "testharness" ], "selection/interfaces-expected.txt": [ - "c00dd816ba626616b2d02f3cfa2c5d0c79e0456b", + "4610698c744b6dcb05c79b7d5b943af78b19a703", "support" ], "selection/interfaces.html": [ @@ -343215,18 +343587,10 @@ "6018a8d5ecb29b6c011b20a3afb38669e41f9323", "testharness" ], - "storage/interfaces.https-expected.txt": [ - "5f98fbf9aa1ea45f22e017d76710645b8a57745b", - "support" - ], "storage/interfaces.https.html": [ "76fa61c3a87485266a7f9d6f66e5d08bb7881ff7", "testharness" ], - "storage/interfaces.https.worker-expected.txt": [ - "5f98fbf9aa1ea45f22e017d76710645b8a57745b", - "support" - ], "storage/interfaces.https.worker.js": [ "da11cf56486fe08214f91d181b3a19775f6aa59c", "testharness" @@ -344735,6 +345099,14 @@ "16a7ef4c64dab3706120a2221dd6bec5ca8e9062", "testharness" ], + "svg/foreignobject/position-svg-root-in-foreign-object-ref.html": [ + "1dc201dc096298f81fd21646fd3bc018c127d0c1", + "support" + ], + "svg/foreignobject/position-svg-root-in-foreign-object.html": [ + "c14ce9ff2df60975888de9c5cc31755325701d71", + "reftest" + ], "svg/historical.html": [ "f18f89f68fdf1266768700235f08e7181ce0e0e1", "testharness" @@ -344744,7 +345116,7 @@ "support" ], "svg/interfaces.html": [ - "3f659056fc469cb96bccd516a596fb183f005e9f", + "6045de5e5dc7810f89ca2c9a526f9e4380ae365c", "testharness" ], "svg/linking/reftests/href-a-element-attr-change.html": [ @@ -344823,6 +345195,30 @@ "fb8aec792684b97151d2964b85d1e70829e141ad", "support" ], + "svg/path/bearing/absolute-ref.svg": [ + "6ad5320a05fcc31fd2af98d2bbd0bd6fbc558daa", + "support" + ], + "svg/path/bearing/absolute.svg": [ + "e1c8d4bca5ab9519936a96521006baa176296c27", + "reftest" + ], + "svg/path/bearing/relative-ref.svg": [ + "6ad5320a05fcc31fd2af98d2bbd0bd6fbc558daa", + "support" + ], + "svg/path/bearing/relative.svg": [ + "75322c3ce1cc60339014301518a966e2e9f35360", + "reftest" + ], + "svg/path/bearing/zero-ref.svg": [ + "8a192b68d131f467d291b277c55c205972db1738", + "support" + ], + "svg/path/bearing/zero.svg": [ + "e7e8508ebb527e97e1f4e289652121b1d070c219", + "reftest" + ], "svg/path/property/d-interpolation-discrete.svg": [ "6e27bfe4467b16b9e8c29bb66894bbb9dfbaf077", "testharness" @@ -345135,10 +345531,6 @@ "551486b9882d33a0ce31740809eaec0352403d69", "manual" ], - "uievents/interfaces-expected.txt": [ - "c00dd816ba626616b2d02f3cfa2c5d0c79e0456b", - "support" - ], "uievents/interfaces.html": [ "e755618e522288e9bf6dc4fc592fd6658dc97aba", "testharness" @@ -347703,6 +348095,14 @@ "7ae04088ab239964b6f934b747af3645f5d89d81", "support" ], + "webrtc/RTCPeerConnection-createOffer-offerToReceive-expected.txt": [ + "def6ac654a2620c82ba9565f81c978058ecf9eb7", + "support" + ], + "webrtc/RTCPeerConnection-createOffer-offerToReceive.html": [ + "ae14ed4e3ffc7ef17de61e3e1a0b594cafdfa50a", + "testharness" + ], "webrtc/RTCPeerConnection-createOffer.html": [ "5b3d38072afd9bbb3e95925c3959ff3f4268a347", "testharness" @@ -349236,7 +349636,7 @@ "support" ], "webstorage/idlharness.html": [ - "9eec3559fc7cfba33bbeb280c392ee0af9d6755b", + "e57413a1868e8d84ba7c500ff13b7e68675cbe66", "testharness" ], "webstorage/missing_arguments.html": [ @@ -349496,7 +349896,7 @@ "support" ], "webvr/idlharness.html": [ - "ef6ad8bff43a6423b9b3e7deb8017a8b3fa0c112", + "3505e27e1b2668010bf61f05f6b8a759cf42cece", "testharness" ], "webvr/webvr-disabled-by-feature-policy.https.sub.html": [
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/imagebitmap/createImageBitmap-invalid-args.html b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/imagebitmap/createImageBitmap-invalid-args.html index a0bcf48..ad8618a 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/imagebitmap/createImageBitmap-invalid-args.html +++ b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/imagebitmap/createImageBitmap-invalid-args.html
@@ -1,10 +1,6 @@ -<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> -<html> -<head> +<!doctype html> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -</head> -<body> <script> function makeCanvas() { @@ -86,6 +82,22 @@ }); } +function makeBrokenImage() { + return new Promise(resolve => { + const image = new Image(); + image.src = "data,x"; + image.onerror = () => resolve(image); + }); +} + +function makeAvailableButBrokenImage() { + return new Promise(resolve => { + const image = new Image(); + image.src = "/images/broken.png"; + image.onload = () => resolve(image); + }); +} + imageSourceTypes = [ { name: 'HTMLImageElement', factory: makeImage }, { name: 'HTMLVideoElement', factory: makeVideo }, @@ -152,36 +164,48 @@ }, "createImageBitmap with null image source rejects with a TypeError."); promise_test( t => { - return promise_rejects(t, new DOMException('', 'InvalidStateError'), + return promise_rejects(t, "InvalidStateError", createImageBitmap(new Image())); }, "createImageBitmap with empty image source rejects with a InvalidStateError."); promise_test( t => { - return promise_rejects(t, new DOMException('', 'InvalidStateError'), + return promise_rejects(t, "InvalidStateError", createImageBitmap(document.createElement('video'))); }, "createImageBitmap with empty video source rejects with a InvalidStateError."); promise_test( t => { return makeOversizedCanvas().then(canvas => { - return promise_rejects(t, new DOMException('', 'InvalidStateError'), + return promise_rejects(t, "InvalidStateError", createImageBitmap(canvas)); }); }, "createImageBitmap with an oversized canvas source rejects with a RangeError."); promise_test( t => { return makeOversizedOffscreenCanvas().then(offscreenCanvas => { - return promise_rejects(t, new DOMException('', 'InvalidStateError'), + return promise_rejects(t, "InvalidStateError", createImageBitmap(offscreenCanvas)); }); }, "createImageBitmap with an invalid OffscreenCanvas source rejects with a RangeError."); promise_test( t => { return makeInvalidBlob().then(blob => { - return promise_rejects(t, new DOMException('', 'InvalidStateError'), + return promise_rejects(t, "InvalidStateError", createImageBitmap(blob)); }); }, "createImageBitmap with an undecodable blob source rejects with an InvalidStateError."); +promise_test( t => { + return makeBrokenImage().then(image => { + return promise_rejects(t, "InvalidStateError", + createImageBitmap(image)); + }); +}, "createImageBitmap with a broken image source rejects with an InvalidStateError."); + +promise_test( t => { + return makeAvailableButBrokenImage().then(image => { + return promise_rejects(t, "InvalidStateError", + createImageBitmap(image)); + }); +}, "createImageBitmap with an available but undecodable image source rejects with an InvalidStateError."); + </script> -</body> -</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/FileAPI/idlharness.html b/third_party/WebKit/LayoutTests/external/wpt/FileAPI/idlharness.html index b88a752..7b706ad 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/FileAPI/idlharness.html +++ b/third_party/WebKit/LayoutTests/external/wpt/FileAPI/idlharness.html
@@ -30,8 +30,6 @@ request.onload = function() { var idls = request.responseText; - idl_array.add_untested_idls("[PrimaryGlobal] interface Window { };"); - idl_array.add_untested_idls("[Exposed=(Window,Worker)] interface ArrayBuffer {};"); idl_array.add_untested_idls("interface URL {};"); idl_array.add_untested_idls("[Exposed=(Window,Worker)] interface EventTarget {};");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/IndexedDB/interfaces.html b/third_party/WebKit/LayoutTests/external/wpt/IndexedDB/interfaces.html index 6fb37f8..30372b6 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/IndexedDB/interfaces.html +++ b/third_party/WebKit/LayoutTests/external/wpt/IndexedDB/interfaces.html
@@ -20,7 +20,7 @@ var idls = request.responseText; // https://html.spec.whatwg.org/multipage/browsers.html#window - idlArray.add_untested_idls("[PrimaryGlobal] interface Window { };"); + idlArray.add_untested_idls("[Global=Window, Exposed=Window] interface Window { };"); // https://html.spec.whatwg.org/multipage/webappapis.html#windoworworkerglobalscope-mixin idlArray.add_untested_idls(`[NoInterfaceObject, Exposed=(Window,Worker)]
diff --git a/third_party/WebKit/LayoutTests/external/wpt/WebCryptoAPI/idlharness.html b/third_party/WebKit/LayoutTests/external/wpt/WebCryptoAPI/idlharness.html index 81e1e04f..53faef26 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/WebCryptoAPI/idlharness.html +++ b/third_party/WebKit/LayoutTests/external/wpt/WebCryptoAPI/idlharness.html
@@ -29,11 +29,6 @@ request.onload = function() { var idls = request.responseText; - idl_array.add_untested_idls("[PrimaryGlobal] interface Window { };"); - - idl_array.add_untested_idls("interface ArrayBuffer {};"); - idl_array.add_untested_idls("interface ArrayBufferView {};"); - idl_array.add_idls(idls); idl_array.add_objects({"Crypto":["crypto"], "SubtleCrypto":["crypto.subtle"]});
diff --git a/third_party/WebKit/LayoutTests/external/wpt/WebCryptoAPI/idlharness.https.html b/third_party/WebKit/LayoutTests/external/wpt/WebCryptoAPI/idlharness.https.html index 81e1e04f..53faef26 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/WebCryptoAPI/idlharness.https.html +++ b/third_party/WebKit/LayoutTests/external/wpt/WebCryptoAPI/idlharness.https.html
@@ -29,11 +29,6 @@ request.onload = function() { var idls = request.responseText; - idl_array.add_untested_idls("[PrimaryGlobal] interface Window { };"); - - idl_array.add_untested_idls("interface ArrayBuffer {};"); - idl_array.add_untested_idls("interface ArrayBufferView {};"); - idl_array.add_idls(idls); idl_array.add_objects({"Crypto":["crypto"], "SubtleCrypto":["crypto.subtle"]});
diff --git a/third_party/WebKit/LayoutTests/external/wpt/XMLHttpRequest/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/XMLHttpRequest/interfaces-expected.txt deleted file mode 100644 index 1fd50f1..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/XMLHttpRequest/interfaces-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL Test driver promise_test: Unhandled rejection with value: "NonElementParentNode: interface mixin not yet supported" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/accelerometer/idlharness.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/accelerometer/idlharness.https-expected.txt index 41d71e9..dba6f07 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/accelerometer/idlharness.https-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/accelerometer/idlharness.https-expected.txt
@@ -1,4 +1,74 @@ This is a testharness.js-based test. -FAIL Test IDL implementation of Accelerometer Sensor promise_test: Unhandled rejection with value: "NonElementParentNode: interface mixin not yet supported" +PASS Test IDL implementation of Accelerometer Sensor +PASS Sensor interface: existence and properties of interface object +PASS Sensor interface object length +PASS Sensor interface object name +PASS Sensor interface: existence and properties of interface prototype object +PASS Sensor interface: existence and properties of interface prototype object's "constructor" property +PASS Sensor interface: attribute activated +PASS Sensor interface: attribute hasReading +PASS Sensor interface: attribute timestamp +PASS Sensor interface: operation start() +PASS Sensor interface: operation stop() +PASS Sensor interface: attribute onreading +PASS Sensor interface: attribute onactivate +PASS Sensor interface: attribute onerror +PASS Accelerometer interface: existence and properties of interface object +PASS Accelerometer interface object length +PASS Accelerometer interface object name +PASS Accelerometer interface: existence and properties of interface prototype object +PASS Accelerometer interface: existence and properties of interface prototype object's "constructor" property +PASS Accelerometer interface: attribute x +PASS Accelerometer interface: attribute y +PASS Accelerometer interface: attribute z +PASS Accelerometer must be primary interface of new Accelerometer(); +PASS Stringification of new Accelerometer(); +PASS Accelerometer interface: new Accelerometer(); must inherit property "x" with the proper type +PASS Accelerometer interface: new Accelerometer(); must inherit property "y" with the proper type +PASS Accelerometer interface: new Accelerometer(); must inherit property "z" with the proper type +PASS Sensor interface: new Accelerometer(); must inherit property "activated" with the proper type +PASS Sensor interface: new Accelerometer(); must inherit property "hasReading" with the proper type +PASS Sensor interface: new Accelerometer(); must inherit property "timestamp" with the proper type +PASS Sensor interface: new Accelerometer(); must inherit property "start()" with the proper type +PASS Sensor interface: new Accelerometer(); must inherit property "stop()" with the proper type +PASS Sensor interface: new Accelerometer(); must inherit property "onreading" with the proper type +PASS Sensor interface: new Accelerometer(); must inherit property "onactivate" with the proper type +PASS Sensor interface: new Accelerometer(); must inherit property "onerror" with the proper type +PASS LinearAccelerationSensor interface: existence and properties of interface object +PASS LinearAccelerationSensor interface object length +PASS LinearAccelerationSensor interface object name +PASS LinearAccelerationSensor interface: existence and properties of interface prototype object +PASS LinearAccelerationSensor interface: existence and properties of interface prototype object's "constructor" property +PASS LinearAccelerationSensor must be primary interface of new LinearAccelerationSensor(); +PASS Stringification of new LinearAccelerationSensor(); +PASS Accelerometer interface: new LinearAccelerationSensor(); must inherit property "x" with the proper type +PASS Accelerometer interface: new LinearAccelerationSensor(); must inherit property "y" with the proper type +PASS Accelerometer interface: new LinearAccelerationSensor(); must inherit property "z" with the proper type +PASS Sensor interface: new LinearAccelerationSensor(); must inherit property "activated" with the proper type +PASS Sensor interface: new LinearAccelerationSensor(); must inherit property "hasReading" with the proper type +PASS Sensor interface: new LinearAccelerationSensor(); must inherit property "timestamp" with the proper type +PASS Sensor interface: new LinearAccelerationSensor(); must inherit property "start()" with the proper type +PASS Sensor interface: new LinearAccelerationSensor(); must inherit property "stop()" with the proper type +PASS Sensor interface: new LinearAccelerationSensor(); must inherit property "onreading" with the proper type +PASS Sensor interface: new LinearAccelerationSensor(); must inherit property "onactivate" with the proper type +PASS Sensor interface: new LinearAccelerationSensor(); must inherit property "onerror" with the proper type +FAIL GravitySensor interface: existence and properties of interface object assert_own_property: self does not have own property "GravitySensor" expected property "GravitySensor" missing +FAIL GravitySensor interface object length assert_own_property: self does not have own property "GravitySensor" expected property "GravitySensor" missing +FAIL GravitySensor interface object name assert_own_property: self does not have own property "GravitySensor" expected property "GravitySensor" missing +FAIL GravitySensor interface: existence and properties of interface prototype object assert_own_property: self does not have own property "GravitySensor" expected property "GravitySensor" missing +FAIL GravitySensor interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "GravitySensor" expected property "GravitySensor" missing +FAIL GravitySensor must be primary interface of new GravitySensor(); assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GravitySensor is not defined" +FAIL Stringification of new GravitySensor(); assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GravitySensor is not defined" +FAIL Accelerometer interface: new GravitySensor(); must inherit property "x" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GravitySensor is not defined" +FAIL Accelerometer interface: new GravitySensor(); must inherit property "y" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GravitySensor is not defined" +FAIL Accelerometer interface: new GravitySensor(); must inherit property "z" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GravitySensor is not defined" +FAIL Sensor interface: new GravitySensor(); must inherit property "activated" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GravitySensor is not defined" +FAIL Sensor interface: new GravitySensor(); must inherit property "hasReading" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GravitySensor is not defined" +FAIL Sensor interface: new GravitySensor(); must inherit property "timestamp" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GravitySensor is not defined" +FAIL Sensor interface: new GravitySensor(); must inherit property "start()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GravitySensor is not defined" +FAIL Sensor interface: new GravitySensor(); must inherit property "stop()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GravitySensor is not defined" +FAIL Sensor interface: new GravitySensor(); must inherit property "onreading" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GravitySensor is not defined" +FAIL Sensor interface: new GravitySensor(); must inherit property "onactivate" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GravitySensor is not defined" +FAIL Sensor interface: new GravitySensor(); must inherit property "onerror" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GravitySensor is not defined" Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_delete_arguments.tentative.html b/third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_delete_arguments.tentative.window.js similarity index 89% rename from third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_delete_arguments.tentative.html rename to third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_delete_arguments.tentative.window.js index 962f13a1..8f3f6f56 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_delete_arguments.tentative.html +++ b/third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_delete_arguments.tentative.window.js
@@ -1,11 +1,3 @@ -<!doctype html> -<meta charset="utf-8"> -<title>Async Cookies: cookieStore.delete() arguments and options</title> -<link rel="help" href="https://github.com/WICG/cookie-store"> -<link rel="author" href="pwnall@chromium.org" title="Victor Costan"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script> 'use strict'; // Workaround because add_cleanup doesn't support async functions yet. @@ -76,7 +68,7 @@ }, 'cookieStore.delete with expires in options'); promise_test(async testCase => { - const currentUrl = new URL(window.location.href); + const currentUrl = new URL(self.location.href); const currentDomain = currentUrl.hostname; await cookieStore.set( 'cookie-name', 'cookie-value', { domain: currentDomain }); @@ -91,7 +83,7 @@ }, 'cookieStore.delete with domain set to the current hostname'); promise_test(async testCase => { - const currentUrl = new URL(window.location.href); + const currentUrl = new URL(self.location.href); const currentDomain = currentUrl.hostname; const subDomain = `sub.${currentDomain}`; await cookieStore.set( @@ -108,7 +100,7 @@ }, 'cookieStore.delete with domain set to a subdomain of the current hostname'); promise_test(async testCase => { - const currentUrl = new URL(window.location.href); + const currentUrl = new URL(self.location.href); const currentDomain = currentUrl.hostname; await cookieStore.set( 'cookie-name', 'cookie-value', { domain: currentDomain }); @@ -124,7 +116,7 @@ 'hostname'); promise_test(async testCase => { - const currentUrl = new URL(window.location.href); + const currentUrl = new URL(self.location.href); const currentDomain = currentUrl.hostname; const subDomain = `sub.${currentDomain}`; await cookieStore.set( @@ -143,7 +135,7 @@ promise_test(async testCase => { - const currentUrl = new URL(window.location.href); + const currentUrl = new URL(self.location.href); const currentPath = currentUrl.pathname; const currentDirectory = currentPath.substr(0, currentPath.lastIndexOf('/') + 1); @@ -160,7 +152,7 @@ }, 'cookieStore.delete with path set to the current directory'); promise_test(async testCase => { - const currentUrl = new URL(window.location.href); + const currentUrl = new URL(self.location.href); const currentPath = currentUrl.pathname; const currentDirectory = currentPath.substr(0, currentPath.lastIndexOf('/') + 1); @@ -177,5 +169,3 @@ await cookieStore.delete('cookie-name', { path: currentDirectory }) }); }, 'cookieStore.delete with path set to subdirectory of the current directory'); - -</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_getAll_arguments.tentative.html b/third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_getAll_arguments.tentative.window.js similarity index 92% rename from third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_getAll_arguments.tentative.html rename to third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_getAll_arguments.tentative.window.js index 3066a99b..650d6eb 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_getAll_arguments.tentative.html +++ b/third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_getAll_arguments.tentative.window.js
@@ -1,11 +1,3 @@ -<!doctype html> -<meta charset="utf-8"> -<title>Async Cookies: cookieStore.getAll() arguments and options</title> -<link rel="help" href="https://github.com/WICG/cookie-store"> -<link rel="author" href="pwnall@chromium.org" title="Victor Costan"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script> 'use strict'; // Workaround because add_cleanup doesn't support async functions yet. @@ -125,5 +117,3 @@ await async_cleanup(() => cookieStore.delete('cookie-name')); await async_cleanup(() => cookieStore.delete('cookie-name-2')); }, 'cookieStore.getAll with matchType set to startsWith and name in options'); - -</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/cookie-store/document_getAll_set.tentative.html b/third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_getAll_set_basic.tentative.window.js similarity index 66% rename from third_party/WebKit/LayoutTests/external/wpt/cookie-store/document_getAll_set.tentative.html rename to third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_getAll_set_basic.tentative.window.js index 05a794b..a70c1197 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/cookie-store/document_getAll_set.tentative.html +++ b/third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_getAll_set_basic.tentative.window.js
@@ -1,11 +1,3 @@ -<!doctype html> -<meta charset="utf-8"> -<title>Async Cookies: cookieStore.getAll() sees cookieStore.set() cookie</title> -<link rel="help" href="https://github.com/WICG/cookie-store"> -<link rel="author" href="pwnall@chromium.org" title="Victor Costan"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script> 'use strict'; // Workaround because add_cleanup doesn't support async functions yet. @@ -28,5 +20,3 @@ await async_cleanup(() => cookieStore.delete('cookie-name')); }, 'cookieStore.getAll returns the cookie written by cookieStore.set'); - -</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_get_arguments.tentative.html b/third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_get_arguments.tentative.window.js similarity index 88% rename from third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_get_arguments.tentative.html rename to third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_get_arguments.tentative.window.js index 469cf4b..f50bb51 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_get_arguments.tentative.html +++ b/third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_get_arguments.tentative.window.js
@@ -1,11 +1,3 @@ -<!doctype html> -<meta charset="utf-8"> -<title>Async Cookies: cookieStore.get() arguments and options</title> -<link rel="help" href="https://github.com/WICG/cookie-store"> -<link rel="author" href="pwnall@chromium.org" title="Victor Costan"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script> 'use strict'; // Workaround because add_cleanup doesn't support async functions yet. @@ -92,5 +84,3 @@ async_cleanup(() => cookieStore.delete('cookie-name')); }, 'cookieStore.get with matchType set to startsWith and name in options'); - -</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/cookie-store/document_get_delete.tentative.html b/third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_get_delete_basic.tentative.window.js similarity index 64% rename from third_party/WebKit/LayoutTests/external/wpt/cookie-store/document_get_delete.tentative.html rename to third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_get_delete_basic.tentative.window.js index ebb2c8f..e039d817 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/cookie-store/document_get_delete.tentative.html +++ b/third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_get_delete_basic.tentative.window.js
@@ -1,11 +1,3 @@ -<!doctype html> -<meta charset="utf-8"> -<title>Async Cookies: cookieStore.delete() impacts cookieStore.get()</title> -<link rel="help" href="https://github.com/WICG/cookie-store"> -<link rel="author" href="pwnall@chromium.org" title="Victor Costan"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script> 'use strict'; // Workaround because add_cleanup doesn't support async functions yet. @@ -25,6 +17,4 @@ assert_equals(cookie, null); await async_cleanup(() => cookieStore.delete('cookie-name')); -}, 'cookieStore.get returns null for a cookie deleted by cookieStore.delete'); - -</script> +}, 'cookieStore.get returns null for a cookie deleted by cookieStore.delete'); \ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/cookie-store/get_set.tentative.window.js b/third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_get_set_basic.tentative.window.js similarity index 100% rename from third_party/WebKit/LayoutTests/external/wpt/cookie-store/get_set.tentative.window.js rename to third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_get_set_basic.tentative.window.js
diff --git a/third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_has_arguments.tentative.html b/third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_has_arguments.tentative.window.js similarity index 89% rename from third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_has_arguments.tentative.html rename to third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_has_arguments.tentative.window.js index c5d8d0b4..443341e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_has_arguments.tentative.html +++ b/third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_has_arguments.tentative.window.js
@@ -1,11 +1,3 @@ -<!doctype html> -<meta charset="utf-8"> -<title>Async Cookies: cookieStore.has() arguments and options</title> -<link rel="help" href="https://github.com/WICG/cookie-store"> -<link rel="author" href="pwnall@chromium.org" title="Victor Costan"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script> 'use strict'; // Workaround because add_cleanup doesn't support async functions yet. @@ -98,5 +90,3 @@ await async_cleanup(() => cookieStore.delete('cookie-name')); }, 'cookieStore.has with matchType set to startsWith and name in options'); - -</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/cookie-store/document_has.tentative.html b/third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_has_basic.tentative.window.js similarity index 72% rename from third_party/WebKit/LayoutTests/external/wpt/cookie-store/document_has.tentative.html rename to third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_has_basic.tentative.window.js index 9c2eb5b..0774a71 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/cookie-store/document_has.tentative.html +++ b/third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_has_basic.tentative.window.js
@@ -1,11 +1,3 @@ -<!doctype html> -<meta charset="utf-8"> -<title>Async Cookies: cookieStore.has()</title> -<link rel="help" href="https://github.com/WICG/cookie-store"> -<link rel="author" href="pwnall@chromium.org" title="Victor Costan"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script> 'use strict'; // Workaround because add_cleanup doesn't support async functions yet. @@ -31,5 +23,3 @@ await async_cleanup(() => cookieStore.delete('cookie-name')); }, 'cookieStore.has returns false for cookie deleted by cookieStore.delete()'); - -</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_set_arguments.tentative.html b/third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_set_arguments.tentative.window.js similarity index 92% rename from third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_set_arguments.tentative.html rename to third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_set_arguments.tentative.window.js index 7a16162..c256430 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_set_arguments.tentative.html +++ b/third_party/WebKit/LayoutTests/external/wpt/cookie-store/cookieStore_set_arguments.tentative.window.js
@@ -1,11 +1,3 @@ -<!doctype html> -<meta charset="utf-8"> -<title>Async Cookies: cookieStore.set() arguments and options</title> -<link rel="help" href="https://github.com/WICG/cookie-store"> -<link rel="author" href="pwnall@chromium.org" title="Victor Costan"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script> 'use strict'; // Workaround because add_cleanup doesn't support async functions yet. @@ -118,7 +110,7 @@ }, 'cookieStore.set with name and value in options and expires in the past'); promise_test(async testCase => { - const currentUrl = new URL(window.location.href); + const currentUrl = new URL(self.location.href); const currentDomain = currentUrl.hostname; await cookieStore.delete('cookie-name', { domain: currentDomain }); @@ -134,7 +126,7 @@ }, 'cookieStore.set with domain set to the current hostname'); promise_test(async testCase => { - const currentUrl = new URL(window.location.href); + const currentUrl = new URL(self.location.href); const currentDomain = currentUrl.hostname; const subDomain = `sub.${currentDomain}`; await cookieStore.delete('cookie-name', { domain: currentDomain }); @@ -151,7 +143,7 @@ }, 'cookieStore.set with domain set to a subdomain of the current hostname'); promise_test(async testCase => { - const currentUrl = new URL(window.location.href); + const currentUrl = new URL(self.location.href); const currentDomain = currentUrl.hostname; await cookieStore.delete('cookie-name'); @@ -171,7 +163,7 @@ }, 'cookieStore.set default domain is current hostname'); promise_test(async testCase => { - const currentUrl = new URL(window.location.href); + const currentUrl = new URL(self.location.href); const currentPath = currentUrl.pathname; const currentDirectory = currentPath.substr(0, currentPath.lastIndexOf('/') + 1); @@ -189,7 +181,7 @@ }, 'cookieStore.set with path set to the current directory'); promise_test(async testCase => { - const currentUrl = new URL(window.location.href); + const currentUrl = new URL(self.location.href); const currentPath = currentUrl.pathname; const currentDirectory = currentPath.substr(0, currentPath.lastIndexOf('/') + 1); @@ -221,5 +213,3 @@ await async_cleanup(() => cookieStore.delete('cookie-name')); await async_cleanup(() => cookieStore.delete('cookie-name', { path: '/' })); }, 'cookieStore.set default path is /'); - -</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/cookie-store/serviceworker_cookieStore_arguments.js b/third_party/WebKit/LayoutTests/external/wpt/cookie-store/serviceworker_cookieStore_arguments.js new file mode 100644 index 0000000..0ffe6f8 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/cookie-store/serviceworker_cookieStore_arguments.js
@@ -0,0 +1,14 @@ +self.GLOBAL = { + isWindow: function() { return false; }, + isWorker: function() { return true; }, +}; +importScripts("/resources/testharness.js"); + +importScripts( + "cookieStore_delete_arguments.tentative.window.js", + "cookieStore_get_arguments.tentative.window.js", + "cookieStore_getAll_arguments.tentative.window.js", + "cookieStore_has_arguments.tentative.window.js", + "cookieStore_set_arguments.tentative.window.js"); + +done();
diff --git a/third_party/WebKit/LayoutTests/external/wpt/cookie-store/serviceworker_cookiestore_basic.tentative.https.html b/third_party/WebKit/LayoutTests/external/wpt/cookie-store/serviceworker_cookieStore_arguments.tentative.https.html similarity index 63% copy from third_party/WebKit/LayoutTests/external/wpt/cookie-store/serviceworker_cookiestore_basic.tentative.https.html copy to third_party/WebKit/LayoutTests/external/wpt/cookie-store/serviceworker_cookieStore_arguments.tentative.https.html index 0c3f6819..06c9501 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/cookie-store/serviceworker_cookiestore_basic.tentative.https.html +++ b/third_party/WebKit/LayoutTests/external/wpt/cookie-store/serviceworker_cookieStore_arguments.tentative.https.html
@@ -1,6 +1,8 @@ <!doctype html> <meta charset="utf-8"> -<title>Async Cookies: cookieStore.get() sees cookieStore.set() cookie in ServiceWorker</title> +<title>Async Cookies: cookieStore API argument handling in ServiceWorker</title> +<link rel="help" href="https://github.com/WICG/cookie-store"> +<link rel="author" href="pwnall@chromium.org" title="Victor Costan"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script> @@ -13,7 +15,7 @@ if (registration) await registration.unregister(); registration = await navigator.serviceWorker.register( - 'serviceworker_cookiestore_basic.js', {scope}); + 'serviceworker_cookieStore_arguments.js', {scope}); fetch_tests_from_worker(registration.installing); })();
diff --git a/third_party/WebKit/LayoutTests/external/wpt/cookie-store/serviceworker_cookieStore_basic.js b/third_party/WebKit/LayoutTests/external/wpt/cookie-store/serviceworker_cookieStore_basic.js new file mode 100644 index 0000000..0d8039f --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/cookie-store/serviceworker_cookieStore_basic.js
@@ -0,0 +1,13 @@ +self.GLOBAL = { + isWindow: function() { return false; }, + isWorker: function() { return true; }, +}; +importScripts("/resources/testharness.js"); + +importScripts( + "cookieStore_get_delete_basic.tentative.window.js", + "cookieStore_get_set_basic.tentative.window.js", + "cookieStore_getAll_set_basic.tentative.window.js", + "cookieStore_has_basic.tentative.window.js"); + +done();
diff --git a/third_party/WebKit/LayoutTests/external/wpt/cookie-store/serviceworker_cookiestore_basic.tentative.https.html b/third_party/WebKit/LayoutTests/external/wpt/cookie-store/serviceworker_cookieStore_basic.tentative.https.html similarity index 65% rename from third_party/WebKit/LayoutTests/external/wpt/cookie-store/serviceworker_cookiestore_basic.tentative.https.html rename to third_party/WebKit/LayoutTests/external/wpt/cookie-store/serviceworker_cookieStore_basic.tentative.https.html index 0c3f6819..d4385d64 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/cookie-store/serviceworker_cookiestore_basic.tentative.https.html +++ b/third_party/WebKit/LayoutTests/external/wpt/cookie-store/serviceworker_cookieStore_basic.tentative.https.html
@@ -1,6 +1,8 @@ <!doctype html> <meta charset="utf-8"> -<title>Async Cookies: cookieStore.get() sees cookieStore.set() cookie in ServiceWorker</title> +<title>Async Cookies: cookieStore basic API in ServiceWorker</title> +<link rel="help" href="https://github.com/WICG/cookie-store"> +<link rel="author" href="pwnall@chromium.org" title="Victor Costan"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script> @@ -13,7 +15,7 @@ if (registration) await registration.unregister(); registration = await navigator.serviceWorker.register( - 'serviceworker_cookiestore_basic.js', {scope}); + 'serviceworker_cookieStore_basic.js', {scope}); fetch_tests_from_worker(registration.installing); })();
diff --git a/third_party/WebKit/LayoutTests/external/wpt/cookie-store/serviceworker_cookiestore_basic.js b/third_party/WebKit/LayoutTests/external/wpt/cookie-store/serviceworker_cookiestore_basic.js deleted file mode 100644 index 13b973e1..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/cookie-store/serviceworker_cookiestore_basic.js +++ /dev/null
@@ -1,9 +0,0 @@ -self.GLOBAL = { - isWindow: function() { return false; }, - isWorker: function() { return true; }, -}; -importScripts("/resources/testharness.js"); - -importScripts("get_set.tentative.window.js"); - -done();
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/cssom-view/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/cssom-view/interfaces-expected.txt index 1fd50f1..436bd416 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/cssom-view/interfaces-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/cssom-view/interfaces-expected.txt
@@ -1,4 +1,304 @@ This is a testharness.js-based test. -FAIL Test driver promise_test: Unhandled rejection with value: "NonElementParentNode: interface mixin not yet supported" +Found 300 tests; 226 PASS, 74 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS Test driver +PASS HTMLElement interface: attribute offsetParent +PASS HTMLElement interface: attribute offsetTop +PASS HTMLElement interface: attribute offsetLeft +PASS HTMLElement interface: attribute offsetWidth +PASS HTMLElement interface: attribute offsetHeight +PASS HTMLElement interface: document.createElement('div') must inherit property "offsetParent" with the proper type +PASS HTMLElement interface: document.createElement('div') must inherit property "offsetTop" with the proper type +PASS HTMLElement interface: document.createElement('div') must inherit property "offsetLeft" with the proper type +PASS HTMLElement interface: document.createElement('div') must inherit property "offsetWidth" with the proper type +PASS HTMLElement interface: document.createElement('div') must inherit property "offsetHeight" with the proper type +PASS Element interface: document.createElement('div') must inherit property "getClientRects()" with the proper type +PASS Element interface: document.createElement('div') must inherit property "getBoundingClientRect()" with the proper type +PASS Element interface: document.createElement('div') must inherit property "scrollIntoView([object Object],[object Object])" with the proper type +PASS Element interface: calling scrollIntoView([object Object],[object Object]) on document.createElement('div') with too few arguments must throw TypeError +PASS Element interface: document.createElement('div') must inherit property "scroll(ScrollToOptions)" with the proper type +PASS Element interface: calling scroll(ScrollToOptions) on document.createElement('div') with too few arguments must throw TypeError +PASS Element interface: document.createElement('div') must inherit property "scroll(unrestricted double, unrestricted double)" with the proper type +PASS Element interface: calling scroll(unrestricted double, unrestricted double) on document.createElement('div') with too few arguments must throw TypeError +PASS Element interface: document.createElement('div') must inherit property "scrollTo(ScrollToOptions)" with the proper type +PASS Element interface: calling scrollTo(ScrollToOptions) on document.createElement('div') with too few arguments must throw TypeError +PASS Element interface: document.createElement('div') must inherit property "scrollTo(unrestricted double, unrestricted double)" with the proper type +PASS Element interface: calling scrollTo(unrestricted double, unrestricted double) on document.createElement('div') with too few arguments must throw TypeError +PASS Element interface: document.createElement('div') must inherit property "scrollBy(ScrollToOptions)" with the proper type +PASS Element interface: calling scrollBy(ScrollToOptions) on document.createElement('div') with too few arguments must throw TypeError +PASS Element interface: document.createElement('div') must inherit property "scrollBy(unrestricted double, unrestricted double)" with the proper type +PASS Element interface: calling scrollBy(unrestricted double, unrestricted double) on document.createElement('div') with too few arguments must throw TypeError +PASS Element interface: document.createElement('div') must inherit property "scrollTop" with the proper type +PASS Element interface: document.createElement('div') must inherit property "scrollLeft" with the proper type +PASS Element interface: document.createElement('div') must inherit property "scrollWidth" with the proper type +PASS Element interface: document.createElement('div') must inherit property "scrollHeight" with the proper type +PASS Element interface: document.createElement('div') must inherit property "clientTop" with the proper type +PASS Element interface: document.createElement('div') must inherit property "clientLeft" with the proper type +PASS Element interface: document.createElement('div') must inherit property "clientWidth" with the proper type +PASS Element interface: document.createElement('div') must inherit property "clientHeight" with the proper type +FAIL Element interface: document.createElement('div') must inherit property "getBoxQuads(BoxQuadOptions)" with the proper type assert_inherits: property "getBoxQuads" not found in prototype chain +FAIL Element interface: calling getBoxQuads(BoxQuadOptions) on document.createElement('div') with too few arguments must throw TypeError assert_inherits: property "getBoxQuads" not found in prototype chain +FAIL Element interface: document.createElement('div') must inherit property "convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions)" with the proper type assert_inherits: property "convertQuadFromNode" not found in prototype chain +FAIL Element interface: calling convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions) on document.createElement('div') with too few arguments must throw TypeError assert_inherits: property "convertQuadFromNode" not found in prototype chain +FAIL Element interface: document.createElement('div') must inherit property "convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions)" with the proper type assert_inherits: property "convertRectFromNode" not found in prototype chain +FAIL Element interface: calling convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions) on document.createElement('div') with too few arguments must throw TypeError assert_inherits: property "convertRectFromNode" not found in prototype chain +FAIL Element interface: document.createElement('div') must inherit property "convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions)" with the proper type assert_inherits: property "convertPointFromNode" not found in prototype chain +FAIL Element interface: calling convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions) on document.createElement('div') with too few arguments must throw TypeError assert_inherits: property "convertPointFromNode" not found in prototype chain +PASS HTMLImageElement interface: attribute x +PASS HTMLImageElement interface: attribute y +PASS HTMLImageElement interface: document.createElement('img') must inherit property "x" with the proper type +PASS HTMLImageElement interface: document.createElement('img') must inherit property "y" with the proper type +PASS HTMLElement interface: document.createElement('img') must inherit property "offsetParent" with the proper type +PASS HTMLElement interface: document.createElement('img') must inherit property "offsetTop" with the proper type +PASS HTMLElement interface: document.createElement('img') must inherit property "offsetLeft" with the proper type +PASS HTMLElement interface: document.createElement('img') must inherit property "offsetWidth" with the proper type +PASS HTMLElement interface: document.createElement('img') must inherit property "offsetHeight" with the proper type +PASS Element interface: document.createElement('img') must inherit property "getClientRects()" with the proper type +PASS Element interface: document.createElement('img') must inherit property "getBoundingClientRect()" with the proper type +PASS Element interface: document.createElement('img') must inherit property "scrollIntoView([object Object],[object Object])" with the proper type +PASS Element interface: calling scrollIntoView([object Object],[object Object]) on document.createElement('img') with too few arguments must throw TypeError +PASS Element interface: document.createElement('img') must inherit property "scroll(ScrollToOptions)" with the proper type +PASS Element interface: calling scroll(ScrollToOptions) on document.createElement('img') with too few arguments must throw TypeError +PASS Element interface: document.createElement('img') must inherit property "scroll(unrestricted double, unrestricted double)" with the proper type +PASS Element interface: calling scroll(unrestricted double, unrestricted double) on document.createElement('img') with too few arguments must throw TypeError +PASS Element interface: document.createElement('img') must inherit property "scrollTo(ScrollToOptions)" with the proper type +PASS Element interface: calling scrollTo(ScrollToOptions) on document.createElement('img') with too few arguments must throw TypeError +PASS Element interface: document.createElement('img') must inherit property "scrollTo(unrestricted double, unrestricted double)" with the proper type +PASS Element interface: calling scrollTo(unrestricted double, unrestricted double) on document.createElement('img') with too few arguments must throw TypeError +PASS Element interface: document.createElement('img') must inherit property "scrollBy(ScrollToOptions)" with the proper type +PASS Element interface: calling scrollBy(ScrollToOptions) on document.createElement('img') with too few arguments must throw TypeError +PASS Element interface: document.createElement('img') must inherit property "scrollBy(unrestricted double, unrestricted double)" with the proper type +PASS Element interface: calling scrollBy(unrestricted double, unrestricted double) on document.createElement('img') with too few arguments must throw TypeError +PASS Element interface: document.createElement('img') must inherit property "scrollTop" with the proper type +PASS Element interface: document.createElement('img') must inherit property "scrollLeft" with the proper type +PASS Element interface: document.createElement('img') must inherit property "scrollWidth" with the proper type +PASS Element interface: document.createElement('img') must inherit property "scrollHeight" with the proper type +PASS Element interface: document.createElement('img') must inherit property "clientTop" with the proper type +PASS Element interface: document.createElement('img') must inherit property "clientLeft" with the proper type +PASS Element interface: document.createElement('img') must inherit property "clientWidth" with the proper type +PASS Element interface: document.createElement('img') must inherit property "clientHeight" with the proper type +FAIL Element interface: document.createElement('img') must inherit property "getBoxQuads(BoxQuadOptions)" with the proper type assert_inherits: property "getBoxQuads" not found in prototype chain +FAIL Element interface: calling getBoxQuads(BoxQuadOptions) on document.createElement('img') with too few arguments must throw TypeError assert_inherits: property "getBoxQuads" not found in prototype chain +FAIL Element interface: document.createElement('img') must inherit property "convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions)" with the proper type assert_inherits: property "convertQuadFromNode" not found in prototype chain +FAIL Element interface: calling convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions) on document.createElement('img') with too few arguments must throw TypeError assert_inherits: property "convertQuadFromNode" not found in prototype chain +FAIL Element interface: document.createElement('img') must inherit property "convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions)" with the proper type assert_inherits: property "convertRectFromNode" not found in prototype chain +FAIL Element interface: calling convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions) on document.createElement('img') with too few arguments must throw TypeError assert_inherits: property "convertRectFromNode" not found in prototype chain +FAIL Element interface: document.createElement('img') must inherit property "convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions)" with the proper type assert_inherits: property "convertPointFromNode" not found in prototype chain +FAIL Element interface: calling convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions) on document.createElement('img') with too few arguments must throw TypeError assert_inherits: property "convertPointFromNode" not found in prototype chain +PASS Window interface: operation matchMedia(CSSOMString) +PASS Window interface: attribute screen +PASS Window interface: operation moveTo(long, long) +PASS Window interface: operation moveBy(long, long) +PASS Window interface: operation resizeTo(long, long) +PASS Window interface: operation resizeBy(long, long) +PASS Window interface: attribute innerWidth +PASS Window interface: attribute innerHeight +PASS Window interface: attribute scrollX +PASS Window interface: attribute pageXOffset +PASS Window interface: attribute scrollY +PASS Window interface: attribute pageYOffset +FAIL Window interface: operation scroll(ScrollToOptions) assert_equals: property has wrong .length expected 0 but got 2 +FAIL Window interface: operation scroll(unrestricted double, unrestricted double) assert_equals: property has wrong .length expected 0 but got 2 +FAIL Window interface: operation scrollTo(ScrollToOptions) assert_equals: property has wrong .length expected 0 but got 2 +FAIL Window interface: operation scrollTo(unrestricted double, unrestricted double) assert_equals: property has wrong .length expected 0 but got 2 +FAIL Window interface: operation scrollBy(ScrollToOptions) assert_equals: property has wrong .length expected 0 but got 2 +FAIL Window interface: operation scrollBy(unrestricted double, unrestricted double) assert_equals: property has wrong .length expected 0 but got 2 +PASS Window interface: attribute screenX +PASS Window interface: attribute screenY +PASS Window interface: attribute outerWidth +PASS Window interface: attribute outerHeight +PASS Window interface: attribute devicePixelRatio +PASS Window interface: window must inherit property "matchMedia(CSSOMString)" with the proper type +PASS Window interface: calling matchMedia(CSSOMString) on window with too few arguments must throw TypeError +PASS Window interface: window must inherit property "screen" with the proper type +PASS Window interface: window must inherit property "moveTo(long, long)" with the proper type +PASS Window interface: calling moveTo(long, long) on window with too few arguments must throw TypeError +PASS Window interface: window must inherit property "moveBy(long, long)" with the proper type +PASS Window interface: calling moveBy(long, long) on window with too few arguments must throw TypeError +PASS Window interface: window must inherit property "resizeTo(long, long)" with the proper type +PASS Window interface: calling resizeTo(long, long) on window with too few arguments must throw TypeError +PASS Window interface: window must inherit property "resizeBy(long, long)" with the proper type +PASS Window interface: calling resizeBy(long, long) on window with too few arguments must throw TypeError +PASS Window interface: window must inherit property "innerWidth" with the proper type +PASS Window interface: window must inherit property "innerHeight" with the proper type +PASS Window interface: window must inherit property "scrollX" with the proper type +PASS Window interface: window must inherit property "pageXOffset" with the proper type +PASS Window interface: window must inherit property "scrollY" with the proper type +PASS Window interface: window must inherit property "pageYOffset" with the proper type +PASS Window interface: window must inherit property "scroll(ScrollToOptions)" with the proper type +PASS Window interface: calling scroll(ScrollToOptions) on window with too few arguments must throw TypeError +PASS Window interface: window must inherit property "scroll(unrestricted double, unrestricted double)" with the proper type +PASS Window interface: calling scroll(unrestricted double, unrestricted double) on window with too few arguments must throw TypeError +PASS Window interface: window must inherit property "scrollTo(ScrollToOptions)" with the proper type +PASS Window interface: calling scrollTo(ScrollToOptions) on window with too few arguments must throw TypeError +PASS Window interface: window must inherit property "scrollTo(unrestricted double, unrestricted double)" with the proper type +PASS Window interface: calling scrollTo(unrestricted double, unrestricted double) on window with too few arguments must throw TypeError +PASS Window interface: window must inherit property "scrollBy(ScrollToOptions)" with the proper type +PASS Window interface: calling scrollBy(ScrollToOptions) on window with too few arguments must throw TypeError +PASS Window interface: window must inherit property "scrollBy(unrestricted double, unrestricted double)" with the proper type +PASS Window interface: calling scrollBy(unrestricted double, unrestricted double) on window with too few arguments must throw TypeError +PASS Window interface: window must inherit property "screenX" with the proper type +PASS Window interface: window must inherit property "screenY" with the proper type +PASS Window interface: window must inherit property "outerWidth" with the proper type +PASS Window interface: window must inherit property "outerHeight" with the proper type +PASS Window interface: window must inherit property "devicePixelRatio" with the proper type +PASS WorkerGlobalScope interface: existence and properties of interface object +PASS DedicatedWorkerGlobalScope interface: existence and properties of interface object +PASS SharedWorkerGlobalScope interface: existence and properties of interface object +PASS WorkerNavigator interface: existence and properties of interface object +PASS WorkerLocation interface: existence and properties of interface object +PASS Document interface: operation elementFromPoint(double, double) +PASS Document interface: operation elementsFromPoint(double, double) +FAIL Document interface: operation caretPositionFromPoint(double, double) assert_own_property: interface prototype object missing non-static operation expected property "caretPositionFromPoint" missing +PASS Document interface: attribute scrollingElement +FAIL Document interface: operation getBoxQuads(BoxQuadOptions) assert_own_property: interface prototype object missing non-static operation expected property "getBoxQuads" missing +FAIL Document interface: operation convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions) assert_own_property: interface prototype object missing non-static operation expected property "convertQuadFromNode" missing +FAIL Document interface: operation convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions) assert_own_property: interface prototype object missing non-static operation expected property "convertRectFromNode" missing +FAIL Document interface: operation convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions) assert_own_property: interface prototype object missing non-static operation expected property "convertPointFromNode" missing +PASS Document interface: document must inherit property "elementFromPoint(double, double)" with the proper type +PASS Document interface: calling elementFromPoint(double, double) on document with too few arguments must throw TypeError +PASS Document interface: document must inherit property "elementsFromPoint(double, double)" with the proper type +PASS Document interface: calling elementsFromPoint(double, double) on document with too few arguments must throw TypeError +FAIL Document interface: document must inherit property "caretPositionFromPoint(double, double)" with the proper type assert_inherits: property "caretPositionFromPoint" not found in prototype chain +FAIL Document interface: calling caretPositionFromPoint(double, double) on document with too few arguments must throw TypeError assert_inherits: property "caretPositionFromPoint" not found in prototype chain +PASS Document interface: document must inherit property "scrollingElement" with the proper type +FAIL Document interface: document must inherit property "getBoxQuads(BoxQuadOptions)" with the proper type assert_inherits: property "getBoxQuads" not found in prototype chain +FAIL Document interface: calling getBoxQuads(BoxQuadOptions) on document with too few arguments must throw TypeError assert_inherits: property "getBoxQuads" not found in prototype chain +FAIL Document interface: document must inherit property "convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions)" with the proper type assert_inherits: property "convertQuadFromNode" not found in prototype chain +FAIL Document interface: calling convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions) on document with too few arguments must throw TypeError assert_inherits: property "convertQuadFromNode" not found in prototype chain +FAIL Document interface: document must inherit property "convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions)" with the proper type assert_inherits: property "convertRectFromNode" not found in prototype chain +FAIL Document interface: calling convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions) on document with too few arguments must throw TypeError assert_inherits: property "convertRectFromNode" not found in prototype chain +FAIL Document interface: document must inherit property "convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions)" with the proper type assert_inherits: property "convertPointFromNode" not found in prototype chain +FAIL Document interface: calling convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions) on document with too few arguments must throw TypeError assert_inherits: property "convertPointFromNode" not found in prototype chain +PASS Element interface: operation getClientRects() +PASS Element interface: operation getBoundingClientRect() +PASS Element interface: operation scrollIntoView([object Object],[object Object]) +PASS Element interface: operation scroll(ScrollToOptions) +PASS Element interface: operation scroll(unrestricted double, unrestricted double) +PASS Element interface: operation scrollTo(ScrollToOptions) +PASS Element interface: operation scrollTo(unrestricted double, unrestricted double) +PASS Element interface: operation scrollBy(ScrollToOptions) +PASS Element interface: operation scrollBy(unrestricted double, unrestricted double) +PASS Element interface: attribute scrollTop +PASS Element interface: attribute scrollLeft +PASS Element interface: attribute scrollWidth +PASS Element interface: attribute scrollHeight +PASS Element interface: attribute clientTop +PASS Element interface: attribute clientLeft +PASS Element interface: attribute clientWidth +PASS Element interface: attribute clientHeight +FAIL Element interface: operation getBoxQuads(BoxQuadOptions) assert_own_property: interface prototype object missing non-static operation expected property "getBoxQuads" missing +FAIL Element interface: operation convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions) assert_own_property: interface prototype object missing non-static operation expected property "convertQuadFromNode" missing +FAIL Element interface: operation convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions) assert_own_property: interface prototype object missing non-static operation expected property "convertRectFromNode" missing +FAIL Element interface: operation convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions) assert_own_property: interface prototype object missing non-static operation expected property "convertPointFromNode" missing +PASS Element interface: document.createElementNS('x', 'y') must inherit property "getClientRects()" with the proper type +PASS Element interface: document.createElementNS('x', 'y') must inherit property "getBoundingClientRect()" with the proper type +PASS Element interface: document.createElementNS('x', 'y') must inherit property "scrollIntoView([object Object],[object Object])" with the proper type +PASS Element interface: calling scrollIntoView([object Object],[object Object]) on document.createElementNS('x', 'y') with too few arguments must throw TypeError +PASS Element interface: document.createElementNS('x', 'y') must inherit property "scroll(ScrollToOptions)" with the proper type +PASS Element interface: calling scroll(ScrollToOptions) on document.createElementNS('x', 'y') with too few arguments must throw TypeError +PASS Element interface: document.createElementNS('x', 'y') must inherit property "scroll(unrestricted double, unrestricted double)" with the proper type +PASS Element interface: calling scroll(unrestricted double, unrestricted double) on document.createElementNS('x', 'y') with too few arguments must throw TypeError +PASS Element interface: document.createElementNS('x', 'y') must inherit property "scrollTo(ScrollToOptions)" with the proper type +PASS Element interface: calling scrollTo(ScrollToOptions) on document.createElementNS('x', 'y') with too few arguments must throw TypeError +PASS Element interface: document.createElementNS('x', 'y') must inherit property "scrollTo(unrestricted double, unrestricted double)" with the proper type +PASS Element interface: calling scrollTo(unrestricted double, unrestricted double) on document.createElementNS('x', 'y') with too few arguments must throw TypeError +PASS Element interface: document.createElementNS('x', 'y') must inherit property "scrollBy(ScrollToOptions)" with the proper type +PASS Element interface: calling scrollBy(ScrollToOptions) on document.createElementNS('x', 'y') with too few arguments must throw TypeError +PASS Element interface: document.createElementNS('x', 'y') must inherit property "scrollBy(unrestricted double, unrestricted double)" with the proper type +PASS Element interface: calling scrollBy(unrestricted double, unrestricted double) on document.createElementNS('x', 'y') with too few arguments must throw TypeError +PASS Element interface: document.createElementNS('x', 'y') must inherit property "scrollTop" with the proper type +PASS Element interface: document.createElementNS('x', 'y') must inherit property "scrollLeft" with the proper type +PASS Element interface: document.createElementNS('x', 'y') must inherit property "scrollWidth" with the proper type +PASS Element interface: document.createElementNS('x', 'y') must inherit property "scrollHeight" with the proper type +PASS Element interface: document.createElementNS('x', 'y') must inherit property "clientTop" with the proper type +PASS Element interface: document.createElementNS('x', 'y') must inherit property "clientLeft" with the proper type +PASS Element interface: document.createElementNS('x', 'y') must inherit property "clientWidth" with the proper type +PASS Element interface: document.createElementNS('x', 'y') must inherit property "clientHeight" with the proper type +FAIL Element interface: document.createElementNS('x', 'y') must inherit property "getBoxQuads(BoxQuadOptions)" with the proper type assert_inherits: property "getBoxQuads" not found in prototype chain +FAIL Element interface: calling getBoxQuads(BoxQuadOptions) on document.createElementNS('x', 'y') with too few arguments must throw TypeError assert_inherits: property "getBoxQuads" not found in prototype chain +FAIL Element interface: document.createElementNS('x', 'y') must inherit property "convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions)" with the proper type assert_inherits: property "convertQuadFromNode" not found in prototype chain +FAIL Element interface: calling convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions) on document.createElementNS('x', 'y') with too few arguments must throw TypeError assert_inherits: property "convertQuadFromNode" not found in prototype chain +FAIL Element interface: document.createElementNS('x', 'y') must inherit property "convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions)" with the proper type assert_inherits: property "convertRectFromNode" not found in prototype chain +FAIL Element interface: calling convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions) on document.createElementNS('x', 'y') with too few arguments must throw TypeError assert_inherits: property "convertRectFromNode" not found in prototype chain +FAIL Element interface: document.createElementNS('x', 'y') must inherit property "convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions)" with the proper type assert_inherits: property "convertPointFromNode" not found in prototype chain +FAIL Element interface: calling convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions) on document.createElementNS('x', 'y') with too few arguments must throw TypeError assert_inherits: property "convertPointFromNode" not found in prototype chain +FAIL Text interface: operation getBoxQuads(BoxQuadOptions) assert_own_property: interface prototype object missing non-static operation expected property "getBoxQuads" missing +FAIL Text interface: operation convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions) assert_own_property: interface prototype object missing non-static operation expected property "convertQuadFromNode" missing +FAIL Text interface: operation convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions) assert_own_property: interface prototype object missing non-static operation expected property "convertRectFromNode" missing +FAIL Text interface: operation convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions) assert_own_property: interface prototype object missing non-static operation expected property "convertPointFromNode" missing +FAIL Text interface: document.createTextNode('x') must inherit property "getBoxQuads(BoxQuadOptions)" with the proper type assert_inherits: property "getBoxQuads" not found in prototype chain +FAIL Text interface: calling getBoxQuads(BoxQuadOptions) on document.createTextNode('x') with too few arguments must throw TypeError assert_inherits: property "getBoxQuads" not found in prototype chain +FAIL Text interface: document.createTextNode('x') must inherit property "convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions)" with the proper type assert_inherits: property "convertQuadFromNode" not found in prototype chain +FAIL Text interface: calling convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions) on document.createTextNode('x') with too few arguments must throw TypeError assert_inherits: property "convertQuadFromNode" not found in prototype chain +FAIL Text interface: document.createTextNode('x') must inherit property "convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions)" with the proper type assert_inherits: property "convertRectFromNode" not found in prototype chain +FAIL Text interface: calling convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions) on document.createTextNode('x') with too few arguments must throw TypeError assert_inherits: property "convertRectFromNode" not found in prototype chain +FAIL Text interface: document.createTextNode('x') must inherit property "convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions)" with the proper type assert_inherits: property "convertPointFromNode" not found in prototype chain +FAIL Text interface: calling convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions) on document.createTextNode('x') with too few arguments must throw TypeError assert_inherits: property "convertPointFromNode" not found in prototype chain +PASS Range interface: operation getClientRects() +PASS Range interface: operation getBoundingClientRect() +PASS Range interface: new Range() must inherit property "getClientRects()" with the proper type +PASS Range interface: new Range() must inherit property "getBoundingClientRect()" with the proper type +PASS MediaQueryList interface: existence and properties of interface object +PASS MediaQueryList interface object length +PASS MediaQueryList interface object name +PASS MediaQueryList interface: existence and properties of interface prototype object +PASS MediaQueryList interface: existence and properties of interface prototype object's "constructor" property +PASS MediaQueryList interface: attribute media +PASS MediaQueryList interface: attribute matches +PASS MediaQueryList interface: operation addListener(EventListener) +PASS MediaQueryList interface: operation removeListener(EventListener) +PASS MediaQueryList interface: attribute onchange +PASS MediaQueryList must be primary interface of matchMedia('all') +PASS Stringification of matchMedia('all') +PASS MediaQueryList interface: matchMedia('all') must inherit property "media" with the proper type +PASS MediaQueryList interface: matchMedia('all') must inherit property "matches" with the proper type +PASS MediaQueryList interface: matchMedia('all') must inherit property "addListener(EventListener)" with the proper type +PASS MediaQueryList interface: calling addListener(EventListener) on matchMedia('all') with too few arguments must throw TypeError +PASS MediaQueryList interface: matchMedia('all') must inherit property "removeListener(EventListener)" with the proper type +PASS MediaQueryList interface: calling removeListener(EventListener) on matchMedia('all') with too few arguments must throw TypeError +PASS MediaQueryList interface: matchMedia('all') must inherit property "onchange" with the proper type +PASS MediaQueryListEvent interface: existence and properties of interface object +PASS MediaQueryListEvent interface object length +PASS MediaQueryListEvent interface object name +PASS MediaQueryListEvent interface: existence and properties of interface prototype object +PASS MediaQueryListEvent interface: existence and properties of interface prototype object's "constructor" property +PASS MediaQueryListEvent interface: attribute media +PASS MediaQueryListEvent interface: attribute matches +PASS MediaQueryListEvent must be primary interface of new MediaQueryListEvent('change') +PASS Stringification of new MediaQueryListEvent('change') +PASS MediaQueryListEvent interface: new MediaQueryListEvent('change') must inherit property "media" with the proper type +PASS MediaQueryListEvent interface: new MediaQueryListEvent('change') must inherit property "matches" with the proper type +PASS Screen interface: existence and properties of interface object +PASS Screen interface object length +PASS Screen interface object name +PASS Screen interface: existence and properties of interface prototype object +PASS Screen interface: existence and properties of interface prototype object's "constructor" property +PASS Screen interface: attribute availWidth +PASS Screen interface: attribute availHeight +PASS Screen interface: attribute width +PASS Screen interface: attribute height +PASS Screen interface: attribute colorDepth +PASS Screen interface: attribute pixelDepth +PASS Screen must be primary interface of screen +PASS Stringification of screen +PASS Screen interface: screen must inherit property "availWidth" with the proper type +PASS Screen interface: screen must inherit property "availHeight" with the proper type +PASS Screen interface: screen must inherit property "width" with the proper type +PASS Screen interface: screen must inherit property "height" with the proper type +PASS Screen interface: screen must inherit property "colorDepth" with the proper type +PASS Screen interface: screen must inherit property "pixelDepth" with the proper type +FAIL CaretPosition interface: existence and properties of interface object assert_own_property: self does not have own property "CaretPosition" expected property "CaretPosition" missing +FAIL CaretPosition interface object length assert_own_property: self does not have own property "CaretPosition" expected property "CaretPosition" missing +FAIL CaretPosition interface object name assert_own_property: self does not have own property "CaretPosition" expected property "CaretPosition" missing +FAIL CaretPosition interface: existence and properties of interface prototype object assert_own_property: self does not have own property "CaretPosition" expected property "CaretPosition" missing +FAIL CaretPosition interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "CaretPosition" expected property "CaretPosition" missing +FAIL CaretPosition interface: attribute offsetNode assert_own_property: self does not have own property "CaretPosition" expected property "CaretPosition" missing +FAIL CaretPosition interface: attribute offset assert_own_property: self does not have own property "CaretPosition" expected property "CaretPosition" missing +FAIL CaretPosition interface: operation getClientRect() assert_own_property: self does not have own property "CaretPosition" expected property "CaretPosition" missing +FAIL CaretPosition must be primary interface of document.caretPositionFromPoint(5, 5) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: document.caretPositionFromPoint is not a function" +FAIL Stringification of document.caretPositionFromPoint(5, 5) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: document.caretPositionFromPoint is not a function" +FAIL CaretPosition interface: document.caretPositionFromPoint(5, 5) must inherit property "offsetNode" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: document.caretPositionFromPoint is not a function" +FAIL CaretPosition interface: document.caretPositionFromPoint(5, 5) must inherit property "offset" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: document.caretPositionFromPoint is not a function" +FAIL CaretPosition interface: document.caretPositionFromPoint(5, 5) must inherit property "getClientRect()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: document.caretPositionFromPoint is not a function" Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/cssom/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/cssom/interfaces-expected.txt index 1fd50f1..7097b80 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/cssom/interfaces-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/cssom/interfaces-expected.txt
@@ -1,4 +1,403 @@ This is a testharness.js-based test. -FAIL Test driver promise_test: Unhandled rejection with value: "NonElementParentNode: interface mixin not yet supported" +Found 399 tests; 313 PASS, 86 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS Test driver +PASS HTMLElement interface: attribute style +PASS HTMLElement interface: style_element must inherit property "style" with the proper type +PASS HTMLElement interface: document.createElement('unknownelement') must inherit property "style" with the proper type +PASS HTMLLinkElement interface: attribute sheet +PASS HTMLStyleElement interface: attribute sheet +PASS Window interface: operation getComputedStyle(Element, CSSOMString) +PASS Window interface: window must inherit property "getComputedStyle(Element, CSSOMString)" with the proper type +PASS Window interface: calling getComputedStyle(Element, CSSOMString) on window with too few arguments must throw TypeError +PASS WorkerGlobalScope interface: existence and properties of interface object +PASS DedicatedWorkerGlobalScope interface: existence and properties of interface object +PASS SharedWorkerGlobalScope interface: existence and properties of interface object +PASS WorkerNavigator interface: existence and properties of interface object +PASS WorkerLocation interface: existence and properties of interface object +PASS Document interface: attribute styleSheets +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 ProcessingInstruction interface: xmlss_pi must inherit property "sheet" with the proper type +PASS SVGElement interface: attribute style +PASS SVGElement interface: svg_element must inherit property "style" with the proper type +PASS MediaList interface: existence and properties of interface object +PASS MediaList interface object length +PASS MediaList interface object name +FAIL MediaList interface: existence and properties of interface prototype object assert_equals: prototype of MediaList.prototype is not Array.prototype expected [] but got object "[object Object]" +PASS MediaList interface: existence and properties of interface prototype object's "constructor" property +PASS MediaList interface: attribute mediaText +FAIL MediaList interface: stringifier assert_own_property: interface prototype object missing non-static operation expected property "toString" missing +PASS MediaList interface: attribute length +PASS MediaList interface: operation item(unsigned long) +PASS MediaList interface: operation appendMedium(CSSOMString) +PASS MediaList interface: operation deleteMedium(CSSOMString) +PASS MediaList must be primary interface of style_element.sheet.media +PASS Stringification of style_element.sheet.media +PASS MediaList interface: style_element.sheet.media must inherit property "mediaText" with the proper type +PASS MediaList interface: style_element.sheet.media must inherit property "length" with the proper type +PASS MediaList interface: style_element.sheet.media must inherit property "item(unsigned long)" with the proper type +PASS MediaList interface: calling item(unsigned long) on style_element.sheet.media with too few arguments must throw TypeError +PASS MediaList interface: style_element.sheet.media must inherit property "appendMedium(CSSOMString)" with the proper type +PASS MediaList interface: calling appendMedium(CSSOMString) on style_element.sheet.media with too few arguments must throw TypeError +PASS MediaList interface: style_element.sheet.media must inherit property "deleteMedium(CSSOMString)" with the proper type +PASS MediaList interface: calling deleteMedium(CSSOMString) on style_element.sheet.media with too few arguments must throw TypeError +PASS StyleSheet interface: existence and properties of interface object +PASS StyleSheet interface object length +PASS StyleSheet interface object name +PASS StyleSheet interface: existence and properties of interface prototype object +PASS StyleSheet interface: existence and properties of interface prototype object's "constructor" property +PASS StyleSheet interface: attribute type +PASS StyleSheet interface: attribute href +PASS StyleSheet interface: attribute ownerNode +PASS StyleSheet interface: attribute parentStyleSheet +PASS StyleSheet interface: attribute title +FAIL StyleSheet interface: attribute media assert_equals: setter must be function for PutForwards, Replaceable, or non-readonly attributes expected "function" but got "undefined" +PASS StyleSheet interface: attribute disabled +PASS CSSStyleSheet interface: existence and properties of interface object +PASS CSSStyleSheet interface object length +PASS CSSStyleSheet interface object name +PASS CSSStyleSheet interface: existence and properties of interface prototype object +PASS CSSStyleSheet interface: existence and properties of interface prototype object's "constructor" property +PASS CSSStyleSheet interface: attribute ownerRule +PASS CSSStyleSheet interface: attribute cssRules +PASS CSSStyleSheet interface: operation insertRule(CSSOMString, unsigned long) +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 +PASS CSSStyleSheet interface: style_element.sheet must inherit property "cssRules" with the proper type +PASS CSSStyleSheet interface: style_element.sheet must inherit property "insertRule(CSSOMString, unsigned long)" with the proper type +PASS CSSStyleSheet interface: calling insertRule(CSSOMString, unsigned long) on style_element.sheet with too few arguments must throw TypeError +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 +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 +FAIL StyleSheetList interface: existence and properties of interface prototype object assert_equals: prototype of StyleSheetList.prototype is not Array.prototype expected [] but got object "[object Object]" +PASS StyleSheetList interface: existence and properties of interface prototype object's "constructor" property +PASS StyleSheetList interface: operation item(unsigned long) +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(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 +PASS CSSRuleList interface: existence and properties of interface object +PASS CSSRuleList interface object length +PASS CSSRuleList interface object name +FAIL CSSRuleList interface: existence and properties of interface prototype object assert_equals: prototype of CSSRuleList.prototype is not Array.prototype expected [] but got object "[object Object]" +PASS CSSRuleList interface: existence and properties of interface prototype object's "constructor" property +PASS CSSRuleList interface: operation item(unsigned long) +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(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 +PASS CSSRule interface: existence and properties of interface object +PASS CSSRule interface object length +PASS CSSRule interface object name +PASS CSSRule interface: existence and properties of interface prototype object +PASS CSSRule interface: existence and properties of interface prototype object's "constructor" property +PASS CSSRule interface: constant STYLE_RULE on interface object +PASS CSSRule interface: constant STYLE_RULE on interface prototype object +PASS CSSRule interface: constant CHARSET_RULE on interface object +PASS CSSRule interface: constant CHARSET_RULE on interface prototype object +PASS CSSRule interface: constant IMPORT_RULE on interface object +PASS CSSRule interface: constant IMPORT_RULE on interface prototype object +PASS CSSRule interface: constant MEDIA_RULE on interface object +PASS CSSRule interface: constant MEDIA_RULE on interface prototype object +PASS CSSRule interface: constant FONT_FACE_RULE on interface object +PASS CSSRule interface: constant FONT_FACE_RULE on interface prototype object +PASS CSSRule interface: constant PAGE_RULE on interface object +PASS CSSRule interface: constant PAGE_RULE on interface prototype object +FAIL CSSRule interface: constant MARGIN_RULE on interface object assert_own_property: expected property "MARGIN_RULE" missing +FAIL CSSRule interface: constant MARGIN_RULE on interface prototype object assert_own_property: expected property "MARGIN_RULE" missing +PASS CSSRule interface: constant NAMESPACE_RULE on interface object +PASS CSSRule interface: constant NAMESPACE_RULE on interface prototype object +PASS CSSRule interface: attribute type +PASS CSSRule interface: attribute cssText +PASS CSSRule interface: attribute parentRule +PASS CSSRule interface: attribute parentStyleSheet +PASS CSSStyleRule interface: existence and properties of interface object +PASS CSSStyleRule interface object length +PASS CSSStyleRule interface object name +PASS CSSStyleRule interface: existence and properties of interface prototype object +PASS CSSStyleRule interface: existence and properties of interface prototype object's "constructor" property +PASS CSSStyleRule interface: attribute selectorText +PASS CSSStyleRule interface: attribute style +PASS CSSStyleRule must be primary interface of style_element.sheet.cssRules[4] +PASS Stringification of style_element.sheet.cssRules[4] +PASS CSSStyleRule interface: style_element.sheet.cssRules[4] must inherit property "selectorText" with the proper type +PASS CSSStyleRule interface: style_element.sheet.cssRules[4] must inherit property "style" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[4] must inherit property "STYLE_RULE" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[4] must inherit property "CHARSET_RULE" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[4] must inherit property "IMPORT_RULE" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[4] must inherit property "MEDIA_RULE" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[4] must inherit property "FONT_FACE_RULE" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[4] must inherit property "PAGE_RULE" with the proper type +FAIL CSSRule interface: style_element.sheet.cssRules[4] 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[4] must inherit property "NAMESPACE_RULE" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[4] must inherit property "type" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[4] must inherit property "cssText" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[4] must inherit property "parentRule" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[4] 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 +PASS CSSImportRule interface: existence and properties of interface prototype object +PASS CSSImportRule interface: existence and properties of interface prototype object's "constructor" property +PASS CSSImportRule interface: attribute href +FAIL CSSImportRule interface: attribute media assert_equals: setter must be function for PutForwards, Replaceable, or non-readonly attributes expected "function" but got "undefined" +PASS CSSImportRule interface: attribute styleSheet +PASS CSSImportRule must be primary interface of style_element.sheet.cssRules[0] +PASS Stringification of style_element.sheet.cssRules[0] +PASS CSSImportRule interface: style_element.sheet.cssRules[0] must inherit property "href" with the proper type +PASS CSSImportRule interface: style_element.sheet.cssRules[0] must inherit property "media" with the proper type +PASS CSSImportRule interface: style_element.sheet.cssRules[0] must inherit property "styleSheet" 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 CSSGroupingRule interface: existence and properties of interface object +PASS CSSGroupingRule interface object length +PASS CSSGroupingRule interface object name +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 +FAIL CSSGroupingRule interface: operation insertRule(CSSOMString, unsigned long) assert_equals: property has wrong .length expected 1 but got 2 +PASS CSSGroupingRule interface: operation deleteRule(unsigned long) +FAIL CSSPageRule interface: existence and properties of interface object assert_equals: prototype of CSSPageRule is not CSSGroupingRule expected function "function CSSGroupingRule() { [native code] }" but got function "function CSSRule() { [native code] }" +PASS CSSPageRule interface object length +PASS CSSPageRule interface object name +FAIL CSSPageRule interface: existence and properties of interface prototype object assert_equals: prototype of CSSPageRule.prototype is not CSSGroupingRule.prototype expected object "[object CSSGroupingRule]" but got object "[object CSSRule]" +PASS CSSPageRule interface: existence and properties of interface prototype object's "constructor" property +PASS CSSPageRule interface: attribute selectorText +FAIL CSSPageRule interface: attribute style assert_equals: setter must be function for PutForwards, Replaceable, or non-readonly attributes expected "function" but got "undefined" +PASS CSSPageRule must be primary interface of style_element.sheet.cssRules[2] +PASS Stringification of style_element.sheet.cssRules[2] +PASS CSSPageRule interface: style_element.sheet.cssRules[2] must inherit property "selectorText" with the proper type +PASS CSSPageRule interface: style_element.sheet.cssRules[2] must inherit property "style" with the proper type +FAIL CSSGroupingRule interface: style_element.sheet.cssRules[2] must inherit property "cssRules" with the proper type assert_inherits: property "cssRules" not found in prototype chain +FAIL CSSGroupingRule interface: style_element.sheet.cssRules[2] must inherit property "insertRule(CSSOMString, unsigned long)" with the proper type assert_inherits: property "insertRule" not found in prototype chain +FAIL CSSGroupingRule interface: calling insertRule(CSSOMString, unsigned long) on style_element.sheet.cssRules[2] with too few arguments must throw TypeError assert_inherits: property "insertRule" not found in prototype chain +FAIL CSSGroupingRule interface: style_element.sheet.cssRules[2] must inherit property "deleteRule(unsigned long)" with the proper type assert_inherits: property "deleteRule" not found in prototype chain +FAIL CSSGroupingRule interface: calling deleteRule(unsigned long) on style_element.sheet.cssRules[2] with too few arguments must throw TypeError assert_inherits: property "deleteRule" not found in prototype chain +PASS CSSRule interface: style_element.sheet.cssRules[2] must inherit property "STYLE_RULE" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[2] must inherit property "CHARSET_RULE" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[2] must inherit property "IMPORT_RULE" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[2] must inherit property "MEDIA_RULE" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[2] must inherit property "FONT_FACE_RULE" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[2] must inherit property "PAGE_RULE" with the proper type +FAIL CSSRule interface: style_element.sheet.cssRules[2] 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[2] must inherit property "NAMESPACE_RULE" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[2] must inherit property "type" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[2] must inherit property "cssText" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[2] must inherit property "parentRule" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[2] must inherit property "parentStyleSheet" with the proper type +FAIL CSSMarginRule interface: existence and properties of interface object assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing +FAIL CSSMarginRule interface object length assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing +FAIL CSSMarginRule interface object name assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing +FAIL CSSMarginRule interface: existence and properties of interface prototype object assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing +FAIL CSSMarginRule interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing +FAIL CSSMarginRule interface: attribute name assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing +FAIL CSSMarginRule interface: attribute style assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing +FAIL CSSMarginRule must be primary interface of style_element.sheet.cssRules[2].cssRules[0] assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +FAIL Stringification of style_element.sheet.cssRules[2].cssRules[0] assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +FAIL CSSMarginRule interface: style_element.sheet.cssRules[2].cssRules[0] must inherit property "name" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +FAIL CSSMarginRule interface: style_element.sheet.cssRules[2].cssRules[0] must inherit property "style" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +FAIL CSSRule interface: style_element.sheet.cssRules[2].cssRules[0] must inherit property "STYLE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +FAIL CSSRule interface: style_element.sheet.cssRules[2].cssRules[0] must inherit property "CHARSET_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +FAIL CSSRule interface: style_element.sheet.cssRules[2].cssRules[0] must inherit property "IMPORT_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +FAIL CSSRule interface: style_element.sheet.cssRules[2].cssRules[0] must inherit property "MEDIA_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +FAIL CSSRule interface: style_element.sheet.cssRules[2].cssRules[0] must inherit property "FONT_FACE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +FAIL CSSRule interface: style_element.sheet.cssRules[2].cssRules[0] must inherit property "PAGE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +FAIL CSSRule interface: style_element.sheet.cssRules[2].cssRules[0] must inherit property "MARGIN_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +FAIL CSSRule interface: style_element.sheet.cssRules[2].cssRules[0] must inherit property "NAMESPACE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +FAIL CSSRule interface: style_element.sheet.cssRules[2].cssRules[0] must inherit property "type" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +FAIL CSSRule interface: style_element.sheet.cssRules[2].cssRules[0] must inherit property "cssText" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +FAIL CSSRule interface: style_element.sheet.cssRules[2].cssRules[0] must inherit property "parentRule" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +FAIL CSSRule interface: style_element.sheet.cssRules[2].cssRules[0] must inherit property "parentStyleSheet" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +PASS CSSNamespaceRule interface: existence and properties of interface object +PASS CSSNamespaceRule interface object length +PASS CSSNamespaceRule interface object name +PASS CSSNamespaceRule interface: existence and properties of interface prototype object +PASS CSSNamespaceRule interface: existence and properties of interface prototype object's "constructor" property +PASS CSSNamespaceRule interface: attribute namespaceURI +PASS CSSNamespaceRule interface: attribute prefix +PASS CSSNamespaceRule must be primary interface of style_element.sheet.cssRules[1] +PASS Stringification of style_element.sheet.cssRules[1] +PASS CSSNamespaceRule interface: style_element.sheet.cssRules[1] must inherit property "namespaceURI" with the proper type +PASS CSSNamespaceRule interface: style_element.sheet.cssRules[1] must inherit property "prefix" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[1] must inherit property "STYLE_RULE" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[1] must inherit property "CHARSET_RULE" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[1] must inherit property "IMPORT_RULE" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[1] must inherit property "MEDIA_RULE" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[1] must inherit property "FONT_FACE_RULE" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[1] must inherit property "PAGE_RULE" with the proper type +FAIL CSSRule interface: style_element.sheet.cssRules[1] 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[1] must inherit property "NAMESPACE_RULE" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[1] must inherit property "type" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[1] must inherit property "cssText" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[1] must inherit property "parentRule" with the proper type +PASS CSSRule interface: style_element.sheet.cssRules[1] must inherit property "parentStyleSheet" with the proper type +PASS CSSStyleDeclaration interface: existence and properties of interface object +PASS CSSStyleDeclaration interface object length +PASS CSSStyleDeclaration interface object name +PASS CSSStyleDeclaration interface: existence and properties of interface prototype object +PASS CSSStyleDeclaration interface: existence and properties of interface prototype object's "constructor" property +PASS CSSStyleDeclaration interface: attribute cssText +PASS CSSStyleDeclaration interface: attribute length +PASS CSSStyleDeclaration interface: operation item(unsigned long) +PASS CSSStyleDeclaration interface: operation getPropertyValue(CSSOMString) +PASS CSSStyleDeclaration interface: operation getPropertyPriority(CSSOMString) +PASS CSSStyleDeclaration interface: operation setProperty(CSSOMString, CSSOMString, CSSOMString) +FAIL CSSStyleDeclaration interface: operation setPropertyValue(CSSOMString, CSSOMString) assert_own_property: interface prototype object missing non-static operation expected property "setPropertyValue" missing +FAIL CSSStyleDeclaration interface: operation setPropertyPriority(CSSOMString, CSSOMString) assert_own_property: interface prototype object missing non-static operation expected property "setPropertyPriority" missing +PASS CSSStyleDeclaration interface: operation removeProperty(CSSOMString) +PASS CSSStyleDeclaration interface: attribute parentRule +PASS CSSStyleDeclaration interface: attribute cssFloat +PASS CSSStyleDeclaration must be primary interface of style_element.sheet.cssRules[4].style +PASS Stringification of style_element.sheet.cssRules[4].style +PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[4].style must inherit property "cssText" with the proper type +PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[4].style must inherit property "length" with the proper type +PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[4].style must inherit property "item(unsigned long)" with the proper type +PASS CSSStyleDeclaration interface: calling item(unsigned long) on style_element.sheet.cssRules[4].style with too few arguments must throw TypeError +PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[4].style must inherit property "getPropertyValue(CSSOMString)" with the proper type +PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on style_element.sheet.cssRules[4].style with too few arguments must throw TypeError +PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[4].style must inherit property "getPropertyPriority(CSSOMString)" with the proper type +PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on style_element.sheet.cssRules[4].style with too few arguments must throw TypeError +PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[4].style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type +PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on style_element.sheet.cssRules[4].style with too few arguments must throw TypeError +FAIL CSSStyleDeclaration interface: style_element.sheet.cssRules[4].style must inherit property "setPropertyValue(CSSOMString, CSSOMString)" with the proper type assert_inherits: property "setPropertyValue" not found in prototype chain +FAIL CSSStyleDeclaration interface: calling setPropertyValue(CSSOMString, CSSOMString) on style_element.sheet.cssRules[4].style with too few arguments must throw TypeError assert_inherits: property "setPropertyValue" not found in prototype chain +FAIL CSSStyleDeclaration interface: style_element.sheet.cssRules[4].style must inherit property "setPropertyPriority(CSSOMString, CSSOMString)" with the proper type assert_inherits: property "setPropertyPriority" not found in prototype chain +FAIL CSSStyleDeclaration interface: calling setPropertyPriority(CSSOMString, CSSOMString) on style_element.sheet.cssRules[4].style with too few arguments must throw TypeError assert_inherits: property "setPropertyPriority" not found in prototype chain +PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[4].style must inherit property "removeProperty(CSSOMString)" with the proper type +PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on style_element.sheet.cssRules[4].style with too few arguments must throw TypeError +PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[4].style must inherit property "parentRule" with the proper type +PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[4].style must inherit property "cssFloat" with the proper type +PASS CSSStyleDeclaration must be primary interface of style_element.sheet.cssRules[2].style +PASS Stringification of style_element.sheet.cssRules[2].style +PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[2].style must inherit property "cssText" with the proper type +PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[2].style must inherit property "length" with the proper type +PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[2].style must inherit property "item(unsigned long)" with the proper type +PASS CSSStyleDeclaration interface: calling item(unsigned long) on style_element.sheet.cssRules[2].style with too few arguments must throw TypeError +PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[2].style must inherit property "getPropertyValue(CSSOMString)" with the proper type +PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on style_element.sheet.cssRules[2].style with too few arguments must throw TypeError +PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[2].style must inherit property "getPropertyPriority(CSSOMString)" with the proper type +PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on style_element.sheet.cssRules[2].style with too few arguments must throw TypeError +PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[2].style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type +PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on style_element.sheet.cssRules[2].style with too few arguments must throw TypeError +FAIL CSSStyleDeclaration interface: style_element.sheet.cssRules[2].style must inherit property "setPropertyValue(CSSOMString, CSSOMString)" with the proper type assert_inherits: property "setPropertyValue" not found in prototype chain +FAIL CSSStyleDeclaration interface: calling setPropertyValue(CSSOMString, CSSOMString) on style_element.sheet.cssRules[2].style with too few arguments must throw TypeError assert_inherits: property "setPropertyValue" not found in prototype chain +FAIL CSSStyleDeclaration interface: style_element.sheet.cssRules[2].style must inherit property "setPropertyPriority(CSSOMString, CSSOMString)" with the proper type assert_inherits: property "setPropertyPriority" not found in prototype chain +FAIL CSSStyleDeclaration interface: calling setPropertyPriority(CSSOMString, CSSOMString) on style_element.sheet.cssRules[2].style with too few arguments must throw TypeError assert_inherits: property "setPropertyPriority" not found in prototype chain +PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[2].style must inherit property "removeProperty(CSSOMString)" with the proper type +PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on style_element.sheet.cssRules[2].style with too few arguments must throw TypeError +PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[2].style must inherit property "parentRule" with the proper type +PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[2].style must inherit property "cssFloat" with the proper type +FAIL CSSStyleDeclaration must be primary interface of style_element.sheet.cssRules[2].cssRules[0].style assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +FAIL Stringification of style_element.sheet.cssRules[2].cssRules[0].style assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +FAIL CSSStyleDeclaration interface: style_element.sheet.cssRules[2].cssRules[0].style must inherit property "cssText" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +FAIL CSSStyleDeclaration interface: style_element.sheet.cssRules[2].cssRules[0].style must inherit property "length" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +FAIL CSSStyleDeclaration interface: style_element.sheet.cssRules[2].cssRules[0].style must inherit property "item(unsigned long)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +FAIL CSSStyleDeclaration interface: calling item(unsigned long) on style_element.sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +FAIL CSSStyleDeclaration interface: style_element.sheet.cssRules[2].cssRules[0].style must inherit property "getPropertyValue(CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +FAIL CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on style_element.sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +FAIL CSSStyleDeclaration interface: style_element.sheet.cssRules[2].cssRules[0].style must inherit property "getPropertyPriority(CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +FAIL CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on style_element.sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +FAIL CSSStyleDeclaration interface: style_element.sheet.cssRules[2].cssRules[0].style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +FAIL CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on style_element.sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +FAIL CSSStyleDeclaration interface: style_element.sheet.cssRules[2].cssRules[0].style must inherit property "setPropertyValue(CSSOMString, CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +FAIL CSSStyleDeclaration interface: calling setPropertyValue(CSSOMString, CSSOMString) on style_element.sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +FAIL CSSStyleDeclaration interface: style_element.sheet.cssRules[2].cssRules[0].style must inherit property "setPropertyPriority(CSSOMString, CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +FAIL CSSStyleDeclaration interface: calling setPropertyPriority(CSSOMString, CSSOMString) on style_element.sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +FAIL CSSStyleDeclaration interface: style_element.sheet.cssRules[2].cssRules[0].style must inherit property "removeProperty(CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +FAIL CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on style_element.sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +FAIL CSSStyleDeclaration interface: style_element.sheet.cssRules[2].cssRules[0].style must inherit property "parentRule" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +FAIL CSSStyleDeclaration interface: style_element.sheet.cssRules[2].cssRules[0].style must inherit property "cssFloat" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined" +PASS CSSStyleDeclaration must be primary interface of style_element.style +PASS Stringification of style_element.style +PASS CSSStyleDeclaration interface: style_element.style must inherit property "cssText" with the proper type +PASS CSSStyleDeclaration interface: style_element.style must inherit property "length" with the proper type +PASS CSSStyleDeclaration interface: style_element.style must inherit property "item(unsigned long)" with the proper type +PASS CSSStyleDeclaration interface: calling item(unsigned long) on style_element.style with too few arguments must throw TypeError +PASS CSSStyleDeclaration interface: style_element.style must inherit property "getPropertyValue(CSSOMString)" with the proper type +PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on style_element.style with too few arguments must throw TypeError +PASS CSSStyleDeclaration interface: style_element.style must inherit property "getPropertyPriority(CSSOMString)" with the proper type +PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on style_element.style with too few arguments must throw TypeError +PASS CSSStyleDeclaration interface: style_element.style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type +PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on style_element.style with too few arguments must throw TypeError +FAIL CSSStyleDeclaration interface: style_element.style must inherit property "setPropertyValue(CSSOMString, CSSOMString)" with the proper type assert_inherits: property "setPropertyValue" not found in prototype chain +FAIL CSSStyleDeclaration interface: calling setPropertyValue(CSSOMString, CSSOMString) on style_element.style with too few arguments must throw TypeError assert_inherits: property "setPropertyValue" not found in prototype chain +FAIL CSSStyleDeclaration interface: style_element.style must inherit property "setPropertyPriority(CSSOMString, CSSOMString)" with the proper type assert_inherits: property "setPropertyPriority" not found in prototype chain +FAIL CSSStyleDeclaration interface: calling setPropertyPriority(CSSOMString, CSSOMString) on style_element.style with too few arguments must throw TypeError assert_inherits: property "setPropertyPriority" not found in prototype chain +PASS CSSStyleDeclaration interface: style_element.style must inherit property "removeProperty(CSSOMString)" with the proper type +PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on style_element.style with too few arguments must throw TypeError +PASS CSSStyleDeclaration interface: style_element.style must inherit property "parentRule" with the proper type +PASS CSSStyleDeclaration interface: style_element.style must inherit property "cssFloat" with the proper type +PASS CSSStyleDeclaration must be primary interface of svg_element.style +PASS Stringification of svg_element.style +PASS CSSStyleDeclaration interface: svg_element.style must inherit property "cssText" with the proper type +PASS CSSStyleDeclaration interface: svg_element.style must inherit property "length" with the proper type +PASS CSSStyleDeclaration interface: svg_element.style must inherit property "item(unsigned long)" with the proper type +PASS CSSStyleDeclaration interface: calling item(unsigned long) on svg_element.style with too few arguments must throw TypeError +PASS CSSStyleDeclaration interface: svg_element.style must inherit property "getPropertyValue(CSSOMString)" with the proper type +PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on svg_element.style with too few arguments must throw TypeError +PASS CSSStyleDeclaration interface: svg_element.style must inherit property "getPropertyPriority(CSSOMString)" with the proper type +PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on svg_element.style with too few arguments must throw TypeError +PASS CSSStyleDeclaration interface: svg_element.style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type +PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on svg_element.style with too few arguments must throw TypeError +FAIL CSSStyleDeclaration interface: svg_element.style must inherit property "setPropertyValue(CSSOMString, CSSOMString)" with the proper type assert_inherits: property "setPropertyValue" not found in prototype chain +FAIL CSSStyleDeclaration interface: calling setPropertyValue(CSSOMString, CSSOMString) on svg_element.style with too few arguments must throw TypeError assert_inherits: property "setPropertyValue" not found in prototype chain +FAIL CSSStyleDeclaration interface: svg_element.style must inherit property "setPropertyPriority(CSSOMString, CSSOMString)" with the proper type assert_inherits: property "setPropertyPriority" not found in prototype chain +FAIL CSSStyleDeclaration interface: calling setPropertyPriority(CSSOMString, CSSOMString) on svg_element.style with too few arguments must throw TypeError assert_inherits: property "setPropertyPriority" not found in prototype chain +PASS CSSStyleDeclaration interface: svg_element.style must inherit property "removeProperty(CSSOMString)" with the proper type +PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on svg_element.style with too few arguments must throw TypeError +PASS CSSStyleDeclaration interface: svg_element.style must inherit property "parentRule" with the proper type +PASS CSSStyleDeclaration interface: svg_element.style must inherit property "cssFloat" with the proper type +PASS CSSStyleDeclaration must be primary interface of getComputedStyle(svg_element) +PASS Stringification of getComputedStyle(svg_element) +PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "cssText" with the proper type +PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "length" with the proper type +PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "item(unsigned long)" with the proper type +PASS CSSStyleDeclaration interface: calling item(unsigned long) on getComputedStyle(svg_element) with too few arguments must throw TypeError +PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "getPropertyValue(CSSOMString)" with the proper type +PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError +PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "getPropertyPriority(CSSOMString)" with the proper type +PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError +PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type +PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError +FAIL CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "setPropertyValue(CSSOMString, CSSOMString)" with the proper type assert_inherits: property "setPropertyValue" not found in prototype chain +FAIL CSSStyleDeclaration interface: calling setPropertyValue(CSSOMString, CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError assert_inherits: property "setPropertyValue" not found in prototype chain +FAIL CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "setPropertyPriority(CSSOMString, CSSOMString)" with the proper type assert_inherits: property "setPropertyPriority" not found in prototype chain +FAIL CSSStyleDeclaration interface: calling setPropertyPriority(CSSOMString, CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError assert_inherits: property "setPropertyPriority" not found in prototype chain +PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "removeProperty(CSSOMString)" with the proper type +PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError +PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "parentRule" with the proper type +PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "cssFloat" with the proper type +PASS CSS interface: existence and properties of interface object +PASS CSS interface object length +PASS CSS interface object name +PASS CSS interface: existence and properties of interface prototype object +PASS CSS interface: existence and properties of interface prototype object's "constructor" property +PASS CSS interface: operation escape(CSSOMString) Harness: the test ran to completion.
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 1fd50f1..4296044 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/dom/interfaces-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/dom/interfaces-expected.txt
@@ -1,4 +1,1650 @@ This is a testharness.js-based test. -FAIL Test driver promise_test: Unhandled rejection with value: "NonElementParentNode: interface mixin not yet supported" +Found 1646 tests; 1618 PASS, 28 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS Test driver +PASS Event interface: existence and properties of interface object +PASS Event interface object length +PASS Event interface object name +PASS Event interface: existence and properties of interface prototype object +PASS Event interface: existence and properties of interface prototype object's "constructor" property +PASS Event interface: attribute type +PASS Event interface: attribute target +PASS Event interface: attribute currentTarget +PASS Event interface: constant NONE on interface object +PASS Event interface: constant NONE on interface prototype object +PASS Event interface: constant CAPTURING_PHASE on interface object +PASS Event interface: constant CAPTURING_PHASE on interface prototype object +PASS Event interface: constant AT_TARGET on interface object +PASS Event interface: constant AT_TARGET on interface prototype object +PASS Event interface: constant BUBBLING_PHASE on interface object +PASS Event interface: constant BUBBLING_PHASE on interface prototype object +PASS Event interface: attribute eventPhase +PASS Event interface: operation stopPropagation() +PASS Event interface: operation stopImmediatePropagation() +PASS Event interface: attribute bubbles +PASS Event interface: attribute cancelable +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 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 +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 +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 +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 +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 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 +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 +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 dispatchEvent(Event) +PASS EventTarget must be primary interface of new EventTarget() +PASS Stringification of new EventTarget() +PASS EventTarget interface: new EventTarget() 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 EventTarget() with too few arguments must throw TypeError +PASS EventTarget interface: new EventTarget() 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 EventTarget() with too few arguments must throw TypeError +PASS EventTarget interface: new EventTarget() must inherit property "dispatchEvent(Event)" with the proper type +PASS EventTarget interface: calling dispatchEvent(Event) on new EventTarget() with too few arguments must throw TypeError +PASS EventListener interface: existence and properties of interface object +PASS EventListener interface: existence and properties of interface prototype object +PASS EventListener interface: existence and properties of interface prototype object's "constructor" property +PASS EventListener interface: operation handleEvent(Event) +FAIL AbortController interface: existence and properties of interface object assert_own_property: self does not have own property "AbortController" expected property "AbortController" missing +FAIL AbortController interface object length assert_own_property: self does not have own property "AbortController" expected property "AbortController" missing +FAIL AbortController interface object name assert_own_property: self does not have own property "AbortController" expected property "AbortController" missing +FAIL AbortController interface: existence and properties of interface prototype object assert_own_property: self does not have own property "AbortController" expected property "AbortController" missing +FAIL AbortController interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "AbortController" expected property "AbortController" missing +FAIL AbortController interface: attribute signal assert_own_property: self does not have own property "AbortController" expected property "AbortController" missing +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 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 +FAIL AbortSignal interface: existence and properties of interface prototype object assert_own_property: self does not have own property "AbortSignal" expected property "AbortSignal" missing +FAIL AbortSignal interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "AbortSignal" expected property "AbortSignal" missing +FAIL AbortSignal interface: attribute aborted assert_own_property: self does not have own property "AbortSignal" expected property "AbortSignal" missing +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 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 +PASS NodeList interface object name +PASS NodeList interface: existence and properties of interface prototype object +PASS NodeList interface: existence and properties of interface prototype object's "constructor" property +PASS NodeList interface: operation item(unsigned long) +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(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 +PASS HTMLCollection interface: existence and properties of interface object +PASS HTMLCollection interface object length +PASS HTMLCollection interface object name +PASS HTMLCollection interface: existence and properties of interface prototype object +PASS HTMLCollection interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLCollection interface: attribute length +PASS HTMLCollection interface: operation item(unsigned long) +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 +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(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 disconnect() +PASS MutationObserver interface: operation takeRecords() +PASS MutationRecord interface: existence and properties of interface object +PASS MutationRecord interface object length +PASS MutationRecord interface object name +PASS MutationRecord interface: existence and properties of interface prototype object +PASS MutationRecord interface: existence and properties of interface prototype object's "constructor" property +PASS MutationRecord interface: attribute type +PASS MutationRecord interface: attribute target +PASS MutationRecord interface: attribute addedNodes +PASS MutationRecord interface: attribute removedNodes +PASS MutationRecord interface: attribute previousSibling +PASS MutationRecord interface: attribute nextSibling +PASS MutationRecord interface: attribute attributeName +PASS MutationRecord interface: attribute attributeNamespace +PASS MutationRecord interface: attribute oldValue +PASS Node interface: existence and properties of interface object +PASS Node interface object length +PASS Node interface object name +PASS Node interface: existence and properties of interface prototype object +PASS Node interface: existence and properties of interface prototype object's "constructor" property +PASS Node interface: constant ELEMENT_NODE on interface object +PASS Node interface: constant ELEMENT_NODE on interface prototype object +PASS Node interface: constant ATTRIBUTE_NODE on interface object +PASS Node interface: constant ATTRIBUTE_NODE on interface prototype object +PASS Node interface: constant TEXT_NODE on interface object +PASS Node interface: constant TEXT_NODE on interface prototype object +PASS Node interface: constant CDATA_SECTION_NODE on interface object +PASS Node interface: constant CDATA_SECTION_NODE on interface prototype object +PASS Node interface: constant ENTITY_REFERENCE_NODE on interface object +PASS Node interface: constant ENTITY_REFERENCE_NODE on interface prototype object +PASS Node interface: constant ENTITY_NODE on interface object +PASS Node interface: constant ENTITY_NODE on interface prototype object +PASS Node interface: constant PROCESSING_INSTRUCTION_NODE on interface object +PASS Node interface: constant PROCESSING_INSTRUCTION_NODE on interface prototype object +PASS Node interface: constant COMMENT_NODE on interface object +PASS Node interface: constant COMMENT_NODE on interface prototype object +PASS Node interface: constant DOCUMENT_NODE on interface object +PASS Node interface: constant DOCUMENT_NODE on interface prototype object +PASS Node interface: constant DOCUMENT_TYPE_NODE on interface object +PASS Node interface: constant DOCUMENT_TYPE_NODE on interface prototype object +PASS Node interface: constant DOCUMENT_FRAGMENT_NODE on interface object +PASS Node interface: constant DOCUMENT_FRAGMENT_NODE on interface prototype object +PASS Node interface: constant NOTATION_NODE on interface object +PASS Node interface: constant NOTATION_NODE on interface prototype object +PASS Node interface: attribute nodeType +PASS Node interface: attribute nodeName +PASS Node interface: attribute baseURI +PASS Node interface: attribute isConnected +PASS Node interface: attribute ownerDocument +PASS Node interface: operation getRootNode(GetRootNodeOptions) +PASS Node interface: attribute parentNode +PASS Node interface: attribute parentElement +PASS Node interface: operation hasChildNodes() +PASS Node interface: attribute childNodes +PASS Node interface: attribute firstChild +PASS Node interface: attribute lastChild +PASS Node interface: attribute previousSibling +PASS Node interface: attribute nextSibling +PASS Node interface: attribute nodeValue +PASS Node interface: attribute textContent +PASS Node interface: operation normalize() +PASS Node interface: operation cloneNode(boolean) +PASS Node interface: operation isEqualNode(Node) +PASS Node interface: operation isSameNode(Node) +PASS Node interface: constant DOCUMENT_POSITION_DISCONNECTED on interface object +PASS Node interface: constant DOCUMENT_POSITION_DISCONNECTED on interface prototype object +PASS Node interface: constant DOCUMENT_POSITION_PRECEDING on interface object +PASS Node interface: constant DOCUMENT_POSITION_PRECEDING on interface prototype object +PASS Node interface: constant DOCUMENT_POSITION_FOLLOWING on interface object +PASS Node interface: constant DOCUMENT_POSITION_FOLLOWING on interface prototype object +PASS Node interface: constant DOCUMENT_POSITION_CONTAINS on interface object +PASS Node interface: constant DOCUMENT_POSITION_CONTAINS on interface prototype object +PASS Node interface: constant DOCUMENT_POSITION_CONTAINED_BY on interface object +PASS Node interface: constant DOCUMENT_POSITION_CONTAINED_BY on interface prototype object +PASS Node interface: constant DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC on interface object +PASS Node interface: constant DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC on interface prototype object +PASS Node interface: operation compareDocumentPosition(Node) +PASS Node interface: operation contains(Node) +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 appendChild(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 +PASS Document interface object name +PASS Document interface: existence and properties of interface prototype object +PASS Document interface: existence and properties of interface prototype object's "constructor" property +PASS Document interface: attribute implementation +PASS Document interface: attribute URL +PASS Document interface: attribute documentURI +PASS Document interface: attribute origin +PASS Document interface: attribute compatMode +PASS Document interface: attribute characterSet +PASS Document interface: attribute charset +PASS Document interface: attribute inputEncoding +PASS Document interface: attribute contentType +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 getElementsByClassName(DOMString) +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 adoptNode(Node) +PASS Document interface: operation createAttribute(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 getElementById(DOMString) +PASS Document interface: attribute children +PASS Document interface: attribute firstElementChild +PASS Document interface: attribute lastElementChild +PASS Document interface: attribute childElementCount +PASS Document interface: operation prepend([object Object],[object Object]) +PASS Document interface: operation append([object Object],[object Object]) +PASS Document interface: operation querySelector(DOMString) +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 +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(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(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(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(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(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(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(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 +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 +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([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(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(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 +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 +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(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(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 +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(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(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(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(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(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(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(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 +PASS XMLDocument interface object name +PASS XMLDocument interface: existence and properties of interface prototype object +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 +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(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(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(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(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(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(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(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 +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 +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([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(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(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 +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 +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(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(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 +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(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(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(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(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(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(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(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 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(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 +PASS DocumentType interface: existence and properties of interface object +PASS DocumentType interface object length +PASS DocumentType interface object name +PASS DocumentType interface: existence and properties of interface prototype object +PASS DocumentType interface: existence and properties of interface prototype object's "constructor" property +PASS DocumentType interface: attribute name +PASS DocumentType interface: attribute publicId +PASS DocumentType interface: attribute systemId +PASS DocumentType interface: operation before([object Object],[object Object]) +PASS DocumentType interface: operation after([object Object],[object Object]) +PASS DocumentType interface: operation replaceWith([object Object],[object Object]) +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 +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([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([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 +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 +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(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(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 +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(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(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(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(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(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(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(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 +PASS DocumentFragment interface object name +PASS DocumentFragment interface: existence and properties of interface prototype object +PASS DocumentFragment interface: existence and properties of interface prototype object's "constructor" property +PASS DocumentFragment interface: operation getElementById(DOMString) +PASS DocumentFragment interface: attribute children +PASS DocumentFragment interface: attribute firstElementChild +PASS DocumentFragment interface: attribute lastElementChild +PASS DocumentFragment interface: attribute childElementCount +PASS DocumentFragment interface: operation prepend([object Object],[object Object]) +PASS DocumentFragment interface: operation append([object Object],[object Object]) +PASS DocumentFragment interface: operation querySelector(DOMString) +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(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 +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([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(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(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 +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 +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(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(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 +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(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(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(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(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(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(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(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 +PASS ShadowRoot interface object name +PASS ShadowRoot interface: existence and properties of interface prototype object +PASS ShadowRoot interface: existence and properties of interface prototype object's "constructor" property +PASS ShadowRoot interface: attribute mode +PASS ShadowRoot interface: attribute host +PASS Element interface: existence and properties of interface object +PASS Element interface object length +PASS Element interface object name +PASS Element interface: existence and properties of interface prototype object +PASS Element interface: existence and properties of interface prototype object's "constructor" property +PASS Element interface: attribute namespaceURI +PASS Element interface: attribute prefix +PASS Element interface: attribute localName +PASS Element interface: attribute tagName +PASS Element interface: attribute id +PASS Element interface: attribute className +PASS Element interface: attribute classList +PASS Element interface: attribute slot +PASS Element interface: operation hasAttributes() +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 removeAttribute(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 getAttributeNode(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) +PASS Element interface: operation attachShadow(ShadowRootInit) +PASS Element interface: attribute shadowRoot +PASS Element interface: operation closest(DOMString) +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 getElementsByClassName(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 +PASS Element interface: attribute childElementCount +PASS Element interface: operation prepend([object Object],[object Object]) +PASS Element interface: operation append([object Object],[object Object]) +PASS Element interface: operation querySelector(DOMString) +PASS Element interface: operation querySelectorAll(DOMString) +PASS Element interface: attribute previousElementSibling +PASS Element interface: attribute nextElementSibling +PASS Element interface: operation before([object Object],[object Object]) +PASS Element interface: operation after([object Object],[object Object]) +PASS Element interface: operation replaceWith([object Object],[object Object]) +PASS Element interface: operation remove() +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 +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(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(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(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(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(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(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(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 +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(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(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(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(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(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([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(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(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 +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([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([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 +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 +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(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(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 +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(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(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(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(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(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(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(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 +PASS NamedNodeMap interface object name +PASS NamedNodeMap interface: existence and properties of interface prototype object +PASS NamedNodeMap interface: existence and properties of interface prototype object's "constructor" property +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 setNamedItem(Attr) +PASS NamedNodeMap interface: operation setNamedItemNS(Attr) +PASS NamedNodeMap interface: operation removeNamedItem(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 +PASS Attr interface: existence and properties of interface prototype object +PASS Attr interface: existence and properties of interface prototype object's "constructor" property +PASS Attr interface: attribute namespaceURI +PASS Attr interface: attribute prefix +PASS Attr interface: attribute localName +PASS Attr interface: attribute name +PASS Attr interface: attribute value +PASS Attr interface: attribute ownerElement +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 +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 +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(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(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 +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(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(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(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(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(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(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(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 +PASS CharacterData interface object name +PASS CharacterData interface: existence and properties of interface prototype object +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 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: attribute previousElementSibling +PASS CharacterData interface: attribute nextElementSibling +PASS CharacterData interface: operation before([object Object],[object Object]) +PASS CharacterData interface: operation after([object Object],[object Object]) +PASS CharacterData interface: operation replaceWith([object Object],[object Object]) +PASS CharacterData interface: operation remove() +PASS Text interface: existence and properties of interface object +PASS Text interface object length +PASS Text interface object name +PASS Text interface: existence and properties of interface prototype object +PASS Text interface: existence and properties of interface prototype object's "constructor" property +PASS Text interface: operation splitText(unsigned long) +PASS Text interface: attribute wholeText +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(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 +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(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([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([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 +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 +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(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(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 +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(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(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(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(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(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(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(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 +PASS CDATASection interface object name +PASS CDATASection interface: existence and properties of interface prototype object +PASS CDATASection interface: existence and properties of interface prototype object's "constructor" property +PASS ProcessingInstruction interface: existence and properties of interface object +PASS ProcessingInstruction interface object length +PASS ProcessingInstruction interface object name +PASS ProcessingInstruction interface: existence and properties of interface prototype object +PASS ProcessingInstruction interface: existence and properties of interface prototype object's "constructor" property +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 +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(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([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([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 +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 +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(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(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 +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(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(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(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(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(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(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(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 +PASS Comment interface object name +PASS Comment interface: existence and properties of interface prototype object +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 +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(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([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([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 +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 +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(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(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 +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(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(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(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(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(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(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(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 +PASS Range interface object name +PASS Range interface: existence and properties of interface prototype object +PASS Range interface: existence and properties of interface prototype object's "constructor" property +PASS Range interface: attribute startContainer +PASS Range interface: attribute startOffset +PASS Range interface: attribute endContainer +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 setStartBefore(Node) +PASS Range interface: operation setStartAfter(Node) +PASS Range interface: operation setEndBefore(Node) +PASS Range interface: operation setEndAfter(Node) +PASS Range interface: operation collapse(boolean) +PASS Range interface: operation selectNode(Node) +PASS Range interface: operation selectNodeContents(Node) +PASS Range interface: constant START_TO_START on interface object +PASS Range interface: constant START_TO_START on interface prototype object +PASS Range interface: constant START_TO_END on interface object +PASS Range interface: constant START_TO_END on interface prototype object +PASS Range interface: constant END_TO_END on interface object +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 deleteContents() +PASS Range interface: operation extractContents() +PASS Range interface: operation cloneContents() +PASS Range interface: operation insertNode(Node) +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 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 +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(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(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(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(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(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(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 +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(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 +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 +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(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(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(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(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(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(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 +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(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 +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 +PASS NodeIterator interface object name +PASS NodeIterator interface: existence and properties of interface prototype object +PASS NodeIterator interface: existence and properties of interface prototype object's "constructor" property +PASS NodeIterator interface: attribute root +PASS NodeIterator interface: attribute referenceNode +PASS NodeIterator interface: attribute pointerBeforeReferenceNode +PASS NodeIterator interface: attribute whatToShow +PASS NodeIterator interface: attribute filter +PASS NodeIterator interface: operation nextNode() +PASS NodeIterator interface: operation previousNode() +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 +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 +PASS TreeWalker interface: existence and properties of interface prototype object +PASS TreeWalker interface: existence and properties of interface prototype object's "constructor" property +PASS TreeWalker interface: attribute root +PASS TreeWalker interface: attribute whatToShow +PASS TreeWalker interface: attribute filter +PASS TreeWalker interface: attribute currentNode +PASS TreeWalker interface: operation parentNode() +PASS TreeWalker interface: operation firstChild() +PASS TreeWalker interface: operation lastChild() +PASS TreeWalker interface: operation previousSibling() +PASS TreeWalker interface: operation nextSibling() +PASS TreeWalker interface: operation previousNode() +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 +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 +PASS NodeFilter interface: existence and properties of interface prototype object's "constructor" property +PASS NodeFilter interface: constant FILTER_ACCEPT on interface object +PASS NodeFilter interface: constant FILTER_ACCEPT on interface prototype object +PASS NodeFilter interface: constant FILTER_REJECT on interface object +PASS NodeFilter interface: constant FILTER_REJECT on interface prototype object +PASS NodeFilter interface: constant FILTER_SKIP on interface object +PASS NodeFilter interface: constant FILTER_SKIP on interface prototype object +PASS NodeFilter interface: constant SHOW_ALL on interface object +PASS NodeFilter interface: constant SHOW_ALL on interface prototype object +PASS NodeFilter interface: constant SHOW_ELEMENT on interface object +PASS NodeFilter interface: constant SHOW_ELEMENT on interface prototype object +PASS NodeFilter interface: constant SHOW_ATTRIBUTE on interface object +PASS NodeFilter interface: constant SHOW_ATTRIBUTE on interface prototype object +PASS NodeFilter interface: constant SHOW_TEXT on interface object +PASS NodeFilter interface: constant SHOW_TEXT on interface prototype object +PASS NodeFilter interface: constant SHOW_CDATA_SECTION on interface object +PASS NodeFilter interface: constant SHOW_CDATA_SECTION on interface prototype object +PASS NodeFilter interface: constant SHOW_ENTITY_REFERENCE on interface object +PASS NodeFilter interface: constant SHOW_ENTITY_REFERENCE on interface prototype object +PASS NodeFilter interface: constant SHOW_ENTITY on interface object +PASS NodeFilter interface: constant SHOW_ENTITY on interface prototype object +PASS NodeFilter interface: constant SHOW_PROCESSING_INSTRUCTION on interface object +PASS NodeFilter interface: constant SHOW_PROCESSING_INSTRUCTION on interface prototype object +PASS NodeFilter interface: constant SHOW_COMMENT on interface object +PASS NodeFilter interface: constant SHOW_COMMENT on interface prototype object +PASS NodeFilter interface: constant SHOW_DOCUMENT on interface object +PASS NodeFilter interface: constant SHOW_DOCUMENT on interface prototype object +PASS NodeFilter interface: constant SHOW_DOCUMENT_TYPE on interface object +PASS NodeFilter interface: constant SHOW_DOCUMENT_TYPE on interface prototype object +PASS NodeFilter interface: constant SHOW_DOCUMENT_FRAGMENT on interface object +PASS NodeFilter interface: constant SHOW_DOCUMENT_FRAGMENT on interface prototype object +PASS NodeFilter interface: constant SHOW_NOTATION on interface object +PASS NodeFilter interface: constant SHOW_NOTATION on interface prototype object +PASS NodeFilter interface: operation acceptNode(Node) +PASS DOMTokenList interface: existence and properties of interface object +PASS DOMTokenList interface object length +PASS DOMTokenList interface object name +PASS DOMTokenList interface: existence and properties of interface prototype object +PASS DOMTokenList interface: existence and properties of interface prototype object's "constructor" property +PASS DOMTokenList interface: attribute length +PASS DOMTokenList interface: operation item(unsigned long) +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 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 +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(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(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(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(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 Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encrypted-media/idlharness.https.html b/third_party/WebKit/LayoutTests/external/wpt/encrypted-media/idlharness.https.html index e65ad5e3..e7e035e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/encrypted-media/idlharness.https.html +++ b/third_party/WebKit/LayoutTests/external/wpt/encrypted-media/idlharness.https.html
@@ -30,9 +30,7 @@ .then( function( idls ) { var idl_array = new IdlArray(); - idl_array.add_untested_idls("[PrimaryGlobal] interface Window {};"); idl_array.add_untested_idls("interface Navigator {};"); - idl_array.add_untested_idls("interface ArrayBuffer {};"); idl_array.add_untested_idls("interface HTMLMediaElement {};"); idl_array.add_untested_idls("interface Event {};"); idl_array.add_untested_idls("interface EventTarget {};");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/request/request-idl.html b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/request/request-idl.html index f78f0ca..f783377 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/request/request-idl.html +++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/request/request-idl.html
@@ -15,9 +15,7 @@ typedef any JSON; typedef (Blob or BufferSource or FormData or URLSearchParams or USVString) BodyInit; - [NoInterfaceObject, - Exposed=(Window,Worker)] - interface Body { + interface mixin Body { readonly attribute ReadableStream? body; readonly attribute boolean bodyUsed; [NewObject] Promise<ArrayBuffer> arrayBuffer(); @@ -48,7 +46,7 @@ [NewObject] Request clone(); }; - Request implements Body; + Request includes Body; dictionary RequestInit { ByteString method;
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/response/response-idl.html b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/response/response-idl.html index 3bbf54e..bd265fa 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/response/response-idl.html +++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/response/response-idl.html
@@ -15,9 +15,7 @@ typedef any JSON; typedef (Blob or BufferSource or FormData or URLSearchParams or USVString) BodyInit; - [NoInterfaceObject, - Exposed=(Window,Worker)] - interface Body { + interface mixin Body { readonly attribute ReadableStream? body; readonly attribute boolean bodyUsed; [NewObject] Promise<ArrayBuffer> arrayBuffer(); @@ -45,7 +43,7 @@ [NewObject] Response clone(); }; - Response implements Body; + Response includes Body; dictionary ResponseInit { unsigned short status = 200;
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 1fd50f1..341d80b3 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/fullscreen/interfaces-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/fullscreen/interfaces-expected.txt
@@ -1,4 +1,23 @@ This is a testharness.js-based test. -FAIL Test driver promise_test: Unhandled rejection with value: "NonElementParentNode: interface mixin not yet supported" +PASS Test driver +FAIL Document interface: attribute fullscreenEnabled assert_equals: setter must be function for PutForwards, Replaceable, or non-readonly attributes expected "function" but got "undefined" +FAIL Document interface: attribute fullscreen assert_true: The prototype object must have a property "fullscreen" expected true got false +FAIL Document interface: operation exitFullscreen() assert_unreached: Throws "TypeError: Illegal invocation" instead of rejecting promise Reached unreachable code +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 +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 +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/generic-sensor/idlharness.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/generic-sensor/idlharness.https-expected.txt deleted file mode 100644 index 6038252..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/generic-sensor/idlharness.https-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL Test IDL implementation of Generic Sensor promise_test: Unhandled rejection with value: "NonElementParentNode: interface mixin not yet supported" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/gyroscope/idlharness.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/gyroscope/idlharness.https-expected.txt deleted file mode 100644 index f864d4e6..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/gyroscope/idlharness.https-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL Test IDL implementation of Gyroscope Sensor promise_test: Unhandled rejection with value: "NonElementParentNode: interface mixin not yet supported" -Harness: the test ran to completion. -
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 1fd50f1..2f15fa99 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
@@ -1,4 +1,5295 @@ This is a testharness.js-based test. -FAIL Test driver promise_test: Unhandled rejection with value: "NonElementParentNode: interface mixin not yet supported" +Found 5287 tests; 5165 PASS, 122 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS Test driver +PASS Document interface: attribute domain +PASS Document interface: attribute referrer +PASS Document interface: attribute cookie +PASS Document interface: attribute lastModified +PASS Document interface: attribute readyState +PASS Document interface: attribute title +PASS Document interface: attribute dir +PASS Document interface: attribute body +PASS Document interface: attribute head +PASS Document interface: attribute images +PASS Document interface: attribute embeds +PASS Document interface: attribute plugins +PASS Document interface: attribute links +PASS Document interface: attribute forms +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 close() +PASS Document interface: operation write(DOMString) +PASS Document interface: operation writeln(DOMString) +PASS Document interface: attribute defaultView +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 queryCommandEnabled(DOMString) +PASS Document interface: operation queryCommandIndeterm(DOMString) +PASS Document interface: operation queryCommandState(DOMString) +PASS Document interface: operation queryCommandSupported(DOMString) +PASS Document interface: operation queryCommandValue(DOMString) +PASS Document interface: attribute onreadystatechange +PASS Document interface: attribute fgColor +PASS Document interface: attribute linkColor +PASS Document interface: attribute vlinkColor +PASS Document interface: attribute alinkColor +PASS Document interface: attribute bgColor +PASS Document interface: attribute anchors +PASS Document interface: attribute applets +PASS Document interface: operation clear() +PASS Document interface: operation captureEvents() +PASS Document interface: operation releaseEvents() +FAIL Document interface: attribute all assert_equals: setter must be undefined for readonly attributes expected (undefined) undefined but got (function) function "function () { [native code] }" +PASS Document interface: attribute onabort +PASS Document interface: attribute onauxclick +PASS Document interface: attribute onblur +PASS Document interface: attribute oncancel +PASS Document interface: attribute oncanplay +PASS Document interface: attribute oncanplaythrough +PASS Document interface: attribute onchange +PASS Document interface: attribute onclick +PASS Document interface: attribute onclose +PASS Document interface: attribute oncontextmenu +PASS Document interface: attribute oncuechange +PASS Document interface: attribute ondblclick +PASS Document interface: attribute ondrag +PASS Document interface: attribute ondragend +PASS Document interface: attribute ondragenter +FAIL Document interface: attribute ondragexit assert_true: The prototype object must have a property "ondragexit" expected true got false +PASS Document interface: attribute ondragleave +PASS Document interface: attribute ondragover +PASS Document interface: attribute ondragstart +PASS Document interface: attribute ondrop +PASS Document interface: attribute ondurationchange +PASS Document interface: attribute onemptied +PASS Document interface: attribute onended +PASS Document interface: attribute onerror +PASS Document interface: attribute onfocus +PASS Document interface: attribute oninput +PASS Document interface: attribute oninvalid +PASS Document interface: attribute onkeydown +PASS Document interface: attribute onkeypress +PASS Document interface: attribute onkeyup +PASS Document interface: attribute onload +PASS Document interface: attribute onloadeddata +PASS Document interface: attribute onloadedmetadata +FAIL Document interface: attribute onloadend assert_true: The prototype object must have a property "onloadend" expected true got false +PASS Document interface: attribute onloadstart +PASS Document interface: attribute onmousedown +PASS Document interface: attribute onmouseenter +PASS Document interface: attribute onmouseleave +PASS Document interface: attribute onmousemove +PASS Document interface: attribute onmouseout +PASS Document interface: attribute onmouseover +PASS Document interface: attribute onmouseup +PASS Document interface: attribute onwheel +PASS Document interface: attribute onpause +PASS Document interface: attribute onplay +PASS Document interface: attribute onplaying +PASS Document interface: attribute onprogress +PASS Document interface: attribute onratechange +PASS Document interface: attribute onreset +PASS Document interface: attribute onresize +PASS Document interface: attribute onscroll +PASS Document interface: attribute onsecuritypolicyviolation +PASS Document interface: attribute onseeked +PASS Document interface: attribute onseeking +PASS Document interface: attribute onselect +PASS Document interface: attribute onstalled +PASS Document interface: attribute onsubmit +PASS Document interface: attribute onsuspend +PASS Document interface: attribute ontimeupdate +PASS Document interface: attribute ontoggle +PASS Document interface: attribute onvolumechange +PASS Document interface: attribute onwaiting +PASS Document interface: attribute oncopy +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 +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 +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(DOMString)" with the proper type +PASS Document interface: calling writeln(DOMString) on iframe.contentDocument with too few arguments must throw TypeError +FAIL Document interface: iframe.contentDocument must inherit property "defaultView" with the proper type Unrecognized type WindowProxy +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(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(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(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(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 +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 "onsecuritypolicyviolation" 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 +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 +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(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 +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(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(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(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(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 +PASS Document interface: new Document() must inherit property "fgColor" with the proper type +PASS Document interface: new Document() must inherit property "linkColor" with the proper type +PASS Document interface: new Document() must inherit property "vlinkColor" with the proper type +PASS Document interface: new Document() must inherit property "alinkColor" with the proper type +PASS Document interface: new Document() must inherit property "bgColor" with the proper type +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 +PASS Document interface: new Document() must inherit property "clear()" with the proper type +PASS Document interface: new Document() must inherit property "captureEvents()" with the proper type +PASS Document interface: new Document() must inherit property "releaseEvents()" with the proper type +FAIL Document interface: new Document() 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: 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 "onsecuritypolicyviolation" 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 +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 +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(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 +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(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(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(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(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 +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "fgColor" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "linkColor" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "vlinkColor" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "alinkColor" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "bgColor" with the proper type +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 +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "clear()" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "captureEvents()" with the proper type +PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "releaseEvents()" with the proper type +FAIL Document interface: document.implementation.createDocument(null, "", null) 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: 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 "onsecuritypolicyviolation" 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 HTMLAllCollection interface: existence and properties of interface object +PASS HTMLAllCollection interface object length +PASS HTMLAllCollection interface object name +PASS HTMLAllCollection interface: existence and properties of interface prototype object +PASS HTMLAllCollection interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLAllCollection interface: attribute length +PASS HTMLAllCollection interface: operation namedItem(DOMString) +PASS HTMLAllCollection interface: operation item(DOMString) +FAIL HTMLAllCollection must be primary interface of document.all assert_equals: wrong typeof object expected "object" but got "undefined" +FAIL Stringification of document.all assert_equals: wrong typeof object expected "object" but got "undefined" +FAIL HTMLAllCollection interface: document.all must inherit property "length" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" +FAIL HTMLAllCollection interface: document.all must inherit property "namedItem(DOMString)" with the proper type assert_equals: wrong typeof object expected "object" 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 "object" but got "undefined" +FAIL HTMLAllCollection interface: document.all must inherit property "item(DOMString)" with the proper type assert_equals: wrong typeof object expected "object" 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 "object" but got "undefined" +PASS HTMLFormControlsCollection interface: existence and properties of interface object +PASS HTMLFormControlsCollection interface object length +PASS HTMLFormControlsCollection interface object name +PASS HTMLFormControlsCollection interface: existence and properties of interface prototype object +PASS HTMLFormControlsCollection interface: existence and properties of interface prototype object's "constructor" property +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(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 +PASS RadioNodeList interface object name +PASS RadioNodeList interface: existence and properties of interface prototype object +PASS RadioNodeList interface: existence and properties of interface prototype object's "constructor" property +PASS RadioNodeList interface: attribute value +PASS HTMLOptionsCollection interface: existence and properties of interface object +PASS HTMLOptionsCollection interface object length +PASS HTMLOptionsCollection interface object name +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 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 +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 +PASS DOMStringList interface: existence and properties of interface object +PASS DOMStringList interface object length +PASS DOMStringList interface object name +PASS DOMStringList interface: existence and properties of interface prototype object +PASS DOMStringList interface: existence and properties of interface prototype object's "constructor" property +PASS DOMStringList interface: attribute length +PASS DOMStringList interface: operation item(unsigned long) +PASS DOMStringList interface: operation contains(DOMString) +PASS HTMLElement interface: existence and properties of interface object +PASS HTMLElement interface object length +PASS HTMLElement interface object name +PASS HTMLElement interface: existence and properties of interface prototype object +PASS HTMLElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLElement interface: attribute title +PASS HTMLElement interface: attribute lang +PASS HTMLElement interface: attribute translate +PASS HTMLElement interface: attribute dir +PASS HTMLElement interface: attribute dataset +PASS HTMLElement interface: attribute hidden +PASS HTMLElement interface: operation click() +PASS HTMLElement interface: attribute tabIndex +PASS HTMLElement interface: operation focus(FocusOptions) +PASS HTMLElement interface: operation blur() +PASS HTMLElement interface: attribute accessKey +FAIL HTMLElement interface: attribute accessKeyLabel assert_true: The prototype object must have a property "accessKeyLabel" expected true got false +PASS HTMLElement interface: attribute draggable +PASS HTMLElement interface: attribute spellcheck +PASS HTMLElement interface: attribute innerText +PASS HTMLElement interface: attribute onabort +PASS HTMLElement interface: attribute onauxclick +PASS HTMLElement interface: attribute onblur +PASS HTMLElement interface: attribute oncancel +PASS HTMLElement interface: attribute oncanplay +PASS HTMLElement interface: attribute oncanplaythrough +PASS HTMLElement interface: attribute onchange +PASS HTMLElement interface: attribute onclick +PASS HTMLElement interface: attribute onclose +PASS HTMLElement interface: attribute oncontextmenu +PASS HTMLElement interface: attribute oncuechange +PASS HTMLElement interface: attribute ondblclick +PASS HTMLElement interface: attribute ondrag +PASS HTMLElement interface: attribute ondragend +PASS HTMLElement interface: attribute ondragenter +FAIL HTMLElement interface: attribute ondragexit assert_true: The prototype object must have a property "ondragexit" expected true got false +PASS HTMLElement interface: attribute ondragleave +PASS HTMLElement interface: attribute ondragover +PASS HTMLElement interface: attribute ondragstart +PASS HTMLElement interface: attribute ondrop +PASS HTMLElement interface: attribute ondurationchange +PASS HTMLElement interface: attribute onemptied +PASS HTMLElement interface: attribute onended +PASS HTMLElement interface: attribute onerror +PASS HTMLElement interface: attribute onfocus +PASS HTMLElement interface: attribute oninput +PASS HTMLElement interface: attribute oninvalid +PASS HTMLElement interface: attribute onkeydown +PASS HTMLElement interface: attribute onkeypress +PASS HTMLElement interface: attribute onkeyup +PASS HTMLElement interface: attribute onload +PASS HTMLElement interface: attribute onloadeddata +PASS HTMLElement interface: attribute onloadedmetadata +FAIL HTMLElement interface: attribute onloadend assert_true: The prototype object must have a property "onloadend" expected true got false +PASS HTMLElement interface: attribute onloadstart +PASS HTMLElement interface: attribute onmousedown +PASS HTMLElement interface: attribute onmouseenter +PASS HTMLElement interface: attribute onmouseleave +PASS HTMLElement interface: attribute onmousemove +PASS HTMLElement interface: attribute onmouseout +PASS HTMLElement interface: attribute onmouseover +PASS HTMLElement interface: attribute onmouseup +PASS HTMLElement interface: attribute onwheel +PASS HTMLElement interface: attribute onpause +PASS HTMLElement interface: attribute onplay +PASS HTMLElement interface: attribute onplaying +PASS HTMLElement interface: attribute onprogress +PASS HTMLElement interface: attribute onratechange +PASS HTMLElement interface: attribute onreset +PASS HTMLElement interface: attribute onresize +PASS HTMLElement interface: attribute onscroll +FAIL HTMLElement interface: attribute onsecuritypolicyviolation assert_true: The prototype object must have a property "onsecuritypolicyviolation" expected true got false +PASS HTMLElement interface: attribute onseeked +PASS HTMLElement interface: attribute onseeking +PASS HTMLElement interface: attribute onselect +PASS HTMLElement interface: attribute onstalled +PASS HTMLElement interface: attribute onsubmit +PASS HTMLElement interface: attribute onsuspend +PASS HTMLElement interface: attribute ontimeupdate +PASS HTMLElement interface: attribute ontoggle +PASS HTMLElement interface: attribute onvolumechange +PASS HTMLElement interface: attribute onwaiting +FAIL HTMLElement interface: attribute oncopy assert_own_property: expected property "oncopy" missing +FAIL HTMLElement interface: attribute oncut assert_own_property: expected property "oncut" missing +FAIL HTMLElement interface: attribute onpaste assert_own_property: expected property "onpaste" missing +PASS HTMLElement interface: attribute contentEditable +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 +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(FocusOptions)" with the proper type +PASS HTMLElement interface: calling focus(FocusOptions) on document.createElement("noscript") with too few arguments must throw TypeError +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 +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 +FAIL HTMLElement interface: document.createElement("noscript") must inherit property "onsecuritypolicyviolation" with the proper type assert_inherits: property "onsecuritypolicyviolation" not found in prototype chain +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 +PASS HTMLUnknownElement interface: existence and properties of interface prototype object +PASS HTMLUnknownElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLUnknownElement must be primary interface of document.createElement("bgsound") +PASS Stringification of document.createElement("bgsound") +PASS DOMStringMap interface: existence and properties of interface object +PASS DOMStringMap interface object length +PASS DOMStringMap interface object name +PASS DOMStringMap interface: existence and properties of interface prototype object +PASS DOMStringMap interface: existence and properties of interface prototype object's "constructor" property +PASS DOMStringMap must be primary interface of document.head.dataset +PASS Stringification of document.head.dataset +PASS HTMLHtmlElement interface: existence and properties of interface object +PASS HTMLHtmlElement interface object length +PASS HTMLHtmlElement interface object name +PASS HTMLHtmlElement interface: existence and properties of interface prototype object +PASS HTMLHtmlElement interface: existence and properties of interface prototype object's "constructor" property +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 +PASS HTMLHeadElement interface: existence and properties of interface object +PASS HTMLHeadElement interface object length +PASS HTMLHeadElement interface object name +PASS HTMLHeadElement interface: existence and properties of interface prototype object +PASS HTMLHeadElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLHeadElement must be primary interface of document.createElement("head") +PASS Stringification of document.createElement("head") +PASS HTMLTitleElement interface: existence and properties of interface object +PASS HTMLTitleElement interface object length +PASS HTMLTitleElement interface object name +PASS HTMLTitleElement interface: existence and properties of interface prototype object +PASS HTMLTitleElement interface: existence and properties of interface prototype object's "constructor" property +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 +PASS HTMLBaseElement interface: existence and properties of interface object +PASS HTMLBaseElement interface object length +PASS HTMLBaseElement interface object name +PASS HTMLBaseElement interface: existence and properties of interface prototype object +PASS HTMLBaseElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLBaseElement interface: attribute href +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 +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 +PASS HTMLLinkElement interface: existence and properties of interface prototype object +PASS HTMLLinkElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLLinkElement interface: attribute href +PASS HTMLLinkElement interface: attribute crossOrigin +PASS HTMLLinkElement interface: attribute rel +PASS HTMLLinkElement interface: attribute as +PASS HTMLLinkElement interface: attribute relList +PASS HTMLLinkElement interface: attribute media +FAIL HTMLLinkElement interface: attribute nonce assert_own_property: expected property "nonce" missing +PASS HTMLLinkElement interface: attribute integrity +PASS HTMLLinkElement interface: attribute hreflang +PASS HTMLLinkElement interface: attribute type +PASS HTMLLinkElement interface: attribute sizes +PASS HTMLLinkElement interface: attribute referrerPolicy +FAIL HTMLLinkElement interface: attribute workerType assert_true: The prototype object must have a property "workerType" expected true got false +FAIL HTMLLinkElement interface: attribute updateViaCache assert_true: The prototype object must have a property "updateViaCache" expected true got false +PASS HTMLLinkElement interface: attribute charset +PASS HTMLLinkElement interface: attribute rev +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 +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 +FAIL HTMLLinkElement interface: document.createElement("link") must inherit property "workerType" with the proper type assert_inherits: property "workerType" not found in prototype chain +FAIL HTMLLinkElement interface: document.createElement("link") must inherit property "updateViaCache" with the proper type assert_inherits: property "updateViaCache" not found in prototype chain +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 +PASS HTMLMetaElement interface: existence and properties of interface prototype object +PASS HTMLMetaElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLMetaElement interface: attribute name +PASS HTMLMetaElement interface: attribute httpEquiv +PASS HTMLMetaElement interface: attribute content +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 +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 +PASS HTMLStyleElement interface: existence and properties of interface prototype object +PASS HTMLStyleElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLStyleElement interface: attribute media +FAIL HTMLStyleElement interface: attribute nonce assert_own_property: expected property "nonce" missing +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 +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 +PASS HTMLBodyElement interface: existence and properties of interface prototype object +PASS HTMLBodyElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLBodyElement interface: attribute text +PASS HTMLBodyElement interface: attribute link +PASS HTMLBodyElement interface: attribute vLink +PASS HTMLBodyElement interface: attribute aLink +PASS HTMLBodyElement interface: attribute bgColor +PASS HTMLBodyElement interface: attribute background +PASS HTMLBodyElement interface: attribute onafterprint +PASS HTMLBodyElement interface: attribute onbeforeprint +PASS HTMLBodyElement interface: attribute onbeforeunload +PASS HTMLBodyElement interface: attribute onhashchange +PASS HTMLBodyElement interface: attribute onlanguagechange +PASS HTMLBodyElement interface: attribute onmessage +PASS HTMLBodyElement interface: attribute onmessageerror +PASS HTMLBodyElement interface: attribute onoffline +PASS HTMLBodyElement interface: attribute ononline +PASS HTMLBodyElement interface: attribute onpagehide +PASS HTMLBodyElement interface: attribute onpageshow +PASS HTMLBodyElement interface: attribute onpopstate +PASS HTMLBodyElement interface: attribute onrejectionhandled +PASS HTMLBodyElement interface: attribute onstorage +PASS HTMLBodyElement interface: attribute onunhandledrejection +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 +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 +PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onafterprint" with the proper type +PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onbeforeprint" with the proper type +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 +PASS HTMLHeadingElement interface: existence and properties of interface prototype object +PASS HTMLHeadingElement interface: existence and properties of interface prototype object's "constructor" property +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 +PASS HTMLParagraphElement interface: existence and properties of interface object +PASS HTMLParagraphElement interface object length +PASS HTMLParagraphElement interface object name +PASS HTMLParagraphElement interface: existence and properties of interface prototype object +PASS HTMLParagraphElement interface: existence and properties of interface prototype object's "constructor" property +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 +PASS HTMLHRElement interface: existence and properties of interface object +PASS HTMLHRElement interface object length +PASS HTMLHRElement interface object name +PASS HTMLHRElement interface: existence and properties of interface prototype object +PASS HTMLHRElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLHRElement interface: attribute align +PASS HTMLHRElement interface: attribute color +PASS HTMLHRElement interface: attribute noShade +PASS HTMLHRElement interface: attribute size +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 +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 +PASS HTMLPreElement interface: existence and properties of interface prototype object +PASS HTMLPreElement interface: existence and properties of interface prototype object's "constructor" property +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 +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 +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 +PASS HTMLQuoteElement interface: existence and properties of interface object +PASS HTMLQuoteElement interface object length +PASS HTMLQuoteElement interface object name +PASS HTMLQuoteElement interface: existence and properties of interface prototype object +PASS HTMLQuoteElement interface: existence and properties of interface prototype object's "constructor" property +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 +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 +PASS HTMLOListElement interface: existence and properties of interface object +PASS HTMLOListElement interface object length +PASS HTMLOListElement interface object name +PASS HTMLOListElement interface: existence and properties of interface prototype object +PASS HTMLOListElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLOListElement interface: attribute reversed +PASS HTMLOListElement interface: attribute start +PASS HTMLOListElement interface: attribute type +PASS HTMLOListElement interface: attribute compact +PASS HTMLUListElement interface: existence and properties of interface object +PASS HTMLUListElement interface object length +PASS HTMLUListElement interface object name +PASS HTMLUListElement interface: existence and properties of interface prototype object +PASS HTMLUListElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLUListElement interface: attribute compact +PASS HTMLUListElement interface: attribute type +PASS HTMLMenuElement interface: existence and properties of interface object +PASS HTMLMenuElement interface object length +PASS HTMLMenuElement interface object name +PASS HTMLMenuElement interface: existence and properties of interface prototype object +PASS HTMLMenuElement interface: existence and properties of interface prototype object's "constructor" property +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 +PASS HTMLLIElement interface: existence and properties of interface object +PASS HTMLLIElement interface object length +PASS HTMLLIElement interface object name +PASS HTMLLIElement interface: existence and properties of interface prototype object +PASS HTMLLIElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLLIElement interface: attribute value +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 +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 +PASS HTMLDListElement interface: existence and properties of interface prototype object +PASS HTMLDListElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLDListElement interface: attribute compact +PASS HTMLDivElement interface: existence and properties of interface object +PASS HTMLDivElement interface object length +PASS HTMLDivElement interface object name +PASS HTMLDivElement interface: existence and properties of interface prototype object +PASS HTMLDivElement interface: existence and properties of interface prototype object's "constructor" property +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 +PASS HTMLAnchorElement interface: existence and properties of interface object +PASS HTMLAnchorElement interface object length +PASS HTMLAnchorElement interface object name +PASS HTMLAnchorElement interface: existence and properties of interface prototype object +PASS HTMLAnchorElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLAnchorElement interface: attribute target +PASS HTMLAnchorElement interface: attribute download +PASS HTMLAnchorElement interface: attribute ping +PASS HTMLAnchorElement interface: attribute rel +FAIL HTMLAnchorElement interface: attribute relList assert_true: The prototype object must have a property "relList" expected true got false +PASS HTMLAnchorElement interface: attribute hreflang +PASS HTMLAnchorElement interface: attribute type +PASS HTMLAnchorElement interface: attribute text +PASS HTMLAnchorElement interface: attribute referrerPolicy +PASS HTMLAnchorElement interface: attribute coords +PASS HTMLAnchorElement interface: attribute charset +PASS HTMLAnchorElement interface: attribute name +PASS HTMLAnchorElement interface: attribute rev +PASS HTMLAnchorElement interface: attribute shape +PASS HTMLAnchorElement interface: attribute href +PASS HTMLAnchorElement interface: stringifier +PASS HTMLAnchorElement interface: attribute origin +PASS HTMLAnchorElement interface: attribute protocol +PASS HTMLAnchorElement interface: attribute username +PASS HTMLAnchorElement interface: attribute password +PASS HTMLAnchorElement interface: attribute host +PASS HTMLAnchorElement interface: attribute hostname +PASS HTMLAnchorElement interface: attribute port +PASS HTMLAnchorElement interface: attribute pathname +PASS HTMLAnchorElement interface: attribute search +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 +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 +PASS HTMLDataElement interface: existence and properties of interface prototype object +PASS HTMLDataElement interface: existence and properties of interface prototype object's "constructor" property +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 +PASS HTMLTimeElement interface: existence and properties of interface object +PASS HTMLTimeElement interface object length +PASS HTMLTimeElement interface object name +PASS HTMLTimeElement interface: existence and properties of interface prototype object +PASS HTMLTimeElement interface: existence and properties of interface prototype object's "constructor" property +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 +PASS HTMLSpanElement interface: existence and properties of interface object +PASS HTMLSpanElement interface object length +PASS HTMLSpanElement interface object name +PASS HTMLSpanElement interface: existence and properties of interface prototype object +PASS HTMLSpanElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLSpanElement must be primary interface of document.createElement("span") +PASS Stringification of document.createElement("span") +PASS HTMLBRElement interface: existence and properties of interface object +PASS HTMLBRElement interface object length +PASS HTMLBRElement interface object name +PASS HTMLBRElement interface: existence and properties of interface prototype object +PASS HTMLBRElement interface: existence and properties of interface prototype object's "constructor" property +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 +PASS HTMLModElement interface: existence and properties of interface object +PASS HTMLModElement interface object length +PASS HTMLModElement interface object name +PASS HTMLModElement interface: existence and properties of interface prototype object +PASS HTMLModElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLModElement interface: attribute cite +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 +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 +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 +PASS HTMLPictureElement interface: existence and properties of interface prototype object +PASS HTMLPictureElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLPictureElement must be primary interface of document.createElement("picture") +PASS Stringification of document.createElement("picture") +PASS HTMLSourceElement interface: existence and properties of interface object +PASS HTMLSourceElement interface object length +PASS HTMLSourceElement interface object name +PASS HTMLSourceElement interface: existence and properties of interface prototype object +PASS HTMLSourceElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLSourceElement interface: attribute src +PASS HTMLSourceElement interface: attribute type +PASS HTMLSourceElement interface: attribute srcset +PASS HTMLSourceElement interface: attribute sizes +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 +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 HTMLImageElement interface: existence and properties of interface object +PASS HTMLImageElement interface object length +PASS HTMLImageElement interface object name +PASS HTMLImageElement interface: existence and properties of interface prototype object +PASS HTMLImageElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLImageElement interface: attribute alt +PASS HTMLImageElement interface: attribute src +PASS HTMLImageElement interface: attribute srcset +PASS HTMLImageElement interface: attribute sizes +PASS HTMLImageElement interface: attribute crossOrigin +PASS HTMLImageElement interface: attribute useMap +PASS HTMLImageElement interface: attribute isMap +PASS HTMLImageElement interface: attribute width +PASS HTMLImageElement interface: attribute height +PASS HTMLImageElement interface: attribute naturalWidth +PASS HTMLImageElement interface: attribute naturalHeight +PASS HTMLImageElement interface: attribute complete +PASS HTMLImageElement interface: attribute currentSrc +PASS HTMLImageElement interface: attribute referrerPolicy +PASS HTMLImageElement interface: operation decode() +PASS HTMLImageElement interface: attribute name +PASS HTMLImageElement interface: attribute lowsrc +PASS HTMLImageElement interface: attribute align +PASS HTMLImageElement interface: attribute hspace +PASS HTMLImageElement interface: attribute vspace +PASS HTMLImageElement interface: attribute longDesc +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 +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 "decode()" 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 +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 "decode()" 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 +PASS HTMLIFrameElement interface: existence and properties of interface prototype object +PASS HTMLIFrameElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLIFrameElement interface: attribute src +PASS HTMLIFrameElement interface: attribute srcdoc +PASS HTMLIFrameElement interface: attribute name +PASS HTMLIFrameElement interface: attribute sandbox +PASS HTMLIFrameElement interface: attribute allowFullscreen +PASS HTMLIFrameElement interface: attribute allowPaymentRequest +FAIL HTMLIFrameElement interface: attribute allowUserMedia assert_true: The prototype object must have a property "allowUserMedia" expected true got false +PASS HTMLIFrameElement interface: attribute width +PASS HTMLIFrameElement interface: attribute height +PASS HTMLIFrameElement interface: attribute referrerPolicy +PASS HTMLIFrameElement interface: attribute contentDocument +PASS HTMLIFrameElement interface: attribute contentWindow +PASS HTMLIFrameElement interface: operation getSVGDocument() +FAIL HTMLIFrameElement interface: attribute delegateStickyUserActivation assert_true: The prototype object must have a property "delegateStickyUserActivation" expected true got false +PASS HTMLIFrameElement interface: attribute align +PASS HTMLIFrameElement interface: attribute scrolling +PASS HTMLIFrameElement interface: attribute frameBorder +PASS HTMLIFrameElement interface: attribute longDesc +PASS HTMLIFrameElement interface: attribute marginHeight +PASS HTMLIFrameElement interface: attribute marginWidth +PASS HTMLEmbedElement interface: existence and properties of interface object +PASS HTMLEmbedElement interface object length +PASS HTMLEmbedElement interface object name +PASS HTMLEmbedElement interface: existence and properties of interface prototype object +PASS HTMLEmbedElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLEmbedElement interface: attribute src +PASS HTMLEmbedElement interface: attribute type +PASS HTMLEmbedElement interface: attribute width +PASS HTMLEmbedElement interface: attribute height +PASS HTMLEmbedElement interface: operation getSVGDocument() +PASS HTMLEmbedElement interface: attribute align +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 +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 +PASS HTMLObjectElement interface: existence and properties of interface prototype object +PASS HTMLObjectElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLObjectElement interface: attribute data +PASS HTMLObjectElement interface: attribute type +FAIL HTMLObjectElement interface: attribute typeMustMatch assert_true: The prototype object must have a property "typeMustMatch" expected true got false +PASS HTMLObjectElement interface: attribute name +PASS HTMLObjectElement interface: attribute useMap +PASS HTMLObjectElement interface: attribute form +PASS HTMLObjectElement interface: attribute width +PASS HTMLObjectElement interface: attribute height +PASS HTMLObjectElement interface: attribute contentDocument +PASS HTMLObjectElement interface: attribute contentWindow +PASS HTMLObjectElement interface: operation getSVGDocument() +PASS HTMLObjectElement interface: attribute willValidate +PASS HTMLObjectElement interface: attribute validity +PASS HTMLObjectElement interface: attribute validationMessage +PASS HTMLObjectElement interface: operation checkValidity() +PASS HTMLObjectElement interface: operation reportValidity() +PASS HTMLObjectElement interface: operation setCustomValidity(DOMString) +PASS HTMLObjectElement interface: attribute align +PASS HTMLObjectElement interface: attribute archive +PASS HTMLObjectElement interface: attribute code +PASS HTMLObjectElement interface: attribute declare +PASS HTMLObjectElement interface: attribute hspace +PASS HTMLObjectElement interface: attribute standby +PASS HTMLObjectElement interface: attribute vspace +PASS HTMLObjectElement interface: attribute codeBase +PASS HTMLObjectElement interface: attribute codeType +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 +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 "getSVGDocument()" 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 +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 +PASS HTMLParamElement interface: existence and properties of interface prototype object +PASS HTMLParamElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLParamElement interface: attribute name +PASS HTMLParamElement interface: attribute value +PASS HTMLParamElement interface: attribute type +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 +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 +PASS HTMLVideoElement interface: existence and properties of interface prototype object +PASS HTMLVideoElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLVideoElement interface: attribute width +PASS HTMLVideoElement interface: attribute height +PASS HTMLVideoElement interface: attribute videoWidth +PASS HTMLVideoElement interface: attribute videoHeight +PASS HTMLVideoElement interface: attribute poster +FAIL HTMLVideoElement interface: attribute playsInline assert_true: The prototype object must have a property "playsInline" expected true got false +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 +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 +FAIL HTMLVideoElement interface: document.createElement("video") must inherit property "playsInline" with the proper type assert_inherits: property "playsInline" not found in prototype chain +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 +FAIL HTMLMediaElement interface: document.createElement("video") must inherit property "srcObject" with the proper type Unrecognized type MediaStream +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 +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 +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 +PASS HTMLAudioElement interface: existence and properties of interface prototype object +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 +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "src" with the proper type +FAIL HTMLMediaElement interface: document.createElement("audio") must inherit property "srcObject" with the proper type Unrecognized type MediaStream +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 +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 +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 +PASS HTMLMediaElement interface: new Audio() must inherit property "src" with the proper type +FAIL HTMLMediaElement interface: new Audio() must inherit property "srcObject" with the proper type Unrecognized type MediaStream +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 +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 +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 HTMLTrackElement interface: existence and properties of interface object +PASS HTMLTrackElement interface object length +PASS HTMLTrackElement interface object name +PASS HTMLTrackElement interface: existence and properties of interface prototype object +PASS HTMLTrackElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLTrackElement interface: attribute kind +PASS HTMLTrackElement interface: attribute src +PASS HTMLTrackElement interface: attribute srclang +PASS HTMLTrackElement interface: attribute label +PASS HTMLTrackElement interface: attribute default +PASS HTMLTrackElement interface: constant NONE on interface object +PASS HTMLTrackElement interface: constant NONE on interface prototype object +PASS HTMLTrackElement interface: constant LOADING on interface object +PASS HTMLTrackElement interface: constant LOADING on interface prototype object +PASS HTMLTrackElement interface: constant LOADED on interface object +PASS HTMLTrackElement interface: constant LOADED on interface prototype object +PASS HTMLTrackElement interface: constant ERROR on interface object +PASS HTMLTrackElement interface: constant ERROR on interface prototype object +PASS HTMLTrackElement interface: attribute readyState +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 +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 +PASS HTMLMediaElement interface: existence and properties of interface prototype object +PASS HTMLMediaElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLMediaElement interface: attribute error +PASS HTMLMediaElement interface: attribute src +PASS HTMLMediaElement interface: attribute srcObject +PASS HTMLMediaElement interface: attribute currentSrc +PASS HTMLMediaElement interface: attribute crossOrigin +PASS HTMLMediaElement interface: constant NETWORK_EMPTY on interface object +PASS HTMLMediaElement interface: constant NETWORK_EMPTY on interface prototype object +PASS HTMLMediaElement interface: constant NETWORK_IDLE on interface object +PASS HTMLMediaElement interface: constant NETWORK_IDLE on interface prototype object +PASS HTMLMediaElement interface: constant NETWORK_LOADING on interface object +PASS HTMLMediaElement interface: constant NETWORK_LOADING on interface prototype object +PASS HTMLMediaElement interface: constant NETWORK_NO_SOURCE on interface object +PASS HTMLMediaElement interface: constant NETWORK_NO_SOURCE on interface prototype object +PASS HTMLMediaElement interface: attribute networkState +PASS HTMLMediaElement interface: attribute preload +PASS HTMLMediaElement interface: attribute buffered +PASS HTMLMediaElement interface: operation load() +PASS HTMLMediaElement interface: operation canPlayType(DOMString) +PASS HTMLMediaElement interface: constant HAVE_NOTHING on interface object +PASS HTMLMediaElement interface: constant HAVE_NOTHING on interface prototype object +PASS HTMLMediaElement interface: constant HAVE_METADATA on interface object +PASS HTMLMediaElement interface: constant HAVE_METADATA on interface prototype object +PASS HTMLMediaElement interface: constant HAVE_CURRENT_DATA on interface object +PASS HTMLMediaElement interface: constant HAVE_CURRENT_DATA on interface prototype object +PASS HTMLMediaElement interface: constant HAVE_FUTURE_DATA on interface object +PASS HTMLMediaElement interface: constant HAVE_FUTURE_DATA on interface prototype object +PASS HTMLMediaElement interface: constant HAVE_ENOUGH_DATA on interface object +PASS HTMLMediaElement interface: constant HAVE_ENOUGH_DATA on interface prototype object +PASS HTMLMediaElement interface: attribute readyState +PASS HTMLMediaElement interface: attribute seeking +PASS HTMLMediaElement interface: attribute currentTime +FAIL HTMLMediaElement interface: operation fastSeek(double) assert_own_property: interface prototype object missing non-static operation expected property "fastSeek" missing +PASS HTMLMediaElement interface: attribute duration +FAIL HTMLMediaElement interface: operation getStartDate() assert_own_property: interface prototype object missing non-static operation expected property "getStartDate" missing +PASS HTMLMediaElement interface: attribute paused +PASS HTMLMediaElement interface: attribute defaultPlaybackRate +PASS HTMLMediaElement interface: attribute playbackRate +PASS HTMLMediaElement interface: attribute played +PASS HTMLMediaElement interface: attribute seekable +PASS HTMLMediaElement interface: attribute ended +PASS HTMLMediaElement interface: attribute autoplay +PASS HTMLMediaElement interface: attribute loop +PASS HTMLMediaElement interface: operation play() +PASS HTMLMediaElement interface: operation pause() +PASS HTMLMediaElement interface: attribute controls +PASS HTMLMediaElement interface: attribute volume +PASS HTMLMediaElement interface: attribute muted +PASS HTMLMediaElement interface: attribute defaultMuted +PASS HTMLMediaElement interface: attribute audioTracks +PASS HTMLMediaElement interface: attribute videoTracks +PASS HTMLMediaElement interface: attribute textTracks +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 +PASS MediaError interface: existence and properties of interface prototype object +PASS MediaError interface: existence and properties of interface prototype object's "constructor" property +PASS MediaError interface: constant MEDIA_ERR_ABORTED on interface object +PASS MediaError interface: constant MEDIA_ERR_ABORTED on interface prototype object +PASS MediaError interface: constant MEDIA_ERR_NETWORK on interface object +PASS MediaError interface: constant MEDIA_ERR_NETWORK on interface prototype object +PASS MediaError interface: constant MEDIA_ERR_DECODE on interface object +PASS MediaError interface: constant MEDIA_ERR_DECODE on interface prototype object +PASS MediaError interface: constant MEDIA_ERR_SRC_NOT_SUPPORTED on interface object +PASS MediaError interface: constant MEDIA_ERR_SRC_NOT_SUPPORTED on interface prototype object +PASS MediaError interface: attribute code +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 +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 +PASS AudioTrackList interface: existence and properties of interface prototype object +PASS AudioTrackList interface: existence and properties of interface prototype object's "constructor" property +PASS AudioTrackList interface: attribute length +PASS AudioTrackList interface: operation getTrackById(DOMString) +PASS AudioTrackList interface: attribute onchange +PASS AudioTrackList interface: attribute onaddtrack +PASS AudioTrackList interface: attribute onremovetrack +PASS AudioTrack interface: existence and properties of interface object +PASS AudioTrack interface object length +PASS AudioTrack interface object name +PASS AudioTrack interface: existence and properties of interface prototype object +PASS AudioTrack interface: existence and properties of interface prototype object's "constructor" property +PASS AudioTrack interface: attribute id +PASS AudioTrack interface: attribute kind +PASS AudioTrack interface: attribute label +PASS AudioTrack interface: attribute language +PASS AudioTrack interface: attribute enabled +PASS VideoTrackList interface: existence and properties of interface object +PASS VideoTrackList interface object length +PASS VideoTrackList interface object name +PASS VideoTrackList interface: existence and properties of interface prototype object +PASS VideoTrackList interface: existence and properties of interface prototype object's "constructor" property +PASS VideoTrackList interface: attribute length +PASS VideoTrackList interface: operation getTrackById(DOMString) +PASS VideoTrackList interface: attribute selectedIndex +PASS VideoTrackList interface: attribute onchange +PASS VideoTrackList interface: attribute onaddtrack +PASS VideoTrackList interface: attribute onremovetrack +PASS VideoTrack interface: existence and properties of interface object +PASS VideoTrack interface object length +PASS VideoTrack interface object name +PASS VideoTrack interface: existence and properties of interface prototype object +PASS VideoTrack interface: existence and properties of interface prototype object's "constructor" property +PASS VideoTrack interface: attribute id +PASS VideoTrack interface: attribute kind +PASS VideoTrack interface: attribute label +PASS VideoTrack interface: attribute language +PASS VideoTrack interface: attribute selected +PASS TextTrackList interface: existence and properties of interface object +PASS TextTrackList interface object length +PASS TextTrackList interface object name +PASS TextTrackList interface: existence and properties of interface prototype object +PASS TextTrackList interface: existence and properties of interface prototype object's "constructor" property +PASS TextTrackList interface: attribute length +PASS TextTrackList interface: operation getTrackById(DOMString) +PASS TextTrackList interface: attribute onchange +PASS TextTrackList interface: attribute onaddtrack +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 +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 +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 +PASS TextTrack interface: existence and properties of interface prototype object +PASS TextTrack interface: existence and properties of interface prototype object's "constructor" property +PASS TextTrack interface: attribute kind +PASS TextTrack interface: attribute label +PASS TextTrack interface: attribute language +PASS TextTrack interface: attribute id +FAIL TextTrack interface: attribute inBandMetadataTrackDispatchType assert_true: The prototype object must have a property "inBandMetadataTrackDispatchType" expected true got false +PASS TextTrack interface: attribute mode +PASS TextTrack interface: attribute cues +PASS TextTrack interface: attribute activeCues +PASS TextTrack interface: operation addCue(TextTrackCue) +PASS TextTrack interface: operation removeCue(TextTrackCue) +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 +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(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 +PASS TextTrackCueList interface: existence and properties of interface object +PASS TextTrackCueList interface object length +PASS TextTrackCueList interface object name +PASS TextTrackCueList interface: existence and properties of interface prototype object +PASS TextTrackCueList interface: existence and properties of interface prototype object's "constructor" property +PASS TextTrackCueList interface: attribute length +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 +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 +PASS TextTrackCue interface object name +PASS TextTrackCue interface: existence and properties of interface prototype object +PASS TextTrackCue interface: existence and properties of interface prototype object's "constructor" property +PASS TextTrackCue interface: attribute track +PASS TextTrackCue interface: attribute id +PASS TextTrackCue interface: attribute startTime +PASS TextTrackCue interface: attribute endTime +PASS TextTrackCue interface: attribute pauseOnExit +PASS TextTrackCue interface: attribute onenter +PASS TextTrackCue interface: attribute onexit +PASS TimeRanges interface: existence and properties of interface object +PASS TimeRanges interface object length +PASS TimeRanges interface object name +PASS TimeRanges interface: existence and properties of interface prototype object +PASS TimeRanges interface: existence and properties of interface prototype object's "constructor" property +PASS TimeRanges interface: attribute length +PASS TimeRanges interface: operation start(unsigned long) +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 +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(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 +PASS TrackEvent interface object name +PASS TrackEvent interface: existence and properties of interface prototype object +PASS TrackEvent interface: existence and properties of interface prototype object's "constructor" property +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 +PASS HTMLMapElement interface: existence and properties of interface object +PASS HTMLMapElement interface object length +PASS HTMLMapElement interface object name +PASS HTMLMapElement interface: existence and properties of interface prototype object +PASS HTMLMapElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLMapElement interface: attribute name +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 +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 +PASS HTMLAreaElement interface: existence and properties of interface prototype object +PASS HTMLAreaElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLAreaElement interface: attribute alt +PASS HTMLAreaElement interface: attribute coords +PASS HTMLAreaElement interface: attribute shape +PASS HTMLAreaElement interface: attribute target +PASS HTMLAreaElement interface: attribute download +PASS HTMLAreaElement interface: attribute ping +PASS HTMLAreaElement interface: attribute rel +FAIL HTMLAreaElement interface: attribute relList assert_true: The prototype object must have a property "relList" expected true got false +PASS HTMLAreaElement interface: attribute referrerPolicy +PASS HTMLAreaElement interface: attribute noHref +PASS HTMLAreaElement interface: attribute href +PASS HTMLAreaElement interface: stringifier +PASS HTMLAreaElement interface: attribute origin +PASS HTMLAreaElement interface: attribute protocol +PASS HTMLAreaElement interface: attribute username +PASS HTMLAreaElement interface: attribute password +PASS HTMLAreaElement interface: attribute host +PASS HTMLAreaElement interface: attribute hostname +PASS HTMLAreaElement interface: attribute port +PASS HTMLAreaElement interface: attribute pathname +PASS HTMLAreaElement interface: attribute search +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 +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 +PASS HTMLTableElement interface: existence and properties of interface prototype object +PASS HTMLTableElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLTableElement interface: attribute caption +PASS HTMLTableElement interface: operation createCaption() +PASS HTMLTableElement interface: operation deleteCaption() +PASS HTMLTableElement interface: attribute tHead +PASS HTMLTableElement interface: operation createTHead() +PASS HTMLTableElement interface: operation deleteTHead() +PASS HTMLTableElement interface: attribute tFoot +PASS HTMLTableElement interface: operation createTFoot() +PASS HTMLTableElement interface: operation deleteTFoot() +PASS HTMLTableElement interface: attribute tBodies +PASS HTMLTableElement interface: operation createTBody() +PASS HTMLTableElement interface: attribute rows +PASS HTMLTableElement interface: operation insertRow(long) +PASS HTMLTableElement interface: operation deleteRow(long) +PASS HTMLTableElement interface: attribute align +PASS HTMLTableElement interface: attribute border +PASS HTMLTableElement interface: attribute frame +PASS HTMLTableElement interface: attribute rules +PASS HTMLTableElement interface: attribute summary +PASS HTMLTableElement interface: attribute width +PASS HTMLTableElement interface: attribute bgColor +PASS HTMLTableElement interface: attribute cellPadding +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 +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(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 +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 +PASS HTMLTableCaptionElement interface: existence and properties of interface prototype object +PASS HTMLTableCaptionElement interface: existence and properties of interface prototype object's "constructor" property +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 +PASS HTMLTableColElement interface: existence and properties of interface object +PASS HTMLTableColElement interface object length +PASS HTMLTableColElement interface object name +PASS HTMLTableColElement interface: existence and properties of interface prototype object +PASS HTMLTableColElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLTableColElement interface: attribute span +PASS HTMLTableColElement interface: attribute align +PASS HTMLTableColElement interface: attribute ch +PASS HTMLTableColElement interface: attribute chOff +PASS HTMLTableColElement interface: attribute vAlign +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 +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 +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 +PASS HTMLTableSectionElement interface: existence and properties of interface prototype object +PASS HTMLTableSectionElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLTableSectionElement interface: attribute rows +PASS HTMLTableSectionElement interface: operation insertRow(long) +PASS HTMLTableSectionElement interface: operation deleteRow(long) +PASS HTMLTableSectionElement interface: attribute align +PASS HTMLTableSectionElement interface: attribute ch +PASS HTMLTableSectionElement interface: attribute chOff +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 +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(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 +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 +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(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 +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 +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(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 +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 +PASS HTMLTableRowElement interface: existence and properties of interface prototype object +PASS HTMLTableRowElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLTableRowElement interface: attribute rowIndex +PASS HTMLTableRowElement interface: attribute sectionRowIndex +PASS HTMLTableRowElement interface: attribute cells +PASS HTMLTableRowElement interface: operation insertCell(long) +PASS HTMLTableRowElement interface: operation deleteCell(long) +PASS HTMLTableRowElement interface: attribute align +PASS HTMLTableRowElement interface: attribute ch +PASS HTMLTableRowElement interface: attribute chOff +PASS HTMLTableRowElement interface: attribute vAlign +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 +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(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 +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 +PASS HTMLTableCellElement interface: existence and properties of interface prototype object +PASS HTMLTableCellElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLTableCellElement interface: attribute colSpan +PASS HTMLTableCellElement interface: attribute rowSpan +PASS HTMLTableCellElement interface: attribute headers +PASS HTMLTableCellElement interface: attribute cellIndex +PASS HTMLTableCellElement interface: attribute scope +PASS HTMLTableCellElement interface: attribute abbr +PASS HTMLTableCellElement interface: attribute align +PASS HTMLTableCellElement interface: attribute axis +PASS HTMLTableCellElement interface: attribute height +PASS HTMLTableCellElement interface: attribute width +PASS HTMLTableCellElement interface: attribute ch +PASS HTMLTableCellElement interface: attribute chOff +PASS HTMLTableCellElement interface: attribute noWrap +PASS HTMLTableCellElement interface: attribute vAlign +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 +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 +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 +PASS HTMLFormElement interface: existence and properties of interface prototype object +PASS HTMLFormElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLFormElement interface: attribute acceptCharset +PASS HTMLFormElement interface: attribute action +PASS HTMLFormElement interface: attribute autocomplete +PASS HTMLFormElement interface: attribute enctype +PASS HTMLFormElement interface: attribute encoding +PASS HTMLFormElement interface: attribute method +PASS HTMLFormElement interface: attribute name +PASS HTMLFormElement interface: attribute noValidate +PASS HTMLFormElement interface: attribute target +PASS HTMLFormElement interface: attribute elements +PASS HTMLFormElement interface: attribute length +PASS HTMLFormElement interface: operation submit() +PASS HTMLFormElement interface: operation reset() +PASS HTMLFormElement interface: operation checkValidity() +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 +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 +PASS HTMLLabelElement interface: existence and properties of interface prototype object +PASS HTMLLabelElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLLabelElement interface: attribute form +PASS HTMLLabelElement interface: attribute htmlFor +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 +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 +PASS HTMLInputElement interface: existence and properties of interface prototype object +PASS HTMLInputElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLInputElement interface: attribute accept +PASS HTMLInputElement interface: attribute alt +PASS HTMLInputElement interface: attribute autocomplete +PASS HTMLInputElement interface: attribute autofocus +PASS HTMLInputElement interface: attribute defaultChecked +PASS HTMLInputElement interface: attribute checked +PASS HTMLInputElement interface: attribute dirName +PASS HTMLInputElement interface: attribute disabled +PASS HTMLInputElement interface: attribute form +PASS HTMLInputElement interface: attribute files +PASS HTMLInputElement interface: attribute formAction +PASS HTMLInputElement interface: attribute formEnctype +PASS HTMLInputElement interface: attribute formMethod +PASS HTMLInputElement interface: attribute formNoValidate +PASS HTMLInputElement interface: attribute formTarget +PASS HTMLInputElement interface: attribute height +PASS HTMLInputElement interface: attribute indeterminate +FAIL HTMLInputElement interface: attribute inputMode assert_own_property: expected property "inputMode" missing +PASS HTMLInputElement interface: attribute list +PASS HTMLInputElement interface: attribute max +PASS HTMLInputElement interface: attribute maxLength +PASS HTMLInputElement interface: attribute min +PASS HTMLInputElement interface: attribute minLength +PASS HTMLInputElement interface: attribute multiple +PASS HTMLInputElement interface: attribute name +PASS HTMLInputElement interface: attribute pattern +PASS HTMLInputElement interface: attribute placeholder +PASS HTMLInputElement interface: attribute readOnly +PASS HTMLInputElement interface: attribute required +PASS HTMLInputElement interface: attribute size +PASS HTMLInputElement interface: attribute src +PASS HTMLInputElement interface: attribute step +PASS HTMLInputElement interface: attribute type +PASS HTMLInputElement interface: attribute defaultValue +PASS HTMLInputElement interface: attribute value +PASS HTMLInputElement interface: attribute valueAsDate +PASS HTMLInputElement interface: attribute valueAsNumber +PASS HTMLInputElement interface: attribute width +PASS HTMLInputElement interface: operation stepUp(long) +PASS HTMLInputElement interface: operation stepDown(long) +PASS HTMLInputElement interface: attribute willValidate +PASS HTMLInputElement interface: attribute validity +PASS HTMLInputElement interface: attribute validationMessage +PASS HTMLInputElement interface: operation checkValidity() +PASS HTMLInputElement interface: operation reportValidity() +PASS HTMLInputElement interface: operation setCustomValidity(DOMString) +PASS HTMLInputElement interface: attribute labels +PASS HTMLInputElement interface: operation select() +PASS HTMLInputElement interface: attribute selectionStart +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: 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 +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(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 +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 +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(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 +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(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 +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 +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(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 +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(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 +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 +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(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 +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(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 +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 +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(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 +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(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 +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 +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(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 +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(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 +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 +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(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 +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(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 +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 +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(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 +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(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 +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 +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(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 +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(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 +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 +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(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 +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(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 +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 +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(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 +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(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 +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 +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(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 +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(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 +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 +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(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 +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(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 +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 +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(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 +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(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 +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 +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(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 +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(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 +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 +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(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 +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(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 +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 +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(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 +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(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 +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 +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(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 +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(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 +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 +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(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 +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(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 +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 +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(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 +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(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 +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 +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(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 +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(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 +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 +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(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 +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(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 +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 +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(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 +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(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 +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 +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(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 +PASS HTMLButtonElement interface: existence and properties of interface prototype object +PASS HTMLButtonElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLButtonElement interface: attribute autofocus +PASS HTMLButtonElement interface: attribute disabled +PASS HTMLButtonElement interface: attribute form +PASS HTMLButtonElement interface: attribute formAction +PASS HTMLButtonElement interface: attribute formEnctype +PASS HTMLButtonElement interface: attribute formMethod +PASS HTMLButtonElement interface: attribute formNoValidate +PASS HTMLButtonElement interface: attribute formTarget +PASS HTMLButtonElement interface: attribute name +PASS HTMLButtonElement interface: attribute type +PASS HTMLButtonElement interface: attribute value +PASS HTMLButtonElement interface: attribute willValidate +PASS HTMLButtonElement interface: attribute validity +PASS HTMLButtonElement interface: attribute validationMessage +PASS HTMLButtonElement interface: operation checkValidity() +PASS HTMLButtonElement interface: operation reportValidity() +PASS HTMLButtonElement interface: operation setCustomValidity(DOMString) +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 +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 +PASS HTMLSelectElement interface: existence and properties of interface object +PASS HTMLSelectElement interface object length +PASS HTMLSelectElement interface object name +PASS HTMLSelectElement interface: existence and properties of interface prototype object +PASS HTMLSelectElement interface: existence and properties of interface prototype object's "constructor" property +FAIL HTMLSelectElement interface: attribute autocomplete assert_true: The prototype object must have a property "autocomplete" expected true got false +PASS HTMLSelectElement interface: attribute autofocus +PASS HTMLSelectElement interface: attribute disabled +PASS HTMLSelectElement interface: attribute form +PASS HTMLSelectElement interface: attribute multiple +PASS HTMLSelectElement interface: attribute name +PASS HTMLSelectElement interface: attribute required +PASS HTMLSelectElement interface: attribute size +PASS HTMLSelectElement interface: attribute type +PASS HTMLSelectElement interface: attribute options +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 remove() +PASS HTMLSelectElement interface: operation remove(long) +PASS HTMLSelectElement interface: attribute selectedOptions +PASS HTMLSelectElement interface: attribute selectedIndex +PASS HTMLSelectElement interface: attribute value +PASS HTMLSelectElement interface: attribute willValidate +PASS HTMLSelectElement interface: attribute validity +PASS HTMLSelectElement interface: attribute validationMessage +PASS HTMLSelectElement interface: operation checkValidity() +PASS HTMLSelectElement interface: operation reportValidity() +PASS HTMLSelectElement interface: operation setCustomValidity(DOMString) +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 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(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([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 +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 +PASS HTMLDataListElement interface: existence and properties of interface object +PASS HTMLDataListElement interface object length +PASS HTMLDataListElement interface object name +PASS HTMLDataListElement interface: existence and properties of interface prototype object +PASS HTMLDataListElement interface: existence and properties of interface prototype object's "constructor" property +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 +PASS HTMLOptGroupElement interface: existence and properties of interface object +PASS HTMLOptGroupElement interface object length +PASS HTMLOptGroupElement interface object name +PASS HTMLOptGroupElement interface: existence and properties of interface prototype object +PASS HTMLOptGroupElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLOptGroupElement interface: attribute disabled +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 +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 +PASS HTMLOptionElement interface: existence and properties of interface prototype object +PASS HTMLOptionElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLOptionElement interface: attribute disabled +PASS HTMLOptionElement interface: attribute form +PASS HTMLOptionElement interface: attribute label +PASS HTMLOptionElement interface: attribute defaultSelected +PASS HTMLOptionElement interface: attribute selected +PASS HTMLOptionElement interface: attribute value +PASS HTMLOptionElement interface: attribute text +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 +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 +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 +PASS HTMLTextAreaElement interface: existence and properties of interface prototype object +PASS HTMLTextAreaElement interface: existence and properties of interface prototype object's "constructor" property +FAIL HTMLTextAreaElement interface: attribute autocomplete assert_true: The prototype object must have a property "autocomplete" expected true got false +PASS HTMLTextAreaElement interface: attribute autofocus +PASS HTMLTextAreaElement interface: attribute cols +PASS HTMLTextAreaElement interface: attribute dirName +PASS HTMLTextAreaElement interface: attribute disabled +PASS HTMLTextAreaElement interface: attribute form +FAIL HTMLTextAreaElement interface: attribute inputMode assert_own_property: expected property "inputMode" missing +PASS HTMLTextAreaElement interface: attribute maxLength +PASS HTMLTextAreaElement interface: attribute minLength +PASS HTMLTextAreaElement interface: attribute name +PASS HTMLTextAreaElement interface: attribute placeholder +PASS HTMLTextAreaElement interface: attribute readOnly +PASS HTMLTextAreaElement interface: attribute required +PASS HTMLTextAreaElement interface: attribute rows +PASS HTMLTextAreaElement interface: attribute wrap +PASS HTMLTextAreaElement interface: attribute type +PASS HTMLTextAreaElement interface: attribute defaultValue +PASS HTMLTextAreaElement interface: attribute value +PASS HTMLTextAreaElement interface: attribute textLength +PASS HTMLTextAreaElement interface: attribute willValidate +PASS HTMLTextAreaElement interface: attribute validity +PASS HTMLTextAreaElement interface: attribute validationMessage +PASS HTMLTextAreaElement interface: operation checkValidity() +PASS HTMLTextAreaElement interface: operation reportValidity() +PASS HTMLTextAreaElement interface: operation setCustomValidity(DOMString) +PASS HTMLTextAreaElement interface: attribute labels +PASS HTMLTextAreaElement interface: operation select() +PASS HTMLTextAreaElement interface: attribute selectionStart +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 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 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 +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(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 +PASS HTMLOutputElement interface: existence and properties of interface prototype object +PASS HTMLOutputElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLOutputElement interface: attribute htmlFor +PASS HTMLOutputElement interface: attribute form +PASS HTMLOutputElement interface: attribute name +PASS HTMLOutputElement interface: attribute type +PASS HTMLOutputElement interface: attribute defaultValue +PASS HTMLOutputElement interface: attribute value +PASS HTMLOutputElement interface: attribute willValidate +PASS HTMLOutputElement interface: attribute validity +PASS HTMLOutputElement interface: attribute validationMessage +PASS HTMLOutputElement interface: operation checkValidity() +PASS HTMLOutputElement interface: operation reportValidity() +PASS HTMLOutputElement interface: operation setCustomValidity(DOMString) +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 +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 +PASS HTMLProgressElement interface: existence and properties of interface object +PASS HTMLProgressElement interface object length +PASS HTMLProgressElement interface object name +PASS HTMLProgressElement interface: existence and properties of interface prototype object +PASS HTMLProgressElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLProgressElement interface: attribute value +PASS HTMLProgressElement interface: attribute max +PASS HTMLProgressElement interface: attribute position +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 +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 +PASS HTMLMeterElement interface: existence and properties of interface prototype object +PASS HTMLMeterElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLMeterElement interface: attribute value +PASS HTMLMeterElement interface: attribute min +PASS HTMLMeterElement interface: attribute max +PASS HTMLMeterElement interface: attribute low +PASS HTMLMeterElement interface: attribute high +PASS HTMLMeterElement interface: attribute optimum +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 +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 +PASS HTMLFieldSetElement interface: existence and properties of interface prototype object +PASS HTMLFieldSetElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLFieldSetElement interface: attribute disabled +PASS HTMLFieldSetElement interface: attribute form +PASS HTMLFieldSetElement interface: attribute name +PASS HTMLFieldSetElement interface: attribute type +PASS HTMLFieldSetElement interface: attribute elements +PASS HTMLFieldSetElement interface: attribute willValidate +PASS HTMLFieldSetElement interface: attribute validity +PASS HTMLFieldSetElement interface: attribute validationMessage +PASS HTMLFieldSetElement interface: operation checkValidity() +PASS HTMLFieldSetElement interface: operation reportValidity() +PASS HTMLFieldSetElement interface: operation setCustomValidity(DOMString) +PASS HTMLLegendElement interface: existence and properties of interface object +PASS HTMLLegendElement interface object length +PASS HTMLLegendElement interface object name +PASS HTMLLegendElement interface: existence and properties of interface prototype object +PASS HTMLLegendElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLLegendElement interface: attribute form +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 +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 +PASS ValidityState interface: existence and properties of interface prototype object +PASS ValidityState interface: existence and properties of interface prototype object's "constructor" property +PASS ValidityState interface: attribute valueMissing +PASS ValidityState interface: attribute typeMismatch +PASS ValidityState interface: attribute patternMismatch +PASS ValidityState interface: attribute tooLong +PASS ValidityState interface: attribute tooShort +PASS ValidityState interface: attribute rangeUnderflow +PASS ValidityState interface: attribute rangeOverflow +PASS ValidityState interface: attribute stepMismatch +PASS ValidityState interface: attribute badInput +PASS ValidityState interface: attribute customError +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 +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 +PASS HTMLDetailsElement interface: existence and properties of interface prototype object +PASS HTMLDetailsElement interface: existence and properties of interface prototype object's "constructor" property +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 +PASS HTMLDialogElement interface: existence and properties of interface object +PASS HTMLDialogElement interface object length +PASS HTMLDialogElement interface object name +PASS HTMLDialogElement interface: existence and properties of interface prototype object +PASS HTMLDialogElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLDialogElement interface: attribute open +PASS HTMLDialogElement interface: attribute returnValue +PASS HTMLDialogElement interface: operation show() +PASS HTMLDialogElement interface: operation showModal() +PASS HTMLDialogElement interface: operation close(DOMString) +PASS HTMLScriptElement interface: existence and properties of interface object +PASS HTMLScriptElement interface object length +PASS HTMLScriptElement interface object name +PASS HTMLScriptElement interface: existence and properties of interface prototype object +PASS HTMLScriptElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLScriptElement interface: attribute src +PASS HTMLScriptElement interface: attribute type +PASS HTMLScriptElement interface: attribute noModule +PASS HTMLScriptElement interface: attribute async +PASS HTMLScriptElement interface: attribute defer +PASS HTMLScriptElement interface: attribute crossOrigin +PASS HTMLScriptElement interface: attribute text +FAIL HTMLScriptElement interface: attribute nonce assert_own_property: expected property "nonce" missing +PASS HTMLScriptElement interface: attribute integrity +PASS HTMLScriptElement interface: attribute charset +PASS HTMLScriptElement interface: attribute event +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 +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 "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 "charset" 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 +PASS HTMLTemplateElement interface: existence and properties of interface prototype object +PASS HTMLTemplateElement interface: existence and properties of interface prototype object's "constructor" property +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 +PASS HTMLSlotElement interface: existence and properties of interface object +PASS HTMLSlotElement interface object length +PASS HTMLSlotElement interface object name +PASS HTMLSlotElement interface: existence and properties of interface prototype object +PASS HTMLSlotElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLSlotElement interface: attribute name +PASS HTMLSlotElement interface: operation assignedNodes(AssignedNodesOptions) +FAIL HTMLSlotElement interface: operation assignedElements(AssignedNodesOptions) assert_own_property: interface prototype object missing non-static operation expected property "assignedElements" missing +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 +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 +FAIL HTMLSlotElement interface: document.createElement("slot") must inherit property "assignedElements(AssignedNodesOptions)" with the proper type assert_inherits: property "assignedElements" not found in prototype chain +FAIL HTMLSlotElement interface: calling assignedElements(AssignedNodesOptions) on document.createElement("slot") with too few arguments must throw TypeError assert_inherits: property "assignedElements" not found in prototype chain +PASS HTMLCanvasElement interface: existence and properties of interface object +PASS HTMLCanvasElement interface object length +PASS HTMLCanvasElement interface object name +PASS HTMLCanvasElement interface: existence and properties of interface prototype object +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 transferControlToOffscreen() +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 +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 HTMLCanvasElement interface: document.createElement("canvas") must inherit property "transferControlToOffscreen()" with the proper type +PASS CanvasRenderingContext2D interface: existence and properties of interface object +PASS CanvasRenderingContext2D interface object length +PASS CanvasRenderingContext2D interface object name +PASS CanvasRenderingContext2D interface: existence and properties of interface prototype object +PASS CanvasRenderingContext2D interface: existence and properties of interface prototype object's "constructor" property +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 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) +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(DOMMatrix2DInit) assert_equals: property has wrong .length expected 0 but got 6 +PASS CanvasRenderingContext2D interface: operation resetTransform() +PASS CanvasRenderingContext2D interface: attribute globalAlpha +PASS CanvasRenderingContext2D interface: attribute globalCompositeOperation +PASS CanvasRenderingContext2D interface: attribute imageSmoothingEnabled +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: 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 beginPath() +PASS CanvasRenderingContext2D interface: operation fill(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) +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 drawFocusIfNeeded(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 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 createImageData(long, long) +PASS CanvasRenderingContext2D interface: operation createImageData(ImageData) +PASS CanvasRenderingContext2D interface: operation getImageData(long, long, long, long) +PASS CanvasRenderingContext2D interface: operation putImageData(ImageData, long, long) +PASS CanvasRenderingContext2D interface: operation putImageData(ImageData, long, long, long, long, long, long) +PASS CanvasRenderingContext2D interface: attribute lineWidth +PASS CanvasRenderingContext2D interface: attribute lineCap +PASS CanvasRenderingContext2D interface: attribute lineJoin +PASS CanvasRenderingContext2D interface: attribute miterLimit +PASS CanvasRenderingContext2D interface: operation setLineDash([object Object]) +PASS CanvasRenderingContext2D interface: operation getLineDash() +PASS CanvasRenderingContext2D interface: attribute lineDashOffset +PASS CanvasRenderingContext2D interface: attribute font +PASS CanvasRenderingContext2D interface: attribute textAlign +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 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 +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(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(DOMMatrix2DInit)" with the proper type +PASS CanvasRenderingContext2D interface: calling setTransform(DOMMatrix2DInit) 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 +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(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(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(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(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(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(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 "createImageData(long, long)" with the proper type +PASS CanvasRenderingContext2D interface: calling createImageData(long, long) 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(long, long, long, long)" with the proper type +PASS CanvasRenderingContext2D interface: calling getImageData(long, long, long, long) 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, long, long)" with the proper type +PASS CanvasRenderingContext2D interface: calling putImageData(ImageData, long, long) 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, long, long, long, long, long, long)" with the proper type +PASS CanvasRenderingContext2D interface: calling putImageData(ImageData, long, long, long, long, long, long) 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 +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 CanvasPattern interface: existence and properties of interface object +PASS CanvasPattern interface object length +PASS CanvasPattern interface object name +PASS CanvasPattern interface: existence and properties of interface prototype object +PASS CanvasPattern interface: existence and properties of interface prototype object's "constructor" property +FAIL CanvasPattern interface: operation setTransform(DOMMatrix2DInit) assert_equals: property has wrong .length expected 0 but got 1 +PASS TextMetrics interface: existence and properties of interface object +PASS TextMetrics interface object length +PASS TextMetrics interface object name +PASS TextMetrics interface: existence and properties of interface prototype object +PASS TextMetrics interface: existence and properties of interface prototype object's "constructor" property +PASS TextMetrics interface: attribute width +PASS TextMetrics interface: attribute actualBoundingBoxLeft +PASS TextMetrics interface: attribute actualBoundingBoxRight +PASS TextMetrics interface: attribute fontBoundingBoxAscent +PASS TextMetrics interface: attribute fontBoundingBoxDescent +PASS TextMetrics interface: attribute actualBoundingBoxAscent +PASS TextMetrics interface: attribute actualBoundingBoxDescent +PASS TextMetrics interface: attribute emHeightAscent +PASS TextMetrics interface: attribute emHeightDescent +PASS TextMetrics interface: attribute hangingBaseline +PASS TextMetrics interface: attribute alphabeticBaseline +PASS TextMetrics interface: attribute ideographicBaseline +PASS ImageData interface: existence and properties of interface object +PASS ImageData interface object length +PASS ImageData interface object name +PASS ImageData interface: existence and properties of interface prototype object +PASS ImageData interface: existence and properties of interface prototype object's "constructor" property +PASS ImageData interface: attribute width +PASS ImageData interface: attribute height +PASS ImageData interface: attribute data +PASS Path2D interface: existence and properties of interface object +PASS Path2D interface object length +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, DOMMatrix2DInit) +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 ImageBitmapRenderingContext interface: existence and properties of interface object +PASS ImageBitmapRenderingContext interface object length +PASS ImageBitmapRenderingContext interface object name +PASS ImageBitmapRenderingContext interface: existence and properties of interface prototype object +PASS ImageBitmapRenderingContext interface: existence and properties of interface prototype object's "constructor" property +PASS ImageBitmapRenderingContext interface: attribute canvas +PASS ImageBitmapRenderingContext interface: operation transferFromImageBitmap(ImageBitmap) +PASS OffscreenCanvas interface: existence and properties of interface object +PASS OffscreenCanvas interface object length +PASS OffscreenCanvas interface object name +PASS OffscreenCanvas interface: existence and properties of interface prototype object +PASS OffscreenCanvas interface: existence and properties of interface prototype object's "constructor" property +PASS OffscreenCanvas interface: attribute width +PASS OffscreenCanvas interface: attribute height +PASS OffscreenCanvas interface: operation getContext(OffscreenRenderingContextType, any) +PASS OffscreenCanvas interface: operation transferToImageBitmap() +PASS OffscreenCanvas interface: operation convertToBlob(ImageEncodeOptions) +PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface object +PASS OffscreenCanvasRenderingContext2D interface object length +PASS OffscreenCanvasRenderingContext2D interface object name +PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object +PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object's "constructor" property +FAIL OffscreenCanvasRenderingContext2D interface: operation commit() assert_throws: calling operation with this = null didn't throw TypeError function "function () { + fn.apply(obj, args); + }" did not throw +PASS OffscreenCanvasRenderingContext2D interface: attribute canvas +PASS OffscreenCanvasRenderingContext2D interface: operation save() +PASS OffscreenCanvasRenderingContext2D interface: operation restore() +PASS OffscreenCanvasRenderingContext2D interface: operation scale(unrestricted double, unrestricted double) +PASS OffscreenCanvasRenderingContext2D interface: operation rotate(unrestricted double) +PASS OffscreenCanvasRenderingContext2D interface: operation translate(unrestricted double, unrestricted double) +PASS OffscreenCanvasRenderingContext2D interface: operation transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) +FAIL OffscreenCanvasRenderingContext2D interface: operation getTransform() assert_own_property: interface prototype object missing non-static operation expected property "getTransform" missing +FAIL OffscreenCanvasRenderingContext2D 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 OffscreenCanvasRenderingContext2D interface: operation setTransform(DOMMatrix2DInit) assert_equals: property has wrong .length expected 0 but got 6 +PASS OffscreenCanvasRenderingContext2D interface: operation resetTransform() +PASS OffscreenCanvasRenderingContext2D interface: attribute globalAlpha +PASS OffscreenCanvasRenderingContext2D interface: attribute globalCompositeOperation +PASS OffscreenCanvasRenderingContext2D interface: attribute imageSmoothingEnabled +PASS OffscreenCanvasRenderingContext2D interface: attribute imageSmoothingQuality +PASS OffscreenCanvasRenderingContext2D interface: attribute strokeStyle +PASS OffscreenCanvasRenderingContext2D interface: attribute fillStyle +PASS OffscreenCanvasRenderingContext2D interface: operation createLinearGradient(double, double, double, double) +PASS OffscreenCanvasRenderingContext2D interface: operation createRadialGradient(double, double, double, double, double, double) +PASS OffscreenCanvasRenderingContext2D interface: operation createPattern(CanvasImageSource, DOMString) +PASS OffscreenCanvasRenderingContext2D interface: attribute shadowOffsetX +PASS OffscreenCanvasRenderingContext2D interface: attribute shadowOffsetY +PASS OffscreenCanvasRenderingContext2D interface: attribute shadowBlur +PASS OffscreenCanvasRenderingContext2D interface: attribute shadowColor +PASS OffscreenCanvasRenderingContext2D interface: attribute filter +PASS OffscreenCanvasRenderingContext2D interface: operation clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) +PASS OffscreenCanvasRenderingContext2D interface: operation fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) +PASS OffscreenCanvasRenderingContext2D interface: operation strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) +PASS OffscreenCanvasRenderingContext2D interface: operation beginPath() +PASS OffscreenCanvasRenderingContext2D interface: operation fill(CanvasFillRule) +PASS OffscreenCanvasRenderingContext2D interface: operation fill(Path2D, CanvasFillRule) +PASS OffscreenCanvasRenderingContext2D interface: operation stroke() +PASS OffscreenCanvasRenderingContext2D interface: operation stroke(Path2D) +PASS OffscreenCanvasRenderingContext2D interface: operation clip(CanvasFillRule) +PASS OffscreenCanvasRenderingContext2D interface: operation clip(Path2D, CanvasFillRule) +FAIL OffscreenCanvasRenderingContext2D interface: operation resetClip() assert_own_property: interface prototype object missing non-static operation expected property "resetClip" missing +PASS OffscreenCanvasRenderingContext2D interface: operation isPointInPath(unrestricted double, unrestricted double, CanvasFillRule) +PASS OffscreenCanvasRenderingContext2D interface: operation isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule) +PASS OffscreenCanvasRenderingContext2D interface: operation isPointInStroke(unrestricted double, unrestricted double) +PASS OffscreenCanvasRenderingContext2D interface: operation isPointInStroke(Path2D, unrestricted double, unrestricted double) +PASS OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double) +PASS OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double) +PASS OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) +PASS OffscreenCanvasRenderingContext2D interface: operation createImageData(long, long) +PASS OffscreenCanvasRenderingContext2D interface: operation createImageData(ImageData) +PASS OffscreenCanvasRenderingContext2D interface: operation getImageData(long, long, long, long) +PASS OffscreenCanvasRenderingContext2D interface: operation putImageData(ImageData, long, long) +PASS OffscreenCanvasRenderingContext2D interface: operation putImageData(ImageData, long, long, long, long, long, long) +PASS OffscreenCanvasRenderingContext2D interface: attribute lineWidth +PASS OffscreenCanvasRenderingContext2D interface: attribute lineCap +PASS OffscreenCanvasRenderingContext2D interface: attribute lineJoin +PASS OffscreenCanvasRenderingContext2D interface: attribute miterLimit +PASS OffscreenCanvasRenderingContext2D interface: operation setLineDash([object Object]) +PASS OffscreenCanvasRenderingContext2D interface: operation getLineDash() +PASS OffscreenCanvasRenderingContext2D interface: attribute lineDashOffset +PASS OffscreenCanvasRenderingContext2D interface: operation closePath() +PASS OffscreenCanvasRenderingContext2D interface: operation moveTo(unrestricted double, unrestricted double) +PASS OffscreenCanvasRenderingContext2D interface: operation lineTo(unrestricted double, unrestricted double) +PASS OffscreenCanvasRenderingContext2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double) +PASS OffscreenCanvasRenderingContext2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) +PASS OffscreenCanvasRenderingContext2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) +PASS OffscreenCanvasRenderingContext2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) +PASS OffscreenCanvasRenderingContext2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) +PASS OffscreenCanvasRenderingContext2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) +PASS OffscreenCanvasRenderingContext2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) +PASS CustomElementRegistry interface: existence and properties of interface object +PASS CustomElementRegistry interface object length +PASS CustomElementRegistry interface object name +PASS CustomElementRegistry interface: existence and properties of interface prototype object +PASS CustomElementRegistry interface: existence and properties of interface prototype object's "constructor" property +PASS CustomElementRegistry interface: operation define(DOMString, Function, ElementDefinitionOptions) +PASS CustomElementRegistry interface: operation get(DOMString) +PASS CustomElementRegistry interface: operation whenDefined(DOMString) +PASS DataTransfer interface: existence and properties of interface object +PASS DataTransfer interface object length +PASS DataTransfer interface object name +PASS DataTransfer interface: existence and properties of interface prototype object +PASS DataTransfer interface: existence and properties of interface prototype object's "constructor" property +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: attribute types +PASS DataTransfer interface: operation getData(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 +PASS DataTransferItemList interface object length +PASS DataTransferItemList interface object name +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(File) +PASS DataTransferItemList interface: operation remove(unsigned long) +PASS DataTransferItemList interface: operation clear() +PASS DataTransferItem interface: existence and properties of interface object +PASS DataTransferItem interface object length +PASS DataTransferItem interface object name +PASS DataTransferItem interface: existence and properties of interface prototype object +PASS DataTransferItem interface: existence and properties of interface prototype object's "constructor" property +PASS DataTransferItem interface: attribute kind +PASS DataTransferItem interface: attribute type +PASS DataTransferItem interface: operation getAsString(FunctionStringCallback) +PASS DataTransferItem interface: operation getAsFile() +PASS DragEvent interface: existence and properties of interface object +PASS DragEvent interface object length +PASS DragEvent interface object name +PASS DragEvent interface: existence and properties of interface prototype object +PASS DragEvent interface: existence and properties of interface prototype object's "constructor" property +PASS DragEvent interface: attribute dataTransfer +PASS Window interface: existence and properties of interface object +PASS Window interface object length +PASS Window interface object name +PASS Window interface: existence and properties of interface prototype object +PASS Window interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Object.setPrototypeOf should throw a TypeError +PASS Window interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via __proto__ should throw a TypeError +PASS Window interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Reflect.setPrototypeOf should return false +PASS Window interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Object.setPrototypeOf should not throw +PASS Window interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via __proto__ should not throw +PASS Window interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Reflect.setPrototypeOf should return true +PASS Window interface: existence and properties of interface prototype object's "constructor" property +FAIL Window interface: attribute self assert_equals: "self" must have a getter expected "function" but got "undefined" +PASS Window interface: attribute name +PASS Window interface: attribute history +PASS Window interface: attribute customElements +PASS Window interface: attribute locationbar +PASS Window interface: attribute menubar +PASS Window interface: attribute personalbar +PASS Window interface: attribute scrollbars +PASS Window interface: attribute statusbar +PASS Window interface: attribute toolbar +PASS Window interface: attribute status +PASS Window interface: operation close() +FAIL Window interface: attribute closed assert_equals: "closed" must have a getter expected "function" but got "undefined" +PASS Window interface: operation stop() +PASS Window interface: operation focus() +PASS Window interface: operation blur() +FAIL Window interface: attribute frames assert_equals: "frames" must have a getter expected "function" but got "undefined" +FAIL Window interface: attribute length assert_equals: "length" must have a getter expected "function" but got "undefined" +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 +PASS Window interface: operation open(USVString, DOMString, DOMString) +PASS Window interface: attribute navigator +PASS Window interface: attribute applicationCache +PASS Window interface: operation alert() +PASS Window interface: operation alert(DOMString) +PASS Window interface: operation confirm(DOMString) +PASS Window interface: operation prompt(DOMString, DOMString) +PASS Window interface: operation print() +PASS Window interface: operation requestAnimationFrame(FrameRequestCallback) +PASS Window interface: operation cancelAnimationFrame(unsigned long) +PASS Window interface: operation postMessage(any, USVString, [object Object]) +PASS Window interface: operation captureEvents() +PASS Window interface: operation releaseEvents() +PASS Window interface: attribute external +PASS Window interface: attribute onabort +PASS Window interface: attribute onauxclick +PASS Window interface: attribute onblur +PASS Window interface: attribute oncancel +PASS Window interface: attribute oncanplay +PASS Window interface: attribute oncanplaythrough +PASS Window interface: attribute onchange +PASS Window interface: attribute onclick +PASS Window interface: attribute onclose +PASS Window interface: attribute oncontextmenu +PASS Window interface: attribute oncuechange +PASS Window interface: attribute ondblclick +PASS Window interface: attribute ondrag +PASS Window interface: attribute ondragend +PASS Window interface: attribute ondragenter +FAIL Window interface: attribute ondragexit assert_own_property: The global object must have a property "ondragexit" expected property "ondragexit" missing +PASS Window interface: attribute ondragleave +PASS Window interface: attribute ondragover +PASS Window interface: attribute ondragstart +PASS Window interface: attribute ondrop +PASS Window interface: attribute ondurationchange +PASS Window interface: attribute onemptied +PASS Window interface: attribute onended +PASS Window interface: attribute onerror +PASS Window interface: attribute onfocus +PASS Window interface: attribute oninput +PASS Window interface: attribute oninvalid +PASS Window interface: attribute onkeydown +PASS Window interface: attribute onkeypress +PASS Window interface: attribute onkeyup +PASS Window interface: attribute onload +PASS Window interface: attribute onloadeddata +PASS Window interface: attribute onloadedmetadata +FAIL Window interface: attribute onloadend assert_own_property: The global object must have a property "onloadend" expected property "onloadend" missing +PASS Window interface: attribute onloadstart +PASS Window interface: attribute onmousedown +PASS Window interface: attribute onmouseenter +PASS Window interface: attribute onmouseleave +PASS Window interface: attribute onmousemove +PASS Window interface: attribute onmouseout +PASS Window interface: attribute onmouseover +PASS Window interface: attribute onmouseup +PASS Window interface: attribute onwheel +PASS Window interface: attribute onpause +PASS Window interface: attribute onplay +PASS Window interface: attribute onplaying +PASS Window interface: attribute onprogress +PASS Window interface: attribute onratechange +PASS Window interface: attribute onreset +PASS Window interface: attribute onresize +PASS Window interface: attribute onscroll +FAIL Window interface: attribute onsecuritypolicyviolation assert_own_property: The global object must have a property "onsecuritypolicyviolation" expected property "onsecuritypolicyviolation" missing +PASS Window interface: attribute onseeked +PASS Window interface: attribute onseeking +PASS Window interface: attribute onselect +PASS Window interface: attribute onstalled +PASS Window interface: attribute onsubmit +PASS Window interface: attribute onsuspend +PASS Window interface: attribute ontimeupdate +PASS Window interface: attribute ontoggle +PASS Window interface: attribute onvolumechange +PASS Window interface: attribute onwaiting +PASS Window interface: attribute onafterprint +PASS Window interface: attribute onbeforeprint +PASS Window interface: attribute onbeforeunload +PASS Window interface: attribute onhashchange +PASS Window interface: attribute onlanguagechange +PASS Window interface: attribute onmessage +PASS Window interface: attribute onmessageerror +PASS Window interface: attribute onoffline +PASS Window interface: attribute ononline +PASS Window interface: attribute onpagehide +PASS Window interface: attribute onpageshow +PASS Window interface: attribute onpopstate +PASS Window interface: attribute onrejectionhandled +PASS Window interface: attribute onstorage +PASS Window interface: attribute onunhandledrejection +PASS Window interface: attribute onunload +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 clearTimeout(long) +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: 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 +PASS Window interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via __proto__ should throw a TypeError +PASS Window interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Reflect.setPrototypeOf should return false +PASS Window interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Object.setPrototypeOf should not throw +PASS Window interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via __proto__ should not throw +PASS Window interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Reflect.setPrototypeOf should return true +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 +FAIL Window interface: window must inherit property "self" with the proper type Unrecognized type WindowProxy +PASS Window interface: window must have own property "document" +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 +PASS Window interface: window must inherit property "customElements" 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 +FAIL Window interface: window must inherit property "frames" with the proper type Unrecognized type WindowProxy +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 +FAIL Window interface: window must inherit property "parent" with the proper type Unrecognized type WindowProxy +PASS Window interface: window must inherit property "frameElement" with the proper type +PASS Window interface: window must inherit property "open(USVString, DOMString, DOMString)" with the proper type +PASS Window interface: calling open(USVString, DOMString, DOMString) 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 "applicationCache" with the proper type +PASS Window interface: window must inherit property "alert()" with the proper type +PASS Window interface: window must inherit property "alert(DOMString)" with the proper type +PASS Window interface: calling alert(DOMString) on window with too few arguments must throw TypeError +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(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 "requestAnimationFrame(FrameRequestCallback)" with the proper type +PASS Window interface: calling requestAnimationFrame(FrameRequestCallback) on window with too few arguments must throw TypeError +PASS Window interface: window must inherit property "cancelAnimationFrame(unsigned long)" with the proper type +PASS Window interface: calling cancelAnimationFrame(unsigned long) on window with too few arguments must throw TypeError +PASS Window interface: window must inherit property "postMessage(any, USVString, [object Object])" with the proper type +PASS Window interface: calling postMessage(any, USVString, [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 "external" 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 +FAIL Window interface: window must inherit property "onsecuritypolicyviolation" with the proper type assert_own_property: expected property "onsecuritypolicyviolation" missing +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 +PASS Window interface: window must inherit property "onafterprint" with the proper type +PASS Window interface: window must inherit property "onbeforeprint" with the proper type +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(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(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(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(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 +PASS BarProp interface: existence and properties of interface prototype object +PASS BarProp interface: existence and properties of interface prototype object's "constructor" property +PASS BarProp interface: attribute visible +PASS History interface: existence and properties of interface object +PASS History interface object length +PASS History interface object name +PASS History interface: existence and properties of interface prototype object +PASS History interface: existence and properties of interface prototype object's "constructor" property +FAIL History interface: attribute index assert_true: The prototype object must have a property "index" expected true got false +PASS History interface: attribute length +PASS History interface: attribute scrollRestoration +PASS History interface: attribute state +PASS History interface: operation go(long) +PASS History interface: operation back() +PASS History interface: operation forward() +PASS History interface: operation pushState(any, DOMString, USVString) +PASS History interface: operation replaceState(any, DOMString, USVString) +PASS History must be primary interface of window.history +PASS Stringification of window.history +FAIL History interface: window.history must inherit property "index" with the proper type assert_inherits: property "index" not found in prototype chain +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 +PASS History interface: window.history must inherit property "forward()" with the proper type +PASS History interface: window.history must inherit property "pushState(any, DOMString, USVString)" with the proper type +PASS History interface: calling pushState(any, DOMString, USVString) on window.history with too few arguments must throw TypeError +PASS History interface: window.history must inherit property "replaceState(any, DOMString, USVString)" with the proper type +PASS History interface: calling replaceState(any, DOMString, USVString) 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 +PASS Location interface: existence and properties of interface prototype object +PASS Location interface: existence and properties of interface prototype object's "constructor" property +FAIL Location interface: stringifier assert_own_property: interface prototype object missing non-static operation expected property "toString" missing +PASS Location must be primary interface of window.location +PASS Stringification of window.location +FAIL Location interface: window.location must have own property "href" assert_false: property descriptor should not have a "value" field expected false got true +PASS Location interface: window.location must have own property "origin" +PASS Location interface: window.location must have own property "protocol" +PASS Location interface: window.location must have own property "host" +PASS Location interface: window.location must have own property "hostname" +PASS Location interface: window.location must have own property "port" +PASS Location interface: window.location must have own property "pathname" +PASS Location interface: window.location must have own property "search" +PASS Location interface: window.location must have own property "hash" +PASS Location interface: window.location must have own property "assign" +PASS Location interface: calling assign(USVString) on window.location with too few arguments must throw TypeError +PASS Location interface: window.location must have own property "replace" +PASS Location interface: calling replace(USVString) on window.location with too few arguments must throw TypeError +PASS Location interface: window.location must have own property "reload" +PASS Location interface: window.location must have own property "ancestorOrigins" +PASS PopStateEvent interface: existence and properties of interface object +PASS PopStateEvent interface object length +PASS PopStateEvent interface object name +PASS PopStateEvent interface: existence and properties of interface prototype object +PASS PopStateEvent interface: existence and properties of interface prototype object's "constructor" property +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 +PASS HashChangeEvent interface: existence and properties of interface object +PASS HashChangeEvent interface object length +PASS HashChangeEvent interface object name +PASS HashChangeEvent interface: existence and properties of interface prototype object +PASS HashChangeEvent interface: existence and properties of interface prototype object's "constructor" property +PASS HashChangeEvent interface: attribute oldURL +PASS HashChangeEvent interface: attribute newURL +PASS PageTransitionEvent interface: existence and properties of interface object +PASS PageTransitionEvent interface object length +PASS PageTransitionEvent interface object name +PASS PageTransitionEvent interface: existence and properties of interface prototype object +PASS PageTransitionEvent interface: existence and properties of interface prototype object's "constructor" property +PASS PageTransitionEvent interface: attribute persisted +PASS BeforeUnloadEvent interface: existence and properties of interface object +PASS BeforeUnloadEvent interface object length +PASS BeforeUnloadEvent interface object name +PASS BeforeUnloadEvent interface: existence and properties of interface prototype object +PASS BeforeUnloadEvent interface: existence and properties of interface prototype object's "constructor" property +PASS BeforeUnloadEvent interface: attribute returnValue +PASS ApplicationCache interface: existence and properties of interface object +PASS ApplicationCache interface object length +PASS ApplicationCache interface object name +PASS ApplicationCache interface: existence and properties of interface prototype object +PASS ApplicationCache interface: existence and properties of interface prototype object's "constructor" property +PASS ApplicationCache interface: constant UNCACHED on interface object +PASS ApplicationCache interface: constant UNCACHED on interface prototype object +PASS ApplicationCache interface: constant IDLE on interface object +PASS ApplicationCache interface: constant IDLE on interface prototype object +PASS ApplicationCache interface: constant CHECKING on interface object +PASS ApplicationCache interface: constant CHECKING on interface prototype object +PASS ApplicationCache interface: constant DOWNLOADING on interface object +PASS ApplicationCache interface: constant DOWNLOADING on interface prototype object +PASS ApplicationCache interface: constant UPDATEREADY on interface object +PASS ApplicationCache interface: constant UPDATEREADY on interface prototype object +PASS ApplicationCache interface: constant OBSOLETE on interface object +PASS ApplicationCache interface: constant OBSOLETE on interface prototype object +PASS ApplicationCache interface: attribute status +PASS ApplicationCache interface: operation update() +PASS ApplicationCache interface: operation abort() +PASS ApplicationCache interface: operation swapCache() +PASS ApplicationCache interface: attribute onchecking +PASS ApplicationCache interface: attribute onerror +PASS ApplicationCache interface: attribute onnoupdate +PASS ApplicationCache interface: attribute ondownloading +PASS ApplicationCache interface: attribute onprogress +PASS ApplicationCache interface: attribute onupdateready +PASS ApplicationCache interface: attribute oncached +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 +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 +PASS ErrorEvent interface: existence and properties of interface prototype object +PASS ErrorEvent interface: existence and properties of interface prototype object's "constructor" property +PASS ErrorEvent interface: attribute message +PASS ErrorEvent interface: attribute filename +PASS ErrorEvent interface: attribute lineno +PASS ErrorEvent interface: attribute colno +PASS ErrorEvent interface: attribute error +PASS PromiseRejectionEvent interface: existence and properties of interface object +PASS PromiseRejectionEvent interface object length +PASS PromiseRejectionEvent interface object name +PASS PromiseRejectionEvent interface: existence and properties of interface prototype object +PASS PromiseRejectionEvent interface: existence and properties of interface prototype object's "constructor" property +PASS PromiseRejectionEvent interface: attribute promise +PASS PromiseRejectionEvent interface: attribute reason +PASS Navigator interface: existence and properties of interface object +PASS Navigator interface object length +PASS Navigator interface object name +PASS Navigator interface: existence and properties of interface prototype object +PASS Navigator interface: existence and properties of interface prototype object's "constructor" property +PASS Navigator interface: attribute appCodeName +PASS Navigator interface: attribute appName +PASS Navigator interface: attribute appVersion +PASS Navigator interface: attribute platform +PASS Navigator interface: attribute product +PASS Navigator interface: attribute productSub +PASS Navigator interface: attribute userAgent +PASS Navigator interface: attribute vendor +PASS Navigator interface: attribute vendorSub +FAIL Navigator interface: operation taintEnabled() assert_own_property: interface prototype object missing non-static operation expected property "taintEnabled" missing +FAIL Navigator interface: attribute oscpu assert_true: The prototype object must have a property "oscpu" expected true got false +PASS Navigator interface: attribute language +PASS Navigator interface: attribute languages +PASS Navigator interface: attribute onLine +PASS Navigator interface: operation registerProtocolHandler(DOMString, USVString, DOMString) +PASS Navigator interface: operation unregisterProtocolHandler(DOMString, USVString) +PASS Navigator interface: attribute cookieEnabled +PASS Navigator interface: attribute plugins +PASS Navigator interface: attribute mimeTypes +PASS Navigator interface: operation javaEnabled() +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 +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 +FAIL Navigator interface: window.navigator must inherit property "taintEnabled()" with the proper type assert_inherits: property "taintEnabled" not found in prototype chain +FAIL Navigator interface: window.navigator must inherit property "oscpu" with the proper type assert_inherits: property "oscpu" not found in prototype chain +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 +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 +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 +PASS PluginArray interface: existence and properties of interface prototype object +PASS PluginArray interface: existence and properties of interface prototype object's "constructor" property +PASS PluginArray interface: operation refresh(boolean) +PASS PluginArray interface: attribute length +PASS PluginArray interface: operation item(unsigned long) +PASS PluginArray interface: operation namedItem(DOMString) +PASS MimeTypeArray interface: existence and properties of interface object +PASS MimeTypeArray interface object length +PASS MimeTypeArray interface object name +PASS MimeTypeArray interface: existence and properties of interface prototype object +PASS MimeTypeArray interface: existence and properties of interface prototype object's "constructor" property +PASS MimeTypeArray interface: attribute length +PASS MimeTypeArray interface: operation item(unsigned long) +PASS MimeTypeArray interface: operation namedItem(DOMString) +PASS Plugin interface: existence and properties of interface object +PASS Plugin interface object length +PASS Plugin interface object name +PASS Plugin interface: existence and properties of interface prototype object +PASS Plugin interface: existence and properties of interface prototype object's "constructor" property +PASS Plugin interface: attribute name +PASS Plugin interface: attribute description +PASS Plugin interface: attribute filename +PASS Plugin interface: attribute length +PASS Plugin interface: operation item(unsigned long) +PASS Plugin interface: operation namedItem(DOMString) +PASS MimeType interface: existence and properties of interface object +PASS MimeType interface object length +PASS MimeType interface object name +PASS MimeType interface: existence and properties of interface prototype object +PASS MimeType interface: existence and properties of interface prototype object's "constructor" property +PASS MimeType interface: attribute type +PASS MimeType interface: attribute description +PASS MimeType interface: attribute suffixes +PASS MimeType interface: attribute enabledPlugin +PASS ImageBitmap interface: existence and properties of interface object +PASS ImageBitmap interface object length +PASS ImageBitmap interface object name +PASS ImageBitmap interface: existence and properties of interface prototype object +PASS ImageBitmap interface: existence and properties of interface prototype object's "constructor" property +PASS ImageBitmap interface: attribute width +PASS ImageBitmap interface: attribute height +PASS ImageBitmap interface: operation close() +PASS MessageEvent interface: existence and properties of interface object +PASS MessageEvent interface object length +PASS MessageEvent interface object name +PASS MessageEvent interface: existence and properties of interface prototype object +PASS MessageEvent interface: existence and properties of interface prototype object's "constructor" property +PASS MessageEvent interface: attribute data +PASS MessageEvent interface: attribute origin +PASS MessageEvent interface: attribute lastEventId +PASS MessageEvent interface: attribute source +PASS MessageEvent interface: attribute ports +FAIL MessageEvent interface: operation initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [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 +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 +FAIL MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "source" with the proper type Unrecognized type WindowProxy +PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "ports" with the proper type +PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object])" with the proper type +FAIL MessageEvent interface: calling initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [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 +PASS EventSource interface object length +PASS EventSource interface object name +PASS EventSource interface: existence and properties of interface prototype object +PASS EventSource interface: existence and properties of interface prototype object's "constructor" property +PASS EventSource interface: attribute url +PASS EventSource interface: attribute withCredentials +PASS EventSource interface: constant CONNECTING on interface object +PASS EventSource interface: constant CONNECTING on interface prototype object +PASS EventSource interface: constant OPEN on interface object +PASS EventSource interface: constant OPEN on interface prototype object +PASS EventSource interface: constant CLOSED on interface object +PASS EventSource interface: constant CLOSED on interface prototype object +PASS EventSource interface: attribute readyState +PASS EventSource interface: attribute onopen +PASS EventSource interface: attribute onmessage +PASS EventSource interface: attribute onerror +PASS EventSource interface: operation close() +PASS WebSocket interface: existence and properties of interface object +PASS WebSocket interface object length +PASS WebSocket interface object name +PASS WebSocket interface: existence and properties of interface prototype object +PASS WebSocket interface: existence and properties of interface prototype object's "constructor" property +PASS WebSocket interface: attribute url +PASS WebSocket interface: constant CONNECTING on interface object +PASS WebSocket interface: constant CONNECTING on interface prototype object +PASS WebSocket interface: constant OPEN on interface object +PASS WebSocket interface: constant OPEN on interface prototype object +PASS WebSocket interface: constant CLOSING on interface object +PASS WebSocket interface: constant CLOSING on interface prototype object +PASS WebSocket interface: constant CLOSED on interface object +PASS WebSocket interface: constant CLOSED on interface prototype object +PASS WebSocket interface: attribute readyState +PASS WebSocket interface: attribute bufferedAmount +PASS WebSocket interface: attribute onopen +PASS WebSocket interface: attribute onerror +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: attribute onmessage +PASS WebSocket interface: attribute binaryType +PASS WebSocket interface: operation send(USVString) +PASS WebSocket interface: operation send(Blob) +PASS WebSocket interface: operation send(ArrayBuffer) +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 +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(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(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(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 +PASS CloseEvent interface object name +PASS CloseEvent interface: existence and properties of interface prototype object +PASS CloseEvent interface: existence and properties of interface prototype object's "constructor" property +PASS CloseEvent interface: attribute wasClean +PASS CloseEvent interface: attribute code +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 +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 +PASS MessageChannel interface: existence and properties of interface prototype object +PASS MessageChannel interface: existence and properties of interface prototype object's "constructor" property +PASS MessageChannel interface: attribute port1 +PASS MessageChannel interface: attribute port2 +PASS MessagePort interface: existence and properties of interface object +PASS MessagePort interface object length +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 start() +PASS MessagePort interface: operation close() +PASS MessagePort interface: attribute onmessage +PASS MessagePort interface: attribute onmessageerror +PASS BroadcastChannel interface: existence and properties of interface object +PASS BroadcastChannel interface object length +PASS BroadcastChannel interface object name +PASS BroadcastChannel interface: existence and properties of interface prototype object +PASS BroadcastChannel interface: existence and properties of interface prototype object's "constructor" property +PASS BroadcastChannel interface: attribute name +PASS BroadcastChannel interface: operation postMessage(any) +PASS BroadcastChannel interface: operation close() +PASS BroadcastChannel interface: attribute onmessage +PASS BroadcastChannel interface: attribute onmessageerror +PASS WorkerGlobalScope interface: existence and properties of interface object +PASS DedicatedWorkerGlobalScope interface: existence and properties of interface object +PASS SharedWorkerGlobalScope interface: existence and properties of interface object +PASS Worker interface: existence and properties of interface object +PASS Worker interface object length +PASS Worker interface object name +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: attribute onmessage +FAIL Worker interface: attribute onmessageerror assert_true: The prototype object must have a property "onmessageerror" expected true got false +PASS Worker interface: attribute onerror +PASS SharedWorker interface: existence and properties of interface object +PASS SharedWorker interface object length +PASS SharedWorker interface object name +PASS SharedWorker interface: existence and properties of interface prototype object +PASS SharedWorker interface: existence and properties of interface prototype object's "constructor" property +PASS SharedWorker interface: attribute port +PASS SharedWorker interface: attribute onerror +PASS WorkerNavigator interface: existence and properties of interface object +PASS WorkerLocation interface: existence and properties of interface object +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 +PASS Storage interface: attribute length +PASS Storage interface: operation key(unsigned long) +PASS Storage interface: operation getItem(DOMString) +PASS Storage interface: operation setItem(DOMString, DOMString) +PASS Storage interface: operation removeItem(DOMString) +PASS Storage interface: operation clear() +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 +PASS HTMLMarqueeElement interface: existence and properties of interface object +PASS HTMLMarqueeElement interface object length +PASS HTMLMarqueeElement interface object name +PASS HTMLMarqueeElement interface: existence and properties of interface prototype object +PASS HTMLMarqueeElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLMarqueeElement interface: attribute behavior +PASS HTMLMarqueeElement interface: attribute bgColor +PASS HTMLMarqueeElement interface: attribute direction +PASS HTMLMarqueeElement interface: attribute height +PASS HTMLMarqueeElement interface: attribute hspace +PASS HTMLMarqueeElement interface: attribute loop +PASS HTMLMarqueeElement interface: attribute scrollAmount +PASS HTMLMarqueeElement interface: attribute scrollDelay +PASS HTMLMarqueeElement interface: attribute trueSpeed +PASS HTMLMarqueeElement interface: attribute vspace +PASS HTMLMarqueeElement interface: attribute width +FAIL HTMLMarqueeElement interface: attribute onbounce assert_true: The prototype object must have a property "onbounce" expected true got false +FAIL HTMLMarqueeElement interface: attribute onfinish assert_true: The prototype object must have a property "onfinish" expected true got false +FAIL HTMLMarqueeElement interface: attribute onstart assert_true: The prototype object must have a property "onstart" expected true got false +PASS HTMLMarqueeElement interface: operation start() +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 +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 +PASS HTMLFrameSetElement interface: existence and properties of interface prototype object +PASS HTMLFrameSetElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLFrameSetElement interface: attribute cols +PASS HTMLFrameSetElement interface: attribute rows +PASS HTMLFrameSetElement interface: attribute onafterprint +PASS HTMLFrameSetElement interface: attribute onbeforeprint +PASS HTMLFrameSetElement interface: attribute onbeforeunload +PASS HTMLFrameSetElement interface: attribute onhashchange +PASS HTMLFrameSetElement interface: attribute onlanguagechange +PASS HTMLFrameSetElement interface: attribute onmessage +PASS HTMLFrameSetElement interface: attribute onmessageerror +PASS HTMLFrameSetElement interface: attribute onoffline +PASS HTMLFrameSetElement interface: attribute ononline +PASS HTMLFrameSetElement interface: attribute onpagehide +PASS HTMLFrameSetElement interface: attribute onpageshow +PASS HTMLFrameSetElement interface: attribute onpopstate +PASS HTMLFrameSetElement interface: attribute onrejectionhandled +PASS HTMLFrameSetElement interface: attribute onstorage +PASS HTMLFrameSetElement interface: attribute onunhandledrejection +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 +PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "rows" with the proper type +PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onafterprint" with the proper type +PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onbeforeprint" with the proper type +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 +PASS HTMLFrameElement interface: existence and properties of interface prototype object +PASS HTMLFrameElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLFrameElement interface: attribute name +PASS HTMLFrameElement interface: attribute scrolling +PASS HTMLFrameElement interface: attribute src +PASS HTMLFrameElement interface: attribute frameBorder +PASS HTMLFrameElement interface: attribute longDesc +PASS HTMLFrameElement interface: attribute noResize +PASS HTMLFrameElement interface: attribute contentDocument +PASS HTMLFrameElement interface: attribute contentWindow +PASS HTMLFrameElement interface: attribute marginHeight +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 +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 +PASS HTMLDirectoryElement interface: existence and properties of interface prototype object +PASS HTMLDirectoryElement interface: existence and properties of interface prototype object's "constructor" property +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 +PASS HTMLFontElement interface: existence and properties of interface object +PASS HTMLFontElement interface object length +PASS HTMLFontElement interface object name +PASS HTMLFontElement interface: existence and properties of interface prototype object +PASS HTMLFontElement interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLFontElement interface: attribute color +PASS HTMLFontElement interface: attribute face +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 +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 +PASS Stringification of window.external +PASS External interface: window.external must inherit property "AddSearchProvider()" with the proper type +PASS External interface: window.external must inherit property "IsSearchProviderInstalled()" 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 1fd50f1..f2473ff 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
@@ -1,4 +1,4 @@ This is a testharness.js-based test. -FAIL Test driver promise_test: Unhandled rejection with value: "NonElementParentNode: interface mixin not yet supported" +FAIL Test driver promise_test: Unhandled rejection with value: "SVGElement implements ElementCSSInlineStyle, but SVGElement is undefined." Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/Function.js b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/Function.js new file mode 100644 index 0000000..bc88bf7b --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/Function.js
@@ -0,0 +1 @@ +Function(`import('../../imports-a.js?label=' + window.label).then(window.continueTest, window.errorTest)`)();
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/eval.js b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/eval.js new file mode 100644 index 0000000..a8bcffe --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/eval.js
@@ -0,0 +1 @@ +eval(`import('../../imports-a.js?label=' + window.label).then(window.continueTest, window.errorTest)`);
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/inline-event-handlers-UA-code.js b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/inline-event-handlers-UA-code.js new file mode 100644 index 0000000..c0bd8655 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/inline-event-handlers-UA-code.js
@@ -0,0 +1,2 @@ +window.dummyDiv.setAttribute("onclick", `import('../../imports-a.js?label=' + window.label).then(window.continueTest, window.errorTest)`); +window.dummyDiv.click(); // different from **on**click()
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/reflected-inline-event-handlers.js b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/reflected-inline-event-handlers.js new file mode 100644 index 0000000..f19ec2b0 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/reflected-inline-event-handlers.js
@@ -0,0 +1,2 @@ +window.dummyDiv.setAttribute("onclick", `import('../../imports-a.js?label=' + window.label).then(window.continueTest, window.errorTest)`); +window.dummyDiv.onclick();
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/setTimeout.js b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/setTimeout.js new file mode 100644 index 0000000..c6f2dda --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/setTimeout.js
@@ -0,0 +1 @@ +setTimeout(`import('../../imports-a.js?label=' + window.label).then(window.continueTest, window.errorTest)`, 0);
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-classic-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-classic-expected.txt new file mode 100644 index 0000000..2c67ac7 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-classic-expected.txt
@@ -0,0 +1,8 @@ +This is a testharness.js-based test. +FAIL setTimeout should successfully import promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/imports-a.js?label=setTimeout" +PASS eval should successfully import +PASS Function should successfully import +FAIL reflected-inline-event-handlers should successfully import promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/imports-a.js?label=reflected-inline-event-handlers" +FAIL inline-event-handlers-UA-code should successfully import promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/imports-a.js?label=inline-event-handlers-UA-code" +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-classic.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-classic.html new file mode 100644 index 0000000..7cf2dac --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-classic.html
@@ -0,0 +1,52 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>import() inside compiled strings uses the script base URL inside a classic script that is loaded from a file</title> +<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<div id="dummy"></div> + +<script> +function load(scriptSrc) { + const el = document.createElement("script"); + el.src = scriptSrc; + document.body.appendChild(el); +} + +function createTestPromise() { + return new Promise((resolve, reject) => { + window.dummyDiv.removeAttribute("onclick"); + delete window.evaluated_imports_a; + delete window.label; + + window.continueTest = resolve; + window.errorTest = reject; + }); +} + +window.dummyDiv = document.querySelector("#dummy"); + +const evaluators = [ + "setTimeout", + "eval", + "Function", + "reflected-inline-event-handlers", + "inline-event-handlers-UA-code" +]; + +for (const label of evaluators) { + promise_test(() => { + const promise = createTestPromise(); + + window.label = label; + load(`scripts/${label}.js`); + + return promise.then(module => { + assert_true(window.evaluated_imports_a, "The module must have been evaluated"); + assert_equals(module.A.from, "imports-a.js", "The module namespace object must be correct"); + }); + }, label + " should successfully import"); +}; +</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-module-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-module-expected.txt new file mode 100644 index 0000000..2c67ac7 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-module-expected.txt
@@ -0,0 +1,8 @@ +This is a testharness.js-based test. +FAIL setTimeout should successfully import promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/imports-a.js?label=setTimeout" +PASS eval should successfully import +PASS Function should successfully import +FAIL reflected-inline-event-handlers should successfully import promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/imports-a.js?label=reflected-inline-event-handlers" +FAIL inline-event-handlers-UA-code should successfully import promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/imports-a.js?label=inline-event-handlers-UA-code" +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-module.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-module.html new file mode 100644 index 0000000..73986c2 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-module.html
@@ -0,0 +1,53 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>import() inside compiled strings uses the script base URL inside a module script that is loaded from a file</title> +<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<div id="dummy"></div> + +<script type="module"> +function load(scriptSrc) { + const el = document.createElement("script"); + el.type = "module"; + el.src = scriptSrc; + document.body.appendChild(el); +} + +function createTestPromise() { + return new Promise((resolve, reject) => { + window.dummyDiv.removeAttribute("onclick"); + delete window.evaluated_imports_a; + delete window.label; + + window.continueTest = resolve; + window.errorTest = reject; + }); +} + +window.dummyDiv = document.querySelector("#dummy"); + +const evaluators = [ + "setTimeout", + "eval", + "Function", + "reflected-inline-event-handlers", + "inline-event-handlers-UA-code" +]; + +for (const label of evaluators) { + promise_test(() => { + const promise = createTestPromise(); + + window.label = label; + load(`scripts/${label}.js`); + + return promise.then(module => { + assert_true(window.evaluated_imports_a, "The module must have been evaluated"); + assert_equals(module.A.from, "imports-a.js", "The module namespace object must be correct"); + }); + }, label + " should successfully import"); +}; +</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-inline-classic-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-inline-classic-expected.txt new file mode 100644 index 0000000..d2d6c0f --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-inline-classic-expected.txt
@@ -0,0 +1,8 @@ +This is a testharness.js-based test. +FAIL setTimeout should successfully import promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/module/dynamic-import/imports-a.js?label=setTimeout" +FAIL eval should successfully import promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/module/dynamic-import/imports-a.js?label=eval" +FAIL the Function constructor should successfully import promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/module/dynamic-import/imports-a.js?label=the%20Function%20constructor" +FAIL reflected inline event handlers should successfully import promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/module/dynamic-import/imports-a.js?label=reflected%20inline%20event%20handlers" +FAIL inline event handlers triggered via UA code should successfully import promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/module/dynamic-import/imports-a.js?label=inline%20event%20handlers%20triggered%20via%20UA%20code" +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-classic.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-inline-classic.html similarity index 91% rename from third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-classic.html rename to third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-inline-classic.html index 062bb620..1bd6d7d 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-classic.html +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-inline-classic.html
@@ -1,6 +1,6 @@ <!DOCTYPE html> <meta charset="utf-8"> -<title>import() inside compiled strings uses the document base URL inside a classic script</title> +<title>import() inside compiled strings uses the script base URL (= document base URL) inside an inline classic script</title> <link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me"> <base href=".."> @@ -21,8 +21,8 @@ const dummyDiv = document.querySelector("#dummy"); const evaluators = { - eval, setTimeout, + eval, "the Function constructor"(x) { Function(x)(); },
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-inline-module-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-inline-module-expected.txt new file mode 100644 index 0000000..81414c53 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-inline-module-expected.txt
@@ -0,0 +1,8 @@ +This is a testharness.js-based test. +FAIL setTimeout should successfully import promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/module/dynamic-import/imports-a.js?label=setTimeout" +PASS eval should successfully import +PASS the Function constructor should successfully import +FAIL reflected inline event handlers should successfully import promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/module/dynamic-import/imports-a.js?label=reflected%20inline%20event%20handlers" +FAIL inline event handlers triggered via UA code should successfully import promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/module/dynamic-import/imports-a.js?label=inline%20event%20handlers%20triggered%20via%20UA%20code" +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-module.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-inline-module.html similarity index 91% rename from third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-module.html rename to third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-inline-module.html index de51c9a4..f5b8574 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-module.html +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-inline-module.html
@@ -1,6 +1,6 @@ <!DOCTYPE html> <meta charset="utf-8"> -<title>import() inside compiled strings uses the document base URL inside a module script</title> +<title>import() inside compiled strings uses the script base URL (= document base URL) inside an inline module script</title> <link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me"> <base href=".."> @@ -21,8 +21,8 @@ const dummyDiv = document.querySelector("#dummy"); const evaluators = { - eval, setTimeout, + eval, "the Function constructor"(x) { Function(x)(); },
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-integrity-classic.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-integrity-classic.html new file mode 100644 index 0000000..666bc7c --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-integrity-classic.html
@@ -0,0 +1,52 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>import() doesn't have any integrity metadata when initiated by compiled strings inside a classic script</title> +<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me"> +<meta http-equiv="Content-Security-Policy" content="require-sri-for script"> + +<script src="/resources/testharness.js" integrity="sha384-4Nybydhnr3tOpv1yrTkDxu3RFpnxWAxlU5kGn7c8ebKvh1iUdfVMjqP6jf0dacrV"></script> +<script src="/resources/testharnessreport.js" integrity="sha384-GOnHxuyo+nnsFAe4enY+RAl4/+w5NPMJPCQiDroTjxtR7ndRz7Uan8vNbM2qWKmU"></script> + +<div id="dummy"></div> + +<script> +function createTestPromise() { + return new Promise((resolve, reject) => { + window.continueTest = resolve; + window.errorTest = reject; + }); +} + +const dummyDiv = document.querySelector("#dummy"); + +const evaluators = { + eval, + setTimeout, + "the Function constructor"(x) { + Function(x)(); + }, + "reflected inline event handlers"(x) { + dummyDiv.setAttribute("onclick", x); + dummyDiv.onclick(); + }, + "inline event handlers triggered via UA code"(x) { + dummyDiv.setAttribute("onclick", x); + dummyDiv.click(); // different from .**on**click() + } +}; + +for (const [label, evaluator] of Object.entries(evaluators)) { + promise_test(t => { + t.add_cleanup(() => { + dummyDiv.removeAttribute("onclick"); + delete window.evaluated_imports_a; + }); + + const promise = createTestPromise(); + + evaluator(`import('../imports-a.js?label=${label}').then(window.continueTest, window.errorTest);`); + + return promise_rejects(t, new TypeError(), promise); + }, label + " should fail to import"); +}; +</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-integrity-module.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-integrity-module.html new file mode 100644 index 0000000..497c9d97 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-integrity-module.html
@@ -0,0 +1,52 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>import() doesn't have any integrity metadata when initiated by compiled strings inside a module script</title> +<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me"> +<meta http-equiv="Content-Security-Policy" content="require-sri-for script"> + +<script src="/resources/testharness.js" integrity="sha384-4Nybydhnr3tOpv1yrTkDxu3RFpnxWAxlU5kGn7c8ebKvh1iUdfVMjqP6jf0dacrV"></script> +<script src="/resources/testharnessreport.js" integrity="sha384-GOnHxuyo+nnsFAe4enY+RAl4/+w5NPMJPCQiDroTjxtR7ndRz7Uan8vNbM2qWKmU"></script> + +<div id="dummy"></div> + +<script type="module"> +function createTestPromise() { + return new Promise((resolve, reject) => { + window.continueTest = resolve; + window.errorTest = reject; + }); +} + +const dummyDiv = document.querySelector("#dummy"); + +const evaluators = { + eval, + setTimeout, + "the Function constructor"(x) { + Function(x)(); + }, + "reflected inline event handlers"(x) { + dummyDiv.setAttribute("onclick", x); + dummyDiv.onclick(); + }, + "inline event handlers triggered via UA code"(x) { + dummyDiv.setAttribute("onclick", x); + dummyDiv.click(); // different from .**on**click() + } +}; + +for (const [label, evaluator] of Object.entries(evaluators)) { + promise_test(t => { + t.add_cleanup(() => { + dummyDiv.removeAttribute("onclick"); + delete window.evaluated_imports_a; + }); + + const promise = createTestPromise(); + + evaluator(`import('../imports-a.js?label=${label}').then(window.continueTest, window.errorTest);`); + + return promise_rejects(t, new TypeError(), promise); + }, label + " should fail to import"); +}; +</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic-expected.txt new file mode 100644 index 0000000..a13de4f1 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic-expected.txt
@@ -0,0 +1,9 @@ +This is a testharness.js-based test. +FAIL setTimeout must inherit the nonce from the triggering script, thus execute assert_true: The module must have been evaluated expected true got undefined +PASS direct eval must inherit the nonce from the triggering script, thus execute +PASS indirect eval must inherit the nonce from the triggering script, thus execute +PASS the Function constructor must inherit the nonce from the triggering script, thus execute +FAIL reflected inline event handlers must inherit the nonce from the triggering script, thus execute promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/module/imports-a.js?label=reflected%20inline%20event%20handlers" +FAIL inline event handlers triggered via UA code must inherit the nonce from the triggering script, thus execute promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/module/imports-a.js?label=inline%20event%20handlers%20triggered%20via%20UA%20code" +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic.html new file mode 100644 index 0000000..ba82fe8 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic.html
@@ -0,0 +1,103 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>import() inside compiled strings uses the appropriate nonce inside a classic script</title> +<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me"> + +<meta http-equiv="content-security-policy" content="script-src 'nonce-correct' 'unsafe-eval' 'unsafe-hashed-attributes' 'sha256-cAMzxBL19bKt4KwKGbxy/ZOFIIjH5AmRjlVbsD5pvNw=' 'sha256-3VjoJYNK/9HJMS8rrZHlqSZgUssDY+GPyc7AU8lNM3k='"> + +<script nonce="correct" src="/resources/testharness.js"></script> +<script nonce="correct" src="/resources/testharnessreport.js"></script> + +<div id="dummy"></div> + +<script nonce="correct"> +"use strict"; +const dummyDiv = document.querySelector("#dummy"); + +function createTestPromise(t) { + t.add_cleanup(() => { + delete window.evaluated_imports_a; + delete window.unreached; + delete window.continueTest; + delete window.errorTest; + }); + + return new Promise((resolve, reject) => { + window.unreached = t.unreached_func("Must not reach this"); + window.continueTest = resolve; + window.errorTest = reject; + }); +} + +function assertSuccessful(module) { + assert_true(window.evaluated_imports_a, "The module must have been evaluated"); + assert_equals(module.A.from, "imports-a.js", "The module namespace object must be correct"); +} + +promise_test(t => { + const promise = createTestPromise(t); + + setTimeout(`import('../imports-a.js?label=setTimeout').then(window.unreached, window.continueTest)`, 0); + + return promise.then(assertSuccessful); +}, "setTimeout must inherit the nonce from the triggering script, thus execute"); + +promise_test(t => { + const promise = createTestPromise(t); + + eval(`import('../imports-a.js?label=direct eval').then(window.continueTest, window.errorTest)`); + + return promise.then(assertSuccessful); +}, "direct eval must inherit the nonce from the triggering script, thus execute"); + +promise_test(t => { + const promise = createTestPromise(t); + + const evalAlias = eval; + evalAlias(`import('../imports-a.js?label=indirect eval').then(window.continueTest, window.errorTest)`); + + return promise.then(assertSuccessful); +}, "indirect eval must inherit the nonce from the triggering script, thus execute"); + +promise_test(t => { + const promise = createTestPromise(t); + + Function(`import('../imports-a.js?label=the Function constructor').then(window.continueTest, window.errorTest)`)(); + + return promise.then(assertSuccessful); +}, "the Function constructor must inherit the nonce from the triggering script, thus execute"); + +promise_test(t => { + t.add_cleanup(() => { + dummyDiv.removeAttribute("onclick"); + }); + + const promise = createTestPromise(t); + + // This only works because of the 'unsafe-hashed-attributes' and the hash in the CSP policy + dummyDiv.setAttribute( + "onclick", + `import('../imports-a.js?label=reflected inline event handlers').then(window.continueTest, window.errorTest)` + ); + dummyDiv.onclick(); + + return promise.then(assertSuccessful); +}, "reflected inline event handlers must inherit the nonce from the triggering script, thus execute"); + +promise_test(t => { + t.add_cleanup(() => { + dummyDiv.removeAttribute("onclick"); + }); + + const promise = createTestPromise(t); + + // This only works because of the 'unsafe-hashed-attributes' and the hash in the CSP policy + dummyDiv.setAttribute( + "onclick", + `import('../imports-a.js?label=inline event handlers triggered via UA code').then(window.continueTest, window.errorTest)` + ); + dummyDiv.click(); // different from **on**click() + + return promise.then(assertSuccessful); +}, "inline event handlers triggered via UA code must inherit the nonce from the triggering script, thus execute"); +</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module-expected.txt new file mode 100644 index 0000000..a13de4f1 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module-expected.txt
@@ -0,0 +1,9 @@ +This is a testharness.js-based test. +FAIL setTimeout must inherit the nonce from the triggering script, thus execute assert_true: The module must have been evaluated expected true got undefined +PASS direct eval must inherit the nonce from the triggering script, thus execute +PASS indirect eval must inherit the nonce from the triggering script, thus execute +PASS the Function constructor must inherit the nonce from the triggering script, thus execute +FAIL reflected inline event handlers must inherit the nonce from the triggering script, thus execute promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/module/imports-a.js?label=reflected%20inline%20event%20handlers" +FAIL inline event handlers triggered via UA code must inherit the nonce from the triggering script, thus execute promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/module/imports-a.js?label=inline%20event%20handlers%20triggered%20via%20UA%20code" +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module.html new file mode 100644 index 0000000..889628f --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module.html
@@ -0,0 +1,102 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>import() inside compiled strings uses the appropriate nonce inside a module script</title> +<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me"> + +<meta http-equiv="content-security-policy" content="script-src 'nonce-correct' 'unsafe-eval' 'unsafe-hashed-attributes' 'sha256-cAMzxBL19bKt4KwKGbxy/ZOFIIjH5AmRjlVbsD5pvNw=' 'sha256-3VjoJYNK/9HJMS8rrZHlqSZgUssDY+GPyc7AU8lNM3k='"> + +<script nonce="correct" src="/resources/testharness.js"></script> +<script nonce="correct" src="/resources/testharnessreport.js"></script> + +<div id="dummy"></div> + +<script type="module" nonce="correct"> +const dummyDiv = document.querySelector("#dummy"); + +function createTestPromise(t) { + t.add_cleanup(() => { + delete window.evaluated_imports_a; + delete window.unreached; + delete window.continueTest; + delete window.errorTest; + }); + + return new Promise((resolve, reject) => { + window.unreached = t.unreached_func("Must not reach this"); + window.continueTest = resolve; + window.errorTest = reject; + }); +} + +function assertSuccessful(module) { + assert_true(window.evaluated_imports_a, "The module must have been evaluated"); + assert_equals(module.A.from, "imports-a.js", "The module namespace object must be correct"); +} + +promise_test(t => { + const promise = createTestPromise(t); + + setTimeout(`import('../imports-a.js?label=setTimeout').then(window.unreached, window.continueTest)`, 0); + + return promise.then(assertSuccessful); +}, "setTimeout must inherit the nonce from the triggering script, thus execute"); + +promise_test(t => { + const promise = createTestPromise(t); + + eval(`import('../imports-a.js?label=direct eval').then(window.continueTest, window.errorTest)`); + + return promise.then(assertSuccessful); +}, "direct eval must inherit the nonce from the triggering script, thus execute"); + +promise_test(t => { + const promise = createTestPromise(t); + + const evalAlias = eval; + evalAlias(`import('../imports-a.js?label=indirect eval').then(window.continueTest, window.errorTest)`); + + return promise.then(assertSuccessful); +}, "indirect eval must inherit the nonce from the triggering script, thus execute"); + +promise_test(t => { + const promise = createTestPromise(t); + + Function(`import('../imports-a.js?label=the Function constructor').then(window.continueTest, window.errorTest)`)(); + + return promise.then(assertSuccessful); +}, "the Function constructor must inherit the nonce from the triggering script, thus execute"); + +promise_test(t => { + t.add_cleanup(() => { + dummyDiv.removeAttribute("onclick"); + }); + + const promise = createTestPromise(t); + + // This only works because of the 'unsafe-hashed-attributes' and the hash in the CSP policy + dummyDiv.setAttribute( + "onclick", + `import('../imports-a.js?label=reflected inline event handlers').then(window.continueTest, window.errorTest)` + ); + dummyDiv.onclick(); + + return promise.then(assertSuccessful); +}, "reflected inline event handlers must inherit the nonce from the triggering script, thus execute"); + +promise_test(t => { + t.add_cleanup(() => { + dummyDiv.removeAttribute("onclick"); + }); + + const promise = createTestPromise(t); + + // This only works because of the 'unsafe-hashed-attributes' and the hash in the CSP policy + dummyDiv.setAttribute( + "onclick", + `import('../imports-a.js?label=inline event handlers triggered via UA code').then(window.continueTest, window.errorTest)` + ); + dummyDiv.click(); // different from **on**click() + + return promise.then(assertSuccessful); +}, "inline event handlers triggered via UA code must inherit the nonce from the triggering script, thus execute"); +</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/text-level-semantics/the-ruby-element/ruby-usage-notref.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/text-level-semantics/the-ruby-element/ruby-usage-notref.html new file mode 100644 index 0000000..f574781 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/text-level-semantics/the-ruby-element/ruby-usage-notref.html
@@ -0,0 +1,6 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>HTML Reference File</title> +<link rel="author" title="Intel" href="http://www.intel.com/"> + +<p>君くん子しは和わして同どうぜず</p>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/text-level-semantics/the-ruby-element/ruby-usage.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/text-level-semantics/the-ruby-element/ruby-usage.html new file mode 100644 index 0000000..59c076c --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/text-level-semantics/the-ruby-element/ruby-usage.html
@@ -0,0 +1,8 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>HTML test: ruby - mark phrasing content</title> +<link rel="author" title="Intel" href="http://www.intel.com/"> +<link rel="mismatch" href="ruby-usage-notref.html"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-ruby-element"/> + +<p><ruby>君<rt>くん</ruby><ruby>子<rt>し</ruby>は<ruby>和<rt>わ</ruby>して<ruby>同<rt>どう</ruby>ぜず</p>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/animation-frames/idlharness.html b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/animation-frames/idlharness.html index acc6657f..3a9d1d9b 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/animation-frames/idlharness.html +++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/animation-frames/idlharness.html
@@ -15,7 +15,7 @@ <p>This test validates the WebIDL included in the Timing control for script-based animations specification.</p> <pre id='untested_idl' style='display:none'> -[PrimaryGlobal] +[Global=Window, Exposed=Window] interface Window { }; </pre>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/interfaces/html.idl b/third_party/WebKit/LayoutTests/external/wpt/interfaces/html.idl index f23334f..7d4fe774 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/interfaces/html.idl +++ b/third_party/WebKit/LayoutTests/external/wpt/interfaces/html.idl
@@ -86,8 +86,8 @@ // special event handler IDL attributes that only apply to Document objects [LenientThis] attribute EventHandler onreadystatechange; }; -Document implements GlobalEventHandlers; -Document implements DocumentAndElementEventHandlers; +Document includes GlobalEventHandlers; +Document includes DocumentAndElementEventHandlers; [Exposed=Window, HTMLConstructor] @@ -117,9 +117,9 @@ boolean preventScroll = false; }; -HTMLElement implements GlobalEventHandlers; -HTMLElement implements DocumentAndElementEventHandlers; -HTMLElement implements ElementContentEditable; +HTMLElement includes GlobalEventHandlers; +HTMLElement includes DocumentAndElementEventHandlers; +HTMLElement includes ElementContentEditable; // Note: intentionally not [HTMLConstructor] interface HTMLUnknownElement : HTMLElement { }; @@ -175,7 +175,7 @@ // also has obsolete members }; -HTMLLinkElement implements LinkStyle; +HTMLLinkElement includes LinkStyle; [Exposed=Window, HTMLConstructor] @@ -194,7 +194,7 @@ [CEReactions] attribute DOMString nonce; [CEReactions] attribute DOMString type; }; -HTMLStyleElement implements LinkStyle; +HTMLStyleElement includes LinkStyle; [Exposed=Window, HTMLConstructor] @@ -202,7 +202,7 @@ // also has obsolete members }; -HTMLBodyElement implements WindowEventHandlers; +HTMLBodyElement includes WindowEventHandlers; [Exposed=Window, HTMLConstructor] @@ -294,7 +294,7 @@ // also has obsolete members }; -HTMLAnchorElement implements HTMLHyperlinkElementUtils; +HTMLAnchorElement includes HTMLHyperlinkElementUtils; [Exposed=Window, HTMLConstructor] @@ -318,9 +318,7 @@ // also has obsolete members }; -[Exposed=Window, - NoInterfaceObject] -interface HTMLHyperlinkElementUtils { +interface mixin HTMLHyperlinkElementUtils { [CEReactions] stringifier attribute USVString href; readonly attribute USVString origin; [CEReactions] attribute USVString protocol; @@ -687,7 +685,7 @@ // also has obsolete members }; -HTMLAreaElement implements HTMLHyperlinkElementUtils; +HTMLAreaElement includes HTMLHyperlinkElementUtils; [Exposed=Window, HTMLConstructor] @@ -1176,32 +1174,30 @@ // back-reference to the canvas readonly attribute HTMLCanvasElement canvas; }; -CanvasRenderingContext2D implements CanvasState; -CanvasRenderingContext2D implements CanvasTransform; -CanvasRenderingContext2D implements CanvasCompositing; -CanvasRenderingContext2D implements CanvasImageSmoothing; -CanvasRenderingContext2D implements CanvasFillStrokeStyles; -CanvasRenderingContext2D implements CanvasShadowStyles; -CanvasRenderingContext2D implements CanvasFilters; -CanvasRenderingContext2D implements CanvasRect; -CanvasRenderingContext2D implements CanvasDrawPath; -CanvasRenderingContext2D implements CanvasUserInterface; -CanvasRenderingContext2D implements CanvasText; -CanvasRenderingContext2D implements CanvasDrawImage; -CanvasRenderingContext2D implements CanvasImageData; -CanvasRenderingContext2D implements CanvasPathDrawingStyles; -CanvasRenderingContext2D implements CanvasTextDrawingStyles; -CanvasRenderingContext2D implements CanvasPath; +CanvasRenderingContext2D includes CanvasState; +CanvasRenderingContext2D includes CanvasTransform; +CanvasRenderingContext2D includes CanvasCompositing; +CanvasRenderingContext2D includes CanvasImageSmoothing; +CanvasRenderingContext2D includes CanvasFillStrokeStyles; +CanvasRenderingContext2D includes CanvasShadowStyles; +CanvasRenderingContext2D includes CanvasFilters; +CanvasRenderingContext2D includes CanvasRect; +CanvasRenderingContext2D includes CanvasDrawPath; +CanvasRenderingContext2D includes CanvasUserInterface; +CanvasRenderingContext2D includes CanvasText; +CanvasRenderingContext2D includes CanvasDrawImage; +CanvasRenderingContext2D includes CanvasImageData; +CanvasRenderingContext2D includes CanvasPathDrawingStyles; +CanvasRenderingContext2D includes CanvasTextDrawingStyles; +CanvasRenderingContext2D includes CanvasPath; -[NoInterfaceObject, Exposed=(Window,Worker)] -interface CanvasState { +interface mixin CanvasState { // state void save(); // push state on state stack void restore(); // pop state stack and restore state }; -[NoInterfaceObject, Exposed=(Window,Worker)] -interface CanvasTransform { +interface mixin CanvasTransform { // transformations (default transform is the identity matrix) void scale(unrestricted double x, unrestricted double y); void rotate(unrestricted double angle); @@ -1212,37 +1208,30 @@ void setTransform(unrestricted double a, unrestricted double b, unrestricted double c, unrestricted double d, unrestricted double e, unrestricted double f); void setTransform(optional DOMMatrix2DInit transform); void resetTransform(); - }; -[NoInterfaceObject, Exposed=(Window,Worker)] -interface CanvasCompositing { +interface mixin CanvasCompositing { // compositing attribute unrestricted double globalAlpha; // (default 1.0) attribute DOMString globalCompositeOperation; // (default source-over) }; -[NoInterfaceObject, Exposed=(Window,Worker)] -interface CanvasImageSmoothing { +interface mixin CanvasImageSmoothing { // image smoothing attribute boolean imageSmoothingEnabled; // (default true) attribute ImageSmoothingQuality imageSmoothingQuality; // (default low) - }; -[NoInterfaceObject, Exposed=(Window,Worker)] -interface CanvasFillStrokeStyles { +interface mixin CanvasFillStrokeStyles { // colors and styles (see also the CanvasPathDrawingStyles and CanvasTextDrawingStyles interfaces) attribute (DOMString or CanvasGradient or CanvasPattern) strokeStyle; // (default black) attribute (DOMString or CanvasGradient or CanvasPattern) fillStyle; // (default black) CanvasGradient createLinearGradient(double x0, double y0, double x1, double y1); CanvasGradient createRadialGradient(double x0, double y0, double r0, double x1, double y1, double r1); CanvasPattern? createPattern(CanvasImageSource image, [TreatNullAs=EmptyString] DOMString repetition); - }; -[NoInterfaceObject, Exposed=(Window,Worker)] -interface CanvasShadowStyles { +interface mixin CanvasShadowStyles { // shadows attribute unrestricted double shadowOffsetX; // (default 0) attribute unrestricted double shadowOffsetY; // (default 0) @@ -1250,22 +1239,19 @@ attribute DOMString shadowColor; // (default transparent black) }; -[NoInterfaceObject, Exposed=(Window,Worker)] -interface CanvasFilters { +interface mixin CanvasFilters { // filters attribute DOMString filter; // (default "none") }; -[NoInterfaceObject, Exposed=(Window,Worker)] -interface CanvasRect { +interface mixin CanvasRect { // rects void clearRect(unrestricted double x, unrestricted double y, unrestricted double w, unrestricted double h); void fillRect(unrestricted double x, unrestricted double y, unrestricted double w, unrestricted double h); void strokeRect(unrestricted double x, unrestricted double y, unrestricted double w, unrestricted double h); }; -[NoInterfaceObject, Exposed=(Window,Worker)] -interface CanvasDrawPath { +interface mixin CanvasDrawPath { // path API (see also CanvasPath) void beginPath(); void fill(optional CanvasFillRule fillRule = "nonzero"); @@ -1281,34 +1267,28 @@ boolean isPointInStroke(Path2D path, unrestricted double x, unrestricted double y); }; -[Exposed=Window, - NoInterfaceObject] -interface CanvasUserInterface { +interface mixin CanvasUserInterface { void drawFocusIfNeeded(Element element); void drawFocusIfNeeded(Path2D path, Element element); void scrollPathIntoView(); void scrollPathIntoView(Path2D path); }; -[Exposed=Window, - NoInterfaceObject] -interface CanvasText { +interface mixin CanvasText { // text (see also the CanvasPathDrawingStyles and CanvasTextDrawingStyles interfaces) void fillText(DOMString text, unrestricted double x, unrestricted double y, optional unrestricted double maxWidth); void strokeText(DOMString text, unrestricted double x, unrestricted double y, optional unrestricted double maxWidth); TextMetrics measureText(DOMString text); }; -[NoInterfaceObject, Exposed=(Window,Worker)] -interface CanvasDrawImage { +interface mixin CanvasDrawImage { // drawing images void drawImage(CanvasImageSource image, unrestricted double dx, unrestricted double dy); void drawImage(CanvasImageSource image, unrestricted double dx, unrestricted double dy, unrestricted double dw, unrestricted double dh); void drawImage(CanvasImageSource image, unrestricted double sx, unrestricted double sy, unrestricted double sw, unrestricted double sh, unrestricted double dx, unrestricted double dy, unrestricted double dw, unrestricted double dh); }; -[NoInterfaceObject, Exposed=(Window,Worker)] -interface CanvasImageData { +interface mixin CanvasImageData { // pixel manipulation ImageData createImageData(long sw, long sh); ImageData createImageData(ImageData imagedata); @@ -1323,8 +1303,7 @@ enum CanvasTextBaseline { "top", "hanging", "middle", "alphabetic", "ideographic", "bottom" }; enum CanvasDirection { "ltr", "rtl", "inherit" }; -[NoInterfaceObject, Exposed=(Window,Worker)] -interface CanvasPathDrawingStyles { +interface mixin CanvasPathDrawingStyles { // line caps/joins attribute unrestricted double lineWidth; // (default 1) attribute CanvasLineCap lineCap; // (default "butt") @@ -1337,9 +1316,7 @@ attribute unrestricted double lineDashOffset; }; -[Exposed=Window, - NoInterfaceObject] -interface CanvasTextDrawingStyles { +interface mixin CanvasTextDrawingStyles { // text attribute DOMString font; // (default 10px sans-serif) attribute CanvasTextAlign textAlign; // (default: "start") @@ -1347,8 +1324,7 @@ attribute CanvasDirection direction; // (default: "inherit") }; -[NoInterfaceObject, Exposed=(Window,Worker)] -interface CanvasPath { +interface mixin CanvasPath { // shared path API methods void closePath(); void moveTo(unrestricted double x, unrestricted double y); @@ -1411,7 +1387,7 @@ interface Path2D { void addPath(Path2D path, optional DOMMatrix2DInit transform); }; -Path2D implements CanvasPath; +Path2D includes CanvasPath; [Exposed=Window] interface ImageBitmapRenderingContext { @@ -1450,19 +1426,19 @@ readonly attribute OffscreenCanvas canvas; }; -OffscreenCanvasRenderingContext2D implements CanvasState; -OffscreenCanvasRenderingContext2D implements CanvasTransform; -OffscreenCanvasRenderingContext2D implements CanvasCompositing; -OffscreenCanvasRenderingContext2D implements CanvasImageSmoothing; -OffscreenCanvasRenderingContext2D implements CanvasFillStrokeStyles; -OffscreenCanvasRenderingContext2D implements CanvasShadowStyles; -OffscreenCanvasRenderingContext2D implements CanvasFilters; -OffscreenCanvasRenderingContext2D implements CanvasRect; -OffscreenCanvasRenderingContext2D implements CanvasDrawPath; -OffscreenCanvasRenderingContext2D implements CanvasDrawImage; -OffscreenCanvasRenderingContext2D implements CanvasImageData; -OffscreenCanvasRenderingContext2D implements CanvasPathDrawingStyles; -OffscreenCanvasRenderingContext2D implements CanvasPath; +OffscreenCanvasRenderingContext2D includes CanvasState; +OffscreenCanvasRenderingContext2D includes CanvasTransform; +OffscreenCanvasRenderingContext2D includes CanvasCompositing; +OffscreenCanvasRenderingContext2D includes CanvasImageSmoothing; +OffscreenCanvasRenderingContext2D includes CanvasFillStrokeStyles; +OffscreenCanvasRenderingContext2D includes CanvasShadowStyles; +OffscreenCanvasRenderingContext2D includes CanvasFilters; +OffscreenCanvasRenderingContext2D includes CanvasRect; +OffscreenCanvasRenderingContext2D includes CanvasDrawPath; +OffscreenCanvasRenderingContext2D includes CanvasDrawImage; +OffscreenCanvasRenderingContext2D includes CanvasImageData; +OffscreenCanvasRenderingContext2D includes CanvasPathDrawingStyles; +OffscreenCanvasRenderingContext2D includes CanvasPath; [Exposed=Window] @@ -1476,9 +1452,7 @@ DOMString extends; }; -[Exposed=Window, - NoInterfaceObject] -interface ElementContentEditable { +interface mixin ElementContentEditable { [CEReactions] attribute DOMString contentEditable; readonly attribute boolean isContentEditable; }; @@ -1531,7 +1505,9 @@ DataTransfer? dataTransfer = null; }; -[PrimaryGlobal, LegacyUnenumerableNamedProperties] +[Global=Window, + Exposed=Window, + LegacyUnenumerableNamedProperties] interface Window : EventTarget { // the current browsing context [Unforgeable] readonly attribute WindowProxy window; @@ -1585,8 +1561,8 @@ // also has obsolete members }; -Window implements GlobalEventHandlers; -Window implements WindowEventHandlers; +Window includes GlobalEventHandlers; +Window includes WindowEventHandlers; callback FrameRequestCallback = void (DOMHighResTimeStamp time); @@ -1694,8 +1670,7 @@ attribute EventHandler onobsolete; }; -[NoInterfaceObject, Exposed=(Window,Worker)] -interface NavigatorOnLine { +interface mixin NavigatorOnLine { readonly attribute boolean onLine; }; @@ -1739,9 +1714,7 @@ callback OnBeforeUnloadEventHandlerNonNull = DOMString? (Event event); typedef OnBeforeUnloadEventHandlerNonNull? OnBeforeUnloadEventHandler; -[Exposed=Window, - NoInterfaceObject] -interface GlobalEventHandlers { +interface mixin GlobalEventHandlers { attribute EventHandler onabort; attribute EventHandler onauxclick; attribute EventHandler onblur; @@ -1806,9 +1779,7 @@ attribute EventHandler onwaiting; }; -[Exposed=Window, - NoInterfaceObject] -interface WindowEventHandlers { +interface mixin WindowEventHandlers { attribute EventHandler onafterprint; attribute EventHandler onbeforeprint; attribute OnBeforeUnloadEventHandler onbeforeunload; @@ -1827,9 +1798,7 @@ attribute EventHandler onunload; }; -[Exposed=Window, - NoInterfaceObject] -interface DocumentAndElementEventHandlers { +interface mixin DocumentAndElementEventHandlers { attribute EventHandler oncopy; attribute EventHandler oncut; attribute EventHandler onpaste; @@ -1837,8 +1806,7 @@ typedef (DOMString or Function) TimerHandler; -[NoInterfaceObject, Exposed=(Window,Worker)] -interface WindowOrWorkerGlobalScope { +interface mixin WindowOrWorkerGlobalScope { [Replaceable] readonly attribute USVString origin; // base64 utility methods @@ -1855,23 +1823,22 @@ Promise<ImageBitmap> createImageBitmap(ImageBitmapSource image, optional ImageBitmapOptions options); Promise<ImageBitmap> createImageBitmap(ImageBitmapSource image, long sx, long sy, long sw, long sh, optional ImageBitmapOptions options); }; -Window implements WindowOrWorkerGlobalScope; -WorkerGlobalScope implements WindowOrWorkerGlobalScope; +Window includes WindowOrWorkerGlobalScope; +WorkerGlobalScope includes WindowOrWorkerGlobalScope; [Exposed=Window] interface Navigator { // objects implementing this interface also implement the interfaces given below }; -Navigator implements NavigatorID; -Navigator implements NavigatorLanguage; -Navigator implements NavigatorOnLine; -Navigator implements NavigatorContentUtils; -Navigator implements NavigatorCookies; -Navigator implements NavigatorPlugins; -Navigator implements NavigatorConcurrentHardware; +Navigator includes NavigatorID; +Navigator includes NavigatorLanguage; +Navigator includes NavigatorOnLine; +Navigator includes NavigatorContentUtils; +Navigator includes NavigatorCookies; +Navigator includes NavigatorPlugins; +Navigator includes NavigatorConcurrentHardware; -[NoInterfaceObject, Exposed=(Window,Worker)] -interface NavigatorID { +interface mixin NavigatorID { readonly attribute DOMString appCodeName; // constant "Mozilla" readonly attribute DOMString appName; // constant "Netscape" readonly attribute DOMString appVersion; @@ -1890,28 +1857,21 @@ [Exposed=Window] readonly attribute DOMString oscpu; }; -[NoInterfaceObject, Exposed=(Window,Worker)] -interface NavigatorLanguage { +interface mixin NavigatorLanguage { readonly attribute DOMString language; readonly attribute FrozenArray<DOMString> languages; }; -[Exposed=Window, - NoInterfaceObject] -interface NavigatorContentUtils { +interface mixin NavigatorContentUtils { void registerProtocolHandler(DOMString scheme, USVString url, DOMString title); void unregisterProtocolHandler(DOMString scheme, USVString url); }; -[Exposed=Window, - NoInterfaceObject] -interface NavigatorCookies { +interface mixin NavigatorCookies { readonly attribute boolean cookieEnabled; }; -[Exposed=Window, - NoInterfaceObject] -interface NavigatorPlugins { +interface mixin NavigatorPlugins { [SameObject] readonly attribute PluginArray plugins; [SameObject] readonly attribute MimeTypeArray mimeTypes; boolean javaEnabled(); @@ -2126,8 +2086,7 @@ attribute EventHandler onconnect; }; -[NoInterfaceObject, Exposed=(Window,Worker)] -interface AbstractWorker { +interface mixin AbstractWorker { attribute EventHandler onerror; }; @@ -2148,26 +2107,25 @@ enum WorkerType { "classic", "module" }; -Worker implements AbstractWorker; +Worker includes AbstractWorker; [Constructor(USVString scriptURL, optional (DOMString or WorkerOptions) options), Exposed=(Window,Worker)] interface SharedWorker : EventTarget { readonly attribute MessagePort port; }; -SharedWorker implements AbstractWorker; +SharedWorker includes AbstractWorker; -[NoInterfaceObject, Exposed=(Window,Worker)] -interface NavigatorConcurrentHardware { +interface mixin NavigatorConcurrentHardware { readonly attribute unsigned long long hardwareConcurrency; }; [Exposed=Worker] interface WorkerNavigator {}; -WorkerNavigator implements NavigatorID; -WorkerNavigator implements NavigatorLanguage; -WorkerNavigator implements NavigatorOnLine; -WorkerNavigator implements NavigatorConcurrentHardware; +WorkerNavigator includes NavigatorID; +WorkerNavigator includes NavigatorLanguage; +WorkerNavigator includes NavigatorOnLine; +WorkerNavigator includes NavigatorConcurrentHardware; [Exposed=Worker] interface WorkerLocation { @@ -2192,19 +2150,15 @@ void clear(); }; -[Exposed=Window, - NoInterfaceObject] -interface WindowSessionStorage { +interface mixin WindowSessionStorage { readonly attribute Storage sessionStorage; }; -Window implements WindowSessionStorage; +Window includes WindowSessionStorage; -[Exposed=Window, - NoInterfaceObject] -interface WindowLocalStorage { +interface mixin WindowLocalStorage { readonly attribute Storage localStorage; }; -Window implements WindowLocalStorage; +Window includes WindowLocalStorage; [Exposed=Window, Constructor(DOMString type, optional StorageEventInit eventInitDict)] @@ -2253,7 +2207,7 @@ [CEReactions] attribute DOMString cols; [CEReactions] attribute DOMString rows; }; -HTMLFrameSetElement implements WindowEventHandlers; +HTMLFrameSetElement includes WindowEventHandlers; [Exposed=Window, HTMLConstructor]
diff --git a/third_party/WebKit/LayoutTests/external/wpt/magnetometer/idlharness.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/magnetometer/idlharness.https-expected.txt index d03e505..9607617 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/magnetometer/idlharness.https-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/magnetometer/idlharness.https-expected.txt
@@ -1,4 +1,65 @@ This is a testharness.js-based test. -FAIL Test IDL implementation of Magnetometer Sensor promise_test: Unhandled rejection with value: "NonElementParentNode: interface mixin not yet supported" +PASS Test IDL implementation of Magnetometer Sensor +PASS Sensor interface: existence and properties of interface object +PASS Sensor interface object length +PASS Sensor interface object name +PASS Sensor interface: existence and properties of interface prototype object +PASS Sensor interface: existence and properties of interface prototype object's "constructor" property +PASS Sensor interface: attribute activated +PASS Sensor interface: attribute hasReading +PASS Sensor interface: attribute timestamp +PASS Sensor interface: operation start() +PASS Sensor interface: operation stop() +PASS Sensor interface: attribute onreading +PASS Sensor interface: attribute onactivate +PASS Sensor interface: attribute onerror +PASS Magnetometer interface: existence and properties of interface object +PASS Magnetometer interface object length +PASS Magnetometer interface object name +PASS Magnetometer interface: existence and properties of interface prototype object +PASS Magnetometer interface: existence and properties of interface prototype object's "constructor" property +PASS Magnetometer interface: attribute x +PASS Magnetometer interface: attribute y +PASS Magnetometer interface: attribute z +PASS Magnetometer must be primary interface of new Magnetometer(); +PASS Stringification of new Magnetometer(); +PASS Magnetometer interface: new Magnetometer(); must inherit property "x" with the proper type +PASS Magnetometer interface: new Magnetometer(); must inherit property "y" with the proper type +PASS Magnetometer interface: new Magnetometer(); must inherit property "z" with the proper type +PASS Sensor interface: new Magnetometer(); must inherit property "activated" with the proper type +PASS Sensor interface: new Magnetometer(); must inherit property "hasReading" with the proper type +PASS Sensor interface: new Magnetometer(); must inherit property "timestamp" with the proper type +PASS Sensor interface: new Magnetometer(); must inherit property "start()" with the proper type +PASS Sensor interface: new Magnetometer(); must inherit property "stop()" with the proper type +PASS Sensor interface: new Magnetometer(); must inherit property "onreading" with the proper type +PASS Sensor interface: new Magnetometer(); must inherit property "onactivate" with the proper type +PASS Sensor interface: new Magnetometer(); must inherit property "onerror" with the proper type +FAIL UncalibratedMagnetometer interface: existence and properties of interface object assert_own_property: self does not have own property "UncalibratedMagnetometer" expected property "UncalibratedMagnetometer" missing +FAIL UncalibratedMagnetometer interface object length assert_own_property: self does not have own property "UncalibratedMagnetometer" expected property "UncalibratedMagnetometer" missing +FAIL UncalibratedMagnetometer interface object name assert_own_property: self does not have own property "UncalibratedMagnetometer" expected property "UncalibratedMagnetometer" missing +FAIL UncalibratedMagnetometer interface: existence and properties of interface prototype object assert_own_property: self does not have own property "UncalibratedMagnetometer" expected property "UncalibratedMagnetometer" missing +FAIL UncalibratedMagnetometer interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "UncalibratedMagnetometer" expected property "UncalibratedMagnetometer" missing +FAIL UncalibratedMagnetometer interface: attribute x assert_own_property: self does not have own property "UncalibratedMagnetometer" expected property "UncalibratedMagnetometer" missing +FAIL UncalibratedMagnetometer interface: attribute y assert_own_property: self does not have own property "UncalibratedMagnetometer" expected property "UncalibratedMagnetometer" missing +FAIL UncalibratedMagnetometer interface: attribute z assert_own_property: self does not have own property "UncalibratedMagnetometer" expected property "UncalibratedMagnetometer" missing +FAIL UncalibratedMagnetometer interface: attribute xBias assert_own_property: self does not have own property "UncalibratedMagnetometer" expected property "UncalibratedMagnetometer" missing +FAIL UncalibratedMagnetometer interface: attribute yBias assert_own_property: self does not have own property "UncalibratedMagnetometer" expected property "UncalibratedMagnetometer" missing +FAIL UncalibratedMagnetometer interface: attribute zBias assert_own_property: self does not have own property "UncalibratedMagnetometer" expected property "UncalibratedMagnetometer" missing +FAIL UncalibratedMagnetometer must be primary interface of new UncalibratedMagnetometer(); assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: UncalibratedMagnetometer is not defined" +FAIL Stringification of new UncalibratedMagnetometer(); assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: UncalibratedMagnetometer is not defined" +FAIL UncalibratedMagnetometer interface: new UncalibratedMagnetometer(); must inherit property "x" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: UncalibratedMagnetometer is not defined" +FAIL UncalibratedMagnetometer interface: new UncalibratedMagnetometer(); must inherit property "y" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: UncalibratedMagnetometer is not defined" +FAIL UncalibratedMagnetometer interface: new UncalibratedMagnetometer(); must inherit property "z" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: UncalibratedMagnetometer is not defined" +FAIL UncalibratedMagnetometer interface: new UncalibratedMagnetometer(); must inherit property "xBias" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: UncalibratedMagnetometer is not defined" +FAIL UncalibratedMagnetometer interface: new UncalibratedMagnetometer(); must inherit property "yBias" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: UncalibratedMagnetometer is not defined" +FAIL UncalibratedMagnetometer interface: new UncalibratedMagnetometer(); must inherit property "zBias" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: UncalibratedMagnetometer is not defined" +FAIL Sensor interface: new UncalibratedMagnetometer(); must inherit property "activated" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: UncalibratedMagnetometer is not defined" +FAIL Sensor interface: new UncalibratedMagnetometer(); must inherit property "hasReading" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: UncalibratedMagnetometer is not defined" +FAIL Sensor interface: new UncalibratedMagnetometer(); must inherit property "timestamp" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: UncalibratedMagnetometer is not defined" +FAIL Sensor interface: new UncalibratedMagnetometer(); must inherit property "start()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: UncalibratedMagnetometer is not defined" +FAIL Sensor interface: new UncalibratedMagnetometer(); must inherit property "stop()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: UncalibratedMagnetometer is not defined" +FAIL Sensor interface: new UncalibratedMagnetometer(); must inherit property "onreading" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: UncalibratedMagnetometer is not defined" +FAIL Sensor interface: new UncalibratedMagnetometer(); must inherit property "onactivate" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: UncalibratedMagnetometer is not defined" +FAIL Sensor interface: new UncalibratedMagnetometer(); must inherit property "onerror" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: UncalibratedMagnetometer is not defined" Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/idlharness.html b/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/idlharness.html index 3efe5a6..c4b0b99f 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/idlharness.html +++ b/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/idlharness.html
@@ -12,7 +12,7 @@ <body> <h1>Media Session IDL tests</h1> <pre id='untested_idl' style='display:none'> -[PrimaryGlobal] +[Global=Window, Exposed=Window] interface Window { }; interface Worker {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaStreamTrack-idl.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaStreamTrack-idl.https-expected.txt index 1fd50f1..cb25ca42 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaStreamTrack-idl.https-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaStreamTrack-idl.https-expected.txt
@@ -1,4 +1,44 @@ This is a testharness.js-based test. -FAIL Test driver promise_test: Unhandled rejection with value: "NonElementParentNode: interface mixin not yet supported" +PASS Test driver +PASS MediaStreamTrack interface: existence and properties of interface object +PASS MediaStreamTrack interface object length +PASS MediaStreamTrack interface object name +PASS MediaStreamTrack interface: existence and properties of interface prototype object +PASS MediaStreamTrack interface: existence and properties of interface prototype object's "constructor" property +PASS MediaStreamTrack interface: attribute kind +PASS MediaStreamTrack interface: attribute id +PASS MediaStreamTrack interface: attribute label +PASS MediaStreamTrack interface: attribute enabled +PASS MediaStreamTrack interface: attribute muted +PASS MediaStreamTrack interface: attribute onmute +PASS MediaStreamTrack interface: attribute onunmute +PASS MediaStreamTrack interface: attribute readyState +PASS MediaStreamTrack interface: attribute onended +FAIL MediaStreamTrack interface: attribute onoverconstrained assert_true: The prototype object must have a property "onoverconstrained" expected true got false +PASS MediaStreamTrack interface: operation clone() +PASS MediaStreamTrack interface: operation stop() +PASS MediaStreamTrack interface: operation getCapabilities() +PASS MediaStreamTrack interface: operation getConstraints() +PASS MediaStreamTrack interface: operation getSettings() +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 +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 +PASS MediaStreamTrack interface: track must inherit property "onmute" with the proper type +PASS MediaStreamTrack interface: track must inherit property "onunmute" with the proper type +PASS MediaStreamTrack interface: track must inherit property "readyState" with the proper type +PASS MediaStreamTrack interface: track must inherit property "onended" with the proper type +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 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 eaeae13..6a92e62 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/mediasession/idlharness-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/mediasession/idlharness-expected.txt
@@ -1,4 +1,5 @@ This is a testharness.js-based test. +FAIL Window interface: existence and properties of interface object assert_false: expected false got true PASS Navigator interface: attribute mediaSession PASS Navigator interface: navigator must inherit property "mediaSession" with the proper type PASS MediaSession interface: existence and properties of interface object
diff --git a/third_party/WebKit/LayoutTests/external/wpt/mediasession/idlharness.html b/third_party/WebKit/LayoutTests/external/wpt/mediasession/idlharness.html index a90c83e..4991404b 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/mediasession/idlharness.html +++ b/third_party/WebKit/LayoutTests/external/wpt/mediasession/idlharness.html
@@ -13,7 +13,7 @@ <h1>Media Session IDL tests</h1> <pre id='untested_idl' style='display:none'> -[PrimaryGlobal] +[Global=Window, Exposed=Global] interface Window { };
diff --git a/third_party/WebKit/LayoutTests/external/wpt/orientation-sensor/idlharness.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/orientation-sensor/idlharness.https-expected.txt deleted file mode 100644 index 2eec9272..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/orientation-sensor/idlharness.https-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL Test IDL implementation of Orientation Sensor promise_test: Unhandled rejection with value: "NonElementParentNode: interface mixin not yet supported" -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 27004c0..4389ff0 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
@@ -1,4 +1,570 @@ This is a testharness.js-based test. -FAIL Setup for Payment Request API IDL tests. promise_test: Unhandled rejection with value: "NonElementParentNode: interface mixin not yet supported" +PASS Setup for Payment Request API IDL tests. +PASS Event interface: existence and properties of interface object +PASS Event interface object length +PASS Event interface object name +PASS Event interface: existence and properties of interface prototype object +PASS Event interface: existence and properties of interface prototype object's "constructor" property +PASS Event interface: attribute type +PASS Event interface: attribute target +PASS Event interface: attribute currentTarget +PASS Event interface: constant NONE on interface object +PASS Event interface: constant NONE on interface prototype object +PASS Event interface: constant CAPTURING_PHASE on interface object +PASS Event interface: constant CAPTURING_PHASE on interface prototype object +PASS Event interface: constant AT_TARGET on interface object +PASS Event interface: constant AT_TARGET on interface prototype object +PASS Event interface: constant BUBBLING_PHASE on interface object +PASS Event interface: constant BUBBLING_PHASE on interface prototype object +PASS Event interface: attribute eventPhase +PASS Event interface: operation stopPropagation() +PASS Event interface: operation stopImmediatePropagation() +PASS Event interface: attribute bubbles +PASS Event interface: attribute cancelable +PASS Event interface: operation preventDefault() +PASS Event interface: attribute defaultPrevented +PASS Event interface: attribute timeStamp +PASS Event interface: operation initEvent(DOMString, boolean, boolean) +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 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 EventListener interface: existence and properties of interface object +PASS EventListener interface: existence and properties of interface prototype object +PASS EventListener interface: existence and properties of interface prototype object's "constructor" property +PASS EventListener interface: operation handleEvent(Event) +FAIL AbortController interface: existence and properties of interface object assert_own_property: self does not have own property "AbortController" expected property "AbortController" missing +FAIL AbortController interface object length assert_own_property: self does not have own property "AbortController" expected property "AbortController" missing +FAIL AbortController interface object name assert_own_property: self does not have own property "AbortController" expected property "AbortController" missing +FAIL AbortController interface: existence and properties of interface prototype object assert_own_property: self does not have own property "AbortController" expected property "AbortController" missing +FAIL AbortController interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "AbortController" expected property "AbortController" missing +FAIL AbortController interface: attribute signal assert_own_property: self does not have own property "AbortController" expected property "AbortController" missing +FAIL AbortController interface: operation abort() assert_own_property: self does not have own property "AbortController" expected property "AbortController" missing +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 +FAIL AbortSignal interface: existence and properties of interface prototype object assert_own_property: self does not have own property "AbortSignal" expected property "AbortSignal" missing +FAIL AbortSignal interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "AbortSignal" expected property "AbortSignal" missing +FAIL AbortSignal interface: attribute aborted assert_own_property: self does not have own property "AbortSignal" expected property "AbortSignal" missing +FAIL AbortSignal interface: attribute onabort assert_own_property: self does not have own property "AbortSignal" expected property "AbortSignal" missing +PASS NodeList interface: existence and properties of interface object +PASS NodeList interface object length +PASS NodeList interface object name +PASS NodeList interface: existence and properties of interface prototype object +PASS NodeList interface: existence and properties of interface prototype object's "constructor" property +PASS NodeList interface: operation item(unsigned long) +PASS NodeList interface: attribute length +PASS HTMLCollection interface: existence and properties of interface object +PASS HTMLCollection interface object length +PASS HTMLCollection interface object name +PASS HTMLCollection interface: existence and properties of interface prototype object +PASS HTMLCollection interface: existence and properties of interface prototype object's "constructor" property +PASS HTMLCollection interface: attribute length +PASS HTMLCollection interface: operation item(unsigned long) +PASS HTMLCollection interface: operation namedItem(DOMString) +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 disconnect() +PASS MutationObserver interface: operation takeRecords() +PASS MutationRecord interface: existence and properties of interface object +PASS MutationRecord interface object length +PASS MutationRecord interface object name +PASS MutationRecord interface: existence and properties of interface prototype object +PASS MutationRecord interface: existence and properties of interface prototype object's "constructor" property +PASS MutationRecord interface: attribute type +PASS MutationRecord interface: attribute target +PASS MutationRecord interface: attribute addedNodes +PASS MutationRecord interface: attribute removedNodes +PASS MutationRecord interface: attribute previousSibling +PASS MutationRecord interface: attribute nextSibling +PASS MutationRecord interface: attribute attributeName +PASS MutationRecord interface: attribute attributeNamespace +PASS MutationRecord interface: attribute oldValue +PASS Node interface: existence and properties of interface object +PASS Node interface object length +PASS Node interface object name +PASS Node interface: existence and properties of interface prototype object +PASS Node interface: existence and properties of interface prototype object's "constructor" property +PASS Node interface: constant ELEMENT_NODE on interface object +PASS Node interface: constant ELEMENT_NODE on interface prototype object +PASS Node interface: constant ATTRIBUTE_NODE on interface object +PASS Node interface: constant ATTRIBUTE_NODE on interface prototype object +PASS Node interface: constant TEXT_NODE on interface object +PASS Node interface: constant TEXT_NODE on interface prototype object +PASS Node interface: constant CDATA_SECTION_NODE on interface object +PASS Node interface: constant CDATA_SECTION_NODE on interface prototype object +PASS Node interface: constant ENTITY_REFERENCE_NODE on interface object +PASS Node interface: constant ENTITY_REFERENCE_NODE on interface prototype object +PASS Node interface: constant ENTITY_NODE on interface object +PASS Node interface: constant ENTITY_NODE on interface prototype object +PASS Node interface: constant PROCESSING_INSTRUCTION_NODE on interface object +PASS Node interface: constant PROCESSING_INSTRUCTION_NODE on interface prototype object +PASS Node interface: constant COMMENT_NODE on interface object +PASS Node interface: constant COMMENT_NODE on interface prototype object +PASS Node interface: constant DOCUMENT_NODE on interface object +PASS Node interface: constant DOCUMENT_NODE on interface prototype object +PASS Node interface: constant DOCUMENT_TYPE_NODE on interface object +PASS Node interface: constant DOCUMENT_TYPE_NODE on interface prototype object +PASS Node interface: constant DOCUMENT_FRAGMENT_NODE on interface object +PASS Node interface: constant DOCUMENT_FRAGMENT_NODE on interface prototype object +PASS Node interface: constant NOTATION_NODE on interface object +PASS Node interface: constant NOTATION_NODE on interface prototype object +PASS Node interface: attribute nodeType +PASS Node interface: attribute nodeName +PASS Node interface: attribute baseURI +PASS Node interface: attribute isConnected +PASS Node interface: attribute ownerDocument +PASS Node interface: operation getRootNode(GetRootNodeOptions) +PASS Node interface: attribute parentNode +PASS Node interface: attribute parentElement +PASS Node interface: operation hasChildNodes() +PASS Node interface: attribute childNodes +PASS Node interface: attribute firstChild +PASS Node interface: attribute lastChild +PASS Node interface: attribute previousSibling +PASS Node interface: attribute nextSibling +PASS Node interface: attribute nodeValue +PASS Node interface: attribute textContent +PASS Node interface: operation normalize() +PASS Node interface: operation cloneNode(boolean) +PASS Node interface: operation isEqualNode(Node) +PASS Node interface: operation isSameNode(Node) +PASS Node interface: constant DOCUMENT_POSITION_DISCONNECTED on interface object +PASS Node interface: constant DOCUMENT_POSITION_DISCONNECTED on interface prototype object +PASS Node interface: constant DOCUMENT_POSITION_PRECEDING on interface object +PASS Node interface: constant DOCUMENT_POSITION_PRECEDING on interface prototype object +PASS Node interface: constant DOCUMENT_POSITION_FOLLOWING on interface object +PASS Node interface: constant DOCUMENT_POSITION_FOLLOWING on interface prototype object +PASS Node interface: constant DOCUMENT_POSITION_CONTAINS on interface object +PASS Node interface: constant DOCUMENT_POSITION_CONTAINS on interface prototype object +PASS Node interface: constant DOCUMENT_POSITION_CONTAINED_BY on interface object +PASS Node interface: constant DOCUMENT_POSITION_CONTAINED_BY on interface prototype object +PASS Node interface: constant DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC on interface object +PASS Node interface: constant DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC on interface prototype object +PASS Node interface: operation compareDocumentPosition(Node) +PASS Node interface: operation contains(Node) +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 appendChild(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 +PASS Document interface object name +PASS Document interface: existence and properties of interface prototype object +PASS Document interface: existence and properties of interface prototype object's "constructor" property +PASS Document interface: attribute implementation +PASS Document interface: attribute URL +PASS Document interface: attribute documentURI +PASS Document interface: attribute origin +PASS Document interface: attribute compatMode +PASS Document interface: attribute characterSet +PASS Document interface: attribute charset +PASS Document interface: attribute inputEncoding +PASS Document interface: attribute contentType +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 getElementsByClassName(DOMString) +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 adoptNode(Node) +PASS Document interface: operation createAttribute(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 getElementById(DOMString) +PASS Document interface: attribute children +PASS Document interface: attribute firstElementChild +PASS Document interface: attribute lastElementChild +PASS Document interface: attribute childElementCount +PASS Document interface: operation prepend([object Object],[object Object]) +PASS Document interface: operation append([object Object],[object Object]) +PASS Document interface: operation querySelector(DOMString) +PASS Document interface: operation querySelectorAll(DOMString) +PASS XMLDocument interface: existence and properties of interface object +PASS XMLDocument interface object length +PASS XMLDocument interface object name +PASS XMLDocument interface: existence and properties of interface prototype object +PASS XMLDocument interface: existence and properties of interface prototype object's "constructor" property +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 createHTMLDocument(DOMString) +PASS DOMImplementation interface: operation hasFeature() +PASS DocumentType interface: existence and properties of interface object +PASS DocumentType interface object length +PASS DocumentType interface object name +PASS DocumentType interface: existence and properties of interface prototype object +PASS DocumentType interface: existence and properties of interface prototype object's "constructor" property +PASS DocumentType interface: attribute name +PASS DocumentType interface: attribute publicId +PASS DocumentType interface: attribute systemId +PASS DocumentType interface: operation before([object Object],[object Object]) +PASS DocumentType interface: operation after([object Object],[object Object]) +PASS DocumentType interface: operation replaceWith([object Object],[object Object]) +PASS DocumentType interface: operation remove() +PASS DocumentFragment interface: existence and properties of interface object +PASS DocumentFragment interface object length +PASS DocumentFragment interface object name +PASS DocumentFragment interface: existence and properties of interface prototype object +PASS DocumentFragment interface: existence and properties of interface prototype object's "constructor" property +PASS DocumentFragment interface: operation getElementById(DOMString) +PASS DocumentFragment interface: attribute children +PASS DocumentFragment interface: attribute firstElementChild +PASS DocumentFragment interface: attribute lastElementChild +PASS DocumentFragment interface: attribute childElementCount +PASS DocumentFragment interface: operation prepend([object Object],[object Object]) +PASS DocumentFragment interface: operation append([object Object],[object Object]) +PASS DocumentFragment interface: operation querySelector(DOMString) +PASS DocumentFragment interface: operation querySelectorAll(DOMString) +PASS ShadowRoot interface: existence and properties of interface object +PASS ShadowRoot interface object length +PASS ShadowRoot interface object name +PASS ShadowRoot interface: existence and properties of interface prototype object +PASS ShadowRoot interface: existence and properties of interface prototype object's "constructor" property +PASS ShadowRoot interface: attribute mode +PASS ShadowRoot interface: attribute host +PASS Element interface: existence and properties of interface object +PASS Element interface object length +PASS Element interface object name +PASS Element interface: existence and properties of interface prototype object +PASS Element interface: existence and properties of interface prototype object's "constructor" property +PASS Element interface: attribute namespaceURI +PASS Element interface: attribute prefix +PASS Element interface: attribute localName +PASS Element interface: attribute tagName +PASS Element interface: attribute id +PASS Element interface: attribute className +PASS Element interface: attribute classList +PASS Element interface: attribute slot +PASS Element interface: operation hasAttributes() +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 removeAttribute(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 getAttributeNode(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) +PASS Element interface: operation attachShadow(ShadowRootInit) +PASS Element interface: attribute shadowRoot +PASS Element interface: operation closest(DOMString) +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 getElementsByClassName(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 +PASS Element interface: attribute childElementCount +PASS Element interface: operation prepend([object Object],[object Object]) +PASS Element interface: operation append([object Object],[object Object]) +PASS Element interface: operation querySelector(DOMString) +PASS Element interface: operation querySelectorAll(DOMString) +PASS Element interface: attribute previousElementSibling +PASS Element interface: attribute nextElementSibling +PASS Element interface: operation before([object Object],[object Object]) +PASS Element interface: operation after([object Object],[object Object]) +PASS Element interface: operation replaceWith([object Object],[object Object]) +PASS Element interface: operation remove() +PASS Element interface: attribute assignedSlot +PASS NamedNodeMap interface: existence and properties of interface object +PASS NamedNodeMap interface object length +PASS NamedNodeMap interface object name +PASS NamedNodeMap interface: existence and properties of interface prototype object +PASS NamedNodeMap interface: existence and properties of interface prototype object's "constructor" property +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 setNamedItem(Attr) +PASS NamedNodeMap interface: operation setNamedItemNS(Attr) +PASS NamedNodeMap interface: operation removeNamedItem(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 +PASS Attr interface: existence and properties of interface prototype object +PASS Attr interface: existence and properties of interface prototype object's "constructor" property +PASS Attr interface: attribute namespaceURI +PASS Attr interface: attribute prefix +PASS Attr interface: attribute localName +PASS Attr interface: attribute name +PASS Attr interface: attribute value +PASS Attr interface: attribute ownerElement +PASS Attr interface: attribute specified +PASS CharacterData interface: existence and properties of interface object +PASS CharacterData interface object length +PASS CharacterData interface object name +PASS CharacterData interface: existence and properties of interface prototype object +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 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: attribute previousElementSibling +PASS CharacterData interface: attribute nextElementSibling +PASS CharacterData interface: operation before([object Object],[object Object]) +PASS CharacterData interface: operation after([object Object],[object Object]) +PASS CharacterData interface: operation replaceWith([object Object],[object Object]) +PASS CharacterData interface: operation remove() +PASS Text interface: existence and properties of interface object +PASS Text interface object length +PASS Text interface object name +PASS Text interface: existence and properties of interface prototype object +PASS Text interface: existence and properties of interface prototype object's "constructor" property +PASS Text interface: operation splitText(unsigned long) +PASS Text interface: attribute wholeText +PASS Text interface: attribute assignedSlot +PASS CDATASection interface: existence and properties of interface object +PASS CDATASection interface object length +PASS CDATASection interface object name +PASS CDATASection interface: existence and properties of interface prototype object +PASS CDATASection interface: existence and properties of interface prototype object's "constructor" property +PASS ProcessingInstruction interface: existence and properties of interface object +PASS ProcessingInstruction interface object length +PASS ProcessingInstruction interface object name +PASS ProcessingInstruction interface: existence and properties of interface prototype object +PASS ProcessingInstruction interface: existence and properties of interface prototype object's "constructor" property +PASS ProcessingInstruction interface: attribute target +PASS Comment interface: existence and properties of interface object +PASS Comment interface object length +PASS Comment interface object name +PASS Comment interface: existence and properties of interface prototype object +PASS Comment interface: existence and properties of interface prototype object's "constructor" property +PASS Range interface: existence and properties of interface object +PASS Range interface object length +PASS Range interface object name +PASS Range interface: existence and properties of interface prototype object +PASS Range interface: existence and properties of interface prototype object's "constructor" property +PASS Range interface: attribute startContainer +PASS Range interface: attribute startOffset +PASS Range interface: attribute endContainer +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 setStartBefore(Node) +PASS Range interface: operation setStartAfter(Node) +PASS Range interface: operation setEndBefore(Node) +PASS Range interface: operation setEndAfter(Node) +PASS Range interface: operation collapse(boolean) +PASS Range interface: operation selectNode(Node) +PASS Range interface: operation selectNodeContents(Node) +PASS Range interface: constant START_TO_START on interface object +PASS Range interface: constant START_TO_START on interface prototype object +PASS Range interface: constant START_TO_END on interface object +PASS Range interface: constant START_TO_END on interface prototype object +PASS Range interface: constant END_TO_END on interface object +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 deleteContents() +PASS Range interface: operation extractContents() +PASS Range interface: operation cloneContents() +PASS Range interface: operation insertNode(Node) +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 intersectsNode(Node) +PASS Range interface: stringifier +PASS NodeIterator interface: existence and properties of interface object +PASS NodeIterator interface object length +PASS NodeIterator interface object name +PASS NodeIterator interface: existence and properties of interface prototype object +PASS NodeIterator interface: existence and properties of interface prototype object's "constructor" property +PASS NodeIterator interface: attribute root +PASS NodeIterator interface: attribute referenceNode +PASS NodeIterator interface: attribute pointerBeforeReferenceNode +PASS NodeIterator interface: attribute whatToShow +PASS NodeIterator interface: attribute filter +PASS NodeIterator interface: operation nextNode() +PASS NodeIterator interface: operation previousNode() +PASS NodeIterator interface: operation detach() +PASS TreeWalker interface: existence and properties of interface object +PASS TreeWalker interface object length +PASS TreeWalker interface object name +PASS TreeWalker interface: existence and properties of interface prototype object +PASS TreeWalker interface: existence and properties of interface prototype object's "constructor" property +PASS TreeWalker interface: attribute root +PASS TreeWalker interface: attribute whatToShow +PASS TreeWalker interface: attribute filter +PASS TreeWalker interface: attribute currentNode +PASS TreeWalker interface: operation parentNode() +PASS TreeWalker interface: operation firstChild() +PASS TreeWalker interface: operation lastChild() +PASS TreeWalker interface: operation previousSibling() +PASS TreeWalker interface: operation nextSibling() +PASS TreeWalker interface: operation previousNode() +PASS TreeWalker interface: operation nextNode() +PASS NodeFilter interface: existence and properties of interface object +PASS NodeFilter interface object name +PASS NodeFilter interface: existence and properties of interface prototype object +PASS NodeFilter interface: existence and properties of interface prototype object's "constructor" property +PASS NodeFilter interface: constant FILTER_ACCEPT on interface object +PASS NodeFilter interface: constant FILTER_ACCEPT on interface prototype object +PASS NodeFilter interface: constant FILTER_REJECT on interface object +PASS NodeFilter interface: constant FILTER_REJECT on interface prototype object +PASS NodeFilter interface: constant FILTER_SKIP on interface object +PASS NodeFilter interface: constant FILTER_SKIP on interface prototype object +PASS NodeFilter interface: constant SHOW_ALL on interface object +PASS NodeFilter interface: constant SHOW_ALL on interface prototype object +PASS NodeFilter interface: constant SHOW_ELEMENT on interface object +PASS NodeFilter interface: constant SHOW_ELEMENT on interface prototype object +PASS NodeFilter interface: constant SHOW_ATTRIBUTE on interface object +PASS NodeFilter interface: constant SHOW_ATTRIBUTE on interface prototype object +PASS NodeFilter interface: constant SHOW_TEXT on interface object +PASS NodeFilter interface: constant SHOW_TEXT on interface prototype object +PASS NodeFilter interface: constant SHOW_CDATA_SECTION on interface object +PASS NodeFilter interface: constant SHOW_CDATA_SECTION on interface prototype object +PASS NodeFilter interface: constant SHOW_ENTITY_REFERENCE on interface object +PASS NodeFilter interface: constant SHOW_ENTITY_REFERENCE on interface prototype object +PASS NodeFilter interface: constant SHOW_ENTITY on interface object +PASS NodeFilter interface: constant SHOW_ENTITY on interface prototype object +PASS NodeFilter interface: constant SHOW_PROCESSING_INSTRUCTION on interface object +PASS NodeFilter interface: constant SHOW_PROCESSING_INSTRUCTION on interface prototype object +PASS NodeFilter interface: constant SHOW_COMMENT on interface object +PASS NodeFilter interface: constant SHOW_COMMENT on interface prototype object +PASS NodeFilter interface: constant SHOW_DOCUMENT on interface object +PASS NodeFilter interface: constant SHOW_DOCUMENT on interface prototype object +PASS NodeFilter interface: constant SHOW_DOCUMENT_TYPE on interface object +PASS NodeFilter interface: constant SHOW_DOCUMENT_TYPE on interface prototype object +PASS NodeFilter interface: constant SHOW_DOCUMENT_FRAGMENT on interface object +PASS NodeFilter interface: constant SHOW_DOCUMENT_FRAGMENT on interface prototype object +PASS NodeFilter interface: constant SHOW_NOTATION on interface object +PASS NodeFilter interface: constant SHOW_NOTATION on interface prototype object +PASS NodeFilter interface: operation acceptNode(Node) +PASS DOMTokenList interface: existence and properties of interface object +PASS DOMTokenList interface object length +PASS DOMTokenList interface object name +PASS DOMTokenList interface: existence and properties of interface prototype object +PASS DOMTokenList interface: existence and properties of interface prototype object's "constructor" property +PASS DOMTokenList interface: attribute length +PASS DOMTokenList interface: operation item(unsigned long) +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 supports(DOMString) +PASS DOMTokenList interface: attribute value +PASS DOMTokenList interface: stringifier +PASS PaymentRequest interface: existence and properties of interface object +PASS PaymentRequest interface object length +PASS PaymentRequest interface object name +PASS PaymentRequest interface: existence and properties of interface prototype object +PASS PaymentRequest interface: existence and properties of interface prototype object's "constructor" property +PASS PaymentRequest interface: operation show() +PASS PaymentRequest interface: operation abort() +PASS PaymentRequest interface: operation canMakePayment() +PASS PaymentRequest interface: attribute id +PASS PaymentRequest interface: attribute shippingAddress +PASS PaymentRequest interface: attribute shippingOption +PASS PaymentRequest interface: attribute shippingType +PASS PaymentRequest interface: attribute onshippingaddresschange +PASS PaymentRequest interface: attribute onshippingoptionchange +PASS PaymentRequest must be primary interface of new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'USD', value: '0'}} }) +PASS Stringification of new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'USD', value: '0'}} }) +PASS PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'USD', value: '0'}} }) must inherit property "show()" with the proper type +PASS PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'USD', value: '0'}} }) must inherit property "abort()" with the proper type +PASS PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'USD', value: '0'}} }) must inherit property "canMakePayment()" with the proper type +PASS PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'USD', value: '0'}} }) must inherit property "id" with the proper type +PASS PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'USD', value: '0'}} }) must inherit property "shippingAddress" with the proper type +PASS PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'USD', value: '0'}} }) must inherit property "shippingOption" with the proper type +PASS PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'USD', value: '0'}} }) must inherit property "shippingType" with the proper type +PASS PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'USD', value: '0'}} }) must inherit property "onshippingaddresschange" with the proper type +PASS PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'USD', value: '0'}} }) must inherit property "onshippingoptionchange" with the proper type +PASS EventTarget interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'USD', value: '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 new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'USD', value: '0'}} }) with too few arguments must throw TypeError +PASS EventTarget interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'USD', value: '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 new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'USD', value: '0'}} }) with too few arguments must throw TypeError +PASS EventTarget interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'USD', value: '0'}} }) must inherit property "dispatchEvent(Event)" with the proper type +PASS EventTarget interface: calling dispatchEvent(Event) on new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'USD', value: '0'}} }) with too few arguments must throw TypeError +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() +PASS PaymentAddress interface: attribute country +PASS PaymentAddress interface: attribute addressLine +PASS PaymentAddress interface: attribute region +PASS PaymentAddress interface: attribute city +PASS PaymentAddress interface: attribute dependentLocality +PASS PaymentAddress interface: attribute postalCode +PASS PaymentAddress interface: attribute sortingCode +PASS PaymentAddress interface: attribute languageCode +PASS PaymentAddress interface: attribute organization +PASS PaymentAddress interface: attribute recipient +PASS PaymentAddress interface: attribute phone +PASS PaymentResponse interface: existence and properties of interface object +PASS PaymentResponse interface object length +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() +PASS PaymentResponse interface: attribute requestId +PASS PaymentResponse interface: attribute methodName +PASS PaymentResponse interface: attribute details +PASS PaymentResponse interface: attribute shippingAddress +PASS PaymentResponse interface: attribute shippingOption +PASS PaymentResponse interface: attribute payerName +PASS PaymentResponse interface: attribute payerEmail +PASS PaymentResponse interface: attribute payerPhone +PASS PaymentResponse interface: operation complete(PaymentComplete) +PASS PaymentRequestUpdateEvent interface: existence and properties of interface object +PASS PaymentRequestUpdateEvent interface object length +PASS PaymentRequestUpdateEvent interface object name +PASS PaymentRequestUpdateEvent interface: existence and properties of interface prototype object +PASS PaymentRequestUpdateEvent interface: existence and properties of interface prototype object's "constructor" property +PASS PaymentRequestUpdateEvent interface: operation updateWith([object Object]) Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/pointerevents/extension/idlharness.html b/third_party/WebKit/LayoutTests/external/wpt/pointerevents/extension/idlharness.html index 985712e..d1bbdebd 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/pointerevents/extension/idlharness.html +++ b/third_party/WebKit/LayoutTests/external/wpt/pointerevents/extension/idlharness.html
@@ -7,7 +7,7 @@ <script src="/resources/idlharness.js"></script> <pre id='untested_idl' style='display:none'> -[PrimaryGlobal] +[Global=Window, Exposed=Window] interface Window { };
diff --git a/third_party/WebKit/LayoutTests/external/wpt/pointerevents/idlharness.html b/third_party/WebKit/LayoutTests/external/wpt/pointerevents/idlharness.html index a4ba4c3..729d357 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/pointerevents/idlharness.html +++ b/third_party/WebKit/LayoutTests/external/wpt/pointerevents/idlharness.html
@@ -7,7 +7,7 @@ <script src="/resources/idlharness.js"></script> <pre id='untested_idl' style='display:none'> -[PrimaryGlobal] +[Global=Window, Exposed=Window] interface Window { };
diff --git a/third_party/WebKit/LayoutTests/external/wpt/requestidlecallback/idlharness.html b/third_party/WebKit/LayoutTests/external/wpt/requestidlecallback/idlharness.html index 4007d09..459ce36 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/requestidlecallback/idlharness.html +++ b/third_party/WebKit/LayoutTests/external/wpt/requestidlecallback/idlharness.html
@@ -7,7 +7,7 @@ <script src="/resources/idlharness.js"></script> <pre id='untested_idl' style='display:none'> -[PrimaryGlobal] +[Global=Window, Exposed=Window] interface Window { }; </pre>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/resources/idlharness.js b/third_party/WebKit/LayoutTests/external/wpt/resources/idlharness.js index 731352ce..a8d4150d 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/resources/idlharness.js +++ b/third_party/WebKit/LayoutTests/external/wpt/resources/idlharness.js
@@ -165,6 +165,7 @@ */ this.partials = []; this["implements"] = {}; + this["includes"] = {}; }; //@} @@ -258,6 +259,20 @@ return; } + if (parsed_idl.type == "includes") + { + if (should_skip(parsed_idl.target)) + { + return; + } + if (!(parsed_idl.target in this["includes"])) + { + this["includes"][parsed_idl.target] = []; + } + this["includes"][parsed_idl.target].push(parsed_idl["includes"]); + return; + } + parsed_idl.array = this; if (parsed_idl.name in this.members) { @@ -271,7 +286,12 @@ { case "interface": this.members[parsed_idl.name] = - new IdlInterface(parsed_idl, /* is_callback = */ false); + new IdlInterface(parsed_idl, /* is_callback = */ false, /* is_mixin = */ false); + break; + + case "interface mixin": + this.members[parsed_idl.name] = + new IdlInterface(parsed_idl, /* is_callback = */ false, /* is_mixin = */ true); break; case "dictionary": @@ -295,7 +315,7 @@ case "callback interface": this.members[parsed_idl.name] = - new IdlInterface(parsed_idl, /* is_callback = */ true); + new IdlInterface(parsed_idl, /* is_callback = */ true, /* is_mixin = */ false); break; default: @@ -361,6 +381,36 @@ }; //@} +IdlArray.prototype.recursively_get_includes = function(interface_name) +//@{ +{ + /** + * Helper function for test(). Returns an array of things that implement + * interface_name, so if the IDL contains + * + * A includes B; + * B includes C; + * B includes D; + * + * then recursively_get_includes("A") should return ["B", "C", "D"]. + */ + var ret = this["includes"][interface_name]; + if (ret === undefined) + { + return []; + } + for (var i = 0; i < this["includes"][interface_name].length; i++) + { + ret = ret.concat(this.recursively_get_includes(ret[i])); + if (ret.indexOf(ret[i]) != ret.lastIndexOf(ret[i])) + { + throw "Circular includes statements involving " + ret[i]; + } + } + return ret; +}; + +//@} IdlArray.prototype.is_json_type = function(type) //@{ { @@ -456,7 +506,7 @@ while (thing) { if (thing.has_to_json_regular_operation()) { return true; } - var mixins = this.implements[thing.name]; + var mixins = this.implements[thing.name] || this.includes[thing.name]; if (mixins) { mixins = mixins.map(function(id) { var mixin = this.members[id]; @@ -566,6 +616,23 @@ } this["implements"] = {}; + for (var lhs in this["includes"]) + { + this.recursively_get_includes(lhs).forEach(function(rhs) + { + var errStr = lhs + " includes " + rhs + ", but "; + if (!(lhs in this.members)) throw errStr + lhs + " is undefined."; + if (!(this.members[lhs] instanceof IdlInterface)) throw errStr + lhs + " is not an interface."; + if (!(rhs in this.members)) throw errStr + rhs + " is undefined."; + if (!(this.members[rhs] instanceof IdlInterface)) throw errStr + rhs + " is not an interface."; + this.members[rhs].members.forEach(function(member) + { + this.members[lhs].members.push(new IdlInterfaceMember(member)); + }.bind(this)); + }.bind(this)); + } + this["includes"] = {}; + Object.getOwnPropertyNames(this.members).forEach(function(memberName) { var member = this.members[memberName]; if (!(member instanceof IdlInterface)) { @@ -875,7 +942,7 @@ }; /// IdlInterface /// -function IdlInterface(obj, is_callback) +function IdlInterface(obj, is_callback, is_mixin) //@{ { /** @@ -913,6 +980,7 @@ this.base = obj.inheritance; this._is_callback = is_callback; + this._is_mixin = is_mixin; } //@} IdlInterface.prototype = Object.create(IdlObject.prototype); @@ -923,6 +991,13 @@ }; //@} +IdlInterface.prototype.is_mixin = function() +//@{ +{ + return this._is_mixin; +}; +//@} + IdlInterface.prototype.has_constants = function() //@{ { @@ -936,8 +1011,7 @@ //@{ { return this.extAttrs.some(function(attribute) { - return attribute.name === "Global" || - attribute.name === "PrimaryGlobal"; + return attribute.name === "Global"; }); }; //@} @@ -1047,7 +1121,7 @@ function _traverse_inherited_and_consequential_interfaces(stack, callback) { var I = stack.pop(); callback(I); - var mixins = I.array["implements"][I.name]; + var mixins = I.array["implements"][I.name] || I.array["includes"][I.name]; if (mixins) { mixins.forEach(function(id) { var mixin = I.array.members[id]; @@ -1066,7 +1140,7 @@ IdlInterface.prototype.test = function() //@{ { - if (this.has_extended_attribute("NoInterfaceObject")) + if (this.has_extended_attribute("NoInterfaceObject") || this.is_mixin()) { // No tests to do without an instance. TODO: We should still be able // to run tests on the prototype object, if we obtain one through some @@ -1356,7 +1430,7 @@ // "The interface prototype object for a given interface A must have an // internal [[Prototype]] property whose value is returned from the // following steps: - // "If A is declared with the [Global] or [PrimaryGlobal] extended + // "If A is declared with the [Global] extended // attribute, and A supports named properties, then return the named // properties object for A, as defined in §3.6.4 Named properties // object. @@ -1434,7 +1508,7 @@ } }.bind(this), this.name + " interface: existence and properties of interface prototype object"); - // "If the interface is declared with the [Global] or [PrimaryGlobal] + // "If the interface is declared with the [Global] // extended attribute, or the interface is in the set of inherited // interfaces for any other interface that is declared with one of these // attributes, then the interface prototype object must be an immutable @@ -1780,7 +1854,7 @@ "interface object missing static operation"); memberHolderObject = self[this.name]; // "* Otherwise, [...] if the interface was declared with the [Global] - // or [PrimaryGlobal] extended attribute, then the property exists + // extended attribute, then the property exists // on every object that implements the interface." } else if (this.is_global()) { assert_own_property(self, member.name, @@ -2128,7 +2202,7 @@ } // "The internal [[SetPrototypeOf]] method of every platform object that - // implements an interface with the [Global] or [PrimaryGlobal] extended + // implements an interface with the [Global] extended // attribute must execute the same algorithm as is defined for the // [[SetPrototypeOf]] internal method of an immutable prototype exotic // object."
diff --git a/third_party/WebKit/LayoutTests/external/wpt/selection/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/selection/interfaces-expected.txt index 1fd50f1..f2473ff 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/selection/interfaces-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/selection/interfaces-expected.txt
@@ -1,4 +1,4 @@ This is a testharness.js-based test. -FAIL Test driver promise_test: Unhandled rejection with value: "NonElementParentNode: interface mixin not yet supported" +FAIL Test driver promise_test: Unhandled rejection with value: "SVGElement implements ElementCSSInlineStyle, but SVGElement is undefined." Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/storage/interfaces.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/storage/interfaces.https-expected.txt deleted file mode 100644 index bb04f51..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/storage/interfaces.https-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL Storage API IDL test promise_test: Unhandled rejection with value: "NavigatorStorage: interface mixin not yet supported" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/storage/interfaces.https.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/storage/interfaces.https.worker-expected.txt deleted file mode 100644 index bb04f51..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/storage/interfaces.https.worker-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL Storage API IDL test promise_test: Unhandled rejection with value: "NavigatorStorage: interface mixin not yet supported" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/svg/interfaces.html b/third_party/WebKit/LayoutTests/external/wpt/svg/interfaces.html index b171185..698e6e7 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/svg/interfaces.html +++ b/third_party/WebKit/LayoutTests/external/wpt/svg/interfaces.html
@@ -13,7 +13,7 @@ interface ProcessingInstruction : Node {}; interface Element : Node {}; interface HTMLElement : Element {}; -[PrimaryGlobal] interface Window {}; +[Global=Window, Exposed=Window] interface Window {}; // Just need to know that DOMStringMap exists; its details are tested elsewhere. interface DOMStringMap { };
diff --git a/third_party/WebKit/LayoutTests/external/wpt/svg/path/bearing/absolute-ref.svg b/third_party/WebKit/LayoutTests/external/wpt/svg/path/bearing/absolute-ref.svg new file mode 100644 index 0000000..85b20271 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/svg/path/bearing/absolute-ref.svg
@@ -0,0 +1,9 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200"> + <style> + path { + stroke-width: 3; + stroke: blue; + } + </style> + <path d="M 20 150 v -120 h 140 v 120 z" /> +</svg>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/svg/path/bearing/absolute.svg b/third_party/WebKit/LayoutTests/external/wpt/svg/path/bearing/absolute.svg new file mode 100644 index 0000000..0efc295 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/svg/path/bearing/absolute.svg
@@ -0,0 +1,16 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200"> + <metadata> + <link xmlns="http://www.w3.org/1999/xhtml" rel="help" href="https://www.w3.org/TR/svg-paths/#PathDataBearingCommands"/> + <link xmlns="http://www.w3.org/1999/xhtml" rel="help" href="https://www.w3.org/TR/SVG2/paths.html#PathDataBearingCommands"/> + <link xmlns="http://www.w3.org/1999/xhtml" rel="help" href="https://svgwg.org/svg2-draft/changes.html#paths"/> + <link xmlns="http://www.w3.org/1999/xhtml" rel="match" href="absolute-ref.svg"/> + <meta xmlns="http://www.w3.org/1999/xhtml" name="assert" content="path element with B commands renders correctly."/> + </metadata> + <style> + path { + stroke-width: 3; + stroke: blue; + } + </style> + <path d="M 20 150 B -90 h 120 B 0 h 140 B 90 h 120 z" /> +</svg>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/svg/path/bearing/relative-ref.svg b/third_party/WebKit/LayoutTests/external/wpt/svg/path/bearing/relative-ref.svg new file mode 100644 index 0000000..85b20271 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/svg/path/bearing/relative-ref.svg
@@ -0,0 +1,9 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200"> + <style> + path { + stroke-width: 3; + stroke: blue; + } + </style> + <path d="M 20 150 v -120 h 140 v 120 z" /> +</svg>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/svg/path/bearing/relative.svg b/third_party/WebKit/LayoutTests/external/wpt/svg/path/bearing/relative.svg new file mode 100644 index 0000000..75b87ff --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/svg/path/bearing/relative.svg
@@ -0,0 +1,16 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200"> + <metadata> + <link xmlns="http://www.w3.org/1999/xhtml" rel="help" href="https://www.w3.org/TR/svg-paths/#PathDataBearingCommands"/> + <link xmlns="http://www.w3.org/1999/xhtml" rel="help" href="https://www.w3.org/TR/SVG2/paths.html#PathDataBearingCommands"/> + <link xmlns="http://www.w3.org/1999/xhtml" rel="help" href="https://svgwg.org/svg2-draft/changes.html#paths"/> + <link xmlns="http://www.w3.org/1999/xhtml" rel="match" href="absolute-ref.svg"/> + <meta xmlns="http://www.w3.org/1999/xhtml" name="assert" content="path element with b commands renders correctly."/> + </metadata> + <style> + path { + stroke-width: 3; + stroke: blue; + } + </style> + <path d="M 20 150 b -90 h 120 b 90 h 140 b 90 h 120 z" /> +</svg>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/svg/path/bearing/zero-ref.svg b/third_party/WebKit/LayoutTests/external/wpt/svg/path/bearing/zero-ref.svg new file mode 100644 index 0000000..3558de31 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/svg/path/bearing/zero-ref.svg
@@ -0,0 +1,9 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100"> + <style> + path { + stroke-width: 3; + stroke: blue; + } + </style> + <path d="M 25 50 h 10 m 10 0 h 10 m 10 0 h 10" /> +</svg>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/svg/path/bearing/zero.svg b/third_party/WebKit/LayoutTests/external/wpt/svg/path/bearing/zero.svg new file mode 100644 index 0000000..80256429 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/svg/path/bearing/zero.svg
@@ -0,0 +1,16 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100"> + <metadata> + <link xmlns="http://www.w3.org/1999/xhtml" rel="help" href="https://www.w3.org/TR/svg-paths/#PathDataBearingCommands"/> + <link xmlns="http://www.w3.org/1999/xhtml" rel="help" href="https://www.w3.org/TR/SVG2/paths.html#PathDataBearingCommands"/> + <link xmlns="http://www.w3.org/1999/xhtml" rel="help" href="https://svgwg.org/svg2-draft/changes.html#paths"/> + <link xmlns="http://www.w3.org/1999/xhtml" rel="match" href="zero-ref.svg"/> + <meta xmlns="http://www.w3.org/1999/xhtml" name="assert" content="path element with bearing 0 renders correctly."/> + </metadata> + <style> + path { + stroke-width: 3; + stroke: blue; + } + </style> + <path d="M 25 50 h 10 B 0 m 10 0 h 10 b 0 m 10 0 h 10" /> +</svg>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/uievents/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/uievents/interfaces-expected.txt deleted file mode 100644 index 1fd50f1..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/uievents/interfaces-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL Test driver promise_test: Unhandled rejection with value: "NonElementParentNode: interface mixin not yet supported" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-createOffer-offerToReceive-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-createOffer-offerToReceive-expected.txt new file mode 100644 index 0000000..77c7d54 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-createOffer-offerToReceive-expected.txt
@@ -0,0 +1,12 @@ +This is a testharness.js-based test. +FAIL createOffer() with offerToReceiveAudio set to false should not create a transceiver promise_test: Unhandled rejection with value: object "TypeError: pc.getTransceivers is not a function" +FAIL createOffer() with offerToReceiveAudio should create a "recvonly" transceiver promise_test: Unhandled rejection with value: object "TypeError: pc.getTransceivers is not a function" +FAIL offerToReceiveAudio option should be ignored if a non-stopped "recvonly" transceiver exists promise_test: Unhandled rejection with value: object "TypeError: pc.getTransceivers is not a function" +FAIL offerToReceiveAudio option should be ignored if a non-stopped "sendrecv" transceiver exists promise_test: Unhandled rejection with value: object "NotSupportedError: Only secure origins are allowed (see: https://goo.gl/Y0ZkNV)." +FAIL createOffer() with offerToReceiveVideo set to false should not create a transceiver promise_test: Unhandled rejection with value: object "TypeError: pc.getTransceivers is not a function" +FAIL createOffer() with offerToReceiveVideo should create a "recvonly" transceiver promise_test: Unhandled rejection with value: object "TypeError: pc.getTransceivers is not a function" +FAIL offerToReceiveVideo option should be ignored if a non-stopped "recvonly" transceiver exists promise_test: Unhandled rejection with value: object "TypeError: pc.getTransceivers is not a function" +FAIL offerToReceiveVideo option should be ignored if a non-stopped "sendrecv" transceiver exists promise_test: Unhandled rejection with value: object "NotSupportedError: Only secure origins are allowed (see: https://goo.gl/Y0ZkNV)." +FAIL offerToReceiveAudio and Video should create two "recvonly" transceivers promise_test: Unhandled rejection with value: object "TypeError: pc.getTransceivers is not a function" +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-createOffer-offerToReceive.html b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-createOffer-offerToReceive.html new file mode 100644 index 0000000..72d5837 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-createOffer-offerToReceive.html
@@ -0,0 +1,107 @@ +<!doctype html> +<meta charset=utf-8> +<title>Test legacy offerToReceiveAudio/Video options</title> +<link rel="help" href="https://w3c.github.io/webrtc-pc/#legacy-configuration-extensions"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="RTCPeerConnection-helper.js"></script> +<script> + 'use strict'; + + // Run some tests for both audio and video types + ['audio', 'video'].forEach((type) => { + const capsType = type[0].toUpperCase() + type.slice(1); + + const offerToReceiveTrue = {}; + offerToReceiveTrue[`offerToReceive${capsType}`] = true; + + const offerToReceiveFalse = {}; + offerToReceiveFalse[`offerToReceive${capsType}`] = false; + + // Start testing + promise_test(t => { + const pc = new RTCPeerConnection(); + const dummy = pc.createDataChannel('foo'); // Just to have something to offer + + return pc.createOffer(offerToReceiveFalse) + .then(() => { + assert_equals(pc.getTransceivers().length, 0, + 'Expect pc to have no transceivers'); + }); + }, `createOffer() with offerToReceive${capsType} set to false should not create a transceiver`); + + promise_test(t => { + const pc = new RTCPeerConnection(); + + return pc.createOffer(offerToReceiveTrue) + .then(() => { + assert_equals(pc.getTransceivers().length, 1, + 'Expect pc to have one transceiver'); + + const transceiver = pc.getTransceivers()[0]; + assert_equals(transceiver.direction, 'recvonly', + 'Expect transceiver to have "recvonly" direction'); + }); + }, `createOffer() with offerToReceive${capsType} should create a "recvonly" transceiver`); + + promise_test(t => { + const pc = new RTCPeerConnection(); + + return pc.createOffer(offerToReceiveTrue) + .then(() => { + assert_equals(pc.getTransceivers().length, 1, + 'Expect pc to have one transceiver'); + + const transceiver = pc.getTransceivers()[0]; + assert_equals(transceiver.direction, 'recvonly', + 'Expect transceiver to have "recvonly" direction'); + }) + .then(() => pc.createOffer(offerToReceiveTrue)) + .then(() => { + assert_equals(pc.getTransceivers().length, 1, + 'Expect pc to still have only one transceiver'); + }) + ; + }, `offerToReceive${capsType} option should be ignored if a non-stopped "recvonly" transceiver exists`); + + promise_test(t => { + const pc = new RTCPeerConnection(); + + return getTrackFromUserMedia(type) + .then(([track, stream]) => { + pc.addTrack(track, stream); + return pc.createOffer(); + }) + .then(() => { + assert_equals(pc.getTransceivers().length, 1, + 'Expect pc to have one transceiver'); + + const transceiver = pc.getTransceivers()[0]; + assert_equals(transceiver.direction, 'sendrecv', + 'Expect transceiver to have "sendrecv" direction'); + }) + .then(() => pc.createOffer(offerToReceiveTrue)) + .then(() => { + assert_equals(pc.getTransceivers().length, 1, + 'Expect pc to still have only one transceiver'); + }) + ; + }, `offerToReceive${capsType} option should be ignored if a non-stopped "sendrecv" transceiver exists`); + }); + + promise_test(t => { + const pc = new RTCPeerConnection(); + + return pc.createOffer({ offerToReceiveAudio: true, offerToReceiveVideo: true }) + .then(() => { + assert_equals(pc.getTransceivers().length, 2, + 'Expect pc to have two transceivers'); + + assert_equals(pc.getTransceivers()[0].direction, 'recvonly', + 'Expect first transceiver to have "recvonly" direction'); + assert_equals(pc.getTransceivers()[1].direction, 'recvonly', + 'Expect second transceiver to have "recvonly" direction'); + }); + }, 'offerToReceiveAudio and Video should create two "recvonly" transceivers'); + +</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webstorage/idlharness.html b/third_party/WebKit/LayoutTests/external/wpt/webstorage/idlharness.html index 454e441..cd880a3 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webstorage/idlharness.html +++ b/third_party/WebKit/LayoutTests/external/wpt/webstorage/idlharness.html
@@ -15,7 +15,7 @@ <div id="log"></div> <pre id='untested_idl' style='display:none'> -[PrimaryGlobal] +[Global=Window, Exposed=Window] interface Window { };
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webvr/idlharness.html b/third_party/WebKit/LayoutTests/external/wpt/webvr/idlharness.html index ecb89f37..96c63d5 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webvr/idlharness.html +++ b/third_party/WebKit/LayoutTests/external/wpt/webvr/idlharness.html
@@ -223,7 +223,7 @@ <script> setup( () => { var idl_array = new IdlArray(); - idl_array.add_untested_idls("[PrimaryGlobal] interface Window {};"); + idl_array.add_untested_idls("[Global=Window, Exposed=Window] interface Window {};"); idl_array.add_untested_idls("interface Navigator {};"); idl_array.add_untested_idls("interface Event {};"); idl_array.add_untested_idls("interface EventTarget {};");
diff --git a/third_party/WebKit/LayoutTests/fast/harness/results.html b/third_party/WebKit/LayoutTests/fast/harness/results.html index 1fc0c2d..d32730e 100644 --- a/third_party/WebKit/LayoutTests/fast/harness/results.html +++ b/third_party/WebKit/LayoutTests/fast/harness/results.html
@@ -776,9 +776,11 @@ : test => { if (test.expectPath.includes(searchText)) return true; - for (let bug of test.bugs) { - if (bug.includes(searchText)) - return true; + if (Array.isArray(test.bugs)) { + for (let bug of test.bugs) { + if (bug.includes(searchText)) + return true; + } } return false; };
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/help/release-note-unit-expected.txt b/third_party/WebKit/LayoutTests/http/tests/devtools/help/release-note-unit-expected.txt index 5f3e950..59f7dd4 100644 --- a/third_party/WebKit/LayoutTests/http/tests/devtools/help/release-note-unit-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/devtools/help/release-note-unit-expected.txt
@@ -18,3 +18,13 @@ Did not show release note drawer Release note version in setting: 5 +Running: showReleaseNoteSetting + +Disabled showReleaseNote setting +Last seen version: 4 +Did not show release note drawer + +Enabled showReleaseNote setting +Last seen version: 4 +Showed release note in drawer - version: 5 +
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/help/release-note-unit.js b/third_party/WebKit/LayoutTests/http/tests/devtools/help/release-note-unit.js index 9692b6d..25cd19c 100644 --- a/third_party/WebKit/LayoutTests/http/tests/devtools/help/release-note-unit.js +++ b/third_party/WebKit/LayoutTests/http/tests/devtools/help/release-note-unit.js
@@ -13,11 +13,15 @@ ]; function testMaybeShowInDrawer(lastSeenVersion) { + return testMaybeShowInDrawerWithSettings(lastSeenVersion, {showReleaseNote: true}); + } + + function testMaybeShowInDrawerWithSettings(lastSeenVersion, {showReleaseNote}) { TestRunner.addResult(`Last seen version: ${lastSeenVersion}`); TestRunner.addSniffer(UI.viewManager, 'showView', onShowView); var showedReleaseNote = false; - Help._showReleaseNoteIfNeeded(lastSeenVersion, Help.latestReleaseNote().version); + Help._showReleaseNoteIfNeeded(lastSeenVersion, Help.latestReleaseNote().version, showReleaseNote); function onShowView() { showedReleaseNote = true; @@ -50,5 +54,14 @@ TestRunner.addResult(`Release note version in setting: ${Help.releaseNoteVersionSetting().get()}`); next(); }, + function showReleaseNoteSetting(next) { + TestRunner.addResult('\nDisabled showReleaseNote setting'); + var lastSeenVersion = 4; + testMaybeShowInDrawerWithSettings(lastSeenVersion, {showReleaseNote: false}); + + TestRunner.addResult('\nEnabled showReleaseNote setting'); + testMaybeShowInDrawerWithSettings(lastSeenVersion, {showReleaseNote: true}); + next(); + }, ]); })();
diff --git a/third_party/WebKit/LayoutTests/http/tests/locks/acquire.html b/third_party/WebKit/LayoutTests/http/tests/locks/acquire.html index ca5cf61..c857fe6 100644 --- a/third_party/WebKit/LayoutTests/http/tests/locks/acquire.html +++ b/third_party/WebKit/LayoutTests/http/tests/locks/acquire.html
@@ -10,46 +10,46 @@ promise_test(async t => { await promise_rejects(t, new TypeError(), navigator.locks.acquire()); - await promise_rejects(t, new TypeError(), navigator.locks.acquire('scope')); -}, 'navigator.locks.acquire requires a scope and a callback'); + await promise_rejects(t, new TypeError(), navigator.locks.acquire('name')); +}, 'navigator.locks.acquire requires a name and a callback'); promise_test(async t => { await promise_rejects( t, new TypeError(), - navigator.locks.acquire('scope', {mode: 'foo'}, lock => {})); + navigator.locks.acquire('name', {mode: 'foo'}, lock => {})); await promise_rejects( t, new TypeError(), - navigator.locks.acquire('scope', {mode: null }, lock => {})); + navigator.locks.acquire('name', {mode: null }, lock => {})); assert_equals(await navigator.locks.acquire( - 'scope', {mode: 'exclusive'}, lock => lock.mode), 'exclusive', + 'name', {mode: 'exclusive'}, lock => lock.mode), 'exclusive', 'mode is exclusive'); assert_equals(await navigator.locks.acquire( - 'scope', {mode: 'shared'}, lock => lock.mode), 'shared', + 'name', {mode: 'shared'}, lock => lock.mode), 'shared', 'mode is shared'); }, 'mode must be "shared" or "exclusive"'); promise_test(async t => { await promise_rejects( - t, new TypeError(), navigator.locks.acquire('scope', undefined)); + t, new TypeError(), navigator.locks.acquire('name', undefined)); await promise_rejects( - t, new TypeError(), navigator.locks.acquire('scope', null)); + t, new TypeError(), navigator.locks.acquire('name', null)); await promise_rejects( - t, new TypeError(), navigator.locks.acquire('scope', 123)); + t, new TypeError(), navigator.locks.acquire('name', 123)); await promise_rejects( - t, new TypeError(), navigator.locks.acquire('scope', 'abc')); + t, new TypeError(), navigator.locks.acquire('name', 'abc')); await promise_rejects( - t, new TypeError(), navigator.locks.acquire('scope', [])); + t, new TypeError(), navigator.locks.acquire('name', [])); await promise_rejects( - t, new TypeError(), navigator.locks.acquire('scope', {})); + t, new TypeError(), navigator.locks.acquire('name', {})); await promise_rejects( - t, new TypeError(), navigator.locks.acquire('scope', new Promise(r => {}))); + t, new TypeError(), navigator.locks.acquire('name', new Promise(r => {}))); }, 'callback must be a function'); promise_test(async t => { let release; const promise = new Promise(r => { release = r; }); - let returned = navigator.locks.acquire('scope', lock => { return promise; }); + let returned = navigator.locks.acquire('name', lock => { return promise; }); const order = [];
diff --git a/third_party/WebKit/LayoutTests/http/tests/locks/frames.html b/third_party/WebKit/LayoutTests/http/tests/locks/frames.html index 2475fa7..5b00448f 100644 --- a/third_party/WebKit/LayoutTests/http/tests/locks/frames.html +++ b/third_party/WebKit/LayoutTests/http/tests/locks/frames.html
@@ -38,22 +38,24 @@ }); } +async function postAndConfirm(frame, data) { + const response = await postAndWait(frame, data); + assert_equals(response.ack, data.op); + assert_equals(response.id, data.lock_id); + return response; +} + promise_test(async t => { const res = uniqueName(t); const frame = await iframe('resources/iframe.html'); t.add_cleanup(() => { frame.remove(); }); - const data = await postAndWait( - frame, {op: 'request', lock_id: 1, scope: res, mode: 'shared'}); - - assert_equals(data.ack, 'request'); - assert_equals(data.id, 1); + await postAndConfirm( + frame, {op: 'request', lock_id: 1, name: res, mode: 'shared'}); await navigator.locks.acquire(res, {mode: 'shared'}, async lock => { - const data = await postAndWait(frame, {op: 'release', lock_id: 1}); - assert_equals(data.ack, 'release'); - assert_equals(data.id, 1); + await postAndConfirm(frame, {op: 'release', lock_id: 1}); }); }, 'Window and Frame - shared mode'); @@ -64,11 +66,9 @@ const frame = await iframe('resources/iframe.html'); t.add_cleanup(() => { frame.remove(); }); - const data = await postAndWait( - frame, {op: 'request', lock_id: 1, scope: res}); - // frame has the lock. - assert_equals(data.ack, 'request'); - assert_equals(data.id, 1); + // frame acquires the lock. + await postAndConfirm( + frame, {op: 'request', lock_id: 1, name: res}); // This request should be blocked. let lock_granted = false; @@ -82,11 +82,8 @@ assert_false(lock_granted); // Ask the frame to release it. - const data2 = await postAndWait(frame, {op: 'release', lock_id: 1}); + await postAndConfirm(frame, {op: 'release', lock_id: 1}); - // Frame released it. - assert_equals(data2.ack, 'release'); - assert_equals(data2.id, 1); await blocked; // Now we've got it. assert_true(lock_granted); @@ -97,29 +94,25 @@ const frame1 = await iframe('resources/iframe.html'); const frame2 = await iframe('resources/iframe.html'); - const data = await postAndWait( - frame1, {op: 'request', lock_id: 1, scope: res}); - // frame1 has the lock. - assert_equals(data.ack, 'request'); - assert_equals(data.id, 1); + // frame1 acquires the lock. + await postAndConfirm( + frame1, {op: 'request', lock_id: 1, name: res}); // frame2's request should be blocked. let lock_granted = false; - const blocked = postAndWait( - frame2, {op: 'request', lock_id: 1, scope: res}); + const blocked = postAndConfirm( + frame2, {op: 'request', lock_id: 1, name: res}); blocked.then(f => { lock_granted = true; }); // Verify that frame2 can't get it. - assert_true((await postAndWait(frame2, { - op: 'request', scope: res, lock_id: 2, ifAvailable: true + assert_true((await postAndConfirm(frame2, { + op: 'request', name: res, lock_id: 2, ifAvailable: true })).failed, 'Lock request should have failed'); assert_false(lock_granted); // Ask frame1 to release it. - const data2 = await postAndWait(frame1, {op: 'release', lock_id: 1}); - assert_equals(data2.ack, 'release'); - assert_equals(data2.id, 1); + await postAndConfirm(frame1, {op: 'release', lock_id: 1}); await blocked; // Now frame2 can get it. @@ -132,11 +125,10 @@ const res = uniqueName(t); const frame = await iframe('resources/iframe.html'); - const data = await postAndWait( - frame, {op: 'request', lock_id: 1, scope: res}); - // Frame has the lock. - assert_equals(data.ack, 'request'); - assert_equals(data.id, 1); + + // Frame acquires the lock. + await postAndConfirm( + frame, {op: 'request', lock_id: 1, name: res}); // This request should be blocked. let lock_granted = false; @@ -162,11 +154,10 @@ const res = uniqueName(t); const frame = await iframe('resources/iframe.html'); - const data = await postAndWait( - frame, {op: 'request', lock_id: 1, scope: res}); - // Frame has the lock. - assert_equals(data.ack, 'request'); - assert_equals(data.id, 1); + + // Frame acquires the lock. + await postAndConfirm( + frame, {op: 'request', lock_id: 1, name: res}); // This request should be blocked. let lock_granted = false; @@ -189,14 +180,14 @@ }, 'Navigated Frame with held lock'); promise_test(async t => { - const res1 = uniqueName(t); - const res2 = uniqueName(t); + const res = uniqueName(t); - // frame1 requests and holds [r1] - should be granted immediately - // frame2 requests [r1, r2] - should be blocked - // frame3 requests [r2] - should be blocked - // frame2 is navigated - // frame3's request should be granted + // frame1 requests and holds res - should be granted immediately. + // frame2 requests res - should be blocked. + // frame3 requests res - should be blocked. + // frame2 is navigated. + // frame1 releases res. + // frame3's request should be granted. const frame1 = await iframe('resources/iframe.html'); const frame2 = await iframe('resources/iframe.html'); @@ -205,33 +196,33 @@ t.add_cleanup(() => { frame2.remove(); }); t.add_cleanup(() => { frame3.remove(); }); - // frame1 requests and holds [r1] - should be granted immediately. - const data = await postAndWait( - frame1, {op: 'request', lock_id: 1, scope: res1}); + // frame1 requests and holds res - should be granted immediately. + await postAndConfirm( + frame1, {op: 'request', lock_id: 1, name: res}); - assert_equals(data.ack, 'request'); - assert_equals(data.id, 1); - - // frame2 requests [r1, r2] - should be blocked. + // frame2 requests res - should be blocked. // (don't attach listeners as they will keep the frame alive) frame2.contentWindow.postMessage( - {op: 'request', lock_id: 1, scope: [res1, res2]}, '*'); + {op: 'request', lock_id: 1, name: res}, '*'); - // frame3 requests [r2] - should be blocked. + // frame3 requests res - should be blocked. let lock_granted = false; - const blocked = postAndWait( - frame3, {op: 'request', lock_id: 1, scope: res2}); + const blocked = postAndConfirm( + frame3, {op: 'request', lock_id: 1, name: res}); blocked.then(f => { lock_granted = true; }); // Verify that frame3 can't get it. - assert_true((await postAndWait(frame3, { - op: 'request', scope: res2, lock_id: 2, ifAvailable: true + assert_true((await postAndConfirm(frame3, { + op: 'request', name: res, lock_id: 2, ifAvailable: true })).failed, 'Lock request should have failed'); assert_false(lock_granted); // Navigate frame2. frame2.src = 'about:blank'; + // frame1 releases lock + await postAndConfirm(frame1, {op: 'release', lock_id: 1}); + // frame3's request should be granted. await blocked; assert_true(lock_granted); @@ -239,13 +230,13 @@ }, 'Navigated Frame with pending request'); promise_test(async t => { - const res1 = uniqueName(t); - const res2 = uniqueName(t); + const res = uniqueName(t); - // frame1 requests and holds [r1] - should be granted immediately. - // frame2 requests [r1, r2] - should be blocked. - // frame3 requests [r2] - should be blocked. - // frame2 is navigated. + // frame1 requests and holds res - should be granted immediately. + // frame2 requests res - should be blocked. + // frame3 requests res - should be blocked. + // frame2 is removed. + // frame1 drops lock. // frame3's request should be granted. const frame1 = await iframe('resources/iframe.html'); @@ -254,33 +245,33 @@ t.add_cleanup(() => { frame1.remove(); }); t.add_cleanup(() => { frame3.remove(); }); - // frame1 requests and holds [r1] - should be granted immediately. - const data = await postAndWait( - frame1, {op: 'request', lock_id: 1, scope: res1}); + // frame1 requests and holds res - should be granted immediately. + await postAndConfirm( + frame1, {op: 'request', lock_id: 1, name: res}); - assert_equals(data.ack, 'request'); - assert_equals(data.id, 1); - - // frame2 requests [r1, r2] - should be blocked. + // frame2 requests res - should be blocked. // (don't attach listeners as they will keep the frame alive) frame2.contentWindow.postMessage( - {op: 'request', lock_id: 1, scope: [res1, res2]}, '*'); + {op: 'request', lock_id: 1, name: res}, '*'); - // frame3 requests [r2] - should be blocked. + // frame3 requests res - should be blocked. let lock_granted = false; - const blocked = postAndWait( - frame3, {op: 'request', lock_id: 1, scope: res2}); + const blocked = postAndConfirm( + frame3, {op: 'request', lock_id: 1, name: res}); blocked.then(f => { lock_granted = true; }); // So frame3 can't get it - assert_true((await postAndWait(frame3, { - op: 'request', scope: res2, lock_id: 2, ifAvailable: true + assert_true((await postAndConfirm(frame3, { + op: 'request', name: res, lock_id: 2, ifAvailable: true })).failed, 'Lock request should have failed'); assert_false(lock_granted); // Remove frame2. frame2.remove(); + // frame1 releases lock + await postAndConfirm(frame1, {op: 'release', lock_id: 1}); + // frame3's request should be granted. await blocked; assert_true(lock_granted);
diff --git a/third_party/WebKit/LayoutTests/http/tests/locks/ifAvailable.html b/third_party/WebKit/LayoutTests/http/tests/locks/ifAvailable.html index a8951c0e..7ffe457ba2 100644 --- a/third_party/WebKit/LayoutTests/http/tests/locks/ifAvailable.html +++ b/third_party/WebKit/LayoutTests/http/tests/locks/ifAvailable.html
@@ -52,7 +52,7 @@ promise_test(async t => { let callback_called = false; await navigator.locks.acquire('resource', async lock => { - // Request with a different scope - should be grantable. + // Request with a different name - should be grantable. await navigator.locks.acquire('different', {ifAvailable: true}, async lock => { callback_called = true; assert_not_equals(lock, null, 'lock should be granted');
diff --git a/third_party/WebKit/LayoutTests/http/tests/locks/interfaces.html b/third_party/WebKit/LayoutTests/http/tests/locks/interfaces.html index 9e9cdab..c98fcde 100644 --- a/third_party/WebKit/LayoutTests/http/tests/locks/interfaces.html +++ b/third_party/WebKit/LayoutTests/http/tests/locks/interfaces.html
@@ -28,7 +28,7 @@ idl_array.add_idls(idls); let lock; - await navigator.locks.acquire('scope', async l => { lock = l; }); + await navigator.locks.acquire('name', l => { lock = l; }); idl_array.add_objects({ LockManager: [navigator.locks],
diff --git a/third_party/WebKit/LayoutTests/http/tests/locks/interfaces.idl b/third_party/WebKit/LayoutTests/http/tests/locks/interfaces.idl index 26c61431..29fbfcf 100644 --- a/third_party/WebKit/LayoutTests/http/tests/locks/interfaces.idl +++ b/third_party/WebKit/LayoutTests/http/tests/locks/interfaces.idl
@@ -1,6 +1,4 @@ -typedef (DOMString or sequence<DOMString>) LockScope; - enum LockMode { "shared", "exclusive" }; dictionary LockOptions { @@ -22,15 +20,15 @@ [Exposed=(Window,Worker), SecureContext] interface LockManager { - Promise<any> acquire(LockScope scope, + Promise<any> acquire(DOMString name, LockRequestCallback callback); - Promise<any> acquire(LockScope scope, + Promise<any> acquire(DOMString name, LockOptions options, LockRequestCallback callback); }; [Exposed=(Window,Worker), SecureContext] interface Lock { - readonly attribute FrozenArray<DOMString> scope; + readonly attribute DOMString name; readonly attribute LockMode mode; };
diff --git a/third_party/WebKit/LayoutTests/http/tests/locks/lock-attributes.html b/third_party/WebKit/LayoutTests/http/tests/locks/lock-attributes.html index 1adbe2c..39970ea 100644 --- a/third_party/WebKit/LayoutTests/http/tests/locks/lock-attributes.html +++ b/third_party/WebKit/LayoutTests/http/tests/locks/lock-attributes.html
@@ -8,29 +8,17 @@ 'use strict'; promise_test(async t => { - await navigator.locks.acquire(['r1', 'r2'], lock => { - assert_array_equals(lock.scope, ['r1', 'r2']); + await navigator.locks.acquire('resource', lock => { + assert_equals(lock.name, 'resource'); assert_equals(lock.mode, 'exclusive'); }); }, 'Lock attributes reflect requested properties (exclusive)'); promise_test(async t => { - await navigator.locks.acquire(['r1', 'r2'], {mode: 'shared'}, lock => { - assert_array_equals(lock.scope, ['r1', 'r2']); + await navigator.locks.acquire('resource', {mode: 'shared'}, lock => { + assert_equals(lock.name, 'resource'); assert_equals(lock.mode, 'shared'); }); }, 'Lock attributes reflect requested properties (shared)'); -promise_test(async t => { - await navigator.locks.acquire(['r2', 'r1'], lock => { - assert_array_equals(lock.scope, ['r1', 'r2']); - }); -}, 'Lock.scope is in sorted order'); - -promise_test(async t => { - await navigator.locks.acquire(['r1', 'r2', 'r1', 'r2'], lock => { - assert_array_equals(lock.scope, ['r1', 'r2']); - }); -}, 'Lock.scope has no duplicates'); - </script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/locks/mode-exclusive.html b/third_party/WebKit/LayoutTests/http/tests/locks/mode-exclusive.html index 05e65e9..52507b6 100644 --- a/third_party/WebKit/LayoutTests/http/tests/locks/mode-exclusive.html +++ b/third_party/WebKit/LayoutTests/http/tests/locks/mode-exclusive.html
@@ -12,9 +12,9 @@ function log_grant(n) { return () => { granted.push(n); }; } await Promise.all([ - navigator.locks.acquire(['a', 'b'], log_grant(1)), - navigator.locks.acquire(['b', 'c'], log_grant(2)), - navigator.locks.acquire(['c'], log_grant(3)) + navigator.locks.acquire('a', log_grant(1)), + navigator.locks.acquire('a', log_grant(2)), + navigator.locks.acquire('a', log_grant(3)) ]); assert_array_equals(granted, [1, 2, 3]); }, 'Lock requests are granted in order'); @@ -27,14 +27,14 @@ await navigator.locks.acquire('a', async lock => { inner_promise = Promise.all([ // This will be blocked. - navigator.locks.acquire(['a', 'b'], log_grant(1)), + navigator.locks.acquire('a', log_grant(1)), // But this should be grantable immediately. - navigator.locks.acquire(['c', 'd'], log_grant(2)) + navigator.locks.acquire('b', log_grant(2)) ]); }); await inner_promise; assert_array_equals(granted, [2, 1]); -}, 'Requests with non-overlapping scopes can be granted'); +}, 'Requests for distinct resources can be granted'); </script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/locks/mode-mixed.html b/third_party/WebKit/LayoutTests/http/tests/locks/mode-mixed.html index 8327f11..f18dae8 100644 --- a/third_party/WebKit/LayoutTests/http/tests/locks/mode-mixed.html +++ b/third_party/WebKit/LayoutTests/http/tests/locks/mode-mixed.html
@@ -28,7 +28,7 @@ exclusive_lock = lock; }); - // This should be granted immediately (different scope). + // This should be granted immediately (different name). await navigator.locks.acquire('b', {mode: 'exclusive'}, lock => { granted.push('b-exclusive'); });
diff --git a/third_party/WebKit/LayoutTests/http/tests/locks/mode-shared.html b/third_party/WebKit/LayoutTests/http/tests/locks/mode-shared.html index 3a6ff8d..6c1f92c 100644 --- a/third_party/WebKit/LayoutTests/http/tests/locks/mode-shared.html +++ b/third_party/WebKit/LayoutTests/http/tests/locks/mode-shared.html
@@ -24,26 +24,21 @@ }, 'Lock requests are granted in order'); promise_test(async t => { - let ab_acquired = false, a_acquired = false, b_acquired = false; + let a_acquired = false, a_acquired_again = false; - await navigator.locks.acquire(['a', 'b'], {mode: 'shared'}, async lock => { - ab_acquired = true; + await navigator.locks.acquire('a', {mode: 'shared'}, async lock => { + a_acquired = true; - // Since lock over [a, b] is held, these requests would be blocked if the - // locks were not all 'shared', causing this test to time out. + // Since lock is held, this request would be blocked if the + // lock was not 'shared', causing this test to time out. await navigator.locks.acquire('a', {mode: 'shared'}, lock => { - a_acquired = true; - }); - - await navigator.locks.acquire('b', {mode: 'shared'}, lock => { - b_acquired = true; + a_acquired_again = true; }); }); - assert_true(ab_acquired, 'requested lock was acquired'); - assert_true(a_acquired, 'first lock with overlapping scope acquired'); - assert_true(a_acquired, 'second lock with overlapping scope acquired'); + assert_true(a_acquired, 'first lock acquired'); + assert_true(a_acquired_again, 'second lock acquired'); }, 'Shared locks are not exclusive'); </script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/locks/opaque-origin.html b/third_party/WebKit/LayoutTests/http/tests/locks/opaque-origin.html index abcc12eb..724dd0f2 100644 --- a/third_party/WebKit/LayoutTests/http/tests/locks/opaque-origin.html +++ b/third_party/WebKit/LayoutTests/http/tests/locks/opaque-origin.html
@@ -34,7 +34,7 @@ "use strict"; window.onmessage = async () => { try { - await navigator.locks.acquire('scope', lock => {}); + await navigator.locks.acquire('name', lock => {}); window.parent.postMessage({result: "no exception"}, "*"); } catch (ex) { window.parent.postMessage({result: ex.name}, "*");
diff --git a/third_party/WebKit/LayoutTests/http/tests/locks/resource-names.html b/third_party/WebKit/LayoutTests/http/tests/locks/resource-names.html index 46830b9..0e96b4cf 100644 --- a/third_party/WebKit/LayoutTests/http/tests/locks/resource-names.html +++ b/third_party/WebKit/LayoutTests/http/tests/locks/resource-names.html
@@ -23,7 +23,7 @@ ].forEach(string => { promise_test(async t => { await navigator.locks.acquire(string, lock => { - assert_array_equals(lock.scope, [string], + assert_equals(lock.name, string, 'Requested name matches granted name'); }); }, 'DOMString: ' + code_points(string)); @@ -32,13 +32,13 @@ promise_test(async t => { // '\uD800' treated as a USVString would become '\uFFFD'. await navigator.locks.acquire('\uD800', async lock => { - assert_array_equals(lock.scope, ['\uD800']); + assert_equals(lock.name, '\uD800'); - // |lock| is held for the duration of this scope. It + // |lock| is held for the duration of this name. It // Should not block acquiring |lock2| with a distinct // DOMString. await navigator.locks.acquire('\uFFFD', lock2 => { - assert_array_equals(lock2.scope, ['\uFFFD']); + assert_equals(lock2.name, '\uFFFD'); }); // If we did not time out, this passed.
diff --git a/third_party/WebKit/LayoutTests/http/tests/locks/resources/iframe.html b/third_party/WebKit/LayoutTests/http/tests/locks/resources/iframe.html index eddea2de..081823bb 100644 --- a/third_party/WebKit/LayoutTests/http/tests/locks/resources/iframe.html +++ b/third_party/WebKit/LayoutTests/http/tests/locks/resources/iframe.html
@@ -14,7 +14,7 @@ switch (e.data.op) { case 'request': navigator.locks.acquire( - e.data.scope, { + e.data.name, { mode: e.data.mode || 'exclusive', ifAvailable: e.data.ifAvailable || false }, lock => {
diff --git a/third_party/WebKit/LayoutTests/http/tests/locks/resources/interfaces-worker.js b/third_party/WebKit/LayoutTests/http/tests/locks/resources/interfaces-worker.js index 2c9704c..186d971 100644 --- a/third_party/WebKit/LayoutTests/http/tests/locks/resources/interfaces-worker.js +++ b/third_party/WebKit/LayoutTests/http/tests/locks/resources/interfaces-worker.js
@@ -16,7 +16,7 @@ idl_array.add_idls(idls); let lock; - await navigator.locks.acquire('scope', async l => { lock = l; }); + await navigator.locks.acquire('name', l => { lock = l; }); idl_array.add_objects({ LockManager: [navigator.locks],
diff --git a/third_party/WebKit/LayoutTests/http/tests/locks/resources/worker.js b/third_party/WebKit/LayoutTests/http/tests/locks/resources/worker.js index be10504..27bf9a7 100644 --- a/third_party/WebKit/LayoutTests/http/tests/locks/resources/worker.js +++ b/third_party/WebKit/LayoutTests/http/tests/locks/resources/worker.js
@@ -12,7 +12,7 @@ switch (e.data.op) { case 'request': navigator.locks.acquire( - e.data.scope, { + e.data.name, { mode: e.data.mode || 'exclusive', ifAvailable: e.data.ifAvailable || false }, lock => {
diff --git a/third_party/WebKit/LayoutTests/http/tests/locks/workers.html b/third_party/WebKit/LayoutTests/http/tests/locks/workers.html index 4c82c0a..2c4f9de 100644 --- a/third_party/WebKit/LayoutTests/http/tests/locks/workers.html +++ b/third_party/WebKit/LayoutTests/http/tests/locks/workers.html
@@ -21,21 +21,24 @@ }); } +async function postAndConfirm(frame, data) { + const response = await postAndWait(frame, data); + assert_equals(response.ack, data.op); + assert_equals(response.id, data.lock_id); + return response; +} + promise_test(async t => { const worker = new Worker('resources/worker.js'); t.add_cleanup(() => { worker.terminate(); }); const res = 'shared resource 1'; - const data = await postAndWait( - worker, {op: 'request', lock_id: 1, scope: res, mode: 'shared'}) + await postAndConfirm( + worker, {op: 'request', lock_id: 1, name: res, mode: 'shared'}) - assert_equals(data.ack, 'request'); - assert_equals(data.id, 1); await navigator.locks.acquire(res, {mode: 'shared'}, async lock => { - const data = await postAndWait(worker, {op: 'release', lock_id: 1}); - assert_equals(data.ack, 'release'); - assert_equals(data.id, 1); + await postAndConfirm(worker, {op: 'release', lock_id: 1}); }); }, 'Window and Worker - shared mode'); @@ -46,12 +49,8 @@ const res = 'exclusive resource 1'; - const data = await postAndWait( - worker, {op: 'request', lock_id: 1, scope: res}) - - // worker has the lock. - assert_equals(data.ack, 'request'); - assert_equals(data.id, 1); + // worker acquires the lock. + await postAndConfirm(worker, {op: 'request', lock_id: 1, name: res}) // This request should be blocked. let lock_granted = false; @@ -66,11 +65,7 @@ assert_false(lock_granted); // Ask the worker to release it. - const data2 = await postAndWait(worker, {op: 'release', lock_id: 1}); - - // worker released it. - assert_equals(data2.ack, 'release'); - assert_equals(data2.id, 1); + await postAndConfirm(worker, {op: 'release', lock_id: 1}); // Now we've got it. const lock2 = await blocked; @@ -85,31 +80,24 @@ const res = 'exclusive resource 2'; - const data = await postAndWait( - worker1, {op: 'request', lock_id: 1, scope: res}) - - // worker1 has the lock. - assert_equals(data.ack, 'request'); - assert_equals(data.id, 1); + // worker1 acquires the lock. + await postAndConfirm( + worker1, {op: 'request', lock_id: 1, name: res}) // This request should be blocked. let lock_granted = false; - const blocked = postAndWait( - worker2, {op: 'request', lock_id: 1, scope: res}); + const blocked = postAndConfirm( + worker2, {op: 'request', lock_id: 1, name: res}); blocked.then(f => { lock_granted = true; }); // Verify worker2 can't get it. - assert_true((await postAndWait(worker2, { - op: 'request', scope: res, lock_id: 2, ifAvailable: true + assert_true((await postAndConfirm(worker2, { + op: 'request', name: res, lock_id: 2, ifAvailable: true })).failed, 'Lock request should have failed'); assert_false(lock_granted); // Ask worker1 to release it. - const data2 = await postAndWait(worker1, {op: 'release', lock_id: 1}); - - // worker1 released it. - assert_equals(data2.ack, 'release'); - assert_equals(data2.id, 1); + await postAndConfirm(worker1, {op: 'release', lock_id: 1}); // Now worker2 can get it. const lock = await blocked; @@ -122,12 +110,9 @@ const res = 'exclusive resource 3'; - const data = await postAndWait( - worker, {op: 'request', lock_id: 1, scope: res}) - - // Worker has the lock. - assert_equals(data.ack, 'request'); - assert_equals(data.id, 1); + // Worker acquires the lock. + await postAndConfirm( + worker, {op: 'request', lock_id: 1, name: res}) // This request should be blocked. let lock_granted = false;
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt b/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt index 1abbec73..fac2702 100644 --- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
@@ -706,7 +706,7 @@ interface Lock attribute @@toStringTag getter mode - getter scope + getter name method constructor interface LockManager attribute @@toStringTag
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/reporting/external/wpt/content-security-policy/reporting/securitypolicyviolation-idl-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/reporting/external/wpt/content-security-policy/reporting/securitypolicyviolation-idl-expected.txt index 1fd50f1..18d8446 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/virtual/reporting/external/wpt/content-security-policy/reporting/securitypolicyviolation-idl-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/reporting/external/wpt/content-security-policy/reporting/securitypolicyviolation-idl-expected.txt
@@ -1,4 +1,33 @@ This is a testharness.js-based test. -FAIL Test driver promise_test: Unhandled rejection with value: "NonElementParentNode: interface mixin not yet supported" +PASS Test driver +PASS SecurityPolicyViolationEvent interface: existence and properties of interface object +PASS SecurityPolicyViolationEvent interface object length +PASS SecurityPolicyViolationEvent interface object name +PASS SecurityPolicyViolationEvent interface: existence and properties of interface prototype object +PASS SecurityPolicyViolationEvent interface: existence and properties of interface prototype object's "constructor" property +PASS SecurityPolicyViolationEvent interface: attribute documentURI +PASS SecurityPolicyViolationEvent interface: attribute referrer +PASS SecurityPolicyViolationEvent interface: attribute blockedURI +PASS SecurityPolicyViolationEvent interface: attribute violatedDirective +PASS SecurityPolicyViolationEvent interface: attribute effectiveDirective +PASS SecurityPolicyViolationEvent interface: attribute originalPolicy +PASS SecurityPolicyViolationEvent interface: attribute disposition +PASS SecurityPolicyViolationEvent interface: attribute sourceFile +PASS SecurityPolicyViolationEvent interface: attribute statusCode +PASS SecurityPolicyViolationEvent interface: attribute lineNumber +PASS SecurityPolicyViolationEvent interface: attribute columnNumber +PASS SecurityPolicyViolationEvent must be primary interface of event_to_test +PASS Stringification of event_to_test +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "documentURI" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "referrer" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "blockedURI" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "violatedDirective" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "effectiveDirective" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "originalPolicy" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "disposition" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "sourceFile" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "statusCode" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "lineNumber" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "columnNumber" with the proper type Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/reporting/external/wpt/content-security-policy/reporting/securitypolicyviolation-idl-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/reporting/external/wpt/content-security-policy/reporting/securitypolicyviolation-idl-expected.txt new file mode 100644 index 0000000..18d8446 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/reporting/external/wpt/content-security-policy/reporting/securitypolicyviolation-idl-expected.txt
@@ -0,0 +1,33 @@ +This is a testharness.js-based test. +PASS Test driver +PASS SecurityPolicyViolationEvent interface: existence and properties of interface object +PASS SecurityPolicyViolationEvent interface object length +PASS SecurityPolicyViolationEvent interface object name +PASS SecurityPolicyViolationEvent interface: existence and properties of interface prototype object +PASS SecurityPolicyViolationEvent interface: existence and properties of interface prototype object's "constructor" property +PASS SecurityPolicyViolationEvent interface: attribute documentURI +PASS SecurityPolicyViolationEvent interface: attribute referrer +PASS SecurityPolicyViolationEvent interface: attribute blockedURI +PASS SecurityPolicyViolationEvent interface: attribute violatedDirective +PASS SecurityPolicyViolationEvent interface: attribute effectiveDirective +PASS SecurityPolicyViolationEvent interface: attribute originalPolicy +PASS SecurityPolicyViolationEvent interface: attribute disposition +PASS SecurityPolicyViolationEvent interface: attribute sourceFile +PASS SecurityPolicyViolationEvent interface: attribute statusCode +PASS SecurityPolicyViolationEvent interface: attribute lineNumber +PASS SecurityPolicyViolationEvent interface: attribute columnNumber +PASS SecurityPolicyViolationEvent must be primary interface of event_to_test +PASS Stringification of event_to_test +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "documentURI" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "referrer" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "blockedURI" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "violatedDirective" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "effectiveDirective" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "originalPolicy" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "disposition" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "sourceFile" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "statusCode" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "lineNumber" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "columnNumber" with the proper type +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/virtual/reporting/external/wpt/content-security-policy/reporting/securitypolicyviolation-idl-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/virtual/reporting/external/wpt/content-security-policy/reporting/securitypolicyviolation-idl-expected.txt new file mode 100644 index 0000000..18d8446 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/virtual/reporting/external/wpt/content-security-policy/reporting/securitypolicyviolation-idl-expected.txt
@@ -0,0 +1,33 @@ +This is a testharness.js-based test. +PASS Test driver +PASS SecurityPolicyViolationEvent interface: existence and properties of interface object +PASS SecurityPolicyViolationEvent interface object length +PASS SecurityPolicyViolationEvent interface object name +PASS SecurityPolicyViolationEvent interface: existence and properties of interface prototype object +PASS SecurityPolicyViolationEvent interface: existence and properties of interface prototype object's "constructor" property +PASS SecurityPolicyViolationEvent interface: attribute documentURI +PASS SecurityPolicyViolationEvent interface: attribute referrer +PASS SecurityPolicyViolationEvent interface: attribute blockedURI +PASS SecurityPolicyViolationEvent interface: attribute violatedDirective +PASS SecurityPolicyViolationEvent interface: attribute effectiveDirective +PASS SecurityPolicyViolationEvent interface: attribute originalPolicy +PASS SecurityPolicyViolationEvent interface: attribute disposition +PASS SecurityPolicyViolationEvent interface: attribute sourceFile +PASS SecurityPolicyViolationEvent interface: attribute statusCode +PASS SecurityPolicyViolationEvent interface: attribute lineNumber +PASS SecurityPolicyViolationEvent interface: attribute columnNumber +PASS SecurityPolicyViolationEvent must be primary interface of event_to_test +PASS Stringification of event_to_test +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "documentURI" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "referrer" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "blockedURI" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "violatedDirective" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "effectiveDirective" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "originalPolicy" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "disposition" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "sourceFile" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "statusCode" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "lineNumber" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "columnNumber" with the proper type +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/mac-retina/virtual/reporting/external/wpt/content-security-policy/reporting/securitypolicyviolation-idl-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-retina/virtual/reporting/external/wpt/content-security-policy/reporting/securitypolicyviolation-idl-expected.txt new file mode 100644 index 0000000..18d8446 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac-retina/virtual/reporting/external/wpt/content-security-policy/reporting/securitypolicyviolation-idl-expected.txt
@@ -0,0 +1,33 @@ +This is a testharness.js-based test. +PASS Test driver +PASS SecurityPolicyViolationEvent interface: existence and properties of interface object +PASS SecurityPolicyViolationEvent interface object length +PASS SecurityPolicyViolationEvent interface object name +PASS SecurityPolicyViolationEvent interface: existence and properties of interface prototype object +PASS SecurityPolicyViolationEvent interface: existence and properties of interface prototype object's "constructor" property +PASS SecurityPolicyViolationEvent interface: attribute documentURI +PASS SecurityPolicyViolationEvent interface: attribute referrer +PASS SecurityPolicyViolationEvent interface: attribute blockedURI +PASS SecurityPolicyViolationEvent interface: attribute violatedDirective +PASS SecurityPolicyViolationEvent interface: attribute effectiveDirective +PASS SecurityPolicyViolationEvent interface: attribute originalPolicy +PASS SecurityPolicyViolationEvent interface: attribute disposition +PASS SecurityPolicyViolationEvent interface: attribute sourceFile +PASS SecurityPolicyViolationEvent interface: attribute statusCode +PASS SecurityPolicyViolationEvent interface: attribute lineNumber +PASS SecurityPolicyViolationEvent interface: attribute columnNumber +PASS SecurityPolicyViolationEvent must be primary interface of event_to_test +PASS Stringification of event_to_test +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "documentURI" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "referrer" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "blockedURI" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "violatedDirective" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "effectiveDirective" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "originalPolicy" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "disposition" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "sourceFile" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "statusCode" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "lineNumber" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "columnNumber" with the proper type +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/reporting/external/wpt/content-security-policy/reporting/securitypolicyviolation-idl-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/reporting/external/wpt/content-security-policy/reporting/securitypolicyviolation-idl-expected.txt index 1fd50f1..18d8446 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/virtual/reporting/external/wpt/content-security-policy/reporting/securitypolicyviolation-idl-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/reporting/external/wpt/content-security-policy/reporting/securitypolicyviolation-idl-expected.txt
@@ -1,4 +1,33 @@ This is a testharness.js-based test. -FAIL Test driver promise_test: Unhandled rejection with value: "NonElementParentNode: interface mixin not yet supported" +PASS Test driver +PASS SecurityPolicyViolationEvent interface: existence and properties of interface object +PASS SecurityPolicyViolationEvent interface object length +PASS SecurityPolicyViolationEvent interface object name +PASS SecurityPolicyViolationEvent interface: existence and properties of interface prototype object +PASS SecurityPolicyViolationEvent interface: existence and properties of interface prototype object's "constructor" property +PASS SecurityPolicyViolationEvent interface: attribute documentURI +PASS SecurityPolicyViolationEvent interface: attribute referrer +PASS SecurityPolicyViolationEvent interface: attribute blockedURI +PASS SecurityPolicyViolationEvent interface: attribute violatedDirective +PASS SecurityPolicyViolationEvent interface: attribute effectiveDirective +PASS SecurityPolicyViolationEvent interface: attribute originalPolicy +PASS SecurityPolicyViolationEvent interface: attribute disposition +PASS SecurityPolicyViolationEvent interface: attribute sourceFile +PASS SecurityPolicyViolationEvent interface: attribute statusCode +PASS SecurityPolicyViolationEvent interface: attribute lineNumber +PASS SecurityPolicyViolationEvent interface: attribute columnNumber +PASS SecurityPolicyViolationEvent must be primary interface of event_to_test +PASS Stringification of event_to_test +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "documentURI" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "referrer" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "blockedURI" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "violatedDirective" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "effectiveDirective" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "originalPolicy" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "disposition" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "sourceFile" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "statusCode" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "lineNumber" with the proper type +PASS SecurityPolicyViolationEvent interface: event_to_test must inherit property "columnNumber" with the proper type Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-dedicated-worker-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-dedicated-worker-expected.txt index acf72d7..fe87c02 100644 --- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-dedicated-worker-expected.txt +++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-dedicated-worker-expected.txt
@@ -645,7 +645,7 @@ [Worker] interface Lock [Worker] attribute @@toStringTag [Worker] getter mode -[Worker] getter scope +[Worker] getter name [Worker] method constructor [Worker] interface LockManager [Worker] 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 8ef99c3a..9c5cd1d 100644 --- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt +++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
@@ -3969,7 +3969,7 @@ interface Lock attribute @@toStringTag getter mode - getter scope + getter name method constructor interface LockManager attribute @@toStringTag
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-shared-worker-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-shared-worker-expected.txt index 878e3d5..db17871 100644 --- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-shared-worker-expected.txt +++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-shared-worker-expected.txt
@@ -640,7 +640,7 @@ [Worker] interface Lock [Worker] attribute @@toStringTag [Worker] getter mode -[Worker] getter scope +[Worker] getter name [Worker] method constructor [Worker] interface LockManager [Worker] attribute @@toStringTag
diff --git a/third_party/WebKit/Source/bindings/core/v8/custom/V8MessageChannelCustom.cpp b/third_party/WebKit/Source/bindings/core/v8/custom/V8MessageChannelCustom.cpp index 1c8603bd0..84491ac 100644 --- a/third_party/WebKit/Source/bindings/core/v8/custom/V8MessageChannelCustom.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/custom/V8MessageChannelCustom.cpp
@@ -33,7 +33,7 @@ #include "base/memory/scoped_refptr.h" #include "bindings/core/v8/V8BindingForCore.h" #include "bindings/core/v8/V8MessagePort.h" -#include "core/dom/MessageChannel.h" +#include "core/messaging/MessageChannel.h" #include "core/workers/WorkerGlobalScope.h" #include "platform/bindings/V8PrivateProperty.h"
diff --git a/third_party/WebKit/Source/bindings/core/v8/custom/V8WindowCustom.cpp b/third_party/WebKit/Source/bindings/core/v8/custom/V8WindowCustom.cpp index 0cbabbd..3dd087ee 100644 --- a/third_party/WebKit/Source/bindings/core/v8/custom/V8WindowCustom.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/custom/V8WindowCustom.cpp
@@ -40,7 +40,6 @@ #include "bindings/core/v8/V8EventListener.h" #include "bindings/core/v8/V8HTMLCollection.h" #include "bindings/core/v8/V8Node.h" -#include "core/dom/MessagePort.h" #include "core/frame/Deprecation.h" #include "core/frame/FrameOwner.h" #include "core/frame/LocalDOMWindow.h" @@ -57,6 +56,7 @@ #include "core/inspector/MainThreadDebugger.h" #include "core/loader/FrameLoadRequest.h" #include "core/loader/FrameLoader.h" +#include "core/messaging/MessagePort.h" #include "core/typed_arrays/DOMArrayBuffer.h" #include "platform/LayoutTestSupport.h" #include "platform/bindings/V8PrivateProperty.h"
diff --git a/third_party/WebKit/Source/bindings/core/v8/serialization/SerializedScriptValue.cpp b/third_party/WebKit/Source/bindings/core/v8/serialization/SerializedScriptValue.cpp index cfa4c3f..b7ef9aaa 100644 --- a/third_party/WebKit/Source/bindings/core/v8/serialization/SerializedScriptValue.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/serialization/SerializedScriptValue.cpp
@@ -45,8 +45,8 @@ #include "bindings/core/v8/serialization/Transferables.h" #include "bindings/core/v8/serialization/UnpackedSerializedScriptValue.h" #include "core/dom/ExceptionCode.h" -#include "core/dom/MessagePort.h" #include "core/imagebitmap/ImageBitmap.h" +#include "core/messaging/MessagePort.h" #include "core/typed_arrays/DOMArrayBuffer.h" #include "core/typed_arrays/DOMSharedArrayBuffer.h" #include "platform/SharedBuffer.h"
diff --git a/third_party/WebKit/Source/bindings/core/v8/serialization/SerializedScriptValueFuzzer.cpp b/third_party/WebKit/Source/bindings/core/v8/serialization/SerializedScriptValueFuzzer.cpp index 292af2d..37a4575 100644 --- a/third_party/WebKit/Source/bindings/core/v8/serialization/SerializedScriptValueFuzzer.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/serialization/SerializedScriptValueFuzzer.cpp
@@ -9,8 +9,8 @@ #include <cstdint> #include "bindings/core/v8/V8BindingForCore.h" -#include "core/dom/MessagePort.h" #include "core/frame/Settings.h" +#include "core/messaging/MessagePort.h" #include "core/testing/DummyPageHolder.h" #include "platform/bindings/ScriptState.h" #include "platform/bindings/V8PerIsolateData.h"
diff --git a/third_party/WebKit/Source/bindings/core/v8/serialization/V8ScriptValueDeserializer.cpp b/third_party/WebKit/Source/bindings/core/v8/serialization/V8ScriptValueDeserializer.cpp index 8d95a51a..cffb724 100644 --- a/third_party/WebKit/Source/bindings/core/v8/serialization/V8ScriptValueDeserializer.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/serialization/V8ScriptValueDeserializer.cpp
@@ -7,7 +7,6 @@ #include "bindings/core/v8/ToV8ForCore.h" #include "bindings/core/v8/serialization/UnpackedSerializedScriptValue.h" #include "core/dom/ExecutionContext.h" -#include "core/dom/MessagePort.h" #include "core/fileapi/Blob.h" #include "core/fileapi/File.h" #include "core/fileapi/FileList.h" @@ -21,6 +20,7 @@ #include "core/geometry/DOMRectReadOnly.h" #include "core/html/ImageData.h" #include "core/imagebitmap/ImageBitmap.h" +#include "core/messaging/MessagePort.h" #include "core/offscreencanvas/OffscreenCanvas.h" #include "core/typed_arrays/DOMArrayBuffer.h" #include "core/typed_arrays/DOMSharedArrayBuffer.h"
diff --git a/third_party/WebKit/Source/bindings/core/v8/serialization/V8ScriptValueSerializerTest.cpp b/third_party/WebKit/Source/bindings/core/v8/serialization/V8ScriptValueSerializerTest.cpp index cd7ac78..51817eb 100644 --- a/third_party/WebKit/Source/bindings/core/v8/serialization/V8ScriptValueSerializerTest.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/serialization/V8ScriptValueSerializerTest.cpp
@@ -28,7 +28,6 @@ #include "bindings/core/v8/serialization/UnpackedSerializedScriptValue.h" #include "bindings/core/v8/serialization/V8ScriptValueDeserializer.h" #include "build/build_config.h" -#include "core/dom/MessagePort.h" #include "core/fileapi/Blob.h" #include "core/fileapi/File.h" #include "core/fileapi/FileList.h" @@ -41,6 +40,7 @@ #include "core/geometry/DOMRect.h" #include "core/geometry/DOMRectReadOnly.h" #include "core/html/ImageData.h" +#include "core/messaging/MessagePort.h" #include "core/offscreencanvas/OffscreenCanvas.h" #include "platform/graphics/StaticBitmapImage.h" #include "platform/testing/RuntimeEnabledFeaturesTestHelpers.h"
diff --git a/third_party/WebKit/Source/core/BUILD.gn b/third_party/WebKit/Source/core/BUILD.gn index 58022c99..e11a270 100644 --- a/third_party/WebKit/Source/core/BUILD.gn +++ b/third_party/WebKit/Source/core/BUILD.gn
@@ -201,6 +201,7 @@ "//third_party/WebKit/Source/core/layout/svg:svg_layout", "//third_party/WebKit/Source/core/leak_detector", "//third_party/WebKit/Source/core/loader", + "//third_party/WebKit/Source/core/messaging", "//third_party/WebKit/Source/core/mojo", "//third_party/WebKit/Source/core/offscreencanvas", "//third_party/WebKit/Source/core/origin_trials",
diff --git a/third_party/WebKit/Source/core/core_idl_files.gni b/third_party/WebKit/Source/core/core_idl_files.gni index f15edc5..236138d 100644 --- a/third_party/WebKit/Source/core/core_idl_files.gni +++ b/third_party/WebKit/Source/core/core_idl_files.gni
@@ -115,8 +115,6 @@ "dom/Element.idl", "dom/IdleDeadline.idl", "dom/Iterator.idl", - "dom/MessageChannel.idl", - "dom/MessagePort.idl", "dom/MutationObserver.idl", "dom/MutationRecord.idl", "dom/NamedNodeMap.idl", @@ -288,6 +286,8 @@ "intersection_observer/IntersectionObserver.idl", "intersection_observer/IntersectionObserverEntry.idl", "loader/appcache/ApplicationCache.idl", + "messaging/MessageChannel.idl", + "messaging/MessagePort.idl", "mojo/Mojo.idl", "mojo/MojoHandle.idl", "mojo/MojoWatcher.idl",
diff --git a/third_party/WebKit/Source/core/dom/BUILD.gn b/third_party/WebKit/Source/core/dom/BUILD.gn index 3514fe4..5eb1337 100644 --- a/third_party/WebKit/Source/core/dom/BUILD.gn +++ b/third_party/WebKit/Source/core/dom/BUILD.gn
@@ -22,14 +22,6 @@ "Attr.h", "Attribute.h", "AttributeCollection.h", - "BlinkCloneableMessage.cpp", - "BlinkCloneableMessage.h", - "BlinkCloneableMessageStructTraits.cpp", - "BlinkCloneableMessageStructTraits.h", - "BlinkTransferableMessage.cpp", - "BlinkTransferableMessage.h", - "BlinkTransferableMessageStructTraits.cpp", - "BlinkTransferableMessageStructTraits.h", "CDATASection.cpp", "CDATASection.h", "CharacterData.cpp", @@ -161,10 +153,6 @@ "LiveNodeListBase.h", "LiveNodeListRegistry.cpp", "LiveNodeListRegistry.h", - "MessageChannel.cpp", - "MessageChannel.h", - "MessagePort.cpp", - "MessagePort.h", "Modulator.cpp", "Modulator.h", "ModulatorImplBase.cpp",
diff --git a/third_party/WebKit/Source/core/editing/commands/CompositeEditCommand.cpp b/third_party/WebKit/Source/core/editing/commands/CompositeEditCommand.cpp index b962531e1..b363491 100644 --- a/third_party/WebKit/Source/core/editing/commands/CompositeEditCommand.cpp +++ b/third_party/WebKit/Source/core/editing/commands/CompositeEditCommand.cpp
@@ -1564,6 +1564,7 @@ editing_state); if (editing_state->IsAborted()) return; + ABORT_EDITING_COMMAND_IF(!EndingSelection().IsValidFor(GetDocument())); GetDocument().UpdateStyleAndLayoutIgnorePendingStylesheets();
diff --git a/third_party/WebKit/Source/core/editing/commands/TypingCommandTest.cpp b/third_party/WebKit/Source/core/editing/commands/TypingCommandTest.cpp index 33c06f1b..9e4249c 100644 --- a/third_party/WebKit/Source/core/editing/commands/TypingCommandTest.cpp +++ b/third_party/WebKit/Source/core/editing/commands/TypingCommandTest.cpp
@@ -68,4 +68,29 @@ GetSelectionTextFromBody(Selection().GetSelectionInDOMTree())); } +// crbug.com/794397 +TEST_F(TypingCommandTest, ForwardDeleteInvalidatesSelection) { + GetDocument().setDesignMode("on"); + Selection().SetSelection(SetSelectionTextToBody( + "<blockquote>^" + "<q>" + "<table contenteditable=\"false\"><colgroup width=\"-1\">\n</table>|" + "</q>" + "</blockquote>" + "<q>\n<svg></svg></q>")); + + EditingState editing_state; + TypingCommand::ForwardDeleteKeyPressed(GetDocument(), &editing_state); + + EXPECT_EQ( + "<blockquote>|</blockquote>" + "<q>" + "<table contenteditable=\"false\">" + "<colgroup width=\"-1\"></colgroup>" + "</table>\n" + "<svg></svg>" + "</q>", + GetSelectionTextFromBody(Selection().GetSelectionInDOMTree())); +} + } // namespace blink
diff --git a/third_party/WebKit/Source/core/events/MessageEvent.h b/third_party/WebKit/Source/core/events/MessageEvent.h index f2f32b7..7c2a0bf 100644 --- a/third_party/WebKit/Source/core/events/MessageEvent.h +++ b/third_party/WebKit/Source/core/events/MessageEvent.h
@@ -33,11 +33,11 @@ #include "bindings/core/v8/serialization/SerializedScriptValue.h" #include "bindings/core/v8/serialization/UnpackedSerializedScriptValue.h" #include "core/CoreExport.h" -#include "core/dom/MessagePort.h" #include "core/dom/events/Event.h" #include "core/dom/events/EventTarget.h" #include "core/events/MessageEventInit.h" #include "core/fileapi/Blob.h" +#include "core/messaging/MessagePort.h" #include "core/typed_arrays/DOMArrayBuffer.h" #include "platform/wtf/Compiler.h"
diff --git a/third_party/WebKit/Source/core/exported/WebDOMMessageEvent.cpp b/third_party/WebKit/Source/core/exported/WebDOMMessageEvent.cpp index 698930b..891d15c1 100644 --- a/third_party/WebKit/Source/core/exported/WebDOMMessageEvent.cpp +++ b/third_party/WebKit/Source/core/exported/WebDOMMessageEvent.cpp
@@ -32,9 +32,9 @@ #include "bindings/core/v8/serialization/SerializedScriptValue.h" #include "core/dom/Document.h" -#include "core/dom/MessagePort.h" #include "core/events/MessageEvent.h" #include "core/frame/LocalDOMWindow.h" +#include "core/messaging/MessagePort.h" #include "public/platform/WebString.h" #include "public/web/WebDocument.h" #include "public/web/WebFrame.h"
diff --git a/third_party/WebKit/Source/core/exported/WebDevToolsAgentImpl.cpp b/third_party/WebKit/Source/core/exported/WebDevToolsAgentImpl.cpp index eb0b849..542c7a7 100644 --- a/third_party/WebKit/Source/core/exported/WebDevToolsAgentImpl.cpp +++ b/third_party/WebKit/Source/core/exported/WebDevToolsAgentImpl.cpp
@@ -422,10 +422,6 @@ DestroySession(session_id); } -void WebDevToolsAgentImpl::ContinueProgram() { - ClientMessageLoopAdapter::ContinueProgram(); -} - void WebDevToolsAgentImpl::DidCommitLoadForLocalFrame(LocalFrame* frame) { resource_container_->DidCommitLoadForLocalFrame(frame); resource_content_loader_->DidCommitLoadForLocalFrame(frame); @@ -604,6 +600,14 @@ return false; } +void WebDevToolsAgentImpl::DetachAllSessionsForTesting() { + Vector<int> session_ids; + for (auto& it : sessions_) + session_ids.push_back(it.key); + for (int session_id : session_ids) + DestroySession(session_id); +} + void WebDevToolsAgentImpl::FlushProtocolNotifications() { for (auto& it : sessions_) it.value->flushProtocolNotifications();
diff --git a/third_party/WebKit/Source/core/exported/WebDevToolsAgentImpl.h b/third_party/WebKit/Source/core/exported/WebDevToolsAgentImpl.h index 691062ac..f7b5353 100644 --- a/third_party/WebKit/Source/core/exported/WebDevToolsAgentImpl.h +++ b/third_party/WebKit/Source/core/exported/WebDevToolsAgentImpl.h
@@ -85,13 +85,13 @@ bool ScreencastEnabled(); void LayerTreeViewChanged(WebLayerTreeView*); void RootLayerCleared(); - bool CacheDisabled() override; + bool CacheDisabled(); + void DetachAllSessionsForTesting(); // WebDevToolsAgent implementation. void Attach(int session_id) override; void Reattach(int session_id, const WebString& saved_state) override; void Detach(int session_id) override; - void ContinueProgram() override; void DispatchOnInspectorBackend(int session_id, int call_id, const WebString& method,
diff --git a/third_party/WebKit/Source/core/frame/WebLocalFrameImpl.cpp b/third_party/WebKit/Source/core/frame/WebLocalFrameImpl.cpp index 6fe1f827..f82821b 100644 --- a/third_party/WebKit/Source/core/frame/WebLocalFrameImpl.cpp +++ b/third_party/WebKit/Source/core/frame/WebLocalFrameImpl.cpp
@@ -104,7 +104,6 @@ #include "build/build_config.h" #include "core/dom/Document.h" #include "core/dom/IconURL.h" -#include "core/dom/MessagePort.h" #include "core/dom/Node.h" #include "core/dom/NodeTraversal.h" #include "core/dom/ShadowRoot.h" @@ -172,6 +171,7 @@ #include "core/loader/HistoryItem.h" #include "core/loader/MixedContentChecker.h" #include "core/loader/NavigationScheduler.h" +#include "core/messaging/MessagePort.h" #include "core/page/ContextMenuController.h" #include "core/page/FocusController.h" #include "core/page/FrameTree.h" @@ -1580,6 +1580,11 @@ : WebRect(); } +void WebLocalFrameImpl::DetachAllDevToolsSessionsForTesting() { + if (dev_tools_agent_) + dev_tools_agent_->DetachAllSessionsForTesting(); +} + WebString WebLocalFrameImpl::GetLayerTreeAsTextForTesting( bool show_debug_info) const { if (!GetFrame())
diff --git a/third_party/WebKit/Source/core/frame/WebLocalFrameImpl.h b/third_party/WebKit/Source/core/frame/WebLocalFrameImpl.h index 14e57cb..604aa48 100644 --- a/third_party/WebKit/Source/core/frame/WebLocalFrameImpl.h +++ b/third_party/WebKit/Source/core/frame/WebLocalFrameImpl.h
@@ -236,6 +236,7 @@ const WebDOMEvent&) override; WebRect GetSelectionBoundsRectForTesting() const override; + void DetachAllDevToolsSessionsForTesting() override; WebString GetLayerTreeAsTextForTesting( bool show_debug_info = false) const override;
diff --git a/third_party/WebKit/Source/core/messaging/BUILD.gn b/third_party/WebKit/Source/core/messaging/BUILD.gn new file mode 100644 index 0000000..8ee188a --- /dev/null +++ b/third_party/WebKit/Source/core/messaging/BUILD.gn
@@ -0,0 +1,26 @@ +# Copyright 2016 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//third_party/WebKit/Source/core/core.gni") + +blink_core_sources("messaging") { + sources = [ + "BlinkCloneableMessage.cpp", + "BlinkCloneableMessage.h", + "BlinkCloneableMessageStructTraits.cpp", + "BlinkCloneableMessageStructTraits.h", + "BlinkTransferableMessage.cpp", + "BlinkTransferableMessage.h", + "BlinkTransferableMessageStructTraits.cpp", + "BlinkTransferableMessageStructTraits.h", + "MessageChannel.cpp", + "MessageChannel.h", + "MessagePort.cpp", + "MessagePort.h", + ] + + public_deps = [ + "//third_party/WebKit/common:mojo_bindings_blink", + ] +}
diff --git a/third_party/WebKit/Source/core/dom/BlinkCloneableMessage.cpp b/third_party/WebKit/Source/core/messaging/BlinkCloneableMessage.cpp similarity index 90% rename from third_party/WebKit/Source/core/dom/BlinkCloneableMessage.cpp rename to third_party/WebKit/Source/core/messaging/BlinkCloneableMessage.cpp index 8f3b505..7845a3d 100644 --- a/third_party/WebKit/Source/core/dom/BlinkCloneableMessage.cpp +++ b/third_party/WebKit/Source/core/messaging/BlinkCloneableMessage.cpp
@@ -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 "core/dom/BlinkCloneableMessage.h" +#include "core/messaging/BlinkCloneableMessage.h" namespace blink {
diff --git a/third_party/WebKit/Source/core/dom/BlinkCloneableMessage.h b/third_party/WebKit/Source/core/messaging/BlinkCloneableMessage.h similarity index 100% rename from third_party/WebKit/Source/core/dom/BlinkCloneableMessage.h rename to third_party/WebKit/Source/core/messaging/BlinkCloneableMessage.h
diff --git a/third_party/WebKit/Source/core/dom/BlinkCloneableMessage.typemap b/third_party/WebKit/Source/core/messaging/BlinkCloneableMessage.typemap similarity index 70% rename from third_party/WebKit/Source/core/dom/BlinkCloneableMessage.typemap rename to third_party/WebKit/Source/core/messaging/BlinkCloneableMessage.typemap index eee412b..b77df9d 100644 --- a/third_party/WebKit/Source/core/dom/BlinkCloneableMessage.typemap +++ b/third_party/WebKit/Source/core/messaging/BlinkCloneableMessage.typemap
@@ -4,8 +4,8 @@ mojom = "//third_party/WebKit/common/message_port/message_port.mojom" public_headers = - [ "//third_party/WebKit/Source/core/dom/BlinkCloneableMessage.h" ] -traits_headers = [ "//third_party/WebKit/Source/core/dom/BlinkCloneableMessageStructTraits.h" ] + [ "//third_party/WebKit/Source/core/messaging/BlinkCloneableMessage.h" ] +traits_headers = [ "//third_party/WebKit/Source/core/messaging/BlinkCloneableMessageStructTraits.h" ] deps = [ "//mojo/public/cpp/bindings",
diff --git a/third_party/WebKit/Source/core/dom/BlinkCloneableMessageStructTraits.cpp b/third_party/WebKit/Source/core/messaging/BlinkCloneableMessageStructTraits.cpp similarity index 96% rename from third_party/WebKit/Source/core/dom/BlinkCloneableMessageStructTraits.cpp rename to third_party/WebKit/Source/core/messaging/BlinkCloneableMessageStructTraits.cpp index 1b14f95f..cc499fbd 100644 --- a/third_party/WebKit/Source/core/dom/BlinkCloneableMessageStructTraits.cpp +++ b/third_party/WebKit/Source/core/messaging/BlinkCloneableMessageStructTraits.cpp
@@ -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 "core/dom/BlinkCloneableMessageStructTraits.h" +#include "core/messaging/BlinkCloneableMessageStructTraits.h" #include "platform/blob/BlobData.h" #include "platform/runtime_enabled_features.h"
diff --git a/third_party/WebKit/Source/core/dom/BlinkCloneableMessageStructTraits.h b/third_party/WebKit/Source/core/messaging/BlinkCloneableMessageStructTraits.h similarity index 95% rename from third_party/WebKit/Source/core/dom/BlinkCloneableMessageStructTraits.h rename to third_party/WebKit/Source/core/messaging/BlinkCloneableMessageStructTraits.h index b53046e..1a3b6ff 100644 --- a/third_party/WebKit/Source/core/dom/BlinkCloneableMessageStructTraits.h +++ b/third_party/WebKit/Source/core/messaging/BlinkCloneableMessageStructTraits.h
@@ -6,7 +6,7 @@ #define BlinkCloneableMessageStructTraits_h #include "bindings/core/v8/serialization/SerializedScriptValue.h" -#include "core/dom/BlinkCloneableMessage.h" +#include "core/messaging/BlinkCloneableMessage.h" #include "mojo/public/cpp/bindings/array_traits_wtf_vector.h" #include "mojo/public/cpp/bindings/string_traits_wtf.h" #include "third_party/WebKit/common/message_port/message_port.mojom-blink.h"
diff --git a/third_party/WebKit/Source/core/dom/BlinkTransferableMessage.cpp b/third_party/WebKit/Source/core/messaging/BlinkTransferableMessage.cpp similarity index 90% rename from third_party/WebKit/Source/core/dom/BlinkTransferableMessage.cpp rename to third_party/WebKit/Source/core/messaging/BlinkTransferableMessage.cpp index 1c310f14..bf611f2a 100644 --- a/third_party/WebKit/Source/core/dom/BlinkTransferableMessage.cpp +++ b/third_party/WebKit/Source/core/messaging/BlinkTransferableMessage.cpp
@@ -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 "core/dom/BlinkTransferableMessage.h" +#include "core/messaging/BlinkTransferableMessage.h" namespace blink {
diff --git a/third_party/WebKit/Source/core/dom/BlinkTransferableMessage.h b/third_party/WebKit/Source/core/messaging/BlinkTransferableMessage.h similarity index 95% rename from third_party/WebKit/Source/core/dom/BlinkTransferableMessage.h rename to third_party/WebKit/Source/core/messaging/BlinkTransferableMessage.h index a00c881..abded314 100644 --- a/third_party/WebKit/Source/core/dom/BlinkTransferableMessage.h +++ b/third_party/WebKit/Source/core/messaging/BlinkTransferableMessage.h
@@ -8,7 +8,7 @@ #include "base/macros.h" #include "bindings/core/v8/serialization/SerializedScriptValue.h" #include "core/CoreExport.h" -#include "core/dom/BlinkCloneableMessage.h" +#include "core/messaging/BlinkCloneableMessage.h" #include "third_party/WebKit/common/message_port/message_port_channel.h" namespace blink {
diff --git a/third_party/WebKit/Source/core/dom/BlinkTransferableMessage.typemap b/third_party/WebKit/Source/core/messaging/BlinkTransferableMessage.typemap similarity index 70% rename from third_party/WebKit/Source/core/dom/BlinkTransferableMessage.typemap rename to third_party/WebKit/Source/core/messaging/BlinkTransferableMessage.typemap index 96b0033b..334763ffb 100644 --- a/third_party/WebKit/Source/core/dom/BlinkTransferableMessage.typemap +++ b/third_party/WebKit/Source/core/messaging/BlinkTransferableMessage.typemap
@@ -4,8 +4,8 @@ mojom = "//third_party/WebKit/common/message_port/message_port.mojom" public_headers = - [ "//third_party/WebKit/Source/core/dom/BlinkTransferableMessage.h" ] -traits_headers = [ "//third_party/WebKit/Source/core/dom/BlinkTransferableMessageStructTraits.h" ] + [ "//third_party/WebKit/Source/core/messaging/BlinkTransferableMessage.h" ] +traits_headers = [ "//third_party/WebKit/Source/core/messaging/BlinkTransferableMessageStructTraits.h" ] deps = [ "//mojo/public/cpp/bindings",
diff --git a/third_party/WebKit/Source/core/dom/BlinkTransferableMessageStructTraits.cpp b/third_party/WebKit/Source/core/messaging/BlinkTransferableMessageStructTraits.cpp similarity index 92% rename from third_party/WebKit/Source/core/dom/BlinkTransferableMessageStructTraits.cpp rename to third_party/WebKit/Source/core/messaging/BlinkTransferableMessageStructTraits.cpp index 4e1e62a7..41e60d4 100644 --- a/third_party/WebKit/Source/core/dom/BlinkTransferableMessageStructTraits.cpp +++ b/third_party/WebKit/Source/core/messaging/BlinkTransferableMessageStructTraits.cpp
@@ -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 "core/dom/BlinkTransferableMessageStructTraits.h" +#include "core/messaging/BlinkTransferableMessageStructTraits.h" namespace mojo {
diff --git a/third_party/WebKit/Source/core/dom/BlinkTransferableMessageStructTraits.h b/third_party/WebKit/Source/core/messaging/BlinkTransferableMessageStructTraits.h similarity index 91% rename from third_party/WebKit/Source/core/dom/BlinkTransferableMessageStructTraits.h rename to third_party/WebKit/Source/core/messaging/BlinkTransferableMessageStructTraits.h index 3a995d4..780592d 100644 --- a/third_party/WebKit/Source/core/dom/BlinkTransferableMessageStructTraits.h +++ b/third_party/WebKit/Source/core/messaging/BlinkTransferableMessageStructTraits.h
@@ -6,8 +6,8 @@ #define BlinkTransferableMessageStructTraits_h #include "bindings/core/v8/serialization/SerializedScriptValue.h" -#include "core/dom/BlinkCloneableMessageStructTraits.h" -#include "core/dom/BlinkTransferableMessage.h" +#include "core/messaging/BlinkCloneableMessageStructTraits.h" +#include "core/messaging/BlinkTransferableMessage.h" #include "mojo/public/cpp/bindings/array_traits_wtf_vector.h" #include "third_party/WebKit/common/message_port/message_port.mojom-blink.h" #include "third_party/WebKit/common/message_port/message_port_channel.h"
diff --git a/third_party/WebKit/Source/core/dom/MessageChannel.cpp b/third_party/WebKit/Source/core/messaging/MessageChannel.cpp similarity index 95% rename from third_party/WebKit/Source/core/dom/MessageChannel.cpp rename to third_party/WebKit/Source/core/messaging/MessageChannel.cpp index 95c75bf..9012e9f 100644 --- a/third_party/WebKit/Source/core/dom/MessageChannel.cpp +++ b/third_party/WebKit/Source/core/messaging/MessageChannel.cpp
@@ -24,9 +24,9 @@ * */ -#include "core/dom/MessageChannel.h" +#include "core/messaging/MessageChannel.h" -#include "core/dom/MessagePort.h" +#include "core/messaging/MessagePort.h" #include "public/platform/Platform.h" namespace blink {
diff --git a/third_party/WebKit/Source/core/dom/MessageChannel.h b/third_party/WebKit/Source/core/messaging/MessageChannel.h similarity index 100% rename from third_party/WebKit/Source/core/dom/MessageChannel.h rename to third_party/WebKit/Source/core/messaging/MessageChannel.h
diff --git a/third_party/WebKit/Source/core/dom/MessageChannel.idl b/third_party/WebKit/Source/core/messaging/MessageChannel.idl similarity index 100% rename from third_party/WebKit/Source/core/dom/MessageChannel.idl rename to third_party/WebKit/Source/core/messaging/MessageChannel.idl
diff --git a/third_party/WebKit/Source/core/dom/MessagePort.cpp b/third_party/WebKit/Source/core/messaging/MessagePort.cpp similarity index 98% rename from third_party/WebKit/Source/core/dom/MessagePort.cpp rename to third_party/WebKit/Source/core/messaging/MessagePort.cpp index f649dfa..ee273945 100644 --- a/third_party/WebKit/Source/core/dom/MessagePort.cpp +++ b/third_party/WebKit/Source/core/messaging/MessagePort.cpp
@@ -24,18 +24,18 @@ * */ -#include "core/dom/MessagePort.h" +#include "core/messaging/MessagePort.h" #include <memory> #include "bindings/core/v8/ExceptionState.h" #include "bindings/core/v8/serialization/SerializedScriptValue.h" #include "bindings/core/v8/serialization/SerializedScriptValueFactory.h" -#include "core/dom/BlinkTransferableMessageStructTraits.h" #include "core/dom/ExceptionCode.h" #include "core/dom/ExecutionContext.h" #include "core/events/MessageEvent.h" #include "core/frame/LocalDOMWindow.h" #include "core/frame/UseCounter.h" +#include "core/messaging/BlinkTransferableMessageStructTraits.h" #include "core/workers/WorkerGlobalScope.h" #include "platform/CrossThreadFunctional.h" #include "platform/bindings/ScriptState.h"
diff --git a/third_party/WebKit/Source/core/dom/MessagePort.h b/third_party/WebKit/Source/core/messaging/MessagePort.h similarity index 100% rename from third_party/WebKit/Source/core/dom/MessagePort.h rename to third_party/WebKit/Source/core/messaging/MessagePort.h
diff --git a/third_party/WebKit/Source/core/dom/MessagePort.idl b/third_party/WebKit/Source/core/messaging/MessagePort.idl similarity index 100% rename from third_party/WebKit/Source/core/dom/MessagePort.idl rename to third_party/WebKit/Source/core/messaging/MessagePort.idl
diff --git a/third_party/WebKit/Source/core/messaging/OWNERS b/third_party/WebKit/Source/core/messaging/OWNERS new file mode 100644 index 0000000..8a792b5 --- /dev/null +++ b/third_party/WebKit/Source/core/messaging/OWNERS
@@ -0,0 +1,10 @@ +mek@chromium.org +jbroman@chromium.org + +per-file *StructTraits*.*=set noparent +per-file *StructTraits*.*=file://ipc/SECURITY_OWNERS +per-file *.typemap=set noparent +per-file *.typemap=file://ipc/SECURITY_OWNERS + +# TEAM: platform-architecture-dev@chromium.org +# COMPONENT: Blink>Messaging
diff --git a/third_party/WebKit/Source/core/messaging/README.md b/third_party/WebKit/Source/core/messaging/README.md new file mode 100644 index 0000000..2de9f39 --- /dev/null +++ b/third_party/WebKit/Source/core/messaging/README.md
@@ -0,0 +1,7 @@ +# core/messaging/ + +This directory contains: +- The [Web Messaging API][1] implementation. +- Structs and typemaps to efficiently pass SerializedScriptValue over mojo interfaces. + +[1]: https://html.spec.whatwg.org/multipage/web-messaging.html#channel-messaging
diff --git a/third_party/WebKit/Source/core/workers/DedicatedWorker.h b/third_party/WebKit/Source/core/workers/DedicatedWorker.h index e0aea03..a1552ec 100644 --- a/third_party/WebKit/Source/core/workers/DedicatedWorker.h +++ b/third_party/WebKit/Source/core/workers/DedicatedWorker.h
@@ -8,10 +8,10 @@ #include "base/memory/scoped_refptr.h" #include "bindings/core/v8/ActiveScriptWrappable.h" #include "core/CoreExport.h" -#include "core/dom/MessagePort.h" #include "core/dom/PausableObject.h" #include "core/dom/events/EventListener.h" #include "core/dom/events/EventTarget.h" +#include "core/messaging/MessagePort.h" #include "core/workers/AbstractWorker.h" #include "core/workers/WorkerOptions.h" #include "platform/wtf/Forward.h"
diff --git a/third_party/WebKit/Source/core/workers/DedicatedWorkerGlobalScope.h b/third_party/WebKit/Source/core/workers/DedicatedWorkerGlobalScope.h index ab76a8f..7f48d97 100644 --- a/third_party/WebKit/Source/core/workers/DedicatedWorkerGlobalScope.h +++ b/third_party/WebKit/Source/core/workers/DedicatedWorkerGlobalScope.h
@@ -31,11 +31,11 @@ #ifndef DedicatedWorkerGlobalScope_h #define DedicatedWorkerGlobalScope_h +#include <memory> #include "core/CoreExport.h" -#include "core/dom/MessagePort.h" +#include "core/messaging/MessagePort.h" #include "core/workers/WorkerGlobalScope.h" #include "platform/heap/Visitor.h" -#include <memory> namespace blink {
diff --git a/third_party/WebKit/Source/core/workers/DedicatedWorkerMessagingProxy.h b/third_party/WebKit/Source/core/workers/DedicatedWorkerMessagingProxy.h index fb6b14f..a83cc300 100644 --- a/third_party/WebKit/Source/core/workers/DedicatedWorkerMessagingProxy.h +++ b/third_party/WebKit/Source/core/workers/DedicatedWorkerMessagingProxy.h
@@ -9,7 +9,7 @@ #include "base/macros.h" #include "base/memory/scoped_refptr.h" #include "core/CoreExport.h" -#include "core/dom/MessagePort.h" +#include "core/messaging/MessagePort.h" #include "core/workers/GlobalScopeCreationParams.h" #include "core/workers/ThreadedMessagingProxyBase.h" #include "core/workers/WorkerBackingThreadStartupData.h"
diff --git a/third_party/WebKit/Source/core/workers/DedicatedWorkerObjectProxy.h b/third_party/WebKit/Source/core/workers/DedicatedWorkerObjectProxy.h index 7754b2e..9a1eb84a 100644 --- a/third_party/WebKit/Source/core/workers/DedicatedWorkerObjectProxy.h +++ b/third_party/WebKit/Source/core/workers/DedicatedWorkerObjectProxy.h
@@ -35,7 +35,7 @@ #include "base/macros.h" #include "base/memory/scoped_refptr.h" #include "core/CoreExport.h" -#include "core/dom/MessagePort.h" +#include "core/messaging/MessagePort.h" #include "core/workers/ThreadedObjectProxyBase.h" #include "core/workers/WorkerReportingProxy.h" #include "platform/heap/Handle.h"
diff --git a/third_party/WebKit/Source/core/workers/SharedWorker.cpp b/third_party/WebKit/Source/core/workers/SharedWorker.cpp index 0b9cd1217..e127f78 100644 --- a/third_party/WebKit/Source/core/workers/SharedWorker.cpp +++ b/third_party/WebKit/Source/core/workers/SharedWorker.cpp
@@ -33,11 +33,11 @@ #include "bindings/core/v8/ExceptionState.h" #include "core/dom/ExecutionContext.h" -#include "core/dom/MessageChannel.h" -#include "core/dom/MessagePort.h" #include "core/frame/LocalFrame.h" #include "core/frame/LocalFrameClient.h" #include "core/frame/UseCounter.h" +#include "core/messaging/MessageChannel.h" +#include "core/messaging/MessagePort.h" #include "core/probe/CoreProbes.h" #include "core/workers/SharedWorkerRepositoryClient.h" #include "platform/weborigin/KURL.h"
diff --git a/third_party/WebKit/Source/core/workers/ThreadedObjectProxyBase.h b/third_party/WebKit/Source/core/workers/ThreadedObjectProxyBase.h index 74222496..a910988 100644 --- a/third_party/WebKit/Source/core/workers/ThreadedObjectProxyBase.h +++ b/third_party/WebKit/Source/core/workers/ThreadedObjectProxyBase.h
@@ -8,7 +8,7 @@ #include "base/macros.h" #include "bindings/core/v8/SourceLocation.h" #include "core/CoreExport.h" -#include "core/dom/MessagePort.h" +#include "core/messaging/MessagePort.h" #include "core/workers/WorkerReportingProxy.h" namespace blink {
diff --git a/third_party/WebKit/Source/devtools/front_end/help/Help.js b/third_party/WebKit/Source/devtools/front_end/help/Help.js index 96878936..4c619fb2 100644 --- a/third_party/WebKit/Source/devtools/front_end/help/Help.js +++ b/third_party/WebKit/Source/devtools/front_end/help/Help.js
@@ -25,18 +25,23 @@ }; Help.showReleaseNoteIfNeeded = function() { - Help._showReleaseNoteIfNeeded(Help.releaseNoteVersionSetting().get(), Help.latestReleaseNote().version); + Help._showReleaseNoteIfNeeded( + Help.releaseNoteVersionSetting().get(), Help.latestReleaseNote().version, + Common.settings.moduleSetting('help.show-release-note').get()); }; /** * @param {number} lastSeenVersion * @param {number} latestVersion + * @param {boolean} showReleaseNote */ -Help._showReleaseNoteIfNeeded = function(lastSeenVersion, latestVersion) { +Help._showReleaseNoteIfNeeded = function(lastSeenVersion, latestVersion, showReleaseNote) { if (!lastSeenVersion) { Help.releaseNoteVersionSetting().set(latestVersion); return; } + if (!showReleaseNote) + return; if (lastSeenVersion >= latestVersion) return; Help.releaseNoteVersionSetting().set(latestVersion);
diff --git a/third_party/WebKit/Source/devtools/front_end/help/module.json b/third_party/WebKit/Source/devtools/front_end/help/module.json index 937f351..ce3a775 100644 --- a/third_party/WebKit/Source/devtools/front_end/help/module.json +++ b/third_party/WebKit/Source/devtools/front_end/help/module.json
@@ -8,6 +8,24 @@ "persistence": "closeable", "order": 1, "className": "Help.ReleaseNoteView" + }, + { + "type": "setting", + "category": "Appearance", + "title": "Show What's New after each update", + "settingName": "help.show-release-note", + "settingType": "boolean", + "defaultValue": true, + "options": [ + { + "value": true, + "title": "Show What's New after each update" + }, + { + "value": false, + "title": "Do not show What's New after each update" + } + ] } ], "dependencies": [
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 26ed628..b7db8d1 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
@@ -92,20 +92,6 @@ }); }; -/** - * Note: This is only needed to debug a test in release DevTools. - * Usage: wrap the entire test with debugReleaseTest() and use dtrun test --debug-release - * @param {!Function} testFunction - * @return {!Function} - */ -function debugReleaseTest(testFunction) { - return testRunner => { - TestRunner.addResult = console.log; - TestRunner.completeTest = () => console.log('Test completed'); - window.test = () => testFunction(testRunner); - }; -} - /** @type {!Array<string>} */ TestRunner._results = [];
diff --git a/third_party/WebKit/Source/devtools/scripts/npm_test.js b/third_party/WebKit/Source/devtools/scripts/npm_test.js index b896168..59317e7 100644 --- a/third_party/WebKit/Source/devtools/scripts/npm_test.js +++ b/third_party/WebKit/Source/devtools/scripts/npm_test.js
@@ -10,7 +10,6 @@ var utils = require('./utils'); var Flags = { - DEBUG_RELEASE: '--debug-release', DEBUG_DEVTOOLS: '--debug-devtools', DEBUG_DEVTOOLS_SHORTHAND: '-d', FETCH_CONTENT_SHELL: '--fetch-content-shell', @@ -24,7 +23,6 @@ var IS_DEBUG_ENABLED = utils.includes(process.argv, Flags.DEBUG_DEVTOOLS) || utils.includes(process.argv, Flags.DEBUG_DEVTOOLS_SHORTHAND); -var IS_DEBUG_RELEASE = utils.includes(process.argv, Flags.DEBUG_RELEASE); var CUSTOM_CHROMIUM_PATH = utils.parseArgs(process.argv)[Flags.CHROMIUM_PATH]; var IS_FETCH_CONTENT_SHELL = utils.includes(process.argv, Flags.FETCH_CONTENT_SHELL); var TARGET = utils.parseArgs(process.argv)[Flags.TARGET] || 'Release'; @@ -249,7 +247,7 @@ else console.log('TIP: You can debug a test using: npm run debug-test inspector/test-name.html'); - if (IS_DEBUG_ENABLED || IS_DEBUG_RELEASE) { + if (IS_DEBUG_ENABLED) { testArgs.push('--additional-driver-flag=--remote-debugging-port=9222'); testArgs.push('--time-out-ms=6000000'); console.log('\n=============================================');
diff --git a/third_party/WebKit/Source/modules/indexeddb/IDBKeyRange.cpp b/third_party/WebKit/Source/modules/indexeddb/IDBKeyRange.cpp index 79f1e23..d9beae5 100644 --- a/third_party/WebKit/Source/modules/indexeddb/IDBKeyRange.cpp +++ b/third_party/WebKit/Source/modules/indexeddb/IDBKeyRange.cpp
@@ -208,26 +208,17 @@ } if (lower_) { - short c = key->Compare(lower_); - if (lowerOpen()) { - if (c <= 0) - return false; - } else { - if (c < 0) - return false; - } + int compared_with_lower = key->Compare(lower_); + if (compared_with_lower < 0 || (compared_with_lower == 0 && lowerOpen())) + return false; } if (upper_) { - short c = key->Compare(upper_); - if (upperOpen()) { - if (c >= 0) - return false; - } else { - if (c > 0) - return false; - } + int compared_with_upper = key->Compare(upper_); + if (compared_with_upper > 0 || (compared_with_upper == 0 && upperOpen())) + return false; } + return true; }
diff --git a/third_party/WebKit/Source/modules/locks/Lock.cpp b/third_party/WebKit/Source/modules/locks/Lock.cpp index 6cec6f5f..aafde18 100644 --- a/third_party/WebKit/Source/modules/locks/Lock.cpp +++ b/third_party/WebKit/Source/modules/locks/Lock.cpp
@@ -57,18 +57,18 @@ // static Lock* Lock::Create(ScriptState* script_state, - const Vector<String>& scope, + const String& name, mojom::blink::LockManager::LockMode mode, mojom::blink::LockHandlePtr handle) { - return new Lock(script_state, scope, mode, std::move(handle)); + return new Lock(script_state, name, mode, std::move(handle)); } Lock::Lock(ScriptState* script_state, - const Vector<String>& scope, + const String& name, mojom::blink::LockManager::LockMode mode, mojom::blink::LockHandlePtr handle) : PausableObject(ExecutionContext::From(script_state)), - scope_(scope), + name_(name), mode_(mode), handle_(std::move(handle)) { PauseIfNeeded();
diff --git a/third_party/WebKit/Source/modules/locks/Lock.h b/third_party/WebKit/Source/modules/locks/Lock.h index 4993442..44c8b86 100644 --- a/third_party/WebKit/Source/modules/locks/Lock.h +++ b/third_party/WebKit/Source/modules/locks/Lock.h
@@ -24,7 +24,7 @@ public: static Lock* Create(ScriptState*, - const Vector<String>& scope, + const String& name, mojom::blink::LockManager::LockMode, mojom::blink::LockHandlePtr); @@ -34,7 +34,7 @@ EAGERLY_FINALIZE(); // Lock.idl - Vector<String> scope() const { return scope_; } + String name() const { return name_; } String mode() const; // PausableObject @@ -51,7 +51,7 @@ class ThenFunction; Lock(ScriptState*, - const Vector<String>& scope, + const String& name, mojom::blink::LockManager::LockMode, mojom::blink::LockHandlePtr); @@ -59,7 +59,7 @@ Member<ScriptPromiseResolver> resolver_; - const Vector<String> scope_; + const String name_; const mojom::blink::LockManager::LockMode mode_; mojom::blink::LockHandlePtr handle_; };
diff --git a/third_party/WebKit/Source/modules/locks/Lock.idl b/third_party/WebKit/Source/modules/locks/Lock.idl index 6919f60e..b134a2e1 100644 --- a/third_party/WebKit/Source/modules/locks/Lock.idl +++ b/third_party/WebKit/Source/modules/locks/Lock.idl
@@ -8,6 +8,6 @@ Exposed=(Window,Worker), RuntimeEnabled=LocksAPI ] interface Lock { - readonly attribute FrozenArray<DOMString> scope; + readonly attribute DOMString name; readonly attribute LockMode mode; };
diff --git a/third_party/WebKit/Source/modules/locks/LockManager.cpp b/third_party/WebKit/Source/modules/locks/LockManager.cpp index eb58f8bc..d2f4661b 100644 --- a/third_party/WebKit/Source/modules/locks/LockManager.cpp +++ b/third_party/WebKit/Source/modules/locks/LockManager.cpp
@@ -30,13 +30,13 @@ public: LockRequestImpl(V8LockGrantedCallback* callback, ScriptPromiseResolver* resolver, - const Vector<String>& scope, + const String& name, mojom::blink::LockManager::LockMode mode, mojom::blink::LockRequestRequest request, LockManager* manager) : callback_(callback), resolver_(resolver), - scope_(scope), + name_(name), mode_(mode), binding_(this, std::move(request)), manager_(manager) {} @@ -103,7 +103,7 @@ return; } - Lock* lock = Lock::Create(script_state, scope_, mode_, std::move(handle)); + Lock* lock = Lock::Create(script_state, name_, mode_, std::move(handle)); ScriptState::Scope scope(script_state); v8::TryCatch try_catch(script_state->GetIsolate()); @@ -126,8 +126,8 @@ // |callback_|'s result. Member<ScriptPromiseResolver> resolver_; - // Held to stamp the Lock object's |scope| property. - Vector<String> scope_; + // Held to stamp the Lock object's |name| property. + String name_; // Held to stamp the Lock object's |mode| property. mojom::blink::LockManager::LockMode mode_; @@ -144,14 +144,13 @@ : ContextLifecycleObserver(context) {} ScriptPromise LockManager::acquire(ScriptState* script_state, - const StringOrStringSequence& scope_union, + const String& name, V8LockGrantedCallback* callback, ExceptionState& exception_state) { - return acquire(script_state, scope_union, LockOptions(), callback, - exception_state); + return acquire(script_state, name, LockOptions(), callback, exception_state); } ScriptPromise LockManager::acquire(ScriptState* script_state, - const StringOrStringSequence& scope_union, + const String& name, const LockOptions& options, V8LockGrantedCallback* callback, ExceptionState& exception_state) { @@ -175,28 +174,6 @@ } } - // Compute the scope (set of named resources); remove duplicates. - HashSet<String> set; - if (scope_union.IsString()) { - set.insert(scope_union.GetAsString()); - } else if (scope_union.IsStringSequence()) { - for (const auto& name : scope_union.GetAsStringSequence()) - set.insert(name); - } else { - NOTREACHED(); - return ScriptPromise(); - } - - if (set.IsEmpty()) { - exception_state.ThrowTypeError("Scope must not be empty."); - return ScriptPromise(); - } - - Vector<String> scope; - for (const auto& name : set) - scope.push_back(name); - std::sort(scope.begin(), scope.end(), WTF::CodePointCompareLessThan); - mojom::blink::LockManager::LockMode mode = Lock::StringToMode(options.mode()); mojom::blink::LockManager::WaitMode wait = @@ -207,11 +184,11 @@ ScriptPromise promise = resolver->Promise(); mojom::blink::LockRequestPtr request_ptr; - AddPendingRequest(new LockRequestImpl(callback, resolver, scope, mode, + AddPendingRequest(new LockRequestImpl(callback, resolver, name, mode, mojo::MakeRequest(&request_ptr), this)); service_->RequestLock( - ExecutionContext::From(script_state)->GetSecurityOrigin(), scope, mode, + ExecutionContext::From(script_state)->GetSecurityOrigin(), name, mode, wait, std::move(request_ptr)); return promise;
diff --git a/third_party/WebKit/Source/modules/locks/LockManager.h b/third_party/WebKit/Source/modules/locks/LockManager.h index 5593937..bfa89428 100644 --- a/third_party/WebKit/Source/modules/locks/LockManager.h +++ b/third_party/WebKit/Source/modules/locks/LockManager.h
@@ -28,11 +28,11 @@ explicit LockManager(ExecutionContext*); ScriptPromise acquire(ScriptState*, - const StringOrStringSequence& scope, + const String& name, V8LockGrantedCallback*, ExceptionState&); ScriptPromise acquire(ScriptState*, - const StringOrStringSequence& scope, + const String& name, const LockOptions&, V8LockGrantedCallback*, ExceptionState&);
diff --git a/third_party/WebKit/Source/modules/locks/LockManager.idl b/third_party/WebKit/Source/modules/locks/LockManager.idl index eaedad9e..4c0501f 100644 --- a/third_party/WebKit/Source/modules/locks/LockManager.idl +++ b/third_party/WebKit/Source/modules/locks/LockManager.idl
@@ -3,7 +3,7 @@ // found in the LICENSE file. // https://github.com/inexorabletash/web-locks -typedef (DOMString or sequence<DOMString>) LockScope; + callback LockGrantedCallback = any (Lock lock); [ SecureContext, @@ -11,10 +11,10 @@ RuntimeEnabled=LocksAPI ] interface LockManager { [CallWith=ScriptState, RaisesException] Promise<Lock> acquire( - LockScope scope, + DOMString name, LockGrantedCallback callback); [CallWith=ScriptState, RaisesException] Promise<Lock> acquire( - LockScope scope, + DOMString name, LockOptions options, LockGrantedCallback callback); };
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorker.cpp b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorker.cpp index 6f0e833..07a97a2 100644 --- a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorker.cpp +++ b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorker.cpp
@@ -34,8 +34,8 @@ #include "bindings/core/v8/ExceptionState.h" #include "core/dom/ExceptionCode.h" #include "core/dom/ExecutionContext.h" -#include "core/dom/MessagePort.h" #include "core/dom/events/Event.h" +#include "core/messaging/MessagePort.h" #include "modules/EventTargetModules.h" #include "modules/serviceworkers/ServiceWorkerContainerClient.h" #include "platform/bindings/ScriptState.h"
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerContainer.cpp b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerContainer.cpp index e0a50e4..2e30563 100644 --- a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerContainer.cpp +++ b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerContainer.cpp
@@ -40,12 +40,12 @@ #include "core/dom/Document.h" #include "core/dom/ExceptionCode.h" #include "core/dom/ExecutionContext.h" -#include "core/dom/MessagePort.h" #include "core/events/MessageEvent.h" #include "core/frame/Deprecation.h" #include "core/frame/LocalDOMWindow.h" #include "core/frame/UseCounter.h" #include "core/frame/csp/ContentSecurityPolicy.h" +#include "core/messaging/MessagePort.h" #include "modules/EventTargetModules.h" #include "modules/serviceworkers/NavigatorServiceWorker.h" #include "modules/serviceworkers/ServiceWorker.h"
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeClient.h b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeClient.h index fa56c3d..c2061b8 100644 --- a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeClient.h +++ b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeClient.h
@@ -32,7 +32,7 @@ #define ServiceWorkerGlobalScopeClient_h #include <memory> -#include "core/dom/MessagePort.h" +#include "core/messaging/MessagePort.h" #include "core/workers/WorkerClients.h" #include "modules/ModulesExport.h" #include "platform/wtf/Forward.h"
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeProxy.cpp b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeProxy.cpp index a98f1038..6cf05e5f 100644 --- a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeProxy.cpp +++ b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeProxy.cpp
@@ -35,9 +35,9 @@ #include "bindings/core/v8/SourceLocation.h" #include "bindings/core/v8/WorkerOrWorkletScriptController.h" #include "core/dom/ExecutionContext.h" -#include "core/dom/MessagePort.h" #include "core/frame/csp/ContentSecurityPolicy.h" #include "core/inspector/ConsoleMessage.h" +#include "core/messaging/MessagePort.h" #include "core/origin_trials/origin_trials.h" #include "core/workers/ParentFrameTaskRunners.h" #include "core/workers/WorkerGlobalScope.h"
diff --git a/third_party/WebKit/Source/modules/webaudio/AudioWorkletGlobalScope.cpp b/third_party/WebKit/Source/modules/webaudio/AudioWorkletGlobalScope.cpp index b7209114..26abbe701 100644 --- a/third_party/WebKit/Source/modules/webaudio/AudioWorkletGlobalScope.cpp +++ b/third_party/WebKit/Source/modules/webaudio/AudioWorkletGlobalScope.cpp
@@ -16,7 +16,7 @@ #include "bindings/modules/v8/V8AudioParamDescriptor.h" #include "bindings/modules/v8/V8AudioWorkletProcessor.h" #include "core/dom/ExceptionCode.h" -#include "core/dom/MessagePort.h" +#include "core/messaging/MessagePort.h" #include "core/typed_arrays/DOMTypedArray.h" #include "core/workers/GlobalScopeCreationParams.h" #include "modules/webaudio/AudioBuffer.h"
diff --git a/third_party/WebKit/Source/modules/webaudio/AudioWorkletGlobalScopeTest.cpp b/third_party/WebKit/Source/modules/webaudio/AudioWorkletGlobalScopeTest.cpp index 02a85fc..92dbd8d 100644 --- a/third_party/WebKit/Source/modules/webaudio/AudioWorkletGlobalScopeTest.cpp +++ b/third_party/WebKit/Source/modules/webaudio/AudioWorkletGlobalScopeTest.cpp
@@ -17,8 +17,8 @@ #include "bindings/core/v8/V8GCController.h" #include "bindings/core/v8/WorkerOrWorkletScriptController.h" #include "core/dom/Document.h" -#include "core/dom/MessageChannel.h" -#include "core/dom/MessagePort.h" +#include "core/messaging/MessageChannel.h" +#include "core/messaging/MessagePort.h" #include "core/origin_trials/OriginTrialContext.h" #include "core/testing/DummyPageHolder.h" #include "core/workers/GlobalScopeCreationParams.h"
diff --git a/third_party/WebKit/Source/modules/webaudio/AudioWorkletMessagingProxy.cpp b/third_party/WebKit/Source/modules/webaudio/AudioWorkletMessagingProxy.cpp index 2257cc04..fa1ab31 100644 --- a/third_party/WebKit/Source/modules/webaudio/AudioWorkletMessagingProxy.cpp +++ b/third_party/WebKit/Source/modules/webaudio/AudioWorkletMessagingProxy.cpp
@@ -4,7 +4,7 @@ #include "modules/webaudio/AudioWorkletMessagingProxy.h" -#include "core/dom/MessagePort.h" +#include "core/messaging/MessagePort.h" #include "modules/webaudio/AudioWorklet.h" #include "modules/webaudio/AudioWorkletGlobalScope.h" #include "modules/webaudio/AudioWorkletNode.h"
diff --git a/third_party/WebKit/Source/modules/webaudio/AudioWorkletNode.cpp b/third_party/WebKit/Source/modules/webaudio/AudioWorkletNode.cpp index abaf98c3..e43ae68 100644 --- a/third_party/WebKit/Source/modules/webaudio/AudioWorkletNode.cpp +++ b/third_party/WebKit/Source/modules/webaudio/AudioWorkletNode.cpp
@@ -4,9 +4,9 @@ #include "modules/webaudio/AudioWorkletNode.h" +#include "core/messaging/MessageChannel.h" +#include "core/messaging/MessagePort.h" #include "modules/EventModules.h" -#include "core/dom/MessageChannel.h" -#include "core/dom/MessagePort.h" #include "modules/webaudio/AudioBuffer.h" #include "modules/webaudio/AudioNodeInput.h" #include "modules/webaudio/AudioNodeOutput.h"
diff --git a/third_party/WebKit/Source/modules/webaudio/AudioWorkletProcessor.cpp b/third_party/WebKit/Source/modules/webaudio/AudioWorkletProcessor.cpp index 015aaf6..f71d678 100644 --- a/third_party/WebKit/Source/modules/webaudio/AudioWorkletProcessor.cpp +++ b/third_party/WebKit/Source/modules/webaudio/AudioWorkletProcessor.cpp
@@ -4,7 +4,7 @@ #include "modules/webaudio/AudioWorkletProcessor.h" -#include "core/dom/MessagePort.h" +#include "core/messaging/MessagePort.h" #include "core/workers/WorkerGlobalScope.h" #include "modules/webaudio/AudioBuffer.h" #include "modules/webaudio/AudioWorkletGlobalScope.h"
diff --git a/third_party/WebKit/Source/platform/loader/fetch/ResourceResponse.cpp b/third_party/WebKit/Source/platform/loader/fetch/ResourceResponse.cpp index aeda453..1fb639b7 100644 --- a/third_party/WebKit/Source/platform/loader/fetch/ResourceResponse.cpp +++ b/third_party/WebKit/Source/platform/loader/fetch/ResourceResponse.cpp
@@ -76,38 +76,7 @@ } ResourceResponse::ResourceResponse() - : expected_content_length_(0), - connection_id_(0), - http_status_code_(0), - remote_port_(0), - was_cached_(false), - connection_reused_(false), - is_null_(true), - have_parsed_age_header_(false), - have_parsed_date_header_(false), - have_parsed_expires_header_(false), - have_parsed_last_modified_header_(false), - has_major_certificate_errors_(false), - is_legacy_symantec_cert_(false), - was_fetched_via_spdy_(false), - was_fetched_via_proxy_(false), - was_fetched_via_service_worker_(false), - was_fallback_required_by_service_worker_(false), - did_service_worker_navigation_preload_(false), - response_type_via_service_worker_( - network::mojom::FetchResponseType::kDefault), - http_version_(kHTTPVersionUnknown), - security_style_(kSecurityStyleUnknown), - age_(0.0), - date_(0.0), - expires_(0.0), - last_modified_(0.0), - app_cache_id_(0), - connection_info_( - net::HttpResponseInfo::ConnectionInfo::CONNECTION_INFO_UNKNOWN), - encoded_data_length_(0), - encoded_body_length_(0), - decoded_body_length_(0) {} + : expected_content_length_(0), is_null_(true) {} ResourceResponse::ResourceResponse(const KURL& url, const AtomicString& mime_type, @@ -117,37 +86,7 @@ mime_type_(mime_type), expected_content_length_(expected_length), text_encoding_name_(text_encoding_name), - connection_id_(0), - http_status_code_(0), - remote_port_(0), - was_cached_(false), - connection_reused_(false), - is_null_(false), - have_parsed_age_header_(false), - have_parsed_date_header_(false), - have_parsed_expires_header_(false), - have_parsed_last_modified_header_(false), - has_major_certificate_errors_(false), - is_legacy_symantec_cert_(false), - was_fetched_via_spdy_(false), - was_fetched_via_proxy_(false), - was_fetched_via_service_worker_(false), - was_fallback_required_by_service_worker_(false), - did_service_worker_navigation_preload_(false), - response_type_via_service_worker_( - network::mojom::FetchResponseType::kDefault), - http_version_(kHTTPVersionUnknown), - security_style_(kSecurityStyleUnknown), - age_(0.0), - date_(0.0), - expires_(0.0), - last_modified_(0.0), - app_cache_id_(0), - connection_info_( - net::HttpResponseInfo::ConnectionInfo::CONNECTION_INFO_UNKNOWN), - encoded_data_length_(0), - encoded_body_length_(0), - decoded_body_length_(0) {} + is_null_(false) {} ResourceResponse::ResourceResponse(CrossThreadResourceResponseData* data) : ResourceResponse() {
diff --git a/third_party/WebKit/Source/platform/loader/fetch/ResourceResponse.h b/third_party/WebKit/Source/platform/loader/fetch/ResourceResponse.h index c7b59b1..aa2b881 100644 --- a/third_party/WebKit/Source/platform/loader/fetch/ResourceResponse.h +++ b/third_party/WebKit/Source/platform/loader/fetch/ResourceResponse.h
@@ -414,8 +414,9 @@ AtomicString mime_type_; long long expected_content_length_; AtomicString text_encoding_name_; - unsigned connection_id_; - int http_status_code_; + + unsigned connection_id_ = 0; + int http_status_code_ = 0; AtomicString http_status_text_; HTTPHeaderMap http_header_fields_; @@ -423,54 +424,55 @@ AtomicString remote_ip_address_; // Remote port number of the socket which fetched this resource. - unsigned short remote_port_; + unsigned short remote_port_ = 0; - bool was_cached_ : 1; - bool connection_reused_ : 1; - bool is_null_ : 1; - mutable bool have_parsed_age_header_ : 1; - mutable bool have_parsed_date_header_ : 1; - mutable bool have_parsed_expires_header_ : 1; - mutable bool have_parsed_last_modified_header_ : 1; + bool was_cached_ = false; + bool connection_reused_ = false; + bool is_null_; + mutable bool have_parsed_age_header_ = false; + mutable bool have_parsed_date_header_ = false; + mutable bool have_parsed_expires_header_ = false; + mutable bool have_parsed_last_modified_header_ = false; // True if the resource was retrieved by the embedder in spite of // certificate errors. - bool has_major_certificate_errors_ : 1; + bool has_major_certificate_errors_ = false; // True if the resource was retrieved with a legacy Symantec certificate which // is slated for distrust in future. - bool is_legacy_symantec_cert_ : 1; + bool is_legacy_symantec_cert_ = false; // The time at which the resource's certificate expires. Null if there was no // certificate. base::Time cert_validity_start_; // Was the resource fetched over SPDY. See http://dev.chromium.org/spdy - bool was_fetched_via_spdy_ : 1; + bool was_fetched_via_spdy_ = false; // Was the resource fetched over an explicit proxy (HTTP, SOCKS, etc). - bool was_fetched_via_proxy_ : 1; + bool was_fetched_via_proxy_ = false; // Was the resource fetched over a ServiceWorker. - bool was_fetched_via_service_worker_ : 1; + bool was_fetched_via_service_worker_ = false; // Was the fallback request with skip service worker flag required. - bool was_fallback_required_by_service_worker_ : 1; + bool was_fallback_required_by_service_worker_ = false; // True if service worker navigation preload was performed due to // the request for this resource. - bool did_service_worker_navigation_preload_ : 1; + bool did_service_worker_navigation_preload_ = false; // The type of the response which was returned by the ServiceWorker. - network::mojom::FetchResponseType response_type_via_service_worker_; + network::mojom::FetchResponseType response_type_via_service_worker_ = + network::mojom::FetchResponseType::kDefault; // HTTP version used in the response, if known. - HTTPVersion http_version_; + HTTPVersion http_version_ = kHTTPVersionUnknown; // The security style of the resource. // This only contains a valid value when the DevTools Network domain is // enabled. (Otherwise, it contains a default value of Unknown.) - SecurityStyle security_style_; + SecurityStyle security_style_ = kSecurityStyleUnknown; // Security details of this request's connection. // If m_securityStyle is Unknown or Unauthenticated, this does not contain @@ -482,14 +484,14 @@ mutable CacheControlHeader cache_control_header_; - mutable double age_; - mutable double date_; - mutable double expires_; - mutable double last_modified_; + mutable double age_ = 0.0; + mutable double date_ = 0.0; + mutable double expires_ = 0.0; + mutable double last_modified_ = 0.0; // The id of the appcache this response was retrieved from, or zero if // the response was not retrieved from an appcache. - long long app_cache_id_; + long long app_cache_id_ = 0; // The manifest url of the appcache this response was retrieved from, if any. // Note: only valid for main resource responses. @@ -518,17 +520,18 @@ AtomicString alpn_negotiated_protocol_; // Information about the type of connection used to fetch this resource. - net::HttpResponseInfo::ConnectionInfo connection_info_; + net::HttpResponseInfo::ConnectionInfo connection_info_ = + net::HttpResponseInfo::ConnectionInfo::CONNECTION_INFO_UNKNOWN; // Size of the response in bytes prior to decompression. - long long encoded_data_length_; + long long encoded_data_length_ = 0; // Size of the response body in bytes prior to decompression. - long long encoded_body_length_; + long long encoded_body_length_ = 0; // Sizes of the response body in bytes after any content-encoding is // removed. - long long decoded_body_length_; + long long decoded_body_length_ = 0; // The downloaded file path if the load streamed to a file. String downloaded_file_path_;
diff --git a/third_party/WebKit/Source/platform/mojo/blink_typemaps.gni b/third_party/WebKit/Source/platform/mojo/blink_typemaps.gni index 96280d1..b3d5196 100644 --- a/third_party/WebKit/Source/platform/mojo/blink_typemaps.gni +++ b/third_party/WebKit/Source/platform/mojo/blink_typemaps.gni
@@ -5,8 +5,8 @@ typemaps = [ "//mojo/common/file_path.typemap", "//mojo/common/values.typemap", - "//third_party/WebKit/Source/core/dom/BlinkCloneableMessage.typemap", - "//third_party/WebKit/Source/core/dom/BlinkTransferableMessage.typemap", + "//third_party/WebKit/Source/core/messaging/BlinkCloneableMessage.typemap", + "//third_party/WebKit/Source/core/messaging/BlinkTransferableMessage.typemap", "//third_party/WebKit/Source/platform/mojo/File.typemap", "//third_party/WebKit/Source/platform/mojo/Geometry.typemap", "//third_party/WebKit/Source/platform/mojo/KURL.typemap",
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/common/net/git_cl.py b/third_party/WebKit/Tools/Scripts/webkitpy/common/net/git_cl.py index edcae84..5baf5064 100644 --- a/third_party/WebKit/Tools/Scripts/webkitpy/common/net/git_cl.py +++ b/third_party/WebKit/Tools/Scripts/webkitpy/common/net/git_cl.py
@@ -82,7 +82,9 @@ def _get_cl_status(self): return self.run(['status', '--field=status']).strip() - def wait_for_try_jobs(self, poll_delay_seconds=10 * 60, timeout_seconds=120 * 60): + def wait_for_try_jobs( + self, poll_delay_seconds=10 * 60, timeout_seconds=120 * 60, + cq_only=False): """Waits until all try jobs are finished and returns results, or None. This function can also be interrupted if the corresponding CL is @@ -95,7 +97,7 @@ def finished_try_job_results_or_none(): cl_status = self._get_cl_status() _log.debug('Fetched CL status: %s', cl_status) - try_job_results = self.try_job_results() + try_job_results = self.latest_try_jobs(cq_only=cq_only) _log.debug('Fetched try results: %s', try_job_results) if (cl_status == 'closed' or (try_job_results and self.all_finished(try_job_results))): @@ -151,7 +153,7 @@ self._host.print_('Timed out waiting%s.' % message) return None - def latest_try_jobs(self, builder_names=None): + def latest_try_jobs(self, builder_names=None, cq_only=False): """Fetches a dict of Build to TryJobStatus for the latest try jobs. This includes jobs that are not yet finished and builds with infra @@ -160,6 +162,7 @@ Args: builder_names: Optional list of builders used to filter results. + cq_only: If True, only include CQ jobs. Returns: A dict mapping Build objects to TryJobStatus objects, with @@ -167,7 +170,8 @@ """ # TODO(crbug.com/771438): Update filter_latest to handle Swarming tasks. return self.filter_latest( - self.try_job_results(builder_names, include_swarming_tasks=False)) + self.try_job_results( + builder_names, include_swarming_tasks=False, cq_only=cq_only)) @staticmethod def filter_latest(try_results): @@ -177,7 +181,9 @@ latest_builds = filter_latest_builds(try_results.keys()) return {b: s for b, s in try_results.items() if b in latest_builds} - def try_job_results(self, builder_names=None, include_swarming_tasks=True): + def try_job_results( + self, builder_names=None, include_swarming_tasks=True, + cq_only=False): """Returns a dict mapping Build objects to TryJobStatus objects.""" raw_results = self.fetch_raw_try_job_results() build_to_status = {} @@ -187,6 +193,10 @@ is_swarming_task = result['url'] and '/task/' in result['url'] if is_swarming_task and not include_swarming_tasks: continue + is_cq = 'user_agent:cq' in result.get('tags', []) + is_experimental = result.get('experimental') + if cq_only and not (is_cq and not is_experimental): + continue build_to_status[self._build(result)] = self._try_job_status(result) return build_to_status
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/common/net/git_cl_mock.py b/third_party/WebKit/Tools/Scripts/webkitpy/common/net/git_cl_mock.py index e3e3fd7..7c36dc1 100644 --- a/third_party/WebKit/Tools/Scripts/webkitpy/common/net/git_cl_mock.py +++ b/third_party/WebKit/Tools/Scripts/webkitpy/common/net/git_cl_mock.py
@@ -49,7 +49,9 @@ def wait_for_try_jobs(self, **_): if self._time_out: return None - return CLStatus(self._status, self._try_job_results) + return CLStatus( + self._status, + self.filter_latest(self._try_job_results)) def wait_for_closed_status(self, **_): if self._time_out:
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/common/net/git_cl_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/common/net/git_cl_unittest.py index 6d47f8d..2c2746a 100644 --- a/third_party/WebKit/Tools/Scripts/webkitpy/common/net/git_cl_unittest.py +++ b/third_party/WebKit/Tools/Scripts/webkitpy/common/net/git_cl_unittest.py
@@ -252,7 +252,41 @@ Build('some-builder', 2): TryJobStatus('STARTED'), })) - def test_latest_try_builds(self): + def test_latest_try_jobs_cq_only(self): + git_cl = GitCL(MockHost()) + git_cl.fetch_raw_try_job_results = lambda: [ + { + 'builder_name': 'cq-a', + 'experimental': False, + 'result': None, + 'status': 'SCHEDULED', + 'tags': ['user_agent:cq'], + 'url': None, + }, + { + 'builder_name': 'cq-a-experimental', + 'experimental': True, + 'result': None, + 'status': 'SCHEDULED', + 'tags': ['user_agent:cq'], + 'url': None, + }, + { + 'builder_name': 'other', + 'experimental': False, + 'status': 'SCHEDULED', + 'result': None, + 'tags': ['user_agent:git_cl_try'], + 'url': None, + }, + ] + self.assertEqual( + git_cl.latest_try_jobs(cq_only=True), + { + Build('cq-a'): TryJobStatus('SCHEDULED'), + }) + + def test_latest_try_jobs(self): git_cl = GitCL(MockHost()) git_cl.fetch_raw_try_job_results = lambda: [ { @@ -287,7 +321,7 @@ Build('builder-b', 100): TryJobStatus('COMPLETED', 'SUCCESS'), }) - def test_latest_try_builds_started_build_luci_url(self): + def test_latest_try_jobs_started_build_luci_url(self): git_cl = GitCL(MockHost()) git_cl.fetch_raw_try_job_results = lambda: [ { @@ -301,7 +335,7 @@ git_cl.latest_try_jobs(['builder-a']), {Build('builder-a', 100): TryJobStatus('STARTED')}) - def test_latest_try_builds_started_build_buildbot_url(self): + def test_latest_try_jobs_started_build_buildbot_url(self): git_cl = GitCL(MockHost()) git_cl.fetch_raw_try_job_results = lambda: [ { @@ -315,7 +349,7 @@ git_cl.latest_try_jobs(['builder-a']), {Build('builder-a', 100): TryJobStatus('STARTED')}) - def test_latest_try_builds_failures(self): + def test_latest_try_jobs_failures(self): git_cl = GitCL(MockHost()) git_cl.fetch_raw_try_job_results = lambda: [ { @@ -340,7 +374,7 @@ Build('builder-b', 200): TryJobStatus('COMPLETED', 'FAILURE'), }) - def test_latest_try_builds_ignores_swarming_task(self): + def test_latest_try_jobs_ignores_swarming_task(self): git_cl = GitCL(MockHost()) git_cl.fetch_raw_try_job_results = lambda: [ {
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer.py index c74d50f..fc392ae2 100644 --- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer.py +++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer.py
@@ -214,7 +214,8 @@ self.git_cl.run(['try']) cl_status = self.git_cl.wait_for_try_jobs( poll_delay_seconds=POLL_DELAY_SECONDS, - timeout_seconds=TIMEOUT_SECONDS) + timeout_seconds=TIMEOUT_SECONDS, + cq_only=True) if not cl_status: self.git_cl.run(['set-close']) @@ -226,16 +227,7 @@ return False _log.info('All jobs finished.') - try_results = self.git_cl.filter_latest(cl_status.try_job_results) - - # We only want to check the status of CQ bots. The set of CQ bots is - # determined by //infra/config/cq.cfg, but since in import jobs we only - # trigger CQ bots and Blink try bots, we just ignore the - # Blink try bots to get the set of CQ try bots. - # Important: if any CQ bots are added to the builder list - # (self.host.builders), then this logic will need to be updated. - cq_try_results = {build: status for build, status in try_results.items() - if build.builder_name not in self.blink_try_bots()} + cq_try_results = cl_status.try_job_results if not cq_try_results: _log.error('No CQ try results found in try results: %s.', try_results)
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer_unittest.py index 11eac69..f183a34e 100644 --- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer_unittest.py +++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer_unittest.py
@@ -150,37 +150,6 @@ ['git', 'cl', 'try'], ]) - def test_run_commit_queue_for_cl_only_checks_non_blink_bots(self): - host = MockHost() - host.filesystem.write_text_file( - '/mock-checkout/third_party/WebKit/LayoutTests/W3CImportExpectations', '') - host.builders = BuilderList({ - 'fakeos_blink_rel': { - 'port_name': 'test-fakeos', - 'specifiers': ['FakeOS', 'Release'], - 'is_try_builder': True, - } - }) - importer = TestImporter(host) - importer.git_cl = MockGitCL(host, status='lgtm', try_job_results={ - Build('fakeos_blink_rel', 123): TryJobStatus('COMPLETED', 'FAILURE'), - Build('cq-builder-b', 200): TryJobStatus('COMPLETED', 'SUCCESS'), - }) - importer.fetch_new_expectations_and_baselines = lambda: None - success = importer.run_commit_queue_for_cl() - self.assertTrue(success) - self.assertLog([ - 'INFO: Triggering CQ try jobs.\n', - 'INFO: All jobs finished.\n', - 'INFO: CQ appears to have passed; trying to commit.\n', - 'INFO: Update completed.\n', - ]) - self.assertEqual(importer.git_cl.calls, [ - ['git', 'cl', 'try'], - ['git', 'cl', 'upload', '-f', '--send-mail'], - ['git', 'cl', 'set-commit'], - ]) - def test_run_commit_queue_for_cl_timeout(self): # This simulates the case where we time out while waiting for try jobs. host = MockHost()
diff --git a/third_party/WebKit/public/platform/modules/locks/lock_manager.mojom b/third_party/WebKit/public/platform/modules/locks/lock_manager.mojom index d65262c2..e9b51e44 100644 --- a/third_party/WebKit/public/platform/modules/locks/lock_manager.mojom +++ b/third_party/WebKit/public/platform/modules/locks/lock_manager.mojom
@@ -6,10 +6,14 @@ import "url/mojo/origin.mojom"; -// An opaque handle passed from the browser process to a child process to reflect a -// held lock. The lock is released when the handle is dropped. +// An opaque handle passed from the browser process to a child process to +// reflect a held lock. The lock is released when the handle is dropped. interface LockHandle {}; +// An explicit lock request is used so that requests from terminated +// contexts (e.g. closed or navigated tabs) can be observed and removed +// from the lock manager's queue. + interface LockRequest { // Request was granted. Granted(LockHandle lock_handle); @@ -21,6 +25,16 @@ Abort(string reason); }; +// Implementation of the proposed "Web Locks API". This provides a "lock" +// primitive for coordination of resource usage across window and worker +// contexts in a web application. A resource is identified by an abstract +// name string selected by the web app. A lock can be requested over the +// resource. The request will be granted asynchronously depending on +// availablility and options. Once granted, the lock will be held until +// explicitly released or the holding context is terminated. +// +// Proposal: https://github.com/inexorabletash/web-locks + interface LockManager { enum LockMode { SHARED, @@ -32,5 +46,9 @@ NO_WAIT }; - RequestLock(url.mojom.Origin origin, array<string> scope, LockMode mode, WaitMode wait, LockRequest request); + RequestLock(url.mojom.Origin origin, + string name, + LockMode mode, + WaitMode wait, + LockRequest request); };
diff --git a/third_party/WebKit/public/web/WebDevToolsAgent.h b/third_party/WebKit/public/web/WebDevToolsAgent.h index a628bb8..1b730f2 100644 --- a/third_party/WebKit/public/web/WebDevToolsAgent.h +++ b/third_party/WebKit/public/web/WebDevToolsAgent.h
@@ -46,8 +46,6 @@ virtual void Reattach(int session_id, const WebString& saved_state) = 0; virtual void Detach(int session_id) = 0; - virtual void ContinueProgram() = 0; - virtual void DispatchOnInspectorBackend(int session_id, int call_id, const WebString& method, @@ -59,10 +57,6 @@ // Exposed for TestRunner. virtual WebString EvaluateInWebInspectorOverlay(const WebString& script) = 0; - // Returns true if caching is disabled for network requests issued by dev - // tools. - virtual bool CacheDisabled() = 0; - class MessageDescriptor { public: virtual ~MessageDescriptor() {}
diff --git a/third_party/WebKit/public/web/WebLocalFrame.h b/third_party/WebKit/public/web/WebLocalFrame.h index bb22834..12637dd 100644 --- a/third_party/WebKit/public/web/WebLocalFrame.h +++ b/third_party/WebKit/public/web/WebLocalFrame.h
@@ -848,6 +848,11 @@ // empty ((0,0), (0,0)). virtual WebRect GetSelectionBoundsRectForTesting() const = 0; + // Detaches all attached sessions. + // TODO(dgozman): this should be removed together with + // old inspector testing harness. + virtual void DetachAllDevToolsSessionsForTesting() = 0; + protected: explicit WebLocalFrame(WebTreeScopeType scope) : WebFrame(scope) {}
diff --git a/tools/chrome_proxy/webdriver/lofi.py b/tools/chrome_proxy/webdriver/lofi.py index d7bc5f1..c85603b 100644 --- a/tools/chrome_proxy/webdriver/lofi.py +++ b/tools/chrome_proxy/webdriver/lofi.py
@@ -37,6 +37,10 @@ # Verify that Lo-Fi responses were seen. self.assertNotEqual(0, lofi_responses) + # Verify Lo-Fi previews info bar recorded + histogram = test_driver.GetHistogram('Previews.InfoBarAction.LoFi', 5) + self.assertEqual(1, histogram['count']) + # Checks that LoFi images are served when LoFi slow connections are used and # the network quality estimator returns Slow2G. def testLoFiSlowConnection(self): @@ -69,6 +73,50 @@ # Verify that Lo-Fi responses were seen. self.assertNotEqual(0, lofi_responses) + # Verify Lo-Fi previews info bar recorded + histogram = test_driver.GetHistogram('Previews.InfoBarAction.LoFi', 5) + self.assertEqual(1, histogram['count']) + + # Checks that LoFi images are NOT served when the network quality estimator + # returns fast connection type. + def testLoFiFastConnection(self): + with TestDriver() as test_driver: + test_driver.AddChromeArg('--enable-spdy-proxy-auth') + test_driver.AddChromeArg('--enable-features=' + 'DataReductionProxyDecidesTransform') + test_driver.AddChromeArg('--data-reduction-proxy-lo-fi=slow-connections-' + 'only') + # Disable server experiments such as tamper detection. + test_driver.AddChromeArg('--data-reduction-proxy-server-experiments-' + 'disabled') + test_driver.AddChromeArg('--force-fieldtrial-params=' + 'NetworkQualityEstimator.Enabled:' + 'force_effective_connection_type/4G') + test_driver.AddChromeArg('--force-fieldtrials=NetworkQualityEstimator/' + 'Enabled') + + test_driver.LoadURL('http://check.googlezip.net/static/index.html') + + lofi_responses = 0 + for response in test_driver.GetHTTPResponses(): + if response.url.endswith('html'): + # Main resource should accept transforms but not be transformed. + self.assertEqual('lite-page', + response.request_headers['chrome-proxy-accept-transform']) + self.assertNotIn('chrome-proxy-content-transform', + response.response_headers) + if 'chrome-proxy' in response.response_headers: + self.assertNotIn('page-policies', + response.response_headers['chrome-proxy']) + else: + # No subresources should accept transforms. + self.assertNotIn('chrome-proxy-accept-transform', + response.request_headers) + + # Verify no Lo-Fi previews info bar recorded + histogram = test_driver.GetHistogram('Previews.InfoBarAction.LoFi', 5) + self.assertEqual(histogram, {}) + # Checks that LoFi images are not served, but the if-heavy CPAT header is # added when LoFi slow connections are used and the network quality estimator # returns 4G.
diff --git a/ui/touch_selection/touch_selection_controller.cc b/ui/touch_selection/touch_selection_controller.cc index 71f74153..884ea9072 100644 --- a/ui/touch_selection/touch_selection_controller.cc +++ b/ui/touch_selection/touch_selection_controller.cc
@@ -260,6 +260,25 @@ return gfx::RectF(); } +gfx::PointF TouchSelectionController::GetActiveHandleBoundPoint() const { + const gfx::SelectionBound* bound = nullptr; + if (active_status_ == INSERTION_ACTIVE && insertion_handle_->IsActive()) + bound = &start_; + if (active_status_ == SELECTION_ACTIVE) { + if (start_selection_handle_->IsActive()) + bound = &start_; + else if (end_selection_handle_->IsActive()) + bound = &end_; + } + + if (!bound) + return gfx::PointF(0.f, 0.f); + + float x = (bound->edge_top().x() + bound->edge_bottom().x()) / 2.f; + float y = (bound->edge_top().y() + bound->edge_bottom().y()) / 2.f; + return gfx::PointF(x, y); +} + const gfx::PointF& TouchSelectionController::GetStartPosition() const { return start_.edge_bottom(); }
diff --git a/ui/touch_selection/touch_selection_controller.h b/ui/touch_selection/touch_selection_controller.h index 6644e30..6ec985c 100644 --- a/ui/touch_selection/touch_selection_controller.h +++ b/ui/touch_selection/touch_selection_controller.h
@@ -120,6 +120,10 @@ gfx::RectF GetStartHandleRect() const; gfx::RectF GetEndHandleRect() const; + // Returns the middle point of selection bound corresponding to the active + // selection or insertion handle. If there is no active handle, returns (0,0). + gfx::PointF GetActiveHandleBoundPoint() const; + // Returns the focal point of the start and end bounds, as defined by // their bottom coordinate. const gfx::PointF& GetStartPosition() const;
diff --git a/ui/touch_selection/touch_selection_controller_unittest.cc b/ui/touch_selection/touch_selection_controller_unittest.cc index ba4de24b..0056940c 100644 --- a/ui/touch_selection/touch_selection_controller_unittest.cc +++ b/ui/touch_selection/touch_selection_controller_unittest.cc
@@ -100,6 +100,7 @@ last_event_start_ = controller_->GetStartPosition(); last_event_end_ = controller_->GetEndPosition(); last_event_bounds_rect_ = controller_->GetRectBetweenBounds(); + last_event_handle_bound_middle_ = controller_->GetActiveHandleBoundPoint(); } std::unique_ptr<TouchHandleDrawable> CreateDrawable() override { @@ -201,6 +202,9 @@ const gfx::RectF& GetLastEventBoundsRect() const { return last_event_bounds_rect_; } + const gfx::PointF& GetLastEventHandleBoundMiddle() const { + return last_event_handle_bound_middle_; + } std::vector<SelectionEventType> GetAndResetEvents() { std::vector<SelectionEventType> events; @@ -228,6 +232,7 @@ gfx::PointF selection_start_; gfx::PointF selection_end_; gfx::RectF last_event_bounds_rect_; + gfx::PointF last_event_handle_bound_middle_; std::vector<SelectionEventType> events_; bool caret_moved_; bool selection_moved_; @@ -1261,4 +1266,96 @@ TouchHandleOrientation::RIGHT); } +TEST_F(TouchSelectionControllerTest, InsertionActiveBoundMiddlePoint) { + base::TimeTicks event_time = base::TimeTicks::Now(); + float line_height = 10.f; + gfx::RectF insertion_rect(10, 0, 0, line_height); + bool visible = true; + + OnTapEvent(); + ChangeInsertion(insertion_rect, visible); + EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_SHOWN)); + EXPECT_EQ(gfx::PointF(0.f, 0.f), GetLastEventHandleBoundMiddle()); + + SetDraggingEnabled(true); + MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); + EXPECT_TRUE(controller().WillHandleTouchEvent(event)); + EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); + EXPECT_EQ(gfx::PointF(10.f, 5.f), GetLastEventHandleBoundMiddle()); + + insertion_rect.Offset(1, 0); + ChangeInsertion(insertion_rect, visible); + event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 1, 0); + EXPECT_TRUE(controller().WillHandleTouchEvent(event)); + EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_MOVED)); + EXPECT_EQ(gfx::PointF(11.f, 5.f), GetLastEventHandleBoundMiddle()); + + insertion_rect.Offset(0, 1); + ChangeInsertion(insertion_rect, visible); + event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 0, 1); + EXPECT_TRUE(controller().WillHandleTouchEvent(event)); + EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_MOVED)); + EXPECT_EQ(gfx::PointF(11.f, 6.f), GetLastEventHandleBoundMiddle()); + + event_time += base::TimeDelta::FromMilliseconds(2 * kDefaultTapTimeoutMs); + event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); + EXPECT_TRUE(controller().WillHandleTouchEvent(event)); + EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STOPPED)); + EXPECT_EQ(gfx::PointF(0.f, 0.f), GetLastEventHandleBoundMiddle()); + + SetDraggingEnabled(false); +} + +TEST_F(TouchSelectionControllerTest, SelectionActiveBoundMiddlePoint) { + base::TimeTicks event_time = base::TimeTicks::Now(); + float line_height = 10.f; + gfx::RectF start_rect(10, 0, 0, line_height); + gfx::RectF end_rect(50, 0, 0, line_height); + bool visible = true; + OnLongPressEvent(); + + ChangeSelection(start_rect, visible, end_rect, visible); + EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_SHOWN)); + EXPECT_EQ(gfx::PointF(0.f, 0.f), GetLastEventHandleBoundMiddle()); + + // Left handle. + SetDraggingEnabled(true); + MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 10, 5); + EXPECT_TRUE(controller().WillHandleTouchEvent(event)); + EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLE_DRAG_STARTED)); + EXPECT_EQ(gfx::PointF(10.f, 5.f), GetLastEventHandleBoundMiddle()); + + event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 15, 5); + start_rect.Offset(5, 0); + ChangeSelection(start_rect, visible, end_rect, visible); + EXPECT_TRUE(controller().WillHandleTouchEvent(event)); + EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); + EXPECT_EQ(gfx::PointF(15.f, 5.f), GetLastEventHandleBoundMiddle()); + + event_time += base::TimeDelta::FromMilliseconds(2 * kDefaultTapTimeoutMs); + event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 15, 5); + EXPECT_TRUE(controller().WillHandleTouchEvent(event)); + EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLE_DRAG_STOPPED)); + EXPECT_EQ(gfx::PointF(0.f, 0.f), GetLastEventHandleBoundMiddle()); + + // Right handle. + event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 50, 5); + EXPECT_TRUE(controller().WillHandleTouchEvent(event)); + EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLE_DRAG_STARTED)); + EXPECT_EQ(gfx::PointF(50.f, 5.f), GetLastEventHandleBoundMiddle()); + + event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 45, 5); + end_rect.Offset(-5, 0); + ChangeSelection(start_rect, visible, end_rect, visible); + EXPECT_TRUE(controller().WillHandleTouchEvent(event)); + EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); + EXPECT_EQ(gfx::PointF(45.f, 5.f), GetLastEventHandleBoundMiddle()); + + event_time += base::TimeDelta::FromMilliseconds(2 * kDefaultTapTimeoutMs); + event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 45, 5); + EXPECT_TRUE(controller().WillHandleTouchEvent(event)); + EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLE_DRAG_STOPPED)); + EXPECT_EQ(gfx::PointF(0.f, 0.f), GetLastEventHandleBoundMiddle()); +} + } // namespace ui